diff --git a/.eslintrc.json b/.eslintrc.json index 901bd705..8c975468 100755 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -28,13 +28,19 @@ "radix": "warn", // modify rules from base configurations - "no-unused-vars": ["error", { - "args": "none", - "vars": "all" - }], - "no-empty": ["error", { - "allowEmptyCatch": true - }], + "no-unused-vars": [ + "error", + { + "args": "none", + "vars": "all" + } + ], + "no-empty": [ + "error", + { + "allowEmptyCatch": true + } + ], // disable rules from base configurations "no-control-regex": "off", @@ -47,49 +53,72 @@ "block-spacing": "error", "array-bracket-spacing": "error", "comma-spacing": "error", - "spaced-comment": ["error", "always", { "exceptions": ["/"] } ], + "spaced-comment": ["error", "always", { "exceptions": ["/"] }], "comma-style": "error", "computed-property-spacing": "error", "no-trailing-spaces": "warn", "eol-last": "error", "func-call-spacing": "error", - "key-spacing": ["warn", { - "mode": "minimum" - }], - "indent": ["error", 4, { - "ignoreComments": true, - "ArrayExpression": "first", - "SwitchCase": 1 - }], + "key-spacing": [ + "warn", + { + "mode": "minimum" + } + ], + "indent": [ + "error", + 4, + { + "ignoreComments": true, + "ArrayExpression": "first", + "SwitchCase": 1 + } + ], "linebreak-style": ["error", "unix"], - "quotes": ["error", "double", { - "avoidEscape": true, - "allowTemplateLiterals": true - }], - "camelcase": ["error", { - "properties": "always" - }], + "quotes": [ + "error", + "double", + { + "avoidEscape": true, + "allowTemplateLiterals": true + } + ], + "camelcase": [ + "error", + { + "properties": "always" + } + ], "semi": ["error", "always"], "unicode-bom": "error", - "require-jsdoc": ["error", { - "require": { - "FunctionDeclaration": true, - "MethodDefinition": true, - "ClassDeclaration": true, - "ArrowFunctionExpression": true + "require-jsdoc": [ + "error", + { + "require": { + "FunctionDeclaration": true, + "MethodDefinition": true, + "ClassDeclaration": true, + "ArrowFunctionExpression": true + } } - }], - "keyword-spacing": ["error", { - "before": true, - "after": true - }], - "no-multiple-empty-lines": ["warn", { - "max": 2, - "maxEOF": 1, - "maxBOF": 0 - }], + ], + "keyword-spacing": [ + "error", + { + "before": true, + "after": true + } + ], + "no-multiple-empty-lines": [ + "warn", + { + "max": 2, + "maxEOF": 1, + "maxBOF": 0 + } + ], "no-whitespace-before-property": "error", - "operator-linebreak": ["error", "after"], + "operator-linebreak": ["error", "before"], "space-in-parens": "error", "no-var": "error", "prefer-const": "error" diff --git a/.github/workflows/pull_requests.yml b/.github/workflows/pull_requests.yml index daa59490..edd57578 100644 --- a/.github/workflows/pull_requests.yml +++ b/.github/workflows/pull_requests.yml @@ -22,7 +22,7 @@ jobs: npm run setheapsize - name: Lint - run: npx grunt lint + run: npm run style && npx grunt lint && git diff --exit-code - name: Unit Tests run: | diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..e232a509 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,11 @@ +.github +.devcontainer +node_modules +**/*.md +.dockerignore +.gitignore +.editorconfig +.gitattributes +.npmignore +package-lock.json +package.json diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..ebdaa439 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "tabWidth": 4, + "useTabs": false, + "printWidth": 120, + "proseWrap": "always", + "semi": true, + "singleQuote": false, + "bracketSpacing": true, + "trailingComma": "none", + "quoteProps": "preserve" +} diff --git a/Gruntfile.js b/Gruntfile.js index 32ba9007..fca80999 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -6,7 +6,8 @@ const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPl const glob = require("glob"); const path = require("path"); -const nodeFlags = "--experimental-modules --experimental-json-modules --experimental-specifier-resolution=node --no-warnings --no-deprecation"; +const nodeFlags + = "--experimental-modules --experimental-json-modules --experimental-specifier-resolution=node --no-warnings --no-deprecation"; /** * Grunt configuration for building the app in various formats. @@ -21,56 +22,80 @@ module.exports = function (grunt) { grunt.file.preserveBOM = false; // Tasks - grunt.registerTask("dev", + grunt.registerTask( + "dev", "A persistent task which creates a development build whenever source files are modified.", - ["clean:dev", "clean:config", "exec:generateConfig", "concurrent:dev"]); + ["clean:dev", "clean:config", "exec:generateConfig", "concurrent:dev"] + ); - grunt.registerTask("prod", - "Creates a production-ready build. Use the --msg flag to add a compile message.", - [ - "eslint", "clean:prod", "clean:config", "exec:generateConfig", "findModules", "webpack:web", - "copy:standalone", "zip:standalone", "clean:standalone", "exec:calcDownloadHash", "chmod" - ]); + grunt.registerTask("prod", "Creates a production-ready build. Use the --msg flag to add a compile message.", [ + "eslint", + "clean:prod", + "clean:config", + "exec:generateConfig", + "findModules", + "webpack:web", + "copy:standalone", + "zip:standalone", + "clean:standalone", + "exec:calcDownloadHash", + "chmod" + ]); - grunt.registerTask("node", - "Compiles CyberChef into a single NodeJS module.", - [ - "clean:node", "clean:config", "clean:nodeConfig", "exec:generateConfig", "exec:generateNodeIndex" - ]); + grunt.registerTask("node", "Compiles CyberChef into a single NodeJS module.", [ + "clean:node", + "clean:config", + "clean:nodeConfig", + "exec:generateConfig", + "exec:generateNodeIndex" + ]); - grunt.registerTask("configTests", + grunt.registerTask( + "configTests", "A task which configures config files in preparation for tests to be run. Use `npm test` to run tests.", - [ - "clean:config", "clean:nodeConfig", "exec:generateConfig", "exec:generateNodeIndex" - ]); + ["clean:config", "clean:nodeConfig", "exec:generateConfig", "exec:generateNodeIndex"] + ); - grunt.registerTask("testui", + grunt.registerTask( + "testui", "A task which runs all the UI tests in the tests directory. The prod task must already have been run.", - ["connect:prod", "exec:browserTests"]); + ["connect:prod", "exec:browserTests"] + ); - grunt.registerTask("testnodeconsumer", + grunt.registerTask( + "testnodeconsumer", "A task which checks whether consuming CJS and ESM apps work with the CyberChef build", - ["exec:setupNodeConsumers", "exec:testCJSNodeConsumer", "exec:testESMNodeConsumer", "exec:teardownNodeConsumers"]); + [ + "exec:setupNodeConsumers", + "exec:testCJSNodeConsumer", + "exec:testESMNodeConsumer", + "exec:teardownNodeConsumers" + ] + ); - grunt.registerTask("default", - "Lints the code base", - ["eslint", "exec:repoSize"]); + grunt.registerTask("default", "Lints the code base", ["eslint", "exec:repoSize"]); grunt.registerTask("lint", "eslint"); - grunt.registerTask("findModules", + grunt.registerTask( + "findModules", "Finds all generated modules and updates the entry point list for Webpack", - function(arg1, arg2) { + function (arg1, arg2) { const moduleEntryPoints = listEntryModules(); grunt.log.writeln(`Found ${Object.keys(moduleEntryPoints).length} modules.`); - grunt.config.set("webpack.web.entry", - Object.assign({ - main: "./src/web/index.js" - }, moduleEntryPoints)); - }); - + grunt.config.set( + "webpack.web.entry", + Object.assign( + { + main: "./src/web/index.js" + }, + moduleEntryPoints + ) + ); + } + ); // Load tasks provided by each plugin grunt.loadNpmTasks("grunt-eslint"); @@ -84,7 +109,6 @@ module.exports = function (grunt) { grunt.loadNpmTasks("grunt-contrib-connect"); grunt.loadNpmTasks("grunt-zip"); - // Project configuration const compileTime = grunt.template.today("UTC:dd/mm/yyyy HH:MM:ss") + " UTC", pkg = grunt.file.readJSON("package.json"), @@ -92,7 +116,7 @@ module.exports = function (grunt) { BUILD_CONSTANTS = { COMPILE_TIME: JSON.stringify(compileTime), COMPILE_MSG: JSON.stringify(grunt.option("compile-msg") || grunt.option("msg") || ""), - PKG_VERSION: JSON.stringify(pkg.version), + PKG_VERSION: JSON.stringify(pkg.version) }, moduleEntryPoints = listEntryModules(), nodeConsumerTestPath = "~/tmp-cyberchef", @@ -104,13 +128,16 @@ module.exports = function (grunt) { return { mode: "production", target: "web", - entry: Object.assign({ - main: "./src/web/index.js" - }, moduleEntryPoints), + entry: Object.assign( + { + main: "./src/web/index.js" + }, + moduleEntryPoints + ), output: { path: __dirname + "/build/prod", - filename: chunkData => { - return chunkData.chunk.name === "main" ? "assets/[name].js": "[name].js"; + filename: (chunkData) => { + return chunkData.chunk.name === "main" ? "assets/[name].js" : "[name].js"; }, globalObject: "this" }, @@ -138,19 +165,18 @@ module.exports = function (grunt) { analyzerMode: "static", reportFilename: "BundleAnalyzerReport.html", openAnalyzer: false - }), + }) ] }; }; - /** * Generates an entry list for all the modules. */ function listEntryModules() { const entryModules = {}; - glob.sync("./src/core/config/modules/*.mjs").forEach(file => { + glob.sync("./src/core/config/modules/*.mjs").forEach((file) => { const basename = path.basename(file); if (basename !== "Default.mjs" && basename !== "OpModules.mjs") entryModules["modules/" + basename.split(".mjs")[0]] = path.resolve(file); @@ -171,12 +197,14 @@ module.exports = function (grunt) { if (!win) { return cmds.join(";"); } - return cmds - // && means that subsequent commands will not be executed if the - // previous one fails. & would coninue on a fail - .join("&&") - // Windows does not support \n properly - .replace(/\n/g, "\\n"); + return ( + cmds + // && means that subsequent commands will not be executed if the + // previous one fails. & would coninue on a fail + .join("&&") + // Windows does not support \n properly + .replace(/\n/g, "\\n") + ); } grunt.initConfig({ @@ -184,7 +212,11 @@ module.exports = function (grunt) { dev: ["build/dev/*"], prod: ["build/prod/*"], node: ["build/node/*"], - config: ["src/core/config/OperationConfig.json", "src/core/config/modules/*", "src/code/operations/index.mjs"], + config: [ + "src/core/config/OperationConfig.json", + "src/core/config/modules/*", + "src/code/operations/index.mjs" + ], nodeConfig: ["src/node/index.mjs", "src/node/config/OperationConfig.json"], standalone: ["build/prod/CyberChef*.html"] }, @@ -194,20 +226,26 @@ module.exports = function (grunt) { web: ["src/web/**/*.{js,mjs}", "!src/web/static/**/*"], node: ["src/node/**/*.{js,mjs}"], tests: ["tests/**/*.{js,mjs}"], + options: { + fix: true + } }, webpack: { options: webpackConfig, myConfig: webpackConfig, - web: webpackProdConf(), + web: webpackProdConf() }, "webpack-dev-server": { options: webpackConfig, start: { mode: "development", target: "web", - entry: Object.assign({ - main: "./src/web/index.js" - }, moduleEntryPoints), + entry: Object.assign( + { + main: "./src/web/index.js" + }, + moduleEntryPoints + ), resolve: { alias: { "./config/modules/OpModules.mjs": "./config/modules/Default.mjs" @@ -228,7 +266,7 @@ module.exports = function (grunt) { template: "./src/web/html/index.html", chunks: ["main"], compileTime: compileTime, - version: pkg.version, + version: pkg.version }) ] } @@ -236,11 +274,7 @@ module.exports = function (grunt) { zip: { standalone: { cwd: "build/prod/", - src: [ - "build/prod/**/*", - "!build/prod/index.html", - "!build/prod/BundleAnalyzerReport.html", - ], + src: ["build/prod/**/*", "!build/prod/index.html", "!build/prod/BundleAnalyzerReport.html"], dest: `build/prod/CyberChef_v${pkg.version}.zip` } }, @@ -258,14 +292,18 @@ module.exports = function (grunt) { process: function (content, srcpath) { if (srcpath.indexOf("index.html") >= 0) { // Add Google Analytics code to index.html - content = content.replace("", - grunt.file.read("src/web/static/ga.html") + ""); + content = content.replace( + "", + grunt.file.read("src/web/static/ga.html") + "" + ); // Add Structured Data for SEO - content = content.replace("", - ""); + content = content.replace( + "", + "" + ); return grunt.template.process(content, srcpath); } else { return content; @@ -285,8 +323,10 @@ module.exports = function (grunt) { process: function (content, srcpath) { if (srcpath.indexOf("index.html") >= 0) { // Replace download link with version number - content = content.replace(/]+>Download CyberChef.+?<\/a>/, - `Version ${pkg.version}`); + content = content.replace( + /]+>Download CyberChef.+?<\/a>/, + `Version ${pkg.version}` + ); return grunt.template.process(content, srcpath); } else { @@ -306,7 +346,7 @@ module.exports = function (grunt) { chmod: { build: { options: { - mode: "755", + mode: "755" }, src: ["build/**/*", "build/"] } @@ -338,7 +378,7 @@ module.exports = function (grunt) { `sed -i -e "s/DOWNLOAD_HASH_PLACEHOLDER/$(cat build/prod/sha256digest.txt)/" build/prod/index.html` ]); } - }, + } }, repoSize: { command: chainCommands([ @@ -390,21 +430,15 @@ module.exports = function (grunt) { command: chainCommands([ `rm -rf ${nodeConsumerTestPath}`, "echo '\n--- Node consumer tests complete ---'" - ]), + ]) }, testCJSNodeConsumer: { - command: chainCommands([ - `cd ${nodeConsumerTestPath}`, - `node ${nodeFlags} cjs-consumer.js`, - ]), - stdout: false, + command: chainCommands([`cd ${nodeConsumerTestPath}`, `node ${nodeFlags} cjs-consumer.js`]), + stdout: false }, testESMNodeConsumer: { - command: chainCommands([ - `cd ${nodeConsumerTestPath}`, - `node ${nodeFlags} esm-consumer.mjs`, - ]), - stdout: false, + command: chainCommands([`cd ${nodeConsumerTestPath}`, `node ${nodeFlags} esm-consumer.mjs`]), + stdout: false }, fixCryptoApiImports: { command: function () { @@ -428,6 +462,6 @@ module.exports = function (grunt) { }, stdout: false } - }, + } }); }; diff --git a/babel.config.js b/babel.config.js index deab9108..24812843 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,24 +1,29 @@ -module.exports = function(api) { +module.exports = function (api) { api.cache.forever(); return { "presets": [ - ["@babel/preset-env", { - "modules": false, - "useBuiltIns": "entry", - "corejs": 3 - }] + [ + "@babel/preset-env", + { + "modules": false, + "useBuiltIns": "entry", + "corejs": 3 + } + ] ], "plugins": [ "dynamic-import-node", "@babel/plugin-syntax-import-assertions", [ - "babel-plugin-transform-builtin-extend", { + "babel-plugin-transform-builtin-extend", + { "globals": ["Error"] } ], [ - "@babel/plugin-transform-runtime", { + "@babel/plugin-transform-runtime", + { "regenerator": true } ] diff --git a/nightwatch.json b/nightwatch.json index 95359f44..33b166c6 100644 --- a/nightwatch.json +++ b/nightwatch.json @@ -1,32 +1,29 @@ { - "src_folders": ["tests/browser"], - "exclude": ["tests/browser/browserUtils.js"], - "output_folder": "tests/browser/output", + "src_folders": ["tests/browser"], + "exclude": ["tests/browser/browserUtils.js"], + "output_folder": "tests/browser/output", - "test_settings": { + "test_settings": { + "default": { + "launch_url": "http://localhost:8080", + "webdriver": { + "start_process": true, + "server_path": "./node_modules/.bin/chromedriver", + "port": 9515, + "log_path": "tests/browser/output" + }, + "desiredCapabilities": { + "browserName": "chrome" + }, + "enable_fail_fast": true + }, - "default": { - "launch_url": "http://localhost:8080", - "webdriver": { - "start_process": true, - "server_path": "./node_modules/.bin/chromedriver", - "port": 9515, - "log_path": "tests/browser/output" - }, - "desiredCapabilities": { - "browserName": "chrome" - }, - "enable_fail_fast": true - }, + "dev": { + "launch_url": "http://localhost:8080" + }, - "dev": { - "launch_url": "http://localhost:8080" - }, - - "prod": { - "launch_url": "http://localhost:8000/index.html" + "prod": { + "launch_url": "http://localhost:8000/index.html" + } } - - } } - diff --git a/package-lock.json b/package-lock.json index 5e6671a5..a5ee4063 100644 --- a/package-lock.json +++ b/package-lock.json @@ -141,6 +141,7 @@ "postcss-css-variables": "^0.19.0", "postcss-import": "^16.0.0", "postcss-loader": "^8.1.0", + "prettier": "^3.2.5", "prompt": "^1.3.0", "sitemap": "^7.1.1", "terser": "^5.27.0", @@ -12174,6 +12175,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "dev": true, diff --git a/package.json b/package.json index 334d88b5..f12cd297 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "postcss-css-variables": "^0.19.0", "postcss-import": "^16.0.0", "postcss-loader": "^8.1.0", + "prettier": "^3.2.5", "prompt": "^1.3.0", "sitemap": "^7.1.1", "terser": "^5.27.0", @@ -189,6 +190,8 @@ "testui": "npx grunt testui", "testuidev": "npx nightwatch --env=dev", "lint": "npx grunt lint", + "style": "prettier --write .", + "check-style": "prettier --check .", "postinstall": "npx grunt exec:fixCryptoApiImports && npx grunt exec:fixSnackbarMarkup", "newop": "node --experimental-modules --experimental-json-modules src/core/config/scripts/newOperation.mjs", "minor": "node --experimental-modules --experimental-json-modules src/core/config/scripts/newMinorVersion.mjs", diff --git a/postcss.config.js b/postcss.config.js index 2d46543d..3f93879e 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -4,6 +4,6 @@ module.exports = { require("autoprefixer"), require("postcss-css-variables")({ preserve: true - }), + }) ] }; diff --git a/src/core/Chef.mjs b/src/core/Chef.mjs index ab8f83de..e66c3498 100755 --- a/src/core/Chef.mjs +++ b/src/core/Chef.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "./Utils.mjs"; * The main controller for CyberChef. */ class Chef { - /** * Chef constructor */ @@ -21,7 +20,6 @@ class Chef { this.dish = new Dish(); } - /** * Runs the recipe over the input. * @@ -36,12 +34,12 @@ class Chef { * @returns {number} response.progress - The position that we have got to in the recipe * @returns {number} response.duration - The number of ms it took to execute the recipe * @returns {number} response.error - The error object thrown by a failed operation (false if no error) - */ - async bake(input, recipeConfig, options={}) { + */ + async bake(input, recipeConfig, options = {}) { log.debug("Chef baking"); const startTime = Date.now(), - recipe = new Recipe(recipeConfig), - containsFc = recipe.containsFlowControl(); + recipe = new Recipe(recipeConfig), + containsFc = recipe.containsFlowControl(); let error = false, progress = 0; @@ -56,7 +54,7 @@ class Chef { } catch (err) { log.error(err); error = { - displayStr: err.displayStr, + displayStr: err.displayStr }; progress = err.progress; } @@ -67,9 +65,8 @@ class Chef { // Present the raw result await recipe.present(this.dish); - const returnType = - this.dish.type === Dish.HTML ? Dish.HTML : - options?.returnType ? options.returnType : Dish.ARRAY_BUFFER; + const returnType + = this.dish.type === Dish.HTML ? Dish.HTML : options?.returnType ? options.returnType : Dish.ARRAY_BUFFER; return { dish: rawDish, @@ -81,7 +78,6 @@ class Chef { }; } - /** * When a browser tab is unfocused and the browser has to run lots of dynamic content in other tabs, * it swaps out the memory for that tab. If the CyberChef tab has been unfocused for more than a @@ -98,7 +94,7 @@ class Chef { * * @param {Object[]} recipeConfig - The recipe configuration object * @returns {number} The time it took to run the silent bake in milliseconds. - */ + */ silentBake(recipeConfig) { log.debug("Running silent bake"); @@ -114,7 +110,6 @@ class Chef { return Date.now() - startTime; } - /** * Calculates highlight offsets if possible. * @@ -153,7 +148,6 @@ class Chef { }; } - /** * Translates the dish to a specified type and returns it. * @@ -173,11 +167,10 @@ class Chef { * @param {number} [maxLength=100] * @returns {string} */ - async getDishTitle(dish, maxLength=100) { + async getDishTitle(dish, maxLength = 100) { const newDish = new Dish(dish); return await newDish.getTitle(maxLength); } - } export default Chef; diff --git a/src/core/ChefWorker.js b/src/core/ChefWorker.js index a43993f9..23a2a36b 100644 --- a/src/core/ChefWorker.js +++ b/src/core/ChefWorker.js @@ -7,11 +7,10 @@ */ import Chef from "./Chef.mjs"; -import OperationConfig from "./config/OperationConfig.json" assert {type: "json"}; +import OperationConfig from "./config/OperationConfig.json" assert { type: "json" }; import OpModules from "./config/modules/OpModules.mjs"; import loglevelMessagePrefix from "loglevel-message-prefix"; - // Set up Chef instance self.chef = new Chef(); @@ -19,7 +18,6 @@ self.OpModules = OpModules; self.OperationConfig = OperationConfig; self.inputNum = -1; - // Tell the app that the worker has loaded and is ready to operate self.postMessage({ action: "workerLoaded", @@ -45,7 +43,7 @@ self.postMessage({ * } * } */ -self.addEventListener("message", function(e) { +self.addEventListener("message", function (e) { // Handle message const r = e.data; log.debug(`Receiving command '${r.action}'`); @@ -69,11 +67,7 @@ self.addEventListener("message", function(e) { self.docURL = r.data; break; case "highlight": - calculateHighlights( - r.data.recipeConfig, - r.data.direction, - r.data.pos - ); + calculateHighlights(r.data.recipeConfig, r.data.direction, r.data.pos); break; case "setLogLevel": log.setLevel(r.data, false); @@ -89,7 +83,6 @@ self.addEventListener("message", function(e) { } }); - /** * Baking handler * @@ -101,24 +94,24 @@ async function bake(data) { try { self.inputNum = data.inputNum === undefined ? -1 : data.inputNum; const response = await self.chef.bake( - data.input, // The user's input - data.recipeConfig, // The configuration of the recipe - data.options // Options set by the user + data.input, // The user's input + data.recipeConfig, // The configuration of the recipe + data.options // Options set by the user ); - const transferable = (response.dish.value instanceof ArrayBuffer) ? - [response.dish.value] : - undefined; - - self.postMessage({ - action: "bakeComplete", - data: Object.assign(response, { - id: data.id, - inputNum: data.inputNum, - bakeId: data.bakeId - }) - }, transferable); + const transferable = response.dish.value instanceof ArrayBuffer ? [response.dish.value] : undefined; + self.postMessage( + { + action: "bakeComplete", + data: Object.assign(response, { + id: data.id, + inputNum: data.inputNum, + bakeId: data.bakeId + }) + }, + transferable + ); } catch (err) { self.postMessage({ action: "bakeError", @@ -132,7 +125,6 @@ async function bake(data) { self.inputNum = -1; } - /** * Silent baking handler */ @@ -145,23 +137,24 @@ function silentBake(data) { }); } - /** * Translates the dish to a given type. */ async function getDishAs(data) { const value = await self.chef.getDishAs(data.dish, data.type); - const transferable = (data.type === "ArrayBuffer") ? [value] : undefined; - self.postMessage({ - action: "dishReturned", - data: { - value: value, - id: data.id - } - }, transferable); + const transferable = data.type === "ArrayBuffer" ? [value] : undefined; + self.postMessage( + { + action: "dishReturned", + data: { + value: value, + id: data.id + } + }, + transferable + ); } - /** * Gets the dish title * @@ -181,7 +174,6 @@ async function getDishTitle(data) { }); } - /** * Calculates highlight offsets if possible. * @@ -200,14 +192,13 @@ async function calculateHighlights(recipeConfig, direction, pos) { }); } - /** * Checks that all required modules are loaded and loads them if not. * * @param {Object} recipeConfig */ -self.loadRequiredModules = function(recipeConfig) { - recipeConfig.forEach(op => { +self.loadRequiredModules = function (recipeConfig) { + recipeConfig.forEach((op) => { const module = self.OperationConfig[op.op].module; if (!(module in OpModules)) { @@ -219,13 +210,12 @@ self.loadRequiredModules = function(recipeConfig) { }); }; - /** * Send status update to the app. * * @param {string} msg */ -self.sendStatusMessage = function(msg) { +self.sendStatusMessage = function (msg) { self.postMessage({ action: "statusMessage", data: { @@ -235,14 +225,13 @@ self.sendStatusMessage = function(msg) { }); }; - /** * Send progress update to the app. * * @param {number} progress * @param {number} total */ -self.sendProgressMessage = function(progress, total) { +self.sendProgressMessage = function (progress, total) { self.postMessage({ action: "progressMessage", data: { @@ -253,14 +242,13 @@ self.sendProgressMessage = function(progress, total) { }); }; - /** * Send an option value update to the app. * * @param {string} option * @param {*} value */ -self.setOption = function(option, value) { +self.setOption = function (option, value) { self.postMessage({ action: "optionUpdate", data: { @@ -270,7 +258,6 @@ self.setOption = function(option, value) { }); }; - /** * Send register values back to the app. * @@ -278,7 +265,7 @@ self.setOption = function(option, value) { * @param {number} numPrevRegisters * @param {string[]} registers */ -self.setRegisters = function(opIndex, numPrevRegisters, registers) { +self.setRegisters = function (opIndex, numPrevRegisters, registers) { self.postMessage({ action: "setRegisters", data: { diff --git a/src/core/Dish.mjs b/src/core/Dish.mjs index 11b1ff9f..34b9e010 100755 --- a/src/core/Dish.mjs +++ b/src/core/Dish.mjs @@ -20,12 +20,10 @@ import DishListFile from "./dishTypes/DishListFile.mjs"; import DishNumber from "./dishTypes/DishNumber.mjs"; import DishString from "./dishTypes/DishString.mjs"; - /** * The data being operated on by each operation. */ class Dish { - /** * Dish constructor * @@ -34,26 +32,27 @@ class Dish { * @param {Enum} [type=null] (optional) - A type to accompany object * literal input */ - constructor(dishOrInput=null, type = null) { + constructor(dishOrInput = null, type = null) { this.value = new ArrayBuffer(0); this.type = Dish.ARRAY_BUFFER; // Case: dishOrInput is dish object - if (dishOrInput && - Object.prototype.hasOwnProperty.call(dishOrInput, "value") && - Object.prototype.hasOwnProperty.call(dishOrInput, "type")) { + if ( + dishOrInput + && Object.prototype.hasOwnProperty.call(dishOrInput, "value") + && Object.prototype.hasOwnProperty.call(dishOrInput, "type") + ) { this.set(dishOrInput.value, dishOrInput.type); - // input and type defined separately + // input and type defined separately } else if (dishOrInput && type !== null) { this.set(dishOrInput, type); - // No type declared, so infer it. + // No type declared, so infer it. } else if (dishOrInput) { const inferredType = Dish.typeEnum(dishOrInput.constructor.name); this.set(dishOrInput, inferredType); } } - /** * Returns the data type enum for the given type string. * @@ -89,7 +88,6 @@ class Dish { } } - /** * Returns the data type string for the given type enum. * @@ -121,7 +119,6 @@ class Dish { } } - /** * Returns the value of the data in the type format specified. * @@ -136,13 +133,12 @@ class Dish { } if (this.type !== type) { - // Node environment => _translate is sync if (isNodeEnvironment()) { this._translate(type); return this.value; - // Browser environment => _translate is async + // Browser environment => _translate is async } else { return new Promise((resolve, reject) => { this._translate(type) @@ -157,7 +153,6 @@ class Dish { return this.value; } - /** * Sets the data value and type and then validates them. * @@ -196,7 +191,6 @@ class Dish { return clone.get(type); } - /** * Detects the MIME type of the current dish * @returns {string} @@ -212,7 +206,6 @@ class Dish { } } - /** * Returns the title of the data up to the specified length * @@ -241,7 +234,7 @@ class Dish { case Dish.BYTE_ARRAY: title = this.detectDishType(); if (title !== null) break; - // fall through if no mime type was detected + // fall through if no mime type was detected default: try { cloned = this.clone(); @@ -260,7 +253,7 @@ class Dish { * May have to disable parts of BYTE_ARRAY validation if it effects performance. * * @returns {boolean} Whether the data is valid or not. - */ + */ valid() { switch (this.type) { case Dish.BYTE_ARRAY: @@ -270,9 +263,7 @@ class Dish { // Check that every value is a number between 0 - 255 for (let i = 0; i < this.value.length; i++) { - if (typeof this.value[i] !== "number" || - this.value[i] < 0 || - this.value[i] > 255) { + if (typeof this.value[i] !== "number" || this.value[i] < 0 || this.value[i] > 255) { return false; } } @@ -306,21 +297,21 @@ class Dish { case Dish.FILE: return this.value instanceof File; case Dish.LIST_FILE: - return this.value instanceof Array && - this.value.reduce((acc, curr) => acc && curr instanceof File, true); + return ( + this.value instanceof Array && this.value.reduce((acc, curr) => acc && curr instanceof File, true) + ); default: return false; } } - /** * Determines how much space the Dish takes up. * Numbers in JavaScript are 64-bit floating point, however for the purposes of the Dish, * we measure how many bytes are taken up when the number is written as a string. * * @returns {number} - */ + */ get size() { switch (this.type) { case Dish.BYTE_ARRAY: @@ -343,7 +334,6 @@ class Dish { } } - /** * Returns a deep clone of the current Dish. * @@ -358,25 +348,16 @@ class Dish { case Dish.NUMBER: case Dish.BIG_NUMBER: // These data types are immutable so it is acceptable to copy them by reference - newDish.set( - this.value, - this.type - ); + newDish.set(this.value, this.type); break; case Dish.BYTE_ARRAY: case Dish.JSON: // These data types are mutable so they need to be copied by value - newDish.set( - JSON.parse(JSON.stringify(this.value)), - this.type - ); + newDish.set(JSON.parse(JSON.stringify(this.value)), this.type); break; case Dish.ARRAY_BUFFER: // Slicing an ArrayBuffer returns a new ArrayBuffer with a copy its contents - newDish.set( - this.value.slice(0), - this.type - ); + newDish.set(this.value.slice(0), this.type); break; case Dish.FILE: // A new file can be created by copying over all the values from the original @@ -390,11 +371,12 @@ class Dish { break; case Dish.LIST_FILE: newDish.set( - this.value.map(f => - new File([f], f.name, { - "type": f.type, - "lastModified": f.lastModified - }) + this.value.map( + (f) => + new File([f], f.name, { + "type": f.type, + "lastModified": f.lastModified + }) ), this.type ); @@ -423,11 +405,11 @@ class Dish { this.type = Dish.ARRAY_BUFFER; this._fromArrayBuffer(toType); - // Browser environment => translate is async + // Browser environment => translate is async } else { return new Promise((resolve, reject) => { this._toArrayBuffer() - .then(() => this.type = Dish.ARRAY_BUFFER) + .then(() => (this.type = Dish.ARRAY_BUFFER)) .then(() => { this._fromArrayBuffer(toType); resolve(); @@ -435,7 +417,6 @@ class Dish { .catch(reject); }); } - } /** @@ -449,31 +430,31 @@ class Dish { // Using 'bind' here to allow this.value to be mutated within translation functions const toByteArrayFuncs = { browser: { - [Dish.STRING]: () => Promise.resolve(DishString.toArrayBuffer.bind(this)()), - [Dish.NUMBER]: () => Promise.resolve(DishNumber.toArrayBuffer.bind(this)()), - [Dish.HTML]: () => Promise.resolve(DishHTML.toArrayBuffer.bind(this)()), - [Dish.ARRAY_BUFFER]: () => Promise.resolve(), - [Dish.BIG_NUMBER]: () => Promise.resolve(DishBigNumber.toArrayBuffer.bind(this)()), - [Dish.JSON]: () => Promise.resolve(DishJSON.toArrayBuffer.bind(this)()), - [Dish.FILE]: () => DishFile.toArrayBuffer.bind(this)(), - [Dish.LIST_FILE]: () => Promise.resolve(DishListFile.toArrayBuffer.bind(this)()), - [Dish.BYTE_ARRAY]: () => Promise.resolve(DishByteArray.toArrayBuffer.bind(this)()), + [Dish.STRING]: () => Promise.resolve(DishString.toArrayBuffer.bind(this)()), + [Dish.NUMBER]: () => Promise.resolve(DishNumber.toArrayBuffer.bind(this)()), + [Dish.HTML]: () => Promise.resolve(DishHTML.toArrayBuffer.bind(this)()), + [Dish.ARRAY_BUFFER]: () => Promise.resolve(), + [Dish.BIG_NUMBER]: () => Promise.resolve(DishBigNumber.toArrayBuffer.bind(this)()), + [Dish.JSON]: () => Promise.resolve(DishJSON.toArrayBuffer.bind(this)()), + [Dish.FILE]: () => DishFile.toArrayBuffer.bind(this)(), + [Dish.LIST_FILE]: () => Promise.resolve(DishListFile.toArrayBuffer.bind(this)()), + [Dish.BYTE_ARRAY]: () => Promise.resolve(DishByteArray.toArrayBuffer.bind(this)()) }, node: { - [Dish.STRING]: () => DishString.toArrayBuffer.bind(this)(), - [Dish.NUMBER]: () => DishNumber.toArrayBuffer.bind(this)(), - [Dish.HTML]: () => DishHTML.toArrayBuffer.bind(this)(), - [Dish.ARRAY_BUFFER]: () => {}, - [Dish.BIG_NUMBER]: () => DishBigNumber.toArrayBuffer.bind(this)(), - [Dish.JSON]: () => DishJSON.toArrayBuffer.bind(this)(), - [Dish.FILE]: () => DishFile.toArrayBuffer.bind(this)(), - [Dish.LIST_FILE]: () => DishListFile.toArrayBuffer.bind(this)(), - [Dish.BYTE_ARRAY]: () => DishByteArray.toArrayBuffer.bind(this)(), + [Dish.STRING]: () => DishString.toArrayBuffer.bind(this)(), + [Dish.NUMBER]: () => DishNumber.toArrayBuffer.bind(this)(), + [Dish.HTML]: () => DishHTML.toArrayBuffer.bind(this)(), + [Dish.ARRAY_BUFFER]: () => {}, + [Dish.BIG_NUMBER]: () => DishBigNumber.toArrayBuffer.bind(this)(), + [Dish.JSON]: () => DishJSON.toArrayBuffer.bind(this)(), + [Dish.FILE]: () => DishFile.toArrayBuffer.bind(this)(), + [Dish.LIST_FILE]: () => DishListFile.toArrayBuffer.bind(this)(), + [Dish.BYTE_ARRAY]: () => DishByteArray.toArrayBuffer.bind(this)() } }; try { - return toByteArrayFuncs[isNodeEnvironment() && "node" || "browser"][this.type](); + return toByteArrayFuncs[(isNodeEnvironment() && "node") || "browser"][this.type](); } catch (err) { throw new DishError(`Error translating from ${Dish.enumLookup(this.type)} to ArrayBuffer: ${err}`); } @@ -483,20 +464,19 @@ class Dish { * Convert this.value to the given type from ArrayBuffer * * @param {number} toType - the Dish enum to convert to - */ + */ _fromArrayBuffer(toType) { - // Using 'bind' here to allow this.value to be mutated within translation functions const toTypeFunctions = { - [Dish.STRING]: () => DishString.fromArrayBuffer.bind(this)(), - [Dish.NUMBER]: () => DishNumber.fromArrayBuffer.bind(this)(), - [Dish.HTML]: () => DishHTML.fromArrayBuffer.bind(this)(), - [Dish.ARRAY_BUFFER]: () => {}, - [Dish.BIG_NUMBER]: () => DishBigNumber.fromArrayBuffer.bind(this)(), - [Dish.JSON]: () => DishJSON.fromArrayBuffer.bind(this)(), - [Dish.FILE]: () => DishFile.fromArrayBuffer.bind(this)(), - [Dish.LIST_FILE]: () => DishListFile.fromArrayBuffer.bind(this)(), - [Dish.BYTE_ARRAY]: () => DishByteArray.fromArrayBuffer.bind(this)(), + [Dish.STRING]: () => DishString.fromArrayBuffer.bind(this)(), + [Dish.NUMBER]: () => DishNumber.fromArrayBuffer.bind(this)(), + [Dish.HTML]: () => DishHTML.fromArrayBuffer.bind(this)(), + [Dish.ARRAY_BUFFER]: () => {}, + [Dish.BIG_NUMBER]: () => DishBigNumber.fromArrayBuffer.bind(this)(), + [Dish.JSON]: () => DishJSON.fromArrayBuffer.bind(this)(), + [Dish.FILE]: () => DishFile.fromArrayBuffer.bind(this)(), + [Dish.LIST_FILE]: () => DishListFile.fromArrayBuffer.bind(this)(), + [Dish.BYTE_ARRAY]: () => DishByteArray.fromArrayBuffer.bind(this)() }; try { @@ -506,10 +486,8 @@ class Dish { throw new DishError(`Error translating from ArrayBuffer to ${Dish.enumLookup(toType)}: ${err}`); } } - } - /** * Dish data type enum for byte arrays. * @readonly @@ -559,11 +537,10 @@ Dish.JSON = 6; */ Dish.FILE = 7; /** -* Dish data type enum for lists of files. -* @readonly -* @enum -*/ + * Dish data type enum for lists of files. + * @readonly + * @enum + */ Dish.LIST_FILE = 8; - export default Dish; diff --git a/src/core/Ingredient.mjs b/src/core/Ingredient.mjs index 319dfb15..507d0174 100755 --- a/src/core/Ingredient.mjs +++ b/src/core/Ingredient.mjs @@ -5,21 +5,20 @@ */ import Utils from "./Utils.mjs"; -import {fromHex} from "./lib/Hex.mjs"; +import { fromHex } from "./lib/Hex.mjs"; /** * The arguments to operations. */ class Ingredient { - /** * Ingredient constructor * * @param {Object} ingredientConfig */ constructor(ingredientConfig) { - this.name = ""; - this.type = ""; + this.name = ""; + this.type = ""; this._value = null; this.disabled = false; this.hint = ""; @@ -37,7 +36,6 @@ class Ingredient { } } - /** * Reads and parses the given config. * @@ -60,7 +58,6 @@ class Ingredient { this.step = ingredientConfig.step; } - /** * Returns the value of the Ingredient as it should be displayed in a recipe config. * @@ -70,7 +67,6 @@ class Ingredient { return this._value; } - /** * Sets the value of the Ingredient. * @@ -80,7 +76,6 @@ class Ingredient { this._value = Ingredient.prepare(value, this.type); } - /** * Gets the value of the Ingredient. * @@ -90,14 +85,13 @@ class Ingredient { return this._value; } - /** * Most values will be strings when they are entered. This function converts them to the correct * type. * * @param {*} data * @param {string} type - The name of the data type. - */ + */ static prepare(data, type) { let number; @@ -126,7 +120,6 @@ class Ingredient { return data; } } - } export default Ingredient; diff --git a/src/core/Operation.mjs b/src/core/Operation.mjs index 24739d3f..f62aa7d6 100755 --- a/src/core/Operation.mjs +++ b/src/core/Operation.mjs @@ -11,29 +11,27 @@ import Ingredient from "./Ingredient.mjs"; * The Operation specified by the user to be run. */ class Operation { - /** * Operation constructor */ constructor() { // Private fields - this._inputType = -1; - this._outputType = -1; - this._presentType = -1; - this._breakpoint = false; - this._disabled = false; - this._flowControl = false; - this._manualBake = false; - this._ingList = []; + this._inputType = -1; + this._outputType = -1; + this._presentType = -1; + this._breakpoint = false; + this._disabled = false; + this._flowControl = false; + this._manualBake = false; + this._ingList = []; // Public fields - this.name = ""; - this.module = ""; - this.description = ""; - this.infoURL = null; + this.name = ""; + this.module = ""; + this.description = ""; + this.infoURL = null; } - /** * Interface for operation runner * @@ -45,7 +43,6 @@ class Operation { return input; } - /** * Interface for forward highlighter * @@ -59,7 +56,6 @@ class Operation { return false; } - /** * Interface for reverse highlighter * @@ -73,7 +69,6 @@ class Operation { return false; } - /** * Method to be called when displaying the result of an operation in a human-readable * format. This allows operations to return usable data from their run() method and @@ -90,7 +85,6 @@ class Operation { return data; } - /** * Sets the input type as a Dish enum. * @@ -100,7 +94,6 @@ class Operation { this._inputType = Dish.typeEnum(typeStr); } - /** * Gets the input type as a readable string. * @@ -110,7 +103,6 @@ class Operation { return Dish.enumLookup(this._inputType); } - /** * Sets the output type as a Dish enum. * @@ -121,7 +113,6 @@ class Operation { if (this._presentType < 0) this._presentType = this._outputType; } - /** * Gets the output type as a readable string. * @@ -131,7 +122,6 @@ class Operation { return Dish.enumLookup(this._outputType); } - /** * Sets the presentation type as a Dish enum. * @@ -141,7 +131,6 @@ class Operation { this._presentType = Dish.typeEnum(typeStr); } - /** * Gets the presentation type as a readable string. * @@ -151,27 +140,25 @@ class Operation { return Dish.enumLookup(this._presentType); } - /** * Sets the args for the current operation. * * @param {Object[]} conf */ set args(conf) { - conf.forEach(arg => { + conf.forEach((arg) => { const ingredient = new Ingredient(arg); this.addIngredient(ingredient); }); } - /** * Gets the args for the current operation. * * @param {Object[]} conf */ get args() { - return this._ingList.map(ing => { + return this._ingList.map((ing) => { const conf = { name: ing.name, type: ing.type, @@ -192,7 +179,6 @@ class Operation { }); } - /** * Returns the value of the Operation as it should be displayed in a recipe config. * @@ -201,11 +187,10 @@ class Operation { get config() { return { "op": this.name, - "args": this._ingList.map(ing => ing.config) + "args": this._ingList.map((ing) => ing.config) }; } - /** * Adds a new Ingredient to this Operation. * @@ -215,7 +200,6 @@ class Operation { this._ingList.push(ingredient); } - /** * Set the Ingredient values for this Operation. * @@ -227,17 +211,15 @@ class Operation { }); } - /** * Get the Ingredient values for this Operation. * * @returns {Object[]} */ get ingValues() { - return this._ingList.map(ing => ing.value); + return this._ingList.map((ing) => ing.value); } - /** * Set whether this Operation has a breakpoint. * @@ -247,7 +229,6 @@ class Operation { this._breakpoint = !!value; } - /** * Returns true if this Operation has a breakpoint set. * @@ -257,7 +238,6 @@ class Operation { return this._breakpoint; } - /** * Set whether this Operation is disabled. * @@ -267,7 +247,6 @@ class Operation { this._disabled = !!value; } - /** * Returns true if this Operation is disabled. * @@ -277,7 +256,6 @@ class Operation { return this._disabled; } - /** * Returns true if this Operation is a flow control. * @@ -287,7 +265,6 @@ class Operation { return this._flowControl; } - /** * Set whether this Operation is a flowcontrol op. * @@ -297,7 +274,6 @@ class Operation { this._flowControl = !!value; } - /** * Returns true if this Operation should not trigger AutoBake. * @@ -307,7 +283,6 @@ class Operation { return this._manualBake; } - /** * Set whether this Operation should trigger AutoBake. * @@ -316,7 +291,6 @@ class Operation { set manualBake(value) { this._manualBake = !!value; } - } export default Operation; diff --git a/src/core/Recipe.mjs b/src/core/Recipe.mjs index 3ce40aa4..1d02e592 100755 --- a/src/core/Recipe.mjs +++ b/src/core/Recipe.mjs @@ -4,7 +4,7 @@ * @license Apache-2.0 */ -import OperationConfig from "./config/OperationConfig.json" assert {type: "json"}; +import OperationConfig from "./config/OperationConfig.json" assert { type: "json" }; import OperationError from "./errors/OperationError.mjs"; import Operation from "./Operation.mjs"; import DishError from "./errors/DishError.mjs"; @@ -17,8 +17,7 @@ let modules = null; /** * The Recipe controls a list of Operations and the Dish they operate on. */ -class Recipe { - +class Recipe { /** * Recipe constructor * @@ -32,7 +31,6 @@ class Recipe { } } - /** * Reads and parses the given config. * @@ -40,18 +38,17 @@ class Recipe { * @param {Object} recipeConfig */ _parseConfig(recipeConfig) { - recipeConfig.forEach(c => { + recipeConfig.forEach((c) => { this.opList.push({ name: c.op, module: OperationConfig[c.op].module, ingValues: c.args, breakpoint: c.breakpoint, - disabled: c.disabled || c.op === "Comment", + disabled: c.disabled || c.op === "Comment" }); }); } - /** * Populate elements of opList with operation instances. * Dynamic import here removes top-level cyclic dependency issue. @@ -66,7 +63,7 @@ class Recipe { modules = modules.default; } - this.opList = this.opList.map(o => { + this.opList = this.opList.map((o) => { if (o instanceof Operation) { return o; } else { @@ -79,20 +76,18 @@ class Recipe { }); } - /** * Returns the value of the Recipe as it should be displayed in a recipe config. * * @returns {Object[]} */ get config() { - return this.opList.map(op => ({ + return this.opList.map((op) => ({ op: op.name, - args: op.ingValues, + args: op.ingValues })); } - /** * Adds a new Operation to this Recipe. * @@ -102,14 +97,13 @@ class Recipe { this.opList.push(operation); } - /** * Adds a list of Operations to this Recipe. * * @param {Operation[]} operations */ addOperations(operations) { - operations.forEach(o => { + operations.forEach((o) => { if (o instanceof Operation) { this.opList.push(o); } else { @@ -118,13 +112,12 @@ class Recipe { module: o.module, ingValues: o.args, breakpoint: o.breakpoint, - disabled: o.disabled, + disabled: o.disabled }); } }); } - /** * Set a breakpoint on a specified Operation. * @@ -139,7 +132,6 @@ class Recipe { } } - /** * Remove breakpoints on all Operations in the Recipe up to the specified position. Used by Flow * Control Fork operation. @@ -152,7 +144,6 @@ class Recipe { } } - /** * Returns true if there is a Flow Control Operation in this Recipe. * @@ -164,7 +155,6 @@ class Recipe { }, false); } - /** * Executes each operation in the recipe over the given Dish. * @@ -176,8 +166,10 @@ class Recipe { * @returns {number} * - The final progress through the recipe */ - async execute(dish, startFrom=0, forkState={}) { - let op, input, output, + async execute(dish, startFrom = 0, forkState = {}) { + let op, + input, + output, numJumps = 0, numRegisters = forkState.numRegisters || 0; @@ -204,19 +196,19 @@ class Recipe { log.debug(`Executing operation '${op.name}'`); if (isWorkerEnvironment()) { - self.sendStatusMessage(`Baking... (${i+1}/${this.opList.length})`); + self.sendStatusMessage(`Baking... (${i + 1}/${this.opList.length})`); self.sendProgressMessage(i + 1, this.opList.length); } if (op.flowControl) { // Package up the current state let state = { - "progress": i, - "dish": dish, - "opList": this.opList, - "numJumps": numJumps, + "progress": i, + "dish": dish, + "opList": this.opList, + "numJumps": numJumps, "numRegisters": numRegisters, - "forkOffset": forkState.forkOffset || 0 + "forkOffset": forkState.forkOffset || 0 }; state = await op.run(state); @@ -243,8 +235,9 @@ class Recipe { e.progress = i; if (e.fileName) { - e.displayStr = `${op.name} - ${e.name} in ${e.fileName} on line ` + - `${e.lineNumber}.

Message: ${e.displayStr || e.message}`; + e.displayStr + = `${op.name} - ${e.name} in ${e.fileName} on line ` + + `${e.lineNumber}.

Message: ${e.displayStr || e.message}`; } else { e.displayStr = `${op.name} - ${e.displayStr || e.message}`; } @@ -258,7 +251,6 @@ class Recipe { return this.opList.length; } - /** * Present the results of the final operation. * @@ -274,7 +266,6 @@ class Recipe { dish.set(output, this.lastRunOp.presentType); } - /** * Returns the recipe configuration in string format. * @@ -284,7 +275,6 @@ class Recipe { return JSON.stringify(this.config); } - /** * Creates a Recipe from a given configuration string. * @@ -295,7 +285,6 @@ class Recipe { this._parseConfig(recipeConfig); } - /** * Generates a list of all the highlight functions assigned to operations in the recipe, if the * entire recipe supports highlighting. @@ -329,7 +318,6 @@ class Recipe { return highlights; } - /** * Determines whether the previous operation has a different presentation type to its normal output. * @@ -338,9 +326,8 @@ class Recipe { */ lastOpPresented(progress) { if (progress < 1) return false; - return this.opList[progress-1].presentType !== this.opList[progress-1].outputType; + return this.opList[progress - 1].presentType !== this.opList[progress - 1].outputType; } - } export default Recipe; diff --git a/src/core/Utils.mjs b/src/core/Utils.mjs index 18b0e688..7f1a943d 100755 --- a/src/core/Utils.mjs +++ b/src/core/Utils.mjs @@ -7,16 +7,15 @@ // loglevel import required for Node API import log from "loglevel"; import utf8 from "utf8"; -import {fromBase64, toBase64} from "./lib/Base64.mjs"; -import {fromHex} from "./lib/Hex.mjs"; -import {fromDecimal} from "./lib/Decimal.mjs"; -import {fromBinary} from "./lib/Binary.mjs"; +import { fromBase64, toBase64 } from "./lib/Base64.mjs"; +import { fromHex } from "./lib/Hex.mjs"; +import { fromDecimal } from "./lib/Decimal.mjs"; +import { fromBinary } from "./lib/Binary.mjs"; /** * Utility functions for use in operations, the core framework and the stage. */ class Utils { - /** * Translates an ordinal into a character. * @@ -33,15 +32,14 @@ class Utils { // https://mathiasbynens.be/notes/javascript-unicode if (o > 0xffff) { o -= 0x10000; - const high = String.fromCharCode(o >>> 10 & 0x3ff | 0xd800); - o = 0xdc00 | o & 0x3ff; + const high = String.fromCharCode(((o >>> 10) & 0x3ff) | 0xd800); + o = 0xdc00 | (o & 0x3ff); return high + String.fromCharCode(o); } return String.fromCharCode(o); } - /** * Translates a character into an ordinal. * @@ -59,8 +57,7 @@ class Utils { if (c.length === 2) { const high = c.charCodeAt(0); const low = c.charCodeAt(1); - if (high >= 0xd800 && high < 0xdc00 && - low >= 0xdc00 && low < 0xe000) { + if (high >= 0xd800 && high < 0xdc00 && low >= 0xdc00 && low < 0xe000) { return (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000; } } @@ -68,7 +65,6 @@ class Utils { return c.charCodeAt(0); } - /** * Adds trailing bytes to a byteArray. * @@ -92,7 +88,7 @@ class Utils { * // returns ["t", "e", "s", "t", 1, 1, 1, 1] * Utils.padBytesRight("test", 8, 1); */ - static padBytesRight(arr, numBytes, padByte=0) { + static padBytesRight(arr, numBytes, padByte = 0) { const paddedBytes = new Array(numBytes); paddedBytes.fill(padByte); @@ -103,7 +99,6 @@ class Utils { return paddedBytes; } - /** * Truncates a long string to max length and adds suffix. * @@ -119,14 +114,13 @@ class Utils { * // returns "A long s-" * Utils.truncate("A long string", 9, "-"); */ - static truncate(str, max, suffix="...") { + static truncate(str, max, suffix = "...") { if (str.length > max) { str = str.slice(0, max - suffix.length) + suffix; } return str; } - /** * Converts a character or number to its hex representation. * @@ -141,12 +135,11 @@ class Utils { * // returns "6e" * Utils.hex(110); */ - static hex(c, length=2) { + static hex(c, length = 2) { c = typeof c == "string" ? Utils.ord(c) : c; return c.toString(16).padStart(length, "0"); } - /** * Converts a character or number to its binary representation. * @@ -161,12 +154,11 @@ class Utils { * // returns "01101110" * Utils.bin(110); */ - static bin(c, length=8) { + static bin(c, length = 8) { c = typeof c == "string" ? Utils.ord(c) : c; return c.toString(2).padStart(length, "0"); } - /** * Returns a string with all non-printable chars as dots, optionally preserving whitespace. * @@ -175,13 +167,13 @@ class Utils { * @param {boolean} [onlyAscii=false] - Whether or not to replace non ASCII characters. * @returns {string} */ - static printable(str, preserveWs=false, onlyAscii=false) { + static printable(str, preserveWs = false, onlyAscii = false) { if (onlyAscii) { return str.replace(/[^\x20-\x7f]/g, "."); } - // eslint-disable-next-line no-misleading-character-class - const re = /[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g; + const re + = /[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g; // eslint-disable-line no-misleading-character-class const wsRe = /[\x09-\x10\u2028\u2029]/g; str = str.replace(re, "."); @@ -189,7 +181,6 @@ class Utils { return str; } - /** * Returns a string with whitespace represented as special characters from the * Unicode Private Use Area, which CyberChef will display as control characters. @@ -199,12 +190,11 @@ class Utils { * @returns {string} */ static escapeWhitespace(str) { - return str.replace(/[\x09-\x10]/g, function(c) { + return str.replace(/[\x09-\x10]/g, function (c) { return String.fromCharCode(0xe000 + c.charCodeAt(0)); }); } - /** * Parse a string entered by a user and replace escaped chars with the bytes they represent. * @@ -219,49 +209,49 @@ class Utils { * Utils.parseEscapedChars("\\n"); */ static parseEscapedChars(str) { - return str.replace(/\\([abfnrtv'"]|[0-3][0-7]{2}|[0-7]{1,2}|x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]{1,6}\}|\\)/g, function(m, a) { - switch (a[0]) { - case "\\": - return "\\"; - case "0": - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - return String.fromCharCode(parseInt(a, 8)); - case "a": - return String.fromCharCode(7); - case "b": - return "\b"; - case "t": - return "\t"; - case "n": - return "\n"; - case "v": - return "\v"; - case "f": - return "\f"; - case "r": - return "\r"; - case '"': - return '"'; - case "'": - return "'"; - case "x": - return String.fromCharCode(parseInt(a.substr(1), 16)); - case "u": - if (a[1] === "{") - return String.fromCodePoint(parseInt(a.slice(2, -1), 16)); - else + return str.replace( + /\\([abfnrtv'"]|[0-3][0-7]{2}|[0-7]{1,2}|x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]{1,6}\}|\\)/g, + function (m, a) { + switch (a[0]) { + case "\\": + return "\\"; + case "0": + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + return String.fromCharCode(parseInt(a, 8)); + case "a": + return String.fromCharCode(7); + case "b": + return "\b"; + case "t": + return "\t"; + case "n": + return "\n"; + case "v": + return "\v"; + case "f": + return "\f"; + case "r": + return "\r"; + case '"': + return '"'; + case "'": + return "'"; + case "x": return String.fromCharCode(parseInt(a.substr(1), 16)); + case "u": + if (a[1] === "{") return String.fromCodePoint(parseInt(a.slice(2, -1), 16)); + else return String.fromCharCode(parseInt(a.substr(1), 16)); + } } - }); + ); } - /** * Escape a string containing regex control characters so that it can be safely * used in a regex without causing unintended behaviours. @@ -277,7 +267,6 @@ class Utils { return str.replace(/([.*+?^=!:${}()|[\]/\\])/g, "\\$1"); } - /** * Expand an alphabet range string into a list of the characters in that range. * @@ -298,19 +287,15 @@ class Utils { const alphArr = []; for (let i = 0; i < alphStr.length; i++) { - if (i < alphStr.length - 2 && - alphStr[i+1] === "-" && - alphStr[i] !== "\\") { + if (i < alphStr.length - 2 && alphStr[i + 1] === "-" && alphStr[i] !== "\\") { const start = Utils.ord(alphStr[i]), - end = Utils.ord(alphStr[i+2]); + end = Utils.ord(alphStr[i + 2]); for (let j = start; j <= end; j++) { alphArr.push(Utils.chr(j)); } i += 2; - } else if (i < alphStr.length - 2 && - alphStr[i] === "\\" && - alphStr[i+1] === "-") { + } else if (i < alphStr.length - 2 && alphStr[i] === "\\" && alphStr[i + 1] === "-") { alphArr.push("-"); i++; } else { @@ -320,7 +305,6 @@ class Utils { return alphArr; } - /** * Coverts data of varying types to a byteArray. * Accepts hex, Base64, UTF8 and Latin1 strings. @@ -357,7 +341,6 @@ class Utils { } } - /** * Coverts data of varying types to a byte string. * Accepts hex, Base64, UTF8 and Latin1 strings. @@ -394,7 +377,6 @@ class Utils { } } - /** * Converts a byte array to an integer. * @@ -413,17 +395,16 @@ class Utils { let value = 0; if (byteorder === "big") { for (let i = 0; i < byteArray.length; i++) { - value = (value * 256) + byteArray[i]; + value = value * 256 + byteArray[i]; } } else { for (let i = byteArray.length - 1; i >= 0; i--) { - value = (value * 256) + byteArray[i]; + value = value * 256 + byteArray[i]; } } return value; } - /** * Converts an integer to a byte array of {length} bytes. * @@ -446,19 +427,18 @@ class Utils { const arr = new Array(length); if (byteorder === "little") { for (let i = 0; i < length; i++) { - arr[i] = value & 0xFF; + arr[i] = value & 0xff; value = value >>> 8; } } else { for (let i = length - 1; i >= 0; i--) { - arr[i] = value & 0xFF; + arr[i] = value & 0xff; value = value >>> 8; } } return arr; } - /** * Converts a string to an ArrayBuffer. * Treats the string as UTF-8 if any values are over 255. @@ -475,10 +455,11 @@ class Utils { */ static strToArrayBuffer(str) { log.debug(`Converting string[${str?.length}] to array buffer`); - if (!str) return new ArrayBuffer; + if (!str) return new ArrayBuffer(); const arr = new Uint8Array(str.length); - let i = str.length, b; + let i = str.length, + b; while (i--) { b = str.charCodeAt(i); arr[i] = b; @@ -488,7 +469,6 @@ class Utils { return arr.buffer; } - /** * Converts a string to a UTF-8 ArrayBuffer. * @@ -504,7 +484,7 @@ class Utils { */ static strToUtf8ArrayBuffer(str) { log.debug(`Converting string[${str?.length}] to UTF8 array buffer`); - if (!str) return new ArrayBuffer; + if (!str) return new ArrayBuffer(); const buffer = new TextEncoder("utf-8").encode(str); @@ -519,7 +499,6 @@ class Utils { return buffer.buffer; } - /** * Converts a string to a byte array. * Treats the string as UTF-8 if any values are over 255. @@ -538,7 +517,8 @@ class Utils { log.debug(`Converting string[${str?.length}] to byte array`); if (!str) return []; const byteArray = new Array(str.length); - let i = str.length, b; + let i = str.length, + b; while (i--) { b = str.charCodeAt(i); byteArray[i] = b; @@ -548,7 +528,6 @@ class Utils { return byteArray; } - /** * Converts a string to a UTF-8 byte array. * @@ -578,7 +557,6 @@ class Utils { return Utils.strToByteArray(utf8Str); } - /** * Converts a string to a unicode charcode array * @@ -614,7 +592,6 @@ class Utils { return charcode; } - /** * Attempts to convert a byte array to a UTF-8 string. * @@ -631,11 +608,10 @@ class Utils { static byteArrayToUtf8(byteArray) { log.debug(`Converting byte array[${byteArray?.length}] to UTF8`); if (!byteArray || !byteArray.length) return ""; - if (!(byteArray instanceof Uint8Array)) - byteArray = new Uint8Array(byteArray); + if (!(byteArray instanceof Uint8Array)) byteArray = new Uint8Array(byteArray); try { - const str = new TextDecoder("utf-8", {fatal: true}).decode(byteArray); + const str = new TextDecoder("utf-8", { fatal: true }).decode(byteArray); if (str.length !== byteArray.length) { if (isWorkerEnvironment()) { @@ -652,7 +628,6 @@ class Utils { } } - /** * Converts a charcode array to a string. * @@ -673,12 +648,11 @@ class Utils { // Maxiumum arg length for fromCharCode is 65535, but the stack may already be fairly deep, // so don't get too near it. for (let i = 0; i < byteArray.length; i += 20000) { - str += String.fromCharCode(...(byteArray.slice(i, i+20000))); + str += String.fromCharCode(...byteArray.slice(i, i + 20000)); } return str; } - /** * Converts an ArrayBuffer to a string. * @@ -690,7 +664,7 @@ class Utils { * // returns "hello" * Utils.arrayBufferToStr(Uint8Array.from([104,101,108,108,111]).buffer); */ - static arrayBufferToStr(arrayBuffer, utf8=true) { + static arrayBufferToStr(arrayBuffer, utf8 = true) { log.debug(`Converting array buffer[${arrayBuffer?.byteLength}] to str`); if (!arrayBuffer || !arrayBuffer.byteLength) return ""; const arr = new Uint8Array(arrayBuffer); @@ -729,13 +703,12 @@ class Utils { for (i = 0; i < prob.length; i++) { p = prob[i]; - entropy += p * Math.log(p) / Math.log(2); + entropy += (p * Math.log(p)) / Math.log(2); } return -entropy; } - /** * Parses CSV data and returns it as a two dimensional array or strings. * @@ -748,7 +721,7 @@ class Utils { * // returns [["head1", "head2"], ["data1", "data2"]] * Utils.parseCSV("head1,head2\ndata1,data2"); */ - static parseCSV(data, cellDelims=[","], lineDelims=["\n", "\r"]) { + static parseCSV(data, cellDelims = [","], lineDelims = ["\n", "\r"]) { let b, next, renderNext = false, @@ -762,14 +735,14 @@ class Utils { for (let i = 0; i < data.length; i++) { b = data[i]; - next = data[i+1] || ""; + next = data[i + 1] || ""; if (renderNext) { cell += b; renderNext = false; - } else if (b === "\"" && !inString) { + } else if (b === '"' && !inString) { inString = true; - } else if (b === "\"" && inString) { - if (next === "\"") renderNext = true; + } else if (b === '"' && inString) { + if (next === '"') renderNext = true; else inString = false; } else if (!inString && cellDelims.indexOf(b) >= 0) { line.push(cell); @@ -796,7 +769,6 @@ class Utils { return lines; } - /** * Removes all HTML (or XML) tags from the input string. * @@ -809,7 +781,7 @@ class Utils { * // returns "Test" * Utils.stripHtmlTags("
Test
"); */ - static stripHtmlTags(htmlStr, removeScriptAndStyle=false) { + static stripHtmlTags(htmlStr, removeScriptAndStyle = false) { /** * Recursively remove a pattern from a string until there are no more matches. * Avoids incomplete sanitization e.g. "aabcbc".replace(/abc/g, "") === "abc" @@ -830,7 +802,6 @@ class Utils { return recursiveRemove(/<[^>]+>/g, htmlStr); } - /** * Escapes HTML tags in a string to stop them being rendered. * https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet @@ -858,12 +829,13 @@ class Utils { "\u0000": "\ue000" }; - return str ? str.replace(/[&<>"'`\u0000]/g, function (match) { - return HTML_CHARS[match]; - }) : str; + return str + ? str.replace(/[&<>"'`\u0000]/g, function (match) { + return HTML_CHARS[match]; + }) + : str; } - /** * Unescapes HTML tags in a string to make them render again. * @@ -876,9 +848,9 @@ class Utils { */ static unescapeHtml(str) { const HTML_CHARS = { - "&": "&", - "<": "<", - ">": ">", + "&": "&", + "<": "<", + ">": ">", """: '"', "'": "'", "/": "/", @@ -886,12 +858,11 @@ class Utils { "\ue000": "\u0000" }; - return str.replace(/(&#?x?[a-z0-9]{2,4};|\ue000)/ig, function (match) { + return str.replace(/(&#?x?[a-z0-9]{2,4};|\ue000)/gi, function (match) { return HTML_CHARS[match] || match; }); } - /** * Converts a string to it's title case equivalent. * @@ -903,12 +874,11 @@ class Utils { * Utils.toTitleCase("a tIny String"); */ static toTitleCase(str) { - return str.replace(/\w\S*/g, function(txt) { + return str.replace(/\w\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }); } - /** * Encodes a URI fragment (#) or query (?) using a minimal amount of percent-encoding. * @@ -960,7 +930,6 @@ class Utils { }); } - /** * Generates a "pretty" recipe format from a recipeConfig object. * @@ -982,7 +951,7 @@ class Utils { disabled = "", bp = ""; - recipeConfig.forEach(op => { + recipeConfig.forEach((op) => { name = op.op.replace(/ /g, "_"); args = JSON.stringify(op.args) .slice(1, -1) // Remove [ and ] as they are implied @@ -992,7 +961,7 @@ class Utils { .replace(/"((?:[^"\\]|\\.)*)"/g, "'$1'") // Replace opening and closing " with ' .replace(/\\"/g, '"'); // Unescape double quotes - disabled = op.disabled ? "/disabled": ""; + disabled = op.disabled ? "/disabled" : ""; bp = op.breakpoint ? "/breakpoint" : ""; prettyConfig += `${name}(${args}${disabled}${bp})`; if (newline) prettyConfig += "\n"; @@ -1000,7 +969,6 @@ class Utils { return prettyConfig; } - /** * Converts a recipe string to the JSON representation of the recipe. * Accepts either stringified JSON or the bespoke "pretty" recipe format. @@ -1039,7 +1007,6 @@ class Utils { return recipeConfig; } - /** * Formats a list of files or directories. * @@ -1050,7 +1017,7 @@ class Utils { * @returns {html} */ static async displayFilesAsHTML(files) { - const formatDirectory = function(file) { + const formatDirectory = function (file) { const html = `
@@ -1072,12 +1039,9 @@ class Utils { } }; - const formatFile = async function(file, i) { + const formatFile = async function (file, i) { const buff = await Utils.readFile(file); - const blob = new Blob( - [buff], - {type: file.type || "octet/stream"} - ); + const blob = new Blob([buff], { type: file.type || "octet/stream" }); const blobURL = URL.createObjectURL(blob); const html = `
@@ -1130,10 +1094,9 @@ class Utils { } } - return html += "
"; + return (html += "
"); } - /** * Parses URI parameters into a JSON object. * @@ -1149,8 +1112,7 @@ class Utils { if (paramStr === "") return {}; // Cut off ? or # and split on & - if (paramStr[0] === "?" || - paramStr[0] === "#") { + if (paramStr[0] === "?" || paramStr[0] === "#") { paramStr = paramStr.substr(1); } @@ -1169,7 +1131,6 @@ class Utils { return result; } - /** * Reads a File and returns the data as a Uint8Array. * @@ -1181,10 +1142,8 @@ class Utils { * await Utils.readFile(new File(["hello"], "test")) */ static readFile(file) { - if (isNodeEnvironment()) { return Buffer.from(file).buffer; - } else { return new Promise((resolve, reject) => { const reader = new FileReader(); @@ -1192,7 +1151,7 @@ class Utils { let offset = 0; const CHUNK_SIZE = 10485760; // 10MiB - const seek = function() { + const seek = function () { if (offset >= file.size) { resolve(data); return; @@ -1201,13 +1160,13 @@ class Utils { reader.readAsArrayBuffer(slice); }; - reader.onload = function(e) { + reader.onload = function (e) { data.set(new Uint8Array(reader.result), offset); offset += CHUNK_SIZE; seek(); }; - reader.onerror = function(e) { + reader.onerror = function (e) { reject(reader.error.message); }; @@ -1234,7 +1193,6 @@ class Utils { return arrayBuffer.buffer; } - /** * Actual modulo function, since % is actually the remainder function in JS. * @@ -1247,7 +1205,6 @@ class Utils { return ((x % y) + y) % y; } - /** * Finds the greatest common divisor of two numbers. * @@ -1263,7 +1220,6 @@ class Utils { return Utils.gcd(y, x % y); } - /** * Finds the modular inverse of two values. * @@ -1281,7 +1237,6 @@ class Utils { } } - /** * A mapping of names of delimiter characters to their symbols. * @@ -1290,24 +1245,23 @@ class Utils { */ static charRep(token) { return { - "Space": " ", - "Percent": "%", - "Comma": ",", - "Semi-colon": ";", - "Colon": ":", - "Tab": "\t", - "Line feed": "\n", - "CRLF": "\r\n", + "Space": " ", + "Percent": "%", + "Comma": ",", + "Semi-colon": ";", + "Colon": ":", + "Tab": "\t", + "Line feed": "\n", + "CRLF": "\r\n", "Forward slash": "/", - "Backslash": "\\", - "0x": "0x", - "\\x": "\\x", + "Backslash": "\\", + "0x": "0x", + "\\x": "\\x", "Nothing (separate chars)": "", - "None": "", + "None": "" }[token]; } - /** * A mapping of names of delimiter characters to regular expressions which can select them. * @@ -1316,19 +1270,19 @@ class Utils { */ static regexRep(token) { return { - "Space": /\s+/g, - "Percent": /%/g, - "Comma": /,/g, - "Semi-colon": /;/g, - "Colon": /:/g, - "Line feed": /\n/g, - "CRLF": /\r\n/g, + "Space": /\s+/g, + "Percent": /%/g, + "Comma": /,/g, + "Semi-colon": /;/g, + "Colon": /:/g, + "Line feed": /\n/g, + "CRLF": /\r\n/g, "Forward slash": /\//g, - "Backslash": /\\/g, + "Backslash": /\\/g, "0x with comma": /,?0x/g, - "0x": /0x/g, - "\\x": /\\x/g, - "None": /\s+/g // Included here to remove whitespace when there shouldn't be any + "0x": /0x/g, + "\\x": /\\x/g, + "None": /\s+/g // Included here to remove whitespace when there shouldn't be any }[token]; } @@ -1338,7 +1292,7 @@ class Utils { * @param {Iterable} iterable * @param {number} chunksize */ - static* chunked(iterable, chunksize) { + static *chunked(iterable, chunksize) { const iterator = iterable[Symbol.iterator](); while (true) { const res = []; @@ -1369,7 +1323,7 @@ export function isNodeEnvironment() { /** * Check whether the code is running in a web environment * @returns {boolean} -*/ + */ export function isWebEnvironment() { return typeof window === "object"; } @@ -1377,14 +1331,13 @@ export function isWebEnvironment() { /** * Check whether the code is running in a worker * @returns {boolean} -*/ + */ export function isWorkerEnvironment() { return typeof importScripts === "function"; } export default Utils; - /** * Removes all duplicates from an array. * @@ -1397,8 +1350,9 @@ export default Utils; * // returns ["One", "Two", "Three"] * ["One", "Two", "Three", "One"].unique(); */ -Array.prototype.unique = function() { - const u = {}, a = []; +Array.prototype.unique = function () { + const u = {}, + a = []; for (let i = 0, l = this.length; i < l; i++) { if (Object.prototype.hasOwnProperty.call(u, this[i])) { continue; @@ -1409,7 +1363,6 @@ Array.prototype.unique = function() { return a; }; - /** * Returns the largest value in the array. * @@ -1419,11 +1372,10 @@ Array.prototype.unique = function() { * // returns 7 * [4,2,5,3,7].max(); */ -Array.prototype.max = function() { +Array.prototype.max = function () { return Math.max.apply(null, this); }; - /** * Returns the smallest value in the array. * @@ -1433,11 +1385,10 @@ Array.prototype.max = function() { * // returns 2 * [4,2,5,3,7].min(); */ -Array.prototype.min = function() { +Array.prototype.min = function () { return Math.min.apply(null, this); }; - /** * Sums all the values in an array. * @@ -1447,13 +1398,12 @@ Array.prototype.min = function() { * // returns 21 * [4,2,5,3,7].sum(); */ -Array.prototype.sum = function() { +Array.prototype.sum = function () { return this.reduce(function (a, b) { return a + b; }, 0); }; - /** * Determine whether two arrays are equal or not. * @@ -1467,7 +1417,7 @@ Array.prototype.sum = function() { * // returns false * [1,2,3].equals([3,2,1]); */ -Array.prototype.equals = function(other) { +Array.prototype.equals = function (other) { if (!other) return false; let i = this.length; if (i !== other.length) return false; @@ -1477,7 +1427,6 @@ Array.prototype.equals = function(other) { return true; }; - /** * Counts the number of times a char appears in a string. * @@ -1488,21 +1437,18 @@ Array.prototype.equals = function(other) { * // returns 2 * "Hello".count("l"); */ -String.prototype.count = function(chr) { +String.prototype.count = function (chr) { return this.split(chr).length - 1; }; - /** * Wrapper for self.sendStatusMessage to handle different environments. * * @param {string} msg */ export function sendStatusMessage(msg) { - if (isWorkerEnvironment()) - self.sendStatusMessage(msg); - else if (isWebEnvironment()) - app.alert(msg, 10000); + if (isWorkerEnvironment()) self.sendStatusMessage(msg); + else if (isWebEnvironment()) app.alert(msg, 10000); else if (isNodeEnvironment() && !global.TESTING) // eslint-disable-next-line no-console console.debug(msg); @@ -1523,8 +1469,8 @@ const debounceTimeouts = {}; * @returns {function} */ export function debounce(func, wait, id, scope, args) { - return function() { - const later = function() { + return function () { + const later = function () { func.apply(scope, args); }; clearTimeout(debounceTimeouts[id]); @@ -1532,7 +1478,6 @@ export function debounce(func, wait, id, scope, args) { }; } - /* * Polyfills */ @@ -1541,33 +1486,32 @@ export function debounce(func, wait, id, scope, args) { // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart if (!String.prototype.padStart) { String.prototype.padStart = function padStart(targetLength, padString) { - targetLength = targetLength>>0; // floor if number or convert non-number to 0; - padString = String((typeof padString !== "undefined" ? padString : " ")); + targetLength = targetLength >> 0; // floor if number or convert non-number to 0; + padString = String(typeof padString !== "undefined" ? padString : " "); if (this.length > targetLength) { return String(this); } else { - targetLength = targetLength-this.length; + targetLength = targetLength - this.length; if (targetLength > padString.length) { - padString += padString.repeat(targetLength/padString.length); // append to original to ensure we are longer than needed + padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed } return padString.slice(0, targetLength) + String(this); } }; } - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd if (!String.prototype.padEnd) { String.prototype.padEnd = function padEnd(targetLength, padString) { - targetLength = targetLength>>0; // floor if number or convert non-number to 0; - padString = String((typeof padString !== "undefined" ? padString : " ")); + targetLength = targetLength >> 0; // floor if number or convert non-number to 0; + padString = String(typeof padString !== "undefined" ? padString : " "); if (this.length > targetLength) { return String(this); } else { - targetLength = targetLength-this.length; + targetLength = targetLength - this.length; if (targetLength > padString.length) { - padString += padString.repeat(targetLength/padString.length); // append to original to ensure we are longer than needed + padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed } return String(this) + padString.slice(0, targetLength); } diff --git a/src/core/config/scripts/generateConfig.mjs b/src/core/config/scripts/generateConfig.mjs index 64c7cb81..c961fe10 100644 --- a/src/core/config/scripts/generateConfig.mjs +++ b/src/core/config/scripts/generateConfig.mjs @@ -12,7 +12,7 @@ /* eslint no-console: ["off"] */ import path from "path"; -import fs from "fs"; +import fs from "fs"; import process from "process"; import * as Ops from "../../operations/index.mjs"; @@ -24,7 +24,6 @@ if (!fs.existsSync(dir)) { process.exit(1); } - const operationConfig = {}, modules = {}; @@ -35,33 +34,27 @@ for (const opObj in Ops) { const op = new Ops[opObj](); operationConfig[op.name] = { - module: op.module, + module: op.module, description: op.description, - infoURL: op.infoURL, - inputType: op.inputType, - outputType: op.presentType, + infoURL: op.infoURL, + inputType: op.inputType, + outputType: op.presentType, flowControl: op.flowControl, - manualBake: op.manualBake, - args: op.args, - checks: op.checks + manualBake: op.manualBake, + args: op.args, + checks: op.checks }; - if (!(op.module in modules)) - modules[op.module] = {}; + if (!(op.module in modules)) modules[op.module] = {}; modules[op.module][op.name] = opObj; } - /** * Write OperationConfig. */ -fs.writeFileSync( - path.join(dir, "OperationConfig.json"), - JSON.stringify(operationConfig, null, 4) -); +fs.writeFileSync(path.join(dir, "OperationConfig.json"), JSON.stringify(operationConfig, null, 4)); console.log("Written OperationConfig.json"); - /** * Write modules. */ @@ -98,14 +91,10 @@ OpModules.${module} = { export default OpModules; `; - fs.writeFileSync( - path.join(dir, `modules/${module}.mjs`), - code - ); + fs.writeFileSync(path.join(dir, `modules/${module}.mjs`), code); console.log(`Written ${module} module`); } - /** * Write OpModules wrapper. */ @@ -140,8 +129,5 @@ opModulesCode += `); export default OpModules; `; -fs.writeFileSync( - path.join(dir, "modules/OpModules.mjs"), - opModulesCode -); +fs.writeFileSync(path.join(dir, "modules/OpModules.mjs"), opModulesCode); console.log("Written OpModules.mjs"); diff --git a/src/core/config/scripts/generateOpsIndex.mjs b/src/core/config/scripts/generateOpsIndex.mjs index 750ee6f4..edaea565 100644 --- a/src/core/config/scripts/generateOpsIndex.mjs +++ b/src/core/config/scripts/generateOpsIndex.mjs @@ -10,7 +10,7 @@ /* eslint no-console: ["off"] */ import path from "path"; -import fs from "fs"; +import fs from "fs"; import process from "process"; const dir = path.join(process.cwd() + "/src/core/config/"); @@ -23,7 +23,7 @@ if (!fs.existsSync(dir)) { // Find all operation files const opObjs = []; -fs.readdirSync(path.join(dir, "../operations")).forEach(file => { +fs.readdirSync(path.join(dir, "../operations")).forEach((file) => { if (!file.endsWith(".mjs") || file === "index.mjs") return; opObjs.push(file.split(".mjs")[0]); }); @@ -38,7 +38,7 @@ let code = `/** */ `; -opObjs.forEach(obj => { +opObjs.forEach((obj) => { code += `import ${obj} from "./${obj}.mjs";\n`; }); @@ -46,15 +46,12 @@ code += ` export { `; -opObjs.forEach(obj => { +opObjs.forEach((obj) => { code += ` ${obj},\n`; }); code += "};\n"; // Write file -fs.writeFileSync( - path.join(dir, "../operations/index.mjs"), - code -); +fs.writeFileSync(path.join(dir, "../operations/index.mjs"), code); console.log("Written operation index."); diff --git a/src/core/config/scripts/newMinorVersion.mjs b/src/core/config/scripts/newMinorVersion.mjs index 67754890..b26a239f 100644 --- a/src/core/config/scripts/newMinorVersion.mjs +++ b/src/core/config/scripts/newMinorVersion.mjs @@ -11,7 +11,7 @@ import prompt from "prompt"; import colors from "colors"; import path from "path"; -import fs from "fs"; +import fs from "fs"; import process from "process"; const dir = path.join(process.cwd() + "/src/core/config/"); @@ -24,16 +24,12 @@ if (!fs.existsSync(dir)) { let changelogData = fs.readFileSync(path.join(process.cwd(), "CHANGELOG.md"), "utf8"); const lastVersion = changelogData.match(/## Details\s+### \[(\d+)\.(\d+)\.(\d+)\]/); -const newVersion = [ - parseInt(lastVersion[1], 10), - parseInt(lastVersion[2], 10) + 1, - 0 -]; +const newVersion = [parseInt(lastVersion[1], 10), parseInt(lastVersion[2], 10) + 1, 0]; let knownContributors = changelogData.match(/^\[@([^\]]+)\]/gm); -knownContributors = knownContributors.map(c => c.slice(2, -1)); +knownContributors = knownContributors.map((c) => c.slice(2, -1)); -const date = (new Date()).toISOString().split("T")[0]; +const date = new Date().toISOString().split("T")[0]; const schema = { properties: { @@ -42,7 +38,7 @@ const schema = { example: "Added 'Op name' operation", prompt: "Feature description", type: "string", - required: true, + required: true }, author: { description: "The author of the feature (only one supported, edit manually to add more)", @@ -62,7 +58,7 @@ const schema = { example: "y", prompt: "Add another feature?", type: "string", - pattern: /^[yn]$/, + pattern: /^[yn]$/ } } }; @@ -70,7 +66,8 @@ const schema = { // Build schema for (const prop in schema.properties) { const p = schema.properties[prop]; - p.description = "\n" + colors.white(p.description) + colors.cyan("\nExample: " + p.example) + "\n" + colors.green(p.prompt); + p.description + = "\n" + colors.white(p.description) + colors.cyan("\nExample: " + p.example) + "\n" + colors.green(p.prompt); } prompt.message = ""; @@ -83,7 +80,7 @@ const commitIDs = []; prompt.start(); -const getFeature = function() { +const getFeature = function () { prompt.get(schema, (err, result) => { if (err) { console.log("\nExiting script."); @@ -97,7 +94,7 @@ const getFeature = function() { } else { let message = `### [${newVersion[0]}.${newVersion[1]}.${newVersion[2]}] - ${date}\n`; - features.forEach(feature => { + features.forEach((feature) => { const id = feature.id.length > 10 ? feature.id.slice(0, 7) : "#" + feature.id; message += `- ${feature.message} [@${feature.author}] | [${id}]\n`; @@ -120,18 +117,27 @@ const getFeature = function() { changelogData = changelogData.replace(/\n\n(\[\d+\.\d+\.\d+\]: https)/, "\n\n" + newTag + "$1"); // Author - authors.forEach(author => { - changelogData = changelogData.replace(/(\n\[@[^\]]+\]: https:\/\/github\.com\/[^\n]+\n)\n/, "$1" + author + "\n\n"); + authors.forEach((author) => { + changelogData = changelogData.replace( + /(\n\[@[^\]]+\]: https:\/\/github\.com\/[^\n]+\n)\n/, + "$1" + author + "\n\n" + ); }); // Commit IDs - commitIDs.forEach(commitID => { - changelogData = changelogData.replace(/(\n\[[^\].]+\]: https:\/\/github.com\/gchq\/CyberChef\/commit\/[^\n]+\n)\n/, "$1" + commitID + "\n\n"); + commitIDs.forEach((commitID) => { + changelogData = changelogData.replace( + /(\n\[[^\].]+\]: https:\/\/github.com\/gchq\/CyberChef\/commit\/[^\n]+\n)\n/, + "$1" + commitID + "\n\n" + ); }); // PR IDs - prIDs.forEach(prID => { - changelogData = changelogData.replace(/(\n\[#[^\]]+\]: https:\/\/github.com\/gchq\/CyberChef\/pull\/[^\n]+\n)\n*$/, "$1" + prID + "\n\n"); + prIDs.forEach((prID) => { + changelogData = changelogData.replace( + /(\n\[#[^\]]+\]: https:\/\/github.com\/gchq\/CyberChef\/pull\/[^\n]+\n)\n*$/, + "$1" + prID + "\n\n" + ); }); fs.writeFileSync(path.join(process.cwd(), "CHANGELOG.md"), changelogData); diff --git a/src/core/config/scripts/newOperation.mjs b/src/core/config/scripts/newOperation.mjs index fddeff97..c5389f38 100644 --- a/src/core/config/scripts/newOperation.mjs +++ b/src/core/config/scripts/newOperation.mjs @@ -15,7 +15,6 @@ import fs from "fs"; import path from "path"; import EscapeString from "../../operations/EscapeString.mjs"; - const dir = path.join(process.cwd() + "/src/core/operations/"); if (!fs.existsSync(dir)) { console.log("\nCWD: " + process.cwd()); @@ -48,16 +47,19 @@ If your operation does not rely on a library, just leave this blank and it will default: "Default" }, description: { - description: "The description should explain what the operation is and how it works. It can describe how the arguments should be entered and give examples of expected input and output. HTML markup is supported. Use tags for examples. The description is scanned during searches, so include terms that are likely to be searched for when someone is looking for your operation.", - example: "Converts URI/URL percent-encoded characters back to their raw values.

e.g. %3d becomes =", + description: + "The description should explain what the operation is and how it works. It can describe how the arguments should be entered and give examples of expected input and output. HTML markup is supported. Use tags for examples. The description is scanned during searches, so include terms that are likely to be searched for when someone is looking for your operation.", + example: + "Converts URI/URL percent-encoded characters back to their raw values.

e.g. %3d becomes =", prompt: "Description", type: "string" }, infoURL: { - description: "An optional URL for an external site can be added to give more information about the operation. Wikipedia links are often suitable. If linking to Wikipedia, use an international link (e.g. https://wikipedia.org/...) rather than a localised link (e.g. https://en.wikipedia.org/...).", + description: + "An optional URL for an external site can be added to give more information about the operation. Wikipedia links are often suitable. If linking to Wikipedia, use an international link (e.g. https://wikipedia.org/...) rather than a localised link (e.g. https://en.wikipedia.org/...).", example: "https://wikipedia.org/wiki/Percent-encoding", prompt: "Information URL", - type: "string", + type: "string" }, inputType: { description: `The input type defines how the input data will be presented to your operation. Check the project wiki for a full description of each type. The options are: ${ioTypes.join(", ")}.`, @@ -78,7 +80,8 @@ If your operation does not rely on a library, just leave this blank and it will message: `The output type should be one of: ${ioTypes.join(", ")}.` }, highlight: { - description: "If your operation does not change the length of the input in any way, we can enable highlighting. If it does change the length in a predictable way, we may still be able to enable highlighting and calculate the correct offsets. If this is not possible, we will disable highlighting for this operation.", + description: + "If your operation does not change the length of the input in any way, we can enable highlighting. If it does change the length in a predictable way, we may still be able to enable highlighting and calculate the correct offsets. If this is not possible, we will disable highlighting for this operation.", example: "true/false", prompt: "Enable highlighting", type: "boolean", @@ -103,10 +106,14 @@ If your operation does not rely on a library, just leave this blank and it will // Build schema for (const prop in schema.properties) { const p = schema.properties[prop]; - p.description = "\n" + colors.white(p.description) + colors.cyan("\nExample: " + p.example) + "\n" + colors.green(p.prompt); + p.description + = "\n" + colors.white(p.description) + colors.cyan("\nExample: " + p.example) + "\n" + colors.green(p.prompt); } -console.log("\n\nThis script will generate a new operation template based on the information you provide. These values can be changed manually later.".yellow); +console.log( + "\n\nThis script will generate a new operation template based on the information you provide. These values can be changed manually later." + .yellow +); prompt.message = ""; prompt.delimiter = ":".green; @@ -119,14 +126,15 @@ prompt.get(schema, (err, result) => { process.exit(0); } - const moduleName = result.opName.replace(/\w\S*/g, txt => { - return txt.charAt(0).toUpperCase() + txt.substr(1); - }).replace(/[\s-()./]/g, ""); - + const moduleName = result.opName + .replace(/\w\S*/g, (txt) => { + return txt.charAt(0).toUpperCase() + txt.substr(1); + }) + .replace(/[\s-()./]/g, ""); const template = `/** * @author ${result.authorName} [${result.authorEmail}] - * @copyright Crown Copyright ${(new Date()).getFullYear()} + * @copyright Crown Copyright ${new Date().getFullYear()} * @license Apache-2.0 */ @@ -146,7 +154,7 @@ class ${moduleName} extends Operation { this.name = "${result.opName}"; this.module = "${result.module}"; - this.description = "${(new EscapeString).run(result.description, ["Special chars", "Double"])}"; + this.description = "${new EscapeString().run(result.description, ["Special chars", "Double"])}"; this.infoURL = "${result.infoURL}"; this.inputType = "${result.inputType}"; this.outputType = "${result.outputType}"; @@ -176,7 +184,9 @@ class ${moduleName} extends Operation { throw new OperationError("Test"); } -${result.highlight ? ` +${ + result.highlight + ? ` /** * Highlight ${result.opName} * @@ -202,7 +212,9 @@ ${result.highlight ? ` highlightReverse(pos, args) { return pos; } -` : ""} +` + : "" +} } export default ${moduleName}; @@ -225,6 +237,4 @@ export default ${moduleName}; 3. Write tests in ${colors.green("tests/operations/tests/")} 4. Run ${colors.cyan("npm run lint")} and ${colors.cyan("npm run test")} 5. Submit a Pull Request to get your operation added to the official CyberChef repository.`); - }); - diff --git a/src/core/dishTypes/DishBigNumber.mjs b/src/core/dishTypes/DishBigNumber.mjs index 3bb8122c..89c82938 100644 --- a/src/core/dishTypes/DishBigNumber.mjs +++ b/src/core/dishTypes/DishBigNumber.mjs @@ -12,14 +12,15 @@ import BigNumber from "bignumber.js"; * translation methods for BigNumber Dishes */ class DishBigNumber extends DishType { - /** * convert the given value to a ArrayBuffer * @param {BigNumber} value */ static toArrayBuffer() { DishBigNumber.checkForValue(this.value); - this.value = BigNumber.isBigNumber(this.value) ? Utils.strToArrayBuffer(this.value.toFixed()) : new ArrayBuffer; + this.value = BigNumber.isBigNumber(this.value) + ? Utils.strToArrayBuffer(this.value.toFixed()) + : new ArrayBuffer(); } /** diff --git a/src/core/dishTypes/DishByteArray.mjs b/src/core/dishTypes/DishByteArray.mjs index 12a6d334..08b2d36d 100644 --- a/src/core/dishTypes/DishByteArray.mjs +++ b/src/core/dishTypes/DishByteArray.mjs @@ -10,7 +10,6 @@ import DishType from "./DishType.mjs"; * Translation methods for ArrayBuffer Dishes */ class DishByteArray extends DishType { - /** * convert the given value to a ArrayBuffer */ diff --git a/src/core/dishTypes/DishFile.mjs b/src/core/dishTypes/DishFile.mjs index a22df9e5..cef47a98 100644 --- a/src/core/dishTypes/DishFile.mjs +++ b/src/core/dishTypes/DishFile.mjs @@ -11,7 +11,6 @@ import Utils, { isNodeEnvironment } from "../Utils.mjs"; * Translation methods for file Dishes */ class DishFile extends DishType { - /** * convert the given value to an ArrayBuffer * @param {File} value @@ -23,7 +22,7 @@ class DishFile extends DishType { } else { return new Promise((resolve, reject) => { Utils.readFile(this.value) - .then(v => this.value = v.buffer) + .then((v) => (this.value = v.buffer)) .then(resolve) .catch(reject); }); diff --git a/src/core/dishTypes/DishHTML.mjs b/src/core/dishTypes/DishHTML.mjs index 854cacd0..84b8dbd9 100644 --- a/src/core/dishTypes/DishHTML.mjs +++ b/src/core/dishTypes/DishHTML.mjs @@ -11,16 +11,16 @@ import Utils from "../Utils.mjs"; * Translation methods for HTML Dishes */ class DishHTML extends DishString { - /** * convert the given value to a ArrayBuffer * @param {String} value */ static toArrayBuffer() { DishHTML.checkForValue(this.value); - this.value = this.value ? Utils.strToArrayBuffer(Utils.unescapeHtml(Utils.stripHtmlTags(this.value, true))) : new ArrayBuffer; + this.value = this.value + ? Utils.strToArrayBuffer(Utils.unescapeHtml(Utils.stripHtmlTags(this.value, true))) + : new ArrayBuffer(); } - } export default DishHTML; diff --git a/src/core/dishTypes/DishJSON.mjs b/src/core/dishTypes/DishJSON.mjs index e1b32d64..8b5ee638 100644 --- a/src/core/dishTypes/DishJSON.mjs +++ b/src/core/dishTypes/DishJSON.mjs @@ -11,13 +11,13 @@ import Utils from "../Utils.mjs"; * Translation methods for JSON dishes */ class DishJSON extends DishType { - /** * convert the given value to a ArrayBuffer */ static toArrayBuffer() { DishJSON.checkForValue(this.value); - this.value = this.value !== undefined ? Utils.strToArrayBuffer(JSON.stringify(this.value, null, 4)) : new ArrayBuffer; + this.value + = this.value !== undefined ? Utils.strToArrayBuffer(JSON.stringify(this.value, null, 4)) : new ArrayBuffer(); } /** diff --git a/src/core/dishTypes/DishListFile.mjs b/src/core/dishTypes/DishListFile.mjs index 9c34c151..128c686c 100644 --- a/src/core/dishTypes/DishListFile.mjs +++ b/src/core/dishTypes/DishListFile.mjs @@ -7,12 +7,10 @@ import DishType from "./DishType.mjs"; import Utils, { isNodeEnvironment } from "../Utils.mjs"; - /** * Translation methods for ListFile Dishes */ class DishListFile extends DishType { - /** * convert the given value to a ArrayBuffer */ @@ -20,7 +18,7 @@ class DishListFile extends DishType { DishListFile.checkForValue(this.value); if (isNodeEnvironment()) { - this.value = this.value.map(file => Uint8Array.from(file.data)); + this.value = this.value.map((file) => Uint8Array.from(file.data)); } else { this.value = await DishListFile.concatenateTypedArraysWithTypedElements(...this.value); } diff --git a/src/core/dishTypes/DishNumber.mjs b/src/core/dishTypes/DishNumber.mjs index e3ea31b8..406fc34f 100644 --- a/src/core/dishTypes/DishNumber.mjs +++ b/src/core/dishTypes/DishNumber.mjs @@ -4,7 +4,6 @@ * @license Apache-2.0 */ - import DishType from "./DishType.mjs"; import Utils from "../Utils.mjs"; @@ -12,13 +11,12 @@ import Utils from "../Utils.mjs"; * Translation methods for number dishes */ class DishNumber extends DishType { - /** * convert the given value to a ArrayBuffer */ static toArrayBuffer() { DishNumber.checkForValue(this.value); - this.value = typeof this.value === "number" ? Utils.strToArrayBuffer(this.value.toString()) : new ArrayBuffer; + this.value = typeof this.value === "number" ? Utils.strToArrayBuffer(this.value.toString()) : new ArrayBuffer(); } /** diff --git a/src/core/dishTypes/DishString.mjs b/src/core/dishTypes/DishString.mjs index 7de8810d..00cbd759 100644 --- a/src/core/dishTypes/DishString.mjs +++ b/src/core/dishTypes/DishString.mjs @@ -4,7 +4,6 @@ * @license Apache-2.0 */ - import DishType from "./DishType.mjs"; import Utils from "../Utils.mjs"; @@ -12,13 +11,12 @@ import Utils from "../Utils.mjs"; * Translation methods for string dishes */ class DishString extends DishType { - /** * convert the given value to a ArrayBuffer */ static toArrayBuffer() { DishString.checkForValue(this.value); - this.value = this.value ? Utils.strToArrayBuffer(this.value) : new ArrayBuffer; + this.value = this.value ? Utils.strToArrayBuffer(this.value) : new ArrayBuffer(); } /** diff --git a/src/core/dishTypes/DishType.mjs b/src/core/dishTypes/DishType.mjs index d89e3c0b..ad01e096 100644 --- a/src/core/dishTypes/DishType.mjs +++ b/src/core/dishTypes/DishType.mjs @@ -4,12 +4,10 @@ * @license Apache-2.0 */ - /** * Abstract class for dish translation methods */ class DishType { - /** * Warn translations dont work without value from bind */ diff --git a/src/core/dishTypes/index.mjs b/src/core/dishTypes/index.mjs index a3a500b0..4374d1cc 100644 --- a/src/core/dishTypes/index.mjs +++ b/src/core/dishTypes/index.mjs @@ -4,7 +4,6 @@ * @license Apache-2.0 */ - import DishByteArray from "./DishByteArray.mjs"; import DishBigNumber from "./DishBigNumber.mjs"; import DishFile from "./DishFile.mjs"; @@ -14,13 +13,4 @@ import DishListFile from "./DishListFile.mjs"; import DishNumber from "./DishNumber.mjs"; import DishString from "./DishString.mjs"; -export { - DishByteArray, - DishBigNumber, - DishFile, - DishHTML, - DishJSON, - DishListFile, - DishNumber, - DishString, -}; +export { DishByteArray, DishBigNumber, DishFile, DishHTML, DishJSON, DishListFile, DishNumber, DishString }; diff --git a/src/core/errors/index.mjs b/src/core/errors/index.mjs index 6d96acb0..5db53880 100644 --- a/src/core/errors/index.mjs +++ b/src/core/errors/index.mjs @@ -2,8 +2,4 @@ import OperationError from "./OperationError.mjs"; import DishError from "./DishError.mjs"; import ExcludedOperationError from "./ExcludedOperationError.mjs"; -export { - OperationError, - DishError, - ExcludedOperationError, -}; +export { OperationError, DishError, ExcludedOperationError }; diff --git a/src/core/lib/Arithmetic.mjs b/src/core/lib/Arithmetic.mjs index 7c10855f..cef5782c 100644 --- a/src/core/lib/Arithmetic.mjs +++ b/src/core/lib/Arithmetic.mjs @@ -8,7 +8,6 @@ import Utils from "../Utils.mjs"; import BigNumber from "bignumber.js"; - /** * Converts a string array to a number array. * @@ -35,7 +34,6 @@ export function createNumArray(input, delim) { return numbers; } - /** * Adds an array of numbers and returns the value. * @@ -48,7 +46,6 @@ export function sum(data) { } } - /** * Subtracts an array of numbers and returns the value. * @@ -61,7 +58,6 @@ export function sub(data) { } } - /** * Multiplies an array of numbers and returns the value. * @@ -74,7 +70,6 @@ export function multi(data) { } } - /** * Divides an array of numbers and returns the value. * @@ -87,7 +82,6 @@ export function div(data) { } } - /** * Computes mean of a number array and returns the value. * @@ -100,7 +94,6 @@ export function mean(data) { } } - /** * Computes median of a number array and returns the value. * @@ -108,8 +101,8 @@ export function mean(data) { * @returns {BigNumber} */ export function median(data) { - if ((data.length % 2) === 0 && data.length > 0) { - data.sort(function(a, b) { + if (data.length % 2 === 0 && data.length > 0) { + data.sort(function (a, b) { return a.minus(b); }); const first = data[Math.floor(data.length / 2)]; @@ -120,7 +113,6 @@ export function median(data) { } } - /** * Computes standard deviation of a number array and returns the value. * diff --git a/src/core/lib/BCD.mjs b/src/core/lib/BCD.mjs index 2f245236..6aea9dcb 100644 --- a/src/core/lib/BCD.mjs +++ b/src/core/lib/BCD.mjs @@ -9,15 +9,7 @@ /** * BCD encoding schemes. */ -export const ENCODING_SCHEME = [ - "8 4 2 1", - "7 4 2 1", - "4 2 2 1", - "2 4 2 1", - "8 4 -2 -1", - "Excess-3", - "IBM 8 4 2 1", -]; +export const ENCODING_SCHEME = ["8 4 2 1", "7 4 2 1", "4 2 2 1", "2 4 2 1", "8 4 -2 -1", "Excess-3", "IBM 8 4 2 1"]; /** * Lookup table for the binary value of each digit representation. @@ -33,13 +25,13 @@ export const ENCODING_SCHEME = [ * has not yet been added for this. */ export const ENCODING_LOOKUP = { - "8 4 2 1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], - "7 4 2 1": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], - "4 2 2 1": [0, 1, 4, 5, 8, 9, 12, 13, 14, 15], - "2 4 2 1": [0, 1, 2, 3, 4, 11, 12, 13, 14, 15], - "8 4 -2 -1": [0, 7, 6, 5, 4, 11, 10, 9, 8, 15], - "Excess-3": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12], - "IBM 8 4 2 1": [10, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "8 4 2 1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "7 4 2 1": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], + "4 2 2 1": [0, 1, 4, 5, 8, 9, 12, 13, 14, 15], + "2 4 2 1": [0, 1, 2, 3, 4, 11, 12, 13, 14, 15], + "8 4 -2 -1": [0, 7, 6, 5, 4, 11, 10, 9, 8, 15], + "Excess-3": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12], + "IBM 8 4 2 1": [10, 1, 2, 3, 4, 5, 6, 7, 8, 9] }; /** diff --git a/src/core/lib/Bacon.mjs b/src/core/lib/Bacon.mjs index 241237cb..1ea342aa 100644 --- a/src/core/lib/Bacon.mjs +++ b/src/core/lib/Bacon.mjs @@ -26,16 +26,13 @@ export const BACON_TRANSLATIONS = [ BACON_TRANSLATION_01, BACON_TRANSLATION_AB, BACON_TRANSLATION_CASE, - BACON_TRANSLATION_AMNZ, -]; -export const BACON_TRANSLATIONS_FOR_ENCODING = [ - BACON_TRANSLATION_01, - BACON_TRANSLATION_AB + BACON_TRANSLATION_AMNZ ]; +export const BACON_TRANSLATIONS_FOR_ENCODING = [BACON_TRANSLATION_01, BACON_TRANSLATION_AB]; export const BACON_CLEARER_MAP = { [BACON_TRANSLATION_01]: /[^01]/g, [BACON_TRANSLATION_AB]: /[^ABab]/g, - [BACON_TRANSLATION_CASE]: /[^A-Za-z]/g, + [BACON_TRANSLATION_CASE]: /[^A-Za-z]/g }; export const BACON_NORMALIZE_MAP = { [BACON_TRANSLATION_AB]: { @@ -43,7 +40,7 @@ export const BACON_NORMALIZE_MAP = { "B": "1", "a": "0", "b": "1" - }, + } }; /** diff --git a/src/core/lib/Base58.mjs b/src/core/lib/Base58.mjs index b4eb4b41..372a8051 100644 --- a/src/core/lib/Base58.mjs +++ b/src/core/lib/Base58.mjs @@ -13,10 +13,10 @@ export const ALPHABET_OPTIONS = [ { name: "Bitcoin", - value: "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", + value: "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" }, { name: "Ripple", - value: "rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz", - }, + value: "rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz" + } ]; diff --git a/src/core/lib/Base64.mjs b/src/core/lib/Base64.mjs index aeda98cf..5eca4d18 100644 --- a/src/core/lib/Base64.mjs +++ b/src/core/lib/Base64.mjs @@ -23,7 +23,7 @@ import OperationError from "../errors/OperationError.mjs"; * // returns "SGVsbG8=" * toBase64("Hello"); */ -export function toBase64(data, alphabet="A-Za-z0-9+/=") { +export function toBase64(data, alphabet = "A-Za-z0-9+/=") { if (!data) return ""; if (typeof data == "string") { data = Utils.strToArrayBuffer(data); @@ -33,13 +33,19 @@ export function toBase64(data, alphabet="A-Za-z0-9+/=") { } alphabet = Utils.expandAlphRange(alphabet).join(""); - if (alphabet.length !== 64 && alphabet.length !== 65) { // Allow for padding + if (alphabet.length !== 64 && alphabet.length !== 65) { + // Allow for padding throw new OperationError(`Invalid Base64 alphabet length (${alphabet.length}): ${alphabet}`); } let output = "", - chr1, chr2, chr3, - enc1, enc2, enc3, enc4, + chr1, + chr2, + chr3, + enc1, + enc2, + enc3, + enc4, i = 0; while (i < data.length) { @@ -58,14 +64,12 @@ export function toBase64(data, alphabet="A-Za-z0-9+/=") { enc4 = 64; } - output += alphabet.charAt(enc1) + alphabet.charAt(enc2) + - alphabet.charAt(enc3) + alphabet.charAt(enc4); + output += alphabet.charAt(enc1) + alphabet.charAt(enc2) + alphabet.charAt(enc3) + alphabet.charAt(enc4); } return output; } - /** * UnBase64's the input string using the given alphabet, returning a byte array. * @@ -82,7 +86,13 @@ export function toBase64(data, alphabet="A-Za-z0-9+/=") { * // returns [72, 101, 108, 108, 111] * fromBase64("SGVsbG8=", null, "byteArray"); */ -export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", removeNonAlphChars=true, strictMode=false) { +export function fromBase64( + data, + alphabet = "A-Za-z0-9+/=", + returnType = "string", + removeNonAlphChars = true, + strictMode = false +) { if (!data) { return returnType === "string" ? "" : []; } @@ -91,8 +101,11 @@ export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", r alphabet = Utils.expandAlphRange(alphabet).join(""); // Confirm alphabet is a valid length - if (alphabet.length !== 64 && alphabet.length !== 65) { // Allow for padding - throw new OperationError(`Error: Base64 alphabet should be 64 characters long, or 65 with a padding character. Found ${alphabet.length}: ${alphabet}`); + if (alphabet.length !== 64 && alphabet.length !== 65) { + // Allow for padding + throw new OperationError( + `Error: Base64 alphabet should be 64 characters long, or 65 with a padding character. Found ${alphabet.length}: ${alphabet}` + ); } // Remove non-alphabet characters @@ -104,10 +117,13 @@ export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", r if (strictMode) { // Check for incorrect lengths (even without padding) if (data.length % 4 === 1) { - throw new OperationError(`Error: Invalid Base64 input length (${data.length}). Cannot be 4n+1, even without padding chars.`); + throw new OperationError( + `Error: Invalid Base64 input length (${data.length}). Cannot be 4n+1, even without padding chars.` + ); } - if (alphabet.length === 65) { // Padding character included + if (alphabet.length === 65) { + // Padding character included const pad = alphabet.charAt(64); const padPos = data.indexOf(pad); if (padPos >= 0) { @@ -125,8 +141,13 @@ export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", r } const output = []; - let chr1, chr2, chr3, - enc1, enc2, enc3, enc4, + let chr1, + chr2, + chr3, + enc1, + enc2, + enc3, + enc4, i = 0; while (i < data.length) { @@ -158,26 +179,37 @@ export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", r return returnType === "string" ? Utils.byteArrayToUtf8(output) : output; } - /** * Base64 alphabets. */ export const ALPHABET_OPTIONS = [ - {name: "Standard (RFC 4648): A-Za-z0-9+/=", value: "A-Za-z0-9+/="}, - {name: "URL safe (RFC 4648 \u00A75): A-Za-z0-9-_", value: "A-Za-z0-9-_"}, - {name: "Filename safe: A-Za-z0-9+-=", value: "A-Za-z0-9+\\-="}, - {name: "itoa64: ./0-9A-Za-z=", value: "./0-9A-Za-z="}, - {name: "XML: A-Za-z0-9_.", value: "A-Za-z0-9_."}, - {name: "y64: A-Za-z0-9._-", value: "A-Za-z0-9._-"}, - {name: "z64: 0-9a-zA-Z+/=", value: "0-9a-zA-Z+/="}, - {name: "Radix-64 (RFC 4880): 0-9A-Za-z+/=", value: "0-9A-Za-z+/="}, - {name: "Uuencoding: [space]-_", value: " -_"}, - {name: "Xxencoding: +-0-9A-Za-z", value: "+\\-0-9A-Za-z"}, - {name: "BinHex: !-,-0-689@A-NP-VX-Z[`a-fh-mp-r", value: "!-,-0-689@A-NP-VX-Z[`a-fh-mp-r"}, - {name: "ROT13: N-ZA-Mn-za-m0-9+/=", value: "N-ZA-Mn-za-m0-9+/="}, - {name: "UNIX crypt: ./0-9A-Za-z", value: "./0-9A-Za-z"}, - {name: "Atom128: /128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC", value: "/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC"}, - {name: "Megan35: 3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5", value: "3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5"}, - {name: "Zong22: ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2", value: "ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2"}, - {name: "Hazz15: HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5", value: "HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5"} + { name: "Standard (RFC 4648): A-Za-z0-9+/=", value: "A-Za-z0-9+/=" }, + { name: "URL safe (RFC 4648 \u00A75): A-Za-z0-9-_", value: "A-Za-z0-9-_" }, + { name: "Filename safe: A-Za-z0-9+-=", value: "A-Za-z0-9+\\-=" }, + { name: "itoa64: ./0-9A-Za-z=", value: "./0-9A-Za-z=" }, + { name: "XML: A-Za-z0-9_.", value: "A-Za-z0-9_." }, + { name: "y64: A-Za-z0-9._-", value: "A-Za-z0-9._-" }, + { name: "z64: 0-9a-zA-Z+/=", value: "0-9a-zA-Z+/=" }, + { name: "Radix-64 (RFC 4880): 0-9A-Za-z+/=", value: "0-9A-Za-z+/=" }, + { name: "Uuencoding: [space]-_", value: " -_" }, + { name: "Xxencoding: +-0-9A-Za-z", value: "+\\-0-9A-Za-z" }, + { name: "BinHex: !-,-0-689@A-NP-VX-Z[`a-fh-mp-r", value: "!-,-0-689@A-NP-VX-Z[`a-fh-mp-r" }, + { name: "ROT13: N-ZA-Mn-za-m0-9+/=", value: "N-ZA-Mn-za-m0-9+/=" }, + { name: "UNIX crypt: ./0-9A-Za-z", value: "./0-9A-Za-z" }, + { + name: "Atom128: /128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC", + value: "/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC" + }, + { + name: "Megan35: 3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5", + value: "3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5" + }, + { + name: "Zong22: ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2", + value: "ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2" + }, + { + name: "Hazz15: HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5", + value: "HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5" + } ]; diff --git a/src/core/lib/Base85.mjs b/src/core/lib/Base85.mjs index e5778132..1d91ffa6 100644 --- a/src/core/lib/Base85.mjs +++ b/src/core/lib/Base85.mjs @@ -14,19 +14,18 @@ import Utils from "../Utils.mjs"; export const ALPHABET_OPTIONS = [ { name: "Standard", - value: "!-u", + value: "!-u" }, { name: "Z85 (ZeroMQ)", - value: "0-9a-zA-Z.\\-:+=^!/*?&<>()[]{}@%$#", + value: "0-9a-zA-Z.\\-:+=^!/*?&<>()[]{}@%$#" }, { name: "IPv6", - value: "0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~", + value: "0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~" } ]; - /** * Returns the name of the alphabet, when given the alphabet. * @@ -37,7 +36,7 @@ export function alphabetName(alphabet) { alphabet = escape(alphabet); let name; - ALPHABET_OPTIONS.forEach(function(a) { + ALPHABET_OPTIONS.forEach(function (a) { const expanded = Utils.expandAlphRange(a.value).join(""); if (alphabet === escape(expanded)) name = a.name; }); diff --git a/src/core/lib/Base92.mjs b/src/core/lib/Base92.mjs index 902c3e7d..ef45903d 100644 --- a/src/core/lib/Base92.mjs +++ b/src/core/lib/Base92.mjs @@ -18,12 +18,9 @@ export function base92Chr(val) { if (val < 0 || val >= 91) { throw new OperationError("Invalid value"); } - if (val === 0) - return "!".charCodeAt(0); - else if (val <= 61) - return "#".charCodeAt(0) + val - 1; - else - return "a".charCodeAt(0) + val - 62; + if (val === 0) return "!".charCodeAt(0); + else if (val <= 61) return "#".charCodeAt(0) + val - 1; + else return "a".charCodeAt(0) + val - 62; } /** @@ -33,12 +30,8 @@ export function base92Chr(val) { * @returns {number} */ export function base92Ord(val) { - if (val === "!") - return 0; - else if ("#" <= val && val <= "_") - return val.charCodeAt(0) - "#".charCodeAt(0) + 1; - else if ("a" <= val && val <= "}") - return val.charCodeAt(0) - "a".charCodeAt(0) + 62; + if (val === "!") return 0; + else if ("#" <= val && val <= "_") return val.charCodeAt(0) - "#".charCodeAt(0) + 1; + else if ("a" <= val && val <= "}") return val.charCodeAt(0) - "a".charCodeAt(0) + 62; throw new OperationError(`${val} is not a base92 character`); } - diff --git a/src/core/lib/Binary.mjs b/src/core/lib/Binary.mjs index 072000db..54d268f3 100644 --- a/src/core/lib/Binary.mjs +++ b/src/core/lib/Binary.mjs @@ -9,7 +9,6 @@ import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; - /** * Convert a byte array into a binary string. * @@ -28,19 +27,21 @@ import OperationError from "../errors/OperationError.mjs"; * // returns "1010:10100:11110" * toBinary([10,20,30], "Colon", 0); */ -export function toBinary(data, delim="Space", padding=8) { +export function toBinary(data, delim = "Space", padding = 8) { if (data === undefined || data === null) throw new OperationError("Unable to convert to binary: Empty input data enocuntered"); delim = Utils.charRep(delim); let output = ""; - if (data.length) { // array + if (data.length) { + // array for (let i = 0; i < data.length; i++) { output += data[i].toString(2).padStart(padding, "0"); if (i !== data.length - 1) output += delim; } - } else if (typeof data === "number") { // Single value + } else if (typeof data === "number") { + // Single value return data.toString(2).padStart(padding, "0"); } else { return ""; @@ -48,7 +49,6 @@ export function toBinary(data, delim="Space", padding=8) { return output; } - /** * Convert a binary string into a byte array. * @@ -64,7 +64,7 @@ export function toBinary(data, delim="Space", padding=8) { * // returns [10,20,30] * fromBinary("00001010:00010100:00011110", "Colon"); */ -export function fromBinary(data, delim="Space", byteLen=8) { +export function fromBinary(data, delim = "Space", byteLen = 8) { if (byteLen < 1 || Math.round(byteLen) !== byteLen) throw new OperationError("Byte length must be a positive integer"); @@ -77,4 +77,3 @@ export function fromBinary(data, delim="Space", byteLen=8) { } return output; } - diff --git a/src/core/lib/BitwiseOp.mjs b/src/core/lib/BitwiseOp.mjs index 516a816b..48ba0f29 100644 --- a/src/core/lib/BitwiseOp.mjs +++ b/src/core/lib/BitwiseOp.mjs @@ -16,7 +16,7 @@ * @param {string} scheme * @returns {byteArray} */ -export function bitOp (input, key, func, nullPreserving, scheme) { +export function bitOp(input, key, func, nullPreserving, scheme) { if (!key || !key.length) key = [0]; const result = []; let x = null, @@ -29,9 +29,7 @@ export function bitOp (input, key, func, nullPreserving, scheme) { o = input[i]; x = nullPreserving && (o === 0 || o === k) ? o : func(o, k); result.push(x); - if (scheme && - scheme !== "Standard" && - !(nullPreserving && (o === 0 || o === k))) { + if (scheme && scheme !== "Standard" && !(nullPreserving && (o === 0 || o === k))) { switch (scheme) { case "Input differential": key[i % key.length] = o; @@ -57,7 +55,6 @@ export function xor(operand, key) { return operand ^ key; } - /** * NOT bitwise calculation. * @@ -68,7 +65,6 @@ export function not(operand, _) { return ~operand & 0xff; } - /** * AND bitwise calculation. * @@ -80,7 +76,6 @@ export function and(operand, key) { return operand & key; } - /** * OR bitwise calculation. * @@ -92,7 +87,6 @@ export function or(operand, key) { return operand | key; } - /** * ADD bitwise calculation. * @@ -104,7 +98,6 @@ export function add(operand, key) { return (operand + key) % 256; } - /** * SUB bitwise calculation. * @@ -114,10 +107,9 @@ export function add(operand, key) { */ export function sub(operand, key) { const result = operand - key; - return (result < 0) ? 256 + result : result; + return result < 0 ? 256 + result : result; } - /** * Delimiter options for bitwise operations */ diff --git a/src/core/lib/Blowfish.mjs b/src/core/lib/Blowfish.mjs index efe2e2dc..08489457 100644 --- a/src/core/lib/Blowfish.mjs +++ b/src/core/lib/Blowfish.mjs @@ -40,48 +40,47 @@ const crypto = {}; import forge from "node-forge"; - /* dojo-release-1.8.1/dojo/_base/lang.js.uncompressed.js */ const lang = {}; -lang.isString = function(it) { - // summary: - // Return true if it is a String - // it: anything - // Item to test. - return (typeof it == "string" || it instanceof String); // Boolean +lang.isString = function (it) { + // summary: + // Return true if it is a String + // it: anything + // Item to test. + return typeof it == "string" || it instanceof String; // Boolean }; - /* dojo-release-1.8.1/dojo/_base/array.js.uncompressed.js */ const arrayUtil = {}; -arrayUtil.map = function(arr, callback, thisObject, Ctr) { - // summary: - // applies callback to each element of arr and returns - // an Array with the results - // arr: Array|String - // the array to iterate on. If a string, operates on - // individual characters. - // callback: Function - // a function is invoked with three arguments, (item, index, - // array), and returns a value - // thisObject: Object? - // may be used to scope the call to callback - // returns: Array - // description: - // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when - // run over sparse arrays, this implementation passes the "holes" in the sparse array to - // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array. - // For more details, see: - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map - // example: - // | // returns [2, 3, 4, 5] - // | array.map([1, 2, 3, 4], function(item){ return item+1 }); +arrayUtil.map = function (arr, callback, thisObject, Ctr) { + // summary: + // applies callback to each element of arr and returns + // an Array with the results + // arr: Array|String + // the array to iterate on. If a string, operates on + // individual characters. + // callback: Function + // a function is invoked with three arguments, (item, index, + // array), and returns a value + // thisObject: Object? + // may be used to scope the call to callback + // returns: Array + // description: + // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when + // run over sparse arrays, this implementation passes the "holes" in the sparse array to + // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array. + // For more details, see: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map + // example: + // | // returns [2, 3, 4, 5] + // | array.map([1, 2, 3, 4], function(item){ return item+1 }); - // TODO: why do we have a non-standard signature here? do we need "Ctr"? + // TODO: why do we have a non-standard signature here? do we need "Ctr"? let i = 0; - const l = arr && arr.length || 0, out = new (Ctr || Array)(l); + const l = (arr && arr.length) || 0, + out = new (Ctr || Array)(l); if (l && typeof arr == "string") arr = arr.split(""); if (thisObject) { for (; i < l; ++i) { @@ -102,239 +101,231 @@ arrayUtil.map = function(arr, callback, thisObject, Ctr) { * Unsigned math based on Paul Johnstone and Peter Wood patches. * 2005-12-08 */ -const boxes={ +const boxes = { p: [ - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, - 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, - 0x9216d5d9, 0x8979fb1b + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, + 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b ], s0: [ - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, - 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, - 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, - 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, - 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, - 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, - 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, - 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, - 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, - 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, - 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, - 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, - 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, - 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, - 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, - 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, - 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, - 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, - 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, - 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, - 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, - 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, - 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, - 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, - 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, - 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, + 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, + 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, + 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, + 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, + 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, + 0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, + 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, + 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, + 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, + 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, + 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, + 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, + 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, + 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, + 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, + 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, + 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, + 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, + 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, + 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, + 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a ], s1: [ - 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, - 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, - 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, - 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, - 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, - 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, - 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, - 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, - 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, - 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, - 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, - 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, - 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, - 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, - 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, - 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, - 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, - 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, - 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, - 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, - 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, - 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, - 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, - 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, - 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, - 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, + 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, + 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6, + 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, + 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, + 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, + 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, + 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, + 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, + 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, + 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, + 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, + 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, + 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, + 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e, + 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, + 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, + 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, + 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 0x3372f092, + 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, + 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, + 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 ], s2: [ - 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, - 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, - 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, - 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, - 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, - 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, - 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, - 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, - 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, - 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, - 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, - 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, - 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, - 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, - 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, - 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, - 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, - 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, - 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, - 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, - 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, - 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, - 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, - 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, - 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, + 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, + 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, + 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, + 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, + 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, + 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, + 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, + 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, + 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, + 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, + 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, + 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, + 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, + 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, + 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, + 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, + 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, + 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, + 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, + 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, + 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 ], s3: [ - 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, - 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, - 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, - 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, - 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, - 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, - 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, - 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, - 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, - 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, - 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, - 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, - 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, - 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, - 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, - 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, - 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, - 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, - 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, - 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, - 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, - 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, - 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, - 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, - 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, - 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, + 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, + 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, + 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, + 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, + 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, + 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, + 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, + 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, + 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, + 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, + 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, + 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, + 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, + 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, + 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, + 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, + 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, + 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, + 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, + 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, + 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 ] }; - //////////////////////////////////////////////////////////////////////////// // fixes based on patch submitted by Peter Wood (#5791) -const xor = function(x, y) { - return (((x>>0x10)^(y>>0x10))<<0x10)|(((x&0xffff)^(y&0xffff))&0xffff); +const xor = function (x, y) { + return (((x >> 0x10) ^ (y >> 0x10)) << 0x10) | (((x & 0xffff) ^ (y & 0xffff)) & 0xffff); }; +const f = function (v, box) { + const d = box.s3[v & 0xff]; + v >>= 8; + const c = box.s2[v & 0xff]; + v >>= 8; + const b = box.s1[v & 0xff]; + v >>= 8; + const a = box.s0[v & 0xff]; -const f = function(v, box) { - const d=box.s3[v&0xff]; v>>=8; - const c=box.s2[v&0xff]; v>>=8; - const b=box.s1[v&0xff]; v>>=8; - const a=box.s0[v&0xff]; - - let r = (((a>>0x10)+(b>>0x10)+(((a&0xffff)+(b&0xffff))>>0x10))<<0x10)|(((a&0xffff)+(b&0xffff))&0xffff); - r = (((r>>0x10)^(c>>0x10))<<0x10)|(((r&0xffff)^(c&0xffff))&0xffff); - return (((r>>0x10)+(d>>0x10)+(((r&0xffff)+(d&0xffff))>>0x10))<<0x10)|(((r&0xffff)+(d&0xffff))&0xffff); + let r + = (((a >> 0x10) + (b >> 0x10) + (((a & 0xffff) + (b & 0xffff)) >> 0x10)) << 0x10) + | (((a & 0xffff) + (b & 0xffff)) & 0xffff); + r = (((r >> 0x10) ^ (c >> 0x10)) << 0x10) | (((r & 0xffff) ^ (c & 0xffff)) & 0xffff); + return ( + (((r >> 0x10) + (d >> 0x10) + (((r & 0xffff) + (d & 0xffff)) >> 0x10)) << 0x10) + | (((r & 0xffff) + (d & 0xffff)) & 0xffff) + ); }; - -const eb = function(o, box) { - // TODO: see if this can't be made more efficient - let l=o.left; - let r=o.right; - l=xor(l, box.p[0]); - r=xor(r, xor(f(l, box), box.p[1])); - l=xor(l, xor(f(r, box), box.p[2])); - r=xor(r, xor(f(l, box), box.p[3])); - l=xor(l, xor(f(r, box), box.p[4])); - r=xor(r, xor(f(l, box), box.p[5])); - l=xor(l, xor(f(r, box), box.p[6])); - r=xor(r, xor(f(l, box), box.p[7])); - l=xor(l, xor(f(r, box), box.p[8])); - r=xor(r, xor(f(l, box), box.p[9])); - l=xor(l, xor(f(r, box), box.p[10])); - r=xor(r, xor(f(l, box), box.p[11])); - l=xor(l, xor(f(r, box), box.p[12])); - r=xor(r, xor(f(l, box), box.p[13])); - l=xor(l, xor(f(r, box), box.p[14])); - r=xor(r, xor(f(l, box), box.p[15])); - l=xor(l, xor(f(r, box), box.p[16])); - o.right=l; - o.left=xor(r, box.p[17]); +const eb = function (o, box) { + // TODO: see if this can't be made more efficient + let l = o.left; + let r = o.right; + l = xor(l, box.p[0]); + r = xor(r, xor(f(l, box), box.p[1])); + l = xor(l, xor(f(r, box), box.p[2])); + r = xor(r, xor(f(l, box), box.p[3])); + l = xor(l, xor(f(r, box), box.p[4])); + r = xor(r, xor(f(l, box), box.p[5])); + l = xor(l, xor(f(r, box), box.p[6])); + r = xor(r, xor(f(l, box), box.p[7])); + l = xor(l, xor(f(r, box), box.p[8])); + r = xor(r, xor(f(l, box), box.p[9])); + l = xor(l, xor(f(r, box), box.p[10])); + r = xor(r, xor(f(l, box), box.p[11])); + l = xor(l, xor(f(r, box), box.p[12])); + r = xor(r, xor(f(l, box), box.p[13])); + l = xor(l, xor(f(r, box), box.p[14])); + r = xor(r, xor(f(l, box), box.p[15])); + l = xor(l, xor(f(r, box), box.p[16])); + o.right = l; + o.left = xor(r, box.p[17]); }; -const db = function(o, box) { - let l=o.left; - let r=o.right; - l=xor(l, box.p[17]); - r=xor(r, xor(f(l, box), box.p[16])); - l=xor(l, xor(f(r, box), box.p[15])); - r=xor(r, xor(f(l, box), box.p[14])); - l=xor(l, xor(f(r, box), box.p[13])); - r=xor(r, xor(f(l, box), box.p[12])); - l=xor(l, xor(f(r, box), box.p[11])); - r=xor(r, xor(f(l, box), box.p[10])); - l=xor(l, xor(f(r, box), box.p[9])); - r=xor(r, xor(f(l, box), box.p[8])); - l=xor(l, xor(f(r, box), box.p[7])); - r=xor(r, xor(f(l, box), box.p[6])); - l=xor(l, xor(f(r, box), box.p[5])); - r=xor(r, xor(f(l, box), box.p[4])); - l=xor(l, xor(f(r, box), box.p[3])); - r=xor(r, xor(f(l, box), box.p[2])); - l=xor(l, xor(f(r, box), box.p[1])); - o.right=l; - o.left=xor(r, box.p[0]); +const db = function (o, box) { + let l = o.left; + let r = o.right; + l = xor(l, box.p[17]); + r = xor(r, xor(f(l, box), box.p[16])); + l = xor(l, xor(f(r, box), box.p[15])); + r = xor(r, xor(f(l, box), box.p[14])); + l = xor(l, xor(f(r, box), box.p[13])); + r = xor(r, xor(f(l, box), box.p[12])); + l = xor(l, xor(f(r, box), box.p[11])); + r = xor(r, xor(f(l, box), box.p[10])); + l = xor(l, xor(f(r, box), box.p[9])); + r = xor(r, xor(f(l, box), box.p[8])); + l = xor(l, xor(f(r, box), box.p[7])); + r = xor(r, xor(f(l, box), box.p[6])); + l = xor(l, xor(f(r, box), box.p[5])); + r = xor(r, xor(f(l, box), box.p[4])); + l = xor(l, xor(f(r, box), box.p[3])); + r = xor(r, xor(f(l, box), box.p[2])); + l = xor(l, xor(f(r, box), box.p[1])); + o.right = l; + o.left = xor(r, box.p[0]); }; -const encryptBlock=function(inblock, outblock, box) { +const encryptBlock = function (inblock, outblock, box) { const o = {}; - o.left=inblock[0]; - o.right=inblock[1]; + o.left = inblock[0]; + o.right = inblock[1]; eb(o, box); outblock[0] = o.left; outblock[1] = o.right; }; -const decryptBlock=function(inblock, outblock, box) { - const o= {}; - o.left=inblock[0]; - o.right=inblock[1]; +const decryptBlock = function (inblock, outblock, box) { + const o = {}; + o.left = inblock[0]; + o.right = inblock[1]; db(o, box); outblock[0] = o.left; outblock[1] = o.right; }; -crypto.Blowfish = new function() { - this.createCipher=function(key, modeName) { +crypto.Blowfish = new (function () { + this.createCipher = function (key, modeName) { return new forge.cipher.BlockCipher({ algorithm: new Blowfish.Algorithm(key, modeName), key: key, @@ -342,74 +333,73 @@ crypto.Blowfish = new function() { }); }; - this.createDecipher=function(key, modeName) { + this.createDecipher = function (key, modeName) { return new forge.cipher.BlockCipher({ algorithm: new Blowfish.Algorithm(key, modeName), key: key, decrypt: true }); }; -}(); +})(); - -crypto.Blowfish.Algorithm=function(key, modeName) { - this.initialize({key: key}); +crypto.Blowfish.Algorithm = function (key, modeName) { + this.initialize({ key: key }); const _box = this.box; const modeOption = { blockSize: 8, cipher: { - encrypt: function(inblock, outblock) { + encrypt: function (inblock, outblock) { encryptBlock(inblock, outblock, _box); }, - decrypt: function(inblock, outblock) { + decrypt: function (inblock, outblock) { decryptBlock(inblock, outblock, _box); - }, + } } }; switch (modeName.toLowerCase()) { case "ecb": - this.mode=new forge.cipher.modes.ecb(modeOption); + this.mode = new forge.cipher.modes.ecb(modeOption); break; case "cbc": - this.mode=new forge.cipher.modes.cbc(modeOption); + this.mode = new forge.cipher.modes.cbc(modeOption); break; case "cfb": - this.mode=new forge.cipher.modes.cfb(modeOption); + this.mode = new forge.cipher.modes.cfb(modeOption); break; case "ofb": - this.mode=new forge.cipher.modes.ofb(modeOption); + this.mode = new forge.cipher.modes.ofb(modeOption); break; case "ctr": - this.mode=new forge.cipher.modes.ctr(modeOption); + this.mode = new forge.cipher.modes.ctr(modeOption); break; default: - this.mode=new forge.cipher.modes.ecb(modeOption); + this.mode = new forge.cipher.modes.ecb(modeOption); break; } - }; -crypto.Blowfish.Algorithm.prototype.initialize=function(options) { - const POW8=Math.pow(2, 8); +crypto.Blowfish.Algorithm.prototype.initialize = function (options) { + const POW8 = Math.pow(2, 8); - let k=options.key; + let k = options.key; if (lang.isString(k)) { - k = arrayUtil.map(k.split(""), function(item) { + k = arrayUtil.map(k.split(""), function (item) { return item.charCodeAt(0) & 0xff; }); } - // init the boxes - let pos=0, data=0; - const res={ left: 0, right: 0 }; + // init the boxes + let pos = 0, + data = 0; + const res = { left: 0, right: 0 }; const box = { - p: arrayUtil.map(boxes.p.slice(0), function(item) { - const l=k.length; - for (let j=0; j<4; j++) { - data=(data*POW8)|k[pos++ % l]; + p: arrayUtil.map(boxes.p.slice(0), function (item) { + const l = k.length; + for (let j = 0; j < 4; j++) { + data = (data * POW8) | k[pos++ % l]; } - return (((item>>0x10)^(data>>0x10))<<0x10)|(((item&0xffff)^(data&0xffff))&0xffff); + return (((item >> 0x10) ^ (data >> 0x10)) << 0x10) | (((item & 0xffff) ^ (data & 0xffff)) & 0xffff); }), s0: boxes.s0.slice(0), s1: boxes.s1.slice(0), @@ -417,17 +407,17 @@ crypto.Blowfish.Algorithm.prototype.initialize=function(options) { s3: boxes.s3.slice(0) }; - // encrypt p and the s boxes - for (let i=0, l=box.p.length; i 3) { - this.update(this.nLoops, stops, i/nChecks); + this.update(this.nLoops, stops, i / nChecks); } } return result; diff --git a/src/core/lib/Braille.mjs b/src/core/lib/Braille.mjs index 098c0e73..47cf164a 100644 --- a/src/core/lib/Braille.mjs +++ b/src/core/lib/Braille.mjs @@ -11,5 +11,5 @@ */ export const BRAILLE_LOOKUP = { ascii: " A1B'K2L@CIF/MSP\"E3H9O6R^DJG>NTQ,*5<-U8V.%[$+X!&;:4\\0Z7(_?W]#Y)=", - dot6: "⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿" + dot6: "⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿" }; diff --git a/src/core/lib/CanvasComponents.mjs b/src/core/lib/CanvasComponents.mjs index 183dd040..ab5dd53a 100644 --- a/src/core/lib/CanvasComponents.mjs +++ b/src/core/lib/CanvasComponents.mjs @@ -64,14 +64,14 @@ export function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels, // Bar properties const barPadding = graphWidth * 0.003, - barWidth = (graphWidth - (barPadding * scores.length)) / scores.length, + barWidth = (graphWidth - barPadding * scores.length) / scores.length, max = Math.max.apply(Math, scores); let currX = leftPadding + barPadding; // Draw bars ctx.fillStyle = "green"; for (let i = 0; i < scores.length; i++) { - const h = scores[i] / max * graphHeight; + const h = (scores[i] / max) * graphHeight; ctx.fillRect(currX, base - h, barWidth, h); currX += barWidth + barPadding; } @@ -83,7 +83,7 @@ export function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels, if (numXLabels >= scores.length) { // Mark every score for (let i = 0; i <= scores.length; i++) { - ctx.fillText(i, currX, base + (bottomPadding * 0.3)); + ctx.fillText(i, currX, base + bottomPadding * 0.3); currX += barWidth + barPadding; } } else { @@ -91,7 +91,7 @@ export function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels, for (let i = 0; i <= numXLabels; i++) { const val = Math.ceil((scores.length / numXLabels) * i); currX = (graphWidth / numXLabels) * i + leftPadding; - ctx.fillText(val, currX, base + (bottomPadding * 0.3)); + ctx.fillText(val, currX, base + bottomPadding * 0.3); } } @@ -101,14 +101,14 @@ export function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels, if (numYLabels >= max) { // Mark every increment for (let i = 0; i <= max; i++) { - currY = base - (i / max * graphHeight) + fontSize / 3; + currY = base - (i / max) * graphHeight + fontSize / 3; ctx.fillText(i, leftPadding * 0.8, currY); } } else { // Mark some increments for (let i = 0; i <= numYLabels; i++) { const val = Math.ceil((max / numYLabels) * i); - currY = base - (val / max * graphHeight) + fontSize / 3; + currY = base - (val / max) * graphHeight + fontSize / 3; ctx.fillText(val, leftPadding * 0.8, currY); } } @@ -171,21 +171,21 @@ export function drawScaleBar(canvas, score, max, markings) { ctx.font = "13px Arial"; for (let i = 0; i < markings.length; i++) { // Draw min line down - x0 = barWidth / max * markings[i].min + leftPadding; - y0 = topPadding + barHeight + (bottomPadding * 0.1); + x0 = (barWidth / max) * markings[i].min + leftPadding; + y0 = topPadding + barHeight + bottomPadding * 0.1; x1 = x0; - y1 = topPadding + barHeight + (bottomPadding * 0.3); + y1 = topPadding + barHeight + bottomPadding * 0.3; drawLine(ctx, x0, y0, x1, y1); // Draw max line down - x0 = barWidth / max * markings[i].max + leftPadding; + x0 = (barWidth / max) * markings[i].max + leftPadding; x1 = x0; drawLine(ctx, x0, y0, x1, y1); // Join min and max lines - x0 = barWidth / max * markings[i].min + leftPadding; - y0 = topPadding + barHeight + (bottomPadding * 0.3); - x1 = barWidth / max * markings[i].max + leftPadding; + x0 = (barWidth / max) * markings[i].min + leftPadding; + y0 = topPadding + barHeight + bottomPadding * 0.3; + x1 = (barWidth / max) * markings[i].max + leftPadding; y1 = y0; drawLine(ctx, x0, y0, x1, y1); @@ -198,7 +198,7 @@ export function drawScaleBar(canvas, score, max, markings) { } else { x0 = x0 + (x1 - x0) / 2; } - y0 = topPadding + barHeight + (bottomPadding * 0.8); + y0 = topPadding + barHeight + bottomPadding * 0.8; ctx.fillText(markings[i].label, x0, y0); } } diff --git a/src/core/lib/Charts.mjs b/src/core/lib/Charts.mjs index 6cb63f60..a2b9f282 100644 --- a/src/core/lib/Charts.mjs +++ b/src/core/lib/Charts.mjs @@ -14,14 +14,12 @@ import Utils from "../Utils.mjs"; */ export const RECORD_DELIMITER_OPTIONS = ["Line feed", "CRLF"]; - /** * @constant * @default */ export const FIELD_DELIMITER_OPTIONS = ["Space", "Comma", "Semi-colon", "Colon", "Tab"]; - /** * Default from colour * @@ -33,7 +31,6 @@ export const COLOURS = { max: "black" }; - /** * Gets values from input for a plot. * @@ -48,22 +45,19 @@ export function getValues(input, recordDelimiter, fieldDelimiter, columnHeadings let headings; const values = []; - input - .split(recordDelimiter) - .forEach((row, rowIndex) => { - const split = row.split(fieldDelimiter); - if (split.length !== length) throw new OperationError(`Each row must have length ${length}.`); + input.split(recordDelimiter).forEach((row, rowIndex) => { + const split = row.split(fieldDelimiter); + if (split.length !== length) throw new OperationError(`Each row must have length ${length}.`); - if (columnHeadingsAreIncluded && rowIndex === 0) { - headings = split; - } else { - values.push(split); - } - }); + if (columnHeadingsAreIncluded && rowIndex === 0) { + headings = split; + } else { + values.push(split); + } + }); return { headings, values }; } - /** * Gets values from input for a scatter plot. * @@ -74,19 +68,13 @@ export function getValues(input, recordDelimiter, fieldDelimiter, columnHeadings * @returns {Object[]} */ export function getScatterValues(input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded) { - let { headings, values } = getValues( - input, - recordDelimiter, - fieldDelimiter, - columnHeadingsAreIncluded, - 2 - ); + let { headings, values } = getValues(input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded, 2); if (headings) { - headings = {x: headings[0], y: headings[1]}; + headings = { x: headings[0], y: headings[1] }; } - values = values.map(row => { + values = values.map((row) => { const x = parseFloat(row[0]), y = parseFloat(row[1]); @@ -99,7 +87,6 @@ export function getScatterValues(input, recordDelimiter, fieldDelimiter, columnH return { headings, values }; } - /** * Gets values from input for a scatter plot with colour from the third column. * @@ -110,18 +97,13 @@ export function getScatterValues(input, recordDelimiter, fieldDelimiter, columnH * @returns {Object[]} */ export function getScatterValuesWithColour(input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded) { - let { headings, values } = getValues( - input, - recordDelimiter, fieldDelimiter, - columnHeadingsAreIncluded, - 3 - ); + let { headings, values } = getValues(input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded, 3); if (headings) { - headings = {x: headings[0], y: headings[1]}; + headings = { x: headings[0], y: headings[1] }; } - values = values.map(row => { + values = values.map((row) => { const x = parseFloat(row[0]), y = parseFloat(row[1]), colour = row[2]; @@ -145,17 +127,12 @@ export function getScatterValuesWithColour(input, recordDelimiter, fieldDelimite * @returns {Object[]} */ export function getSeriesValues(input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded) { - const { values } = getValues( - input, - recordDelimiter, fieldDelimiter, - false, - 3 - ); + const { values } = getValues(input, recordDelimiter, fieldDelimiter, false, 3); let xValues = new Set(); const series = {}; - values.forEach(row => { + values.forEach((row) => { const serie = row[0], xVal = row[1], val = parseFloat(row[2]); @@ -172,7 +149,7 @@ export function getSeriesValues(input, recordDelimiter, fieldDelimiter, columnHe const seriesList = []; for (const seriesName in series) { const serie = series[seriesName]; - seriesList.push({name: seriesName, data: serie}); + seriesList.push({ name: seriesName, data: serie }); } return { xValues, series: seriesList }; diff --git a/src/core/lib/ChrEnc.mjs b/src/core/lib/ChrEnc.mjs index 6879d736..097cf6de 100644 --- a/src/core/lib/ChrEnc.mjs +++ b/src/core/lib/ChrEnc.mjs @@ -163,10 +163,9 @@ export const CHR_ENC_CODE_PAGES = { "Europa 3 (29001)": 29001, "Atari ST/TT (47451)": 47451, "HZ-GB2312 Simplified Chinese (52936)": 52936, - "Simplified Chinese GB18030 (54936)": 54936, + "Simplified Chinese GB18030 (54936)": 54936 }; - export const CHR_ENC_SIMPLE_LOOKUP = {}; export const CHR_ENC_SIMPLE_REVERSE_LOOKUP = {}; @@ -177,7 +176,6 @@ for (const name in CHR_ENC_CODE_PAGES) { CHR_ENC_SIMPLE_REVERSE_LOOKUP[CHR_ENC_CODE_PAGES[name]] = simpleName; } - /** * Returns the width of the character set for the given codepage. * For example, UTF-8 is a Single Byte Character Set, whereas @@ -194,18 +192,14 @@ export function chrEncWidth(page) { const pageStr = page.toString(); // Confirm this page is legitimate - if (!Object.prototype.hasOwnProperty.call(CHR_ENC_SIMPLE_REVERSE_LOOKUP, pageStr)) - return 0; + if (!Object.prototype.hasOwnProperty.call(CHR_ENC_SIMPLE_REVERSE_LOOKUP, pageStr)) return 0; // Statically defined code pages - if (Object.prototype.hasOwnProperty.call(cptable, pageStr)) - return cptable[pageStr].dec.length > 256 ? 2 : 1; + if (Object.prototype.hasOwnProperty.call(cptable, pageStr)) return cptable[pageStr].dec.length > 256 ? 2 : 1; // Cached code pages - if (cptable.utils.cache.sbcs.includes(pageStr)) - return 1; - if (cptable.utils.cache.dbcs.includes(pageStr)) - return 2; + if (cptable.utils.cache.sbcs.includes(pageStr)) return 1; + if (cptable.utils.cache.dbcs.includes(pageStr)) return 2; // Dynamically generated code pages if (Object.prototype.hasOwnProperty.call(cptable.utils.magic, pageStr)) { diff --git a/src/core/lib/CipherSaber2.mjs b/src/core/lib/CipherSaber2.mjs index bf3954e9..a03f9667 100644 --- a/src/core/lib/CipherSaber2.mjs +++ b/src/core/lib/CipherSaber2.mjs @@ -6,14 +6,14 @@ export function encode(tempIVP, key, rounds, input) { const ivp = new Uint8Array(key.concat(tempIVP)); const state = new Array(256).fill(0); - let j = 0, i = 0; + let j = 0, + i = 0; const result = []; // Mixing states based off of IV. - for (let i = 0; i < 256; i++) - state[i] = i; + for (let i = 0; i < 256; i++) state[i] = i; const ivpLength = ivp.length; - for (let r = 0; r < rounds; r ++) { + for (let r = 0; r < rounds; r++) { for (let k = 0; k < 256; k++) { j = (j + state[k] + ivp[k % ivpLength]) % 256; [state[k], state[j]] = [state[j], state[k]]; @@ -24,7 +24,7 @@ export function encode(tempIVP, key, rounds, input) { // XOR cipher with key. for (let x = 0; x < input.length; x++) { - i = (++i) % 256; + i = ++i % 256; j = (j + state[i]) % 256; [state[i], state[j]] = [state[j], state[i]]; const n = (state[i] + state[j]) % 256; diff --git a/src/core/lib/Ciphers.mjs b/src/core/lib/Ciphers.mjs index a4d174b5..cd4aa7ed 100644 --- a/src/core/lib/Ciphers.mjs +++ b/src/core/lib/Ciphers.mjs @@ -33,10 +33,10 @@ export function affineEncode(input, args) { for (let i = 0; i < input.length; i++) { if (alphabet.indexOf(input[i]) >= 0) { // Uses the affine function ax+b % m = y (where m is length of the alphabet) - output += alphabet[((a * alphabet.indexOf(input[i])) + b) % 26]; + output += alphabet[(a * alphabet.indexOf(input[i]) + b) % 26]; } else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) { // Same as above, accounting for uppercase - output += alphabet[((a * alphabet.indexOf(input[i].toLowerCase())) + b) % 26].toUpperCase(); + output += alphabet[(a * alphabet.indexOf(input[i].toLowerCase()) + b) % 26].toUpperCase(); } else { // Non-alphabetic characters output += input[i]; @@ -53,13 +53,13 @@ export function affineEncode(input, args) { * @param {string} keyword - Must be upper case * @returns {string} */ -export function genPolybiusSquare (keyword) { +export function genPolybiusSquare(keyword) { const alpha = "ABCDEFGHIKLMNOPQRSTUVWXYZ", polArray = `${keyword}${alpha}`.split("").unique(), polybius = []; for (let i = 0; i < 5; i++) { - polybius[i] = polArray.slice(i*5, i*5 + 5); + polybius[i] = polArray.slice(i * 5, i * 5 + 5); } return polybius; @@ -72,11 +72,11 @@ export function genPolybiusSquare (keyword) { * @constant */ export const format = { - "Hex": CryptoJS.enc.Hex, - "Base64": CryptoJS.enc.Base64, - "UTF8": CryptoJS.enc.Utf8, - "UTF16": CryptoJS.enc.Utf16, + "Hex": CryptoJS.enc.Hex, + "Base64": CryptoJS.enc.Base64, + "UTF8": CryptoJS.enc.Utf8, + "UTF16": CryptoJS.enc.Utf16, "UTF16LE": CryptoJS.enc.Utf16LE, "UTF16BE": CryptoJS.enc.Utf16BE, - "Latin1": CryptoJS.enc.Latin1, + "Latin1": CryptoJS.enc.Latin1 }; diff --git a/src/core/lib/Code.mjs b/src/core/lib/Code.mjs index 2d749d79..af6e9564 100644 --- a/src/core/lib/Code.mjs +++ b/src/core/lib/Code.mjs @@ -14,7 +14,7 @@ * @returns {string} */ export function replaceVariableNames(input, replacer) { - const tokenRegex = /\\"|"(?:\\"|[^"])*"|(\b[a-z0-9\-_]+\b)/ig; + const tokenRegex = /\\"|"(?:\\"|[^"])*"|(\b[a-z0-9\-_]+\b)/gi; return input.replace(tokenRegex, (...args) => { const match = args[0], diff --git a/src/core/lib/Colossus.mjs b/src/core/lib/Colossus.mjs index 5fb8e0cc..db4121f8 100644 --- a/src/core/lib/Colossus.mjs +++ b/src/core/lib/Colossus.mjs @@ -5,7 +5,7 @@ * @copyright Crown Copyright 2019 * @license Apache-2.0 */ -import {INIT_PATTERNS, ITA2_TABLE, ROTOR_SIZES} from "../lib/Lorenz.mjs"; +import { INIT_PATTERNS, ITA2_TABLE, ROTOR_SIZES } from "../lib/Lorenz.mjs"; /** * Colossus simulator class. @@ -39,7 +39,6 @@ export class ColossusComputer { this.settotal = settotal; this.limitations = limit; - this.allCounters = [0, 0, 0, 0, 0]; this.Zbits = [0, 0, 0, 0, 0]; // Z input is the cipher tape @@ -73,7 +72,20 @@ export class ColossusComputer { }; // loop until our start positions are back to the beginning - this.rotorPtrs = {X1: this.starts.X1, X2: this.starts.X2, X3: this.starts.X3, X4: this.starts.X4, X5: this.starts.X5, M61: this.starts.M61, M37: this.starts.M37, S1: this.starts.S1, S2: this.starts.S2, S3: this.starts.S3, S4: this.starts.S4, S5: this.starts.S5}; + this.rotorPtrs = { + X1: this.starts.X1, + X2: this.starts.X2, + X3: this.starts.X3, + X4: this.starts.X4, + X5: this.starts.X5, + M61: this.starts.M61, + M37: this.starts.M37, + S1: this.starts.S1, + S2: this.starts.S2, + S3: this.starts.S3, + S4: this.starts.S4, + S5: this.starts.S5 + }; // this.rotorPtrs = this.starts; let runcount = 1; @@ -97,9 +109,9 @@ export class ColossusComputer { if (fast !== "") fastRef = this.rotorPtrs[fast].toString().padStart(2, "0"); if (slow !== "") slowRef = this.rotorPtrs[slow].toString().padStart(2, "0"); let printline = ""; - for (let c=0;c<5;c++) { + for (let c = 0; c < 5; c++) { if (this.allCounters[c] > this.settotal) { - printline += String.fromCharCode(c+97) + this.allCounters[c]+" "; + printline += String.fromCharCode(c + 97) + this.allCounters[c] + " "; } } if (printline !== "") { @@ -140,7 +152,7 @@ export class ColossusComputer { this.Sptr = [this.rotorPtrs.S1, this.rotorPtrs.S2, this.rotorPtrs.S3, this.rotorPtrs.S4, this.rotorPtrs.S5]; // Run full loop of all character on the input tape (Z) - for (let i=0; i ROTOR_SIZES["X"+(r+1)]) this.Xptr[r] = 1; + if (this.Xptr[r] > ROTOR_SIZES["X" + (r + 1)]) this.Xptr[r] = 1; } if (this.totalmotor) { // Step Psi rotors - for (let r=0; r<5; r++) { + for (let r = 0; r < 5; r++) { this.Sptr[r]++; - if (this.Sptr[r] > ROTOR_SIZES["S"+(r+1)]) this.Sptr[r] = 1; + if (this.Sptr[r] > ROTOR_SIZES["S" + (r + 1)]) this.Sptr[r] = 1; } } // Move M37 rotor if M61 set - if (this.rings.M[1][this.Mptr[1]-1]===1) this.Mptr[0]++; - if (this.Mptr[0] > ROTOR_SIZES.M37) this.Mptr[0]=1; + if (this.rings.M[1][this.Mptr[1] - 1] === 1) this.Mptr[0]++; + if (this.Mptr[0] > ROTOR_SIZES.M37) this.Mptr[0] = 1; // Always move M61 rotor this.Mptr[1]++; - if (this.Mptr[1] > ROTOR_SIZES.M61) this.Mptr[1]=1; + if (this.Mptr[1] > ROTOR_SIZES.M61) this.Mptr[1] = 1; } /** @@ -253,25 +264,25 @@ export class ColossusComputer { this.Qbits = this.Zbits; } else if (this.qbusin.Z === "ΔZ") { // delta Z, the Bitwise XOR of this character Zbits + last character Zbits - for (let b=0;b<5;b++) { + for (let b = 0; b < 5; b++) { this.Qbits[b] = this.Zbits[b] ^ this.ZbitsOneBack[b]; } } this.ZbitsOneBack = this.Zbits.slice(); // copy value of object, not reference // Xbits - the current Chi wheel bits - for (let b=0;b<5;b++) { - this.Xbits[b] = this.rings.X[b+1][this.Xptr[b]-1]; + for (let b = 0; b < 5; b++) { + this.Xbits[b] = this.rings.X[b + 1][this.Xptr[b] - 1]; } if (this.qbusin.Chi !== "") { if (this.qbusin.Chi === "Χ") { // direct X added to Qbits - for (let b=0;b<5;b++) { + for (let b = 0; b < 5; b++) { this.Qbits[b] = this.Qbits[b] ^ this.Xbits[b]; } } else if (this.qbusin.Chi === "ΔΧ") { // delta X - for (let b=0;b<5;b++) { + for (let b = 0; b < 5; b++) { this.Qbits[b] = this.Qbits[b] ^ this.Xbits[b]; this.Qbits[b] = this.Qbits[b] ^ this.XbitsOneBack[b]; } @@ -280,18 +291,18 @@ export class ColossusComputer { this.XbitsOneBack = this.Xbits.slice(); // Sbits - the current Psi wheel bits - for (let b=0;b<5;b++) { - this.Sbits[b] = this.rings.S[b+1][this.Sptr[b]-1]; + for (let b = 0; b < 5; b++) { + this.Sbits[b] = this.rings.S[b + 1][this.Sptr[b] - 1]; } if (this.qbusin.Psi !== "") { if (this.qbusin.Psi === "Ψ") { // direct S added to Qbits - for (let b=0;b<5;b++) { + for (let b = 0; b < 5; b++) { this.Qbits[b] = this.Qbits[b] ^ this.Sbits[b]; } } else if (this.qbusin.Psi === "ΔΨ") { // delta S - for (let b=0;b<5;b++) { + for (let b = 0; b < 5; b++) { this.Qbits[b] = this.Qbits[b] ^ this.Sbits[b]; this.Qbits[b] = this.Qbits[b] ^ this.SbitsOneBack[b]; } @@ -307,14 +318,14 @@ export class ColossusComputer { const cnt = [-1, -1, -1, -1, -1]; const numrows = this.qbusswitches.condition.length; - for (let r=0;r= 0 && Qswitch[s] !== parseInt(this.Qbits[s], 10)) result = false; } // Check for NOT switch @@ -330,7 +341,7 @@ export class ColossusComputer { } // Negate the whole column, this allows A OR B by doing NOT(NOT A AND NOT B) - for (let c=0;c<5;c++) { + for (let c = 0; c < 5; c++) { if (this.qbusswitches.condNegateAll && cnt[c] !== -1) cnt[c] = !cnt[c]; } @@ -348,13 +359,13 @@ export class ColossusComputer { // Colossus could actually add into any of the five counters. if (row.C1) { let addition = 0; - for (let s=0;s<5;s++) { + for (let s = 0; s < 5; s++) { // XOR addition if (Qswitch[s]) { addition = addition ^ this.Qbits[s]; } } - const equals = (row.Equals===""?-1:(row.Equals==="."?0:1)); + const equals = row.Equals === "" ? -1 : row.Equals === "." ? 0 : 1; if (addition === equals) { // AND with conditional rows to get final result if (cnt[0] === -1) cnt[0] = true; @@ -365,13 +376,16 @@ export class ColossusComputer { // Final check, check for addition section negate // then, if any column set, from top to bottom of rack, add to counter. - for (let c=0;c<5;c++) { + for (let c = 0; c < 5; c++) { if (this.qbusswitches.addNegateAll && cnt[c] !== -1) cnt[c] = !cnt[c]; - if (this.qbusswitches.totalMotor === "" || (this.qbusswitches.totalMotor === "x" && this.totalmotor === 0) || (this.qbusswitches.totalMotor === "." && this.totalmotor === 1)) { + if ( + this.qbusswitches.totalMotor === "" + || (this.qbusswitches.totalMotor === "x" && this.totalmotor === 0) + || (this.qbusswitches.totalMotor === "." && this.totalmotor === 1) + ) { if (cnt[c] === true) this.allCounters[c]++; } - } } @@ -390,7 +404,7 @@ export class ColossusComputer { }, M: { 1: INIT_PATTERNS[pattern].M[1].slice().reverse(), - 2: INIT_PATTERNS[pattern].M[2].slice().reverse(), + 2: INIT_PATTERNS[pattern].M[2].slice().reverse() }, S: { 1: INIT_PATTERNS[pattern].S[1].slice().reverse(), @@ -407,11 +421,10 @@ export class ColossusComputer { */ readBusSwitches(row) { const output = [-1, -1, -1, -1, -1]; - for (let c=0;c<5;c++) { - if (row[c]===".") output[c] = 0; - if (row[c]==="x") output[c] = 1; + for (let c = 0; c < 5; c++) { + if (row[c] === ".") output[c] = 0; + if (row[c] === "x") output[c] = 1; } return output; } - } diff --git a/src/core/lib/ConvertCoordinates.mjs b/src/core/lib/ConvertCoordinates.mjs index 4fca357d..0c7534ae 100644 --- a/src/core/lib/ConvertCoordinates.mjs +++ b/src/core/lib/ConvertCoordinates.mjs @@ -43,7 +43,7 @@ const NO_CHANGE = [ "Geohash", "Military Grid Reference System", "Ordnance Survey National Grid", - "Universal Transverse Mercator", + "Universal Transverse Mercator" ]; /** @@ -58,7 +58,7 @@ const NO_CHANGE = [ * @param {number} precision - Precision of the result * @returns {string} A formatted string of the converted co-ordinates */ -export function convertCoordinates (input, inFormat, inDelim, outFormat, outDelim, includeDir, precision) { +export function convertCoordinates(input, inFormat, inDelim, outFormat, outDelim, includeDir, precision) { let isPair = false, split, latlon, @@ -194,7 +194,7 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli break; case "Decimal Degrees": if (isPair) { - splitLat = splitInput(split[0]); + splitLat = splitInput(split[0]); splitLong = splitInput(split[1]); if (splitLat.length !== 1 || splitLong.length !== 1) { throw new OperationError("Invalid co-ordinate format for Decimal Degrees."); @@ -221,11 +221,11 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli const dirs = input.toUpperCase().match(/[NESW]/g); if (dirs && dirs.length >= 1) { // Make positive lat/lon values with S/W directions into negative values - if (dirs[0] === "S" || dirs[0] === "W" && latlon.lat > 0) { + if (dirs[0] === "S" || (dirs[0] === "W" && latlon.lat > 0)) { latlon.lat = -latlon.lat; } if (dirs.length >= 2) { - if (dirs[1] === "S" || dirs[1] === "W" && latlon.lon > 0) { + if (dirs[1] === "S" || (dirs[1] === "W" && latlon.lon > 0)) { latlon.lon = -latlon.lon; } } @@ -275,7 +275,9 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli case "Ordnance Survey National Grid": osng = OsGridRef.latLonToOsGrid(latlon); if (osng.toString() === "") { - throw new OperationError("Could not convert co-ordinates to OS National Grid. Are the co-ordinates in range?"); + throw new OperationError( + "Could not convert co-ordinates to OS National Grid. Are the co-ordinates in range?" + ); } // OSNG wants a precision that's an even number between 2 and 10 if (precision % 2 !== 0) { @@ -340,10 +342,10 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli * @param {string} input - The input data to be split * @returns {number[]} An array of the different items in the string, stored as floats */ -function splitInput (input) { +function splitInput(input) { const split = []; - input.split(/\s+/).forEach(item => { + input.split(/\s+/).forEach((item) => { // Remove any character that isn't a digit, decimal point or negative sign item = item.replace(/[^0-9.-]/g, ""); if (item.length > 0) { @@ -363,9 +365,9 @@ function splitInput (input) { * @param {number} precision - The precision the result should be rounded to * @returns {{string: string, degrees: number}} An object containing the raw converted value (obj.degrees), and a formatted string version (obj.string) */ -function convDMSToDD (degrees, minutes, seconds, precision) { +function convDMSToDD(degrees, minutes, seconds, precision) { const absDegrees = Math.abs(degrees); - let conv = absDegrees + (minutes / 60) + (seconds / 3600); + let conv = absDegrees + minutes / 60 + seconds / 3600; let outString = round(conv, precision) + "°"; if (isNegativeZero(degrees) || degrees < 0) { conv = -conv; @@ -385,7 +387,7 @@ function convDMSToDD (degrees, minutes, seconds, precision) { * @param {number} precision - The precision which the result should be rounded to * @returns {{string: string, degrees: number}} An object containing the raw converted value (obj.degrees), and a formatted string version (obj.string) */ -function convDDMToDD (degrees, minutes, precision) { +function convDDMToDD(degrees, minutes, precision) { const absDegrees = Math.abs(degrees); let conv = absDegrees + minutes / 60; let outString = round(conv, precision) + "°"; @@ -407,7 +409,7 @@ function convDDMToDD (degrees, minutes, precision) { * @param {number} precision - The precision which the result should be rounded to * @returns {{string: string, degrees: number}} An object containing the raw converted value (obj.degrees), and a formatted string version (obj.string) */ -function convDDToDD (degrees, precision) { +function convDDToDD(degrees, precision) { return { "degrees": degrees, "string": round(degrees, precision) + "°" @@ -421,12 +423,12 @@ function convDDToDD (degrees, precision) { * @param {number} precision - The precision which the result should be rounded to * @returns {{string: string, degrees: number, minutes: number, seconds: number}} An object containing the raw converted value as separate numbers (.degrees, .minutes, .seconds), and a formatted string version (obj.string) */ -function convDDToDMS (decDegrees, precision) { +function convDDToDMS(decDegrees, precision) { const absDegrees = Math.abs(decDegrees); let degrees = Math.floor(absDegrees); const minutes = Math.floor(60 * (absDegrees - degrees)), seconds = round(3600 * (absDegrees - degrees) - 60 * minutes, precision); - let outString = degrees + "° " + minutes + "' " + seconds + "\""; + let outString = degrees + "° " + minutes + "' " + seconds + '"'; if (isNegativeZero(decDegrees) || decDegrees < 0) { degrees = -degrees; outString = "-" + outString; @@ -446,7 +448,7 @@ function convDDToDMS (decDegrees, precision) { * @param {number} precision - The precision the input data should be rounded to * @returns {{string: string, degrees: number, minutes: number}} An object containing the raw converted value as separate numbers (.degrees, .minutes), and a formatted string version (obj.string) */ -function convDDToDDM (decDegrees, precision) { +function convDDToDDM(decDegrees, precision) { const absDegrees = Math.abs(decDegrees); let degrees = Math.floor(absDegrees); const minutes = absDegrees - degrees, @@ -460,7 +462,7 @@ function convDDToDDM (decDegrees, precision) { return { "degrees": degrees, "minutes": decMinutes, - "string": outString, + "string": outString }; } @@ -532,7 +534,7 @@ export function findDirs(input, delim) { * @param {string} delim - The delimiter separating the data in input * @returns {string} The input format */ -export function findFormat (input, delim) { +export function findFormat(input, delim) { let testData; const mgrsPattern = new RegExp(/^[0-9]{2}\s?[C-HJ-NP-X]{1}\s?[A-HJ-NP-Z][A-HJ-NP-V]\s?[0-9\s]+/), osngPattern = new RegExp(/^[A-HJ-Z]{2}\s+[0-9\s]+$/), @@ -597,7 +599,7 @@ export function findFormat (input, delim) { * @param {string} input * @returns {string} Delimiter type */ -export function findDelim (input) { +export function findDelim(input) { input = input.trim(); const delims = [",", ";", ":"]; const testDir = input.match(/[NnEeSsWw]/g); @@ -634,14 +636,14 @@ export function findDelim (input) { * @param {string} delim The delimiter to be matched * @returns {string} */ -export function realDelim (delim) { +export function realDelim(delim) { return { - "Auto": "Auto", - "Space": " ", - "\\n": "\n", - "Comma": ",", - "Semi-colon": ";", - "Colon": ":" + "Auto": "Auto", + "Space": " ", + "\\n": "\n", + "Comma": ",", + "Semi-colon": ";", + "Colon": ":" }[delim]; } @@ -652,7 +654,7 @@ export function realDelim (delim) { * @returns {boolean} */ function isNegativeZero(zero) { - return zero === 0 && (1/zero < 0); + return zero === 0 && 1 / zero < 0; } /** diff --git a/src/core/lib/Crypt.mjs b/src/core/lib/Crypt.mjs index c36a0267..29153994 100644 --- a/src/core/lib/Crypt.mjs +++ b/src/core/lib/Crypt.mjs @@ -6,4 +6,5 @@ * @license Apache-2.0 */ -export const cryptNotice = "WARNING: Cryptographic operations in CyberChef should not be relied upon to provide security in any situation. No guarantee is offered for their correctness. We advise you not to use keys generated from CyberChef in operational contexts."; +export const cryptNotice + = "WARNING: Cryptographic operations in CyberChef should not be relied upon to provide security in any situation. No guarantee is offered for their correctness. We advise you not to use keys generated from CyberChef in operational contexts."; diff --git a/src/core/lib/DateTime.mjs b/src/core/lib/DateTime.mjs index 00a177c6..92d2bfa1 100644 --- a/src/core/lib/DateTime.mjs +++ b/src/core/lib/DateTime.mjs @@ -42,7 +42,7 @@ export const DATETIME_FORMATS = [ { name: "Automatic", value: "" - }, + } ]; /** @@ -310,4 +310,3 @@ export const FORMAT_EXAMPLES = `Format string tokens: `; - diff --git a/src/core/lib/Decimal.mjs b/src/core/lib/Decimal.mjs index a140fd4e..0d55bd91 100644 --- a/src/core/lib/Decimal.mjs +++ b/src/core/lib/Decimal.mjs @@ -8,7 +8,6 @@ import Utils from "../Utils.mjs"; - /** * Convert a string of decimal values into a byte array. * @@ -23,12 +22,11 @@ import Utils from "../Utils.mjs"; * // returns [10,20,30] * fromDecimal("10:20:30", "Colon"); */ -export function fromDecimal(data, delim="Auto") { +export function fromDecimal(data, delim = "Auto") { delim = Utils.charRep(delim); const output = []; let byteStr = data.split(delim); - if (byteStr[byteStr.length-1] === "") - byteStr = byteStr.slice(0, byteStr.length-1); + if (byteStr[byteStr.length - 1] === "") byteStr = byteStr.slice(0, byteStr.length - 1); for (let i = 0; i < byteStr.length; i++) { output[i] = parseInt(byteStr[i], 10); diff --git a/src/core/lib/Delim.mjs b/src/core/lib/Delim.mjs index c8cc637b..2fbec0e8 100644 --- a/src/core/lib/Delim.mjs +++ b/src/core/lib/Delim.mjs @@ -19,7 +19,16 @@ export const BIN_DELIM_OPTIONS = ["Space", "Comma", "Semi-colon", "Colon", "Line /** * Letter sequence delimiters. */ -export const LETTER_DELIM_OPTIONS = ["Space", "Line feed", "CRLF", "Forward slash", "Backslash", "Comma", "Semi-colon", "Colon"]; +export const LETTER_DELIM_OPTIONS = [ + "Space", + "Line feed", + "CRLF", + "Forward slash", + "Backslash", + "Comma", + "Semi-colon", + "Colon" +]; /** * Word sequence delimiters. @@ -29,7 +38,15 @@ export const WORD_DELIM_OPTIONS = ["Line feed", "CRLF", "Forward slash", "Backsl /** * Input sequence delimiters. */ -export const INPUT_DELIM_OPTIONS = ["Line feed", "CRLF", "Space", "Comma", "Semi-colon", "Colon", "Nothing (separate chars)"]; +export const INPUT_DELIM_OPTIONS = [ + "Line feed", + "CRLF", + "Space", + "Comma", + "Semi-colon", + "Colon", + "Nothing (separate chars)" +]; /** * Arithmetic sequence delimiters @@ -50,34 +67,34 @@ export const IP_DELIM_OPTIONS = ["Line feed", "CRLF", "Space", "Comma", "Semi-co * Split delimiters. */ export const SPLIT_DELIM_OPTIONS = [ - {name: "Comma", value: ","}, - {name: "Space", value: " "}, - {name: "Line feed", value: "\\n"}, - {name: "CRLF", value: "\\r\\n"}, - {name: "Semi-colon", value: ";"}, - {name: "Colon", value: ":"}, - {name: "Nothing (separate chars)", value: ""} + { name: "Comma", value: "," }, + { name: "Space", value: " " }, + { name: "Line feed", value: "\\n" }, + { name: "CRLF", value: "\\r\\n" }, + { name: "Semi-colon", value: ";" }, + { name: "Colon", value: ":" }, + { name: "Nothing (separate chars)", value: "" } ]; /** * Join delimiters. */ export const JOIN_DELIM_OPTIONS = [ - {name: "Line feed", value: "\\n"}, - {name: "CRLF", value: "\\r\\n"}, - {name: "Space", value: " "}, - {name: "Comma", value: ","}, - {name: "Semi-colon", value: ";"}, - {name: "Colon", value: ":"}, - {name: "Nothing (join chars)", value: ""} + { name: "Line feed", value: "\\n" }, + { name: "CRLF", value: "\\r\\n" }, + { name: "Space", value: " " }, + { name: "Comma", value: "," }, + { name: "Semi-colon", value: ";" }, + { name: "Colon", value: ":" }, + { name: "Nothing (join chars)", value: "" } ]; /** * RGBA list delimiters. */ export const RGBA_DELIM_OPTIONS = [ - {name: "Comma", value: ","}, - {name: "Space", value: " "}, - {name: "CRLF", value: "\\r\\n"}, - {name: "Line Feed", value: "\n"} + { name: "Comma", value: "," }, + { name: "Space", value: " " }, + { name: "CRLF", value: "\\r\\n" }, + { name: "Line Feed", value: "\n" } ]; diff --git a/src/core/lib/Enigma.mjs b/src/core/lib/Enigma.mjs index 988e0c45..3d9c6b34 100644 --- a/src/core/lib/Enigma.mjs +++ b/src/core/lib/Enigma.mjs @@ -14,19 +14,19 @@ import Utils from "../Utils.mjs"; * followed by < and a list of letters at which the rotor steps. */ export const ROTORS = [ - {name: "I", value: "EKMFLGDQVZNTOWYHXUSPAIBRCJ= 65 && i <= 90) { return i - 65; @@ -72,7 +72,7 @@ export function a2i(c, permissive=false) { */ export function i2a(i) { if (i >= 0 && i < 26) { - return Utils.chr(i+65); + return Utils.chr(i + 65); } throw new OperationError("i2a called on value outside 0..25"); } @@ -105,7 +105,7 @@ export class Rotor { this.map = new Array(26); this.revMap = new Array(26); const uniq = {}; - for (let i=0; i { + pairs.split(/\s+/).forEach((pair) => { if (!/^[A-Z]{2}$/.test(pair)) { throw new OperationError(name + " must be a whitespace-separated list of uppercase letter pairs"); } - const a = a2i(pair[0]), b = a2i(pair[1]); + const a = a2i(pair[0]), + b = a2i(pair[1]); if (a === b) { // self-stecker return; diff --git a/src/core/lib/Extract.mjs b/src/core/lib/Extract.mjs index 18fec28c..cd528742 100644 --- a/src/core/lib/Extract.mjs +++ b/src/core/lib/Extract.mjs @@ -18,7 +18,7 @@ * @param {boolean} [unique=false] - Whether to unique the results * @returns {string} */ -export function search(input, searchRegex, removeRegex=null, sortBy=null, unique=false) { +export function search(input, searchRegex, removeRegex = null, sortBy = null, unique = false) { let results = []; let match; @@ -28,8 +28,7 @@ export function search(input, searchRegex, removeRegex=null, sortBy=null, unique searchRegex.lastIndex++; } - if (removeRegex && removeRegex.test(match[0])) - continue; + if (removeRegex && removeRegex.test(match[0])) continue; results.push(match[0]); } @@ -45,20 +44,17 @@ export function search(input, searchRegex, removeRegex=null, sortBy=null, unique return results; } - /** * URL regular expression */ const protocol = "[A-Z]+://", hostname = "[-\\w]+(?:\\.\\w[-\\w]*)+", port = ":\\d+", - path = "/[^.!,?\"<>\\[\\]{}\\s\\x7F-\\xFF]*" + - "(?:[.!,?]+[^.!,?\"<>\\[\\]{}\\s\\x7F-\\xFF]+)*"; + path = '/[^.!,?"<>\\[\\]{}\\s\\x7F-\\xFF]*' + '(?:[.!,?]+[^.!,?"<>\\[\\]{}\\s\\x7F-\\xFF]+)*'; export const URL_REGEX = new RegExp(protocol + hostname + "(?:" + port + ")?(?:" + path + ")?", "ig"); - /** * Domain name regular expression */ -export const DOMAIN_REGEX = /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/ig; +export const DOMAIN_REGEX = /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/gi; diff --git a/src/core/lib/FileSignatures.mjs b/src/core/lib/FileSignatures.mjs index 4cba4bc7..4e76aa92 100644 --- a/src/core/lib/FileSignatures.mjs +++ b/src/core/lib/FileSignatures.mjs @@ -23,7 +23,10 @@ export const FILE_SIGNATURES = { 0: 0xff, 1: 0xd8, 2: 0xff, - 3: [0xc0, 0xc4, 0xdb, 0xdd, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe7, 0xe8, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xfe] + 3: [ + 0xc0, 0xc4, 0xdb, 0xdd, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe7, 0xe8, 0xea, 0xeb, 0xec, 0xed, + 0xee, 0xfe + ] }, extractor: extractJPEG }, @@ -38,7 +41,7 @@ export const FILE_SIGNATURES = { 2: 0x46, 3: 0x38, // 8 4: [0x37, 0x39], // 7|9 - 5: 0x61 // a + 5: 0x61 // a }, extractor: extractGIF }, @@ -89,7 +92,8 @@ export const FILE_SIGNATURES = { }, extractor: null }, - { // Place before tiff check + { + // Place before tiff check name: "Canon CR2 raw image", extension: "cr2", mime: "image/x-canon-cr2", @@ -273,7 +277,10 @@ export const FILE_SIGNATURES = { 1: 0x0, 2: 0x1, 3: 0x0, - 4: [0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15], + 4: [ + 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15 + ], 5: 0x0, 6: [0x10, 0x20, 0x30, 0x40, 0x80], 7: [0x10, 0x20, 0x30, 0x40, 0x80], @@ -474,7 +481,8 @@ export const FILE_SIGNATURES = { mime: "image/x-targa", description: "", signature: [ - { // This signature is not at the beginning of the file. The extractor works backwards. + { + // This signature is not at the beginning of the file. The extractor works backwards. 0: 0x54, 1: 0x52, 2: 0x55, @@ -498,7 +506,8 @@ export const FILE_SIGNATURES = { } ], "Video": [ - { // Place before webm + { + // Place before webm name: "Matroska Multimedia Container", extension: "mkv", mime: "video/x-matroska", @@ -528,7 +537,8 @@ export const FILE_SIGNATURES = { }, extractor: null }, - { // Place before MPEG-4 + { + // Place before MPEG-4 name: "Flash MP4 video", extension: "f4v", mime: "video/mp4", @@ -746,7 +756,7 @@ export const FILE_SIGNATURES = { } ], extractor: null - }, + } ], "Audio": [ { @@ -984,7 +994,8 @@ export const FILE_SIGNATURES = { }, extractor: null }, - { // Place before PostScript + { + // Place before PostScript name: "Adobe PostScript", extension: "ps,eps,ai,pfa", mime: "application/postscript", @@ -1275,7 +1286,7 @@ export const FILE_SIGNATURES = { 57: 0x70 }, extractor: extractZIP - }, + } ], "Applications": [ { @@ -1355,7 +1366,7 @@ export const FILE_SIGNATURES = { signature: { 0: [0x43, 0x46], 1: 0x57, - 2: 0x53, + 2: 0x53 }, extractor: null }, @@ -1401,7 +1412,7 @@ export const FILE_SIGNATURES = { 3: 0x34 }, extractor: null - }, + } ], "Archives": [ { @@ -1654,7 +1665,7 @@ export const FILE_SIGNATURES = { mime: "application/mac-binhex", description: "", signature: { - 11: 0x6d, // must be converted with BinHex + 11: 0x6d, // must be converted with BinHex 12: 0x75, 13: 0x73, 14: 0x74, @@ -1759,7 +1770,7 @@ export const FILE_SIGNATURES = { description: "", signature: { 0: 0x50, - 1: 0x4B, + 1: 0x4b, 2: 0x03, 3: 0x04, 4: 0x14, @@ -1795,7 +1806,7 @@ export const FILE_SIGNATURES = { description: "", signature: { 0: 0x21, - 1: 0x3C, + 1: 0x3c, 2: 0x61, 3: 0x72, 4: 0x63, @@ -1834,7 +1845,8 @@ export const FILE_SIGNATURES = { }, extractor: null }, - { // Place before UTF-16 LE text + { + // Place before UTF-16 LE text name: "UTF-32 LE text", extension: "utf32le", mime: "charset/utf32le", @@ -1918,7 +1930,7 @@ export const FILE_SIGNATURES = { 10: 0x2, 34: 0x4c, 35: 0x50 - }, + } ], extractor: null }, @@ -2217,7 +2229,7 @@ export const FILE_SIGNATURES = { 14: 0x45, 15: 0x00, 21: 0x00, - 22: b => b >= 0x01 && b <= 0x80, + 22: (b) => b >= 0x01 && b <= 0x80, 23: 0x06 }, extractor: null @@ -2233,7 +2245,7 @@ export const FILE_SIGNATURES = { 14: 0x45, 15: 0x00, 16: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05], - 22: b => b >= 0x01 && b <= 0x80, + 22: (b) => b >= 0x01 && b <= 0x80, 23: 0x11 }, extractor: null @@ -2319,7 +2331,7 @@ export const FILE_SIGNATURES = { signature: { 0: 0x30, 1: 0x83, - 2: b => b !== 0x00, + 2: (b) => b !== 0x00, 5: 0x06, 6: 0x09 }, @@ -2445,7 +2457,7 @@ export const FILE_SIGNATURES = { 7: 0x62, 8: 0x61, 9: 0x73, - 10: 0x68, + 10: 0x68 }, extractor: null }, @@ -2463,7 +2475,7 @@ export const FILE_SIGNATURES = { 5: 0x6e, 6: 0x2f, 7: 0x73, - 8: 0x68, + 8: 0x68 }, extractor: null }, @@ -2490,7 +2502,7 @@ export const FILE_SIGNATURES = { 14: 0x68, 15: 0x6f, 16: 0x6e, - 17: [0x32, 0x33, 0xa, 0xd], + 17: [0x32, 0x33, 0xa, 0xd] }, extractor: null }, @@ -2514,7 +2526,7 @@ export const FILE_SIGNATURES = { 11: 0x72, 12: 0x75, 13: 0x62, - 14: 0x79, + 14: 0x79 }, extractor: null }, @@ -2538,7 +2550,7 @@ export const FILE_SIGNATURES = { 11: 0x70, 12: 0x65, 13: 0x72, - 14: 0x6c, + 14: 0x6c }, extractor: null }, @@ -2552,7 +2564,7 @@ export const FILE_SIGNATURES = { 1: 0x3f, 2: 0x70, 3: 0x68, - 4: 0x70, + 4: 0x70 }, extractor: null }, @@ -2597,7 +2609,6 @@ export const FILE_SIGNATURES = { ] }; - /** * JPEG extractor. * @@ -2610,7 +2621,8 @@ export function extractJPEG(bytes, offset) { while (stream.hasMore()) { const marker = stream.getBytes(2); - if (marker[0] !== 0xff) throw new Error(`Invalid marker while parsing JPEG at pos ${stream.position}: ${marker}`); + if (marker[0] !== 0xff) + throw new Error(`Invalid marker while parsing JPEG at pos ${stream.position}: ${marker}`); let segmentSize = 0; switch (marker[1]) { @@ -2701,7 +2713,6 @@ export function extractJPEG(bytes, offset) { throw new Error("Unable to parse JPEG successfully"); } - /** * GIF extractor. * @@ -2730,21 +2741,18 @@ export function extractGIF(bytes, offset) { while (stream.getBytes(2) !== [0x21, 0xf9]) { stream.moveBackwardsBy(2); stream.moveForwardsBy(stream.readInt(1)); - if (!stream.readInt(1)) - break; + if (!stream.readInt(1)) break; stream.moveBackwardsBy(1); } // When the end of the file is [0x00, 0x3b], end. - if (stream.readInt(1) === 0x3b) - break; + if (stream.readInt(1) === 0x3b) break; stream.moveForwardsBy(1); } return stream.carve(); } - /** * Portable executable extractor. * Assumes that the offset refers to an MZ header. @@ -2812,7 +2820,6 @@ export function extractMZPE(bytes, offset) { return stream.carve(); } - /** * PDF extractor. * @@ -2832,7 +2839,6 @@ export function extractPDF(bytes, offset) { return stream.carve(); } - /** * ZIP extractor. * @@ -2854,7 +2860,6 @@ export function extractZIP(bytes, offset) { return stream.carve(); } - /** * MACHO extractor * @@ -2863,13 +2868,11 @@ export function extractZIP(bytes, offset) { * @returns {Uint8Array} */ export function extractMACHO(bytes, offset) { - // Magic bytes. const MHCIGAM64 = "207250237254"; const MHMAGIC64 = "254237250207"; const MHCIGAM = "206250237254"; - /** * Checks to see if the file is 64-bit. * @@ -2880,7 +2883,6 @@ export function extractMACHO(bytes, offset) { return magic === MHCIGAM64 || magic === MHMAGIC64; } - /** * Checks the endianness of the file. * @@ -2891,7 +2893,6 @@ export function extractMACHO(bytes, offset) { return magic === MHCIGAM || magic === MHCIGAM64; } - /** * Jumps through segment information and calculates the sum of the segement sizes. * @@ -2907,12 +2908,10 @@ export function extractMACHO(bytes, offset) { const LCSEGEMENT = 0x1; for (let i = 0; i < ncmds; i++) { - // Move to start of segment. stream.moveTo(offset); const cmd = stream.readInt(4, isSwap); if (cmd === LCSEGEMENT64) { - // Move to size of segment field. stream.moveTo(offset + 48); @@ -2934,7 +2933,6 @@ export function extractMACHO(bytes, offset) { return total; } - /** * Reads the number of command segments. * @@ -2945,8 +2943,7 @@ export function extractMACHO(bytes, offset) { */ function dumpMachHeader(stream, is64, isSwap) { let loadCommandsOffset = 28; - if (is64) - loadCommandsOffset += 4; + if (is64) loadCommandsOffset += 4; // Move to number of commands field. stream.moveTo(16); @@ -2954,7 +2951,6 @@ export function extractMACHO(bytes, offset) { return dumpSegmentCommands(stream, loadCommandsOffset, isSwap, ncmds); } - const stream = new Stream(bytes.slice(offset)); const magic = stream.getBytes(4).join(""); @@ -2963,7 +2959,6 @@ export function extractMACHO(bytes, offset) { return stream.carve(); } - /** * TAR extractor. * @@ -2974,7 +2969,6 @@ export function extractMACHO(bytes, offset) { export function extractTAR(bytes, offset) { const stream = new Stream(bytes.slice(offset)); while (stream.hasMore()) { - // Move to ustar identifier. stream.moveForwardsBy(0x101); if (stream.getBytes(5).join("") !== [0x75, 0x73, 0x74, 0x61, 0x72].join("")) { @@ -2993,7 +2987,7 @@ export function extractTAR(bytes, offset) { }); // Round number up from octet to nearest 512. - fsize = (Math.ceil(parseInt(fsize, 8) / 512) * 512); + fsize = Math.ceil(parseInt(fsize, 8) / 512) * 512; // Move forwards to the end of that file. stream.moveForwardsBy(fsize + 0x179); @@ -3002,7 +2996,6 @@ export function extractTAR(bytes, offset) { return stream.carve(); } - /** * PNG extractor. * @@ -3027,11 +3020,9 @@ export function extractPNG(bytes, offset) { stream.moveForwardsBy(chunkSize + 4); } - return stream.carve(); } - /** * WEBP extractor. * @@ -3055,7 +3046,6 @@ export function extractWEBP(bytes, offset) { return stream.carve(); } - /** * BMP extractor. * @@ -3078,7 +3068,6 @@ export function extractBMP(bytes, offset) { return stream.carve(); } - /** * ICO extractor. * @@ -3095,7 +3084,7 @@ export function extractICO(bytes, offset) { const numberFiles = stream.readInt(2, "le"); // Move forward to the last file header. - stream.moveForwardsBy(8 + ((numberFiles-1) * 16)); + stream.moveForwardsBy(8 + (numberFiles - 1) * 16); const fileSize = stream.readInt(4, "le"); const fileOffset = stream.readInt(4, "le"); @@ -3104,7 +3093,6 @@ export function extractICO(bytes, offset) { return stream.carve(); } - /** * TARGA extractor. * @@ -3137,8 +3125,7 @@ export function extractTARGA(bytes, offset) { stream.moveBackwardsBy(sizeOfSize); // If the size matches. - if (size === i) - break; + if (size === i) break; } } @@ -3150,11 +3137,9 @@ export function extractTARGA(bytes, offset) { // The documentation said that 0x100000 was the largest the file could be. for (let i = 0; i < 0x100000; i++) { - // (Height * Width * pixel depth in bits)/8 - const total = (stream.readInt(2, "le") * stream.readInt(2, "le") * stream.readInt(1))/8; - if (total === i-1) - break; + const total = (stream.readInt(2, "le") * stream.readInt(2, "le") * stream.readInt(1)) / 8; + if (total === i - 1) break; stream.moveBackwardsBy(6); } @@ -3182,13 +3167,12 @@ export function extractTARGA(bytes, offset) { moveBackwardsUntilImageSize(); // Move backwards over the reaminder of the header + the 5 we borrowed in moveBackwardsUntilImageSize(). - stream.moveBackwardsBy(0xc+5); + stream.moveBackwardsBy(0xc + 5); } - return stream.carve(stream.position, offset+0x12); + return stream.carve(stream.position, offset + 0x12); } - /** * WAV extractor. * @@ -3208,7 +3192,6 @@ export function extractWAV(bytes, offset) { return stream.carve(); } - /** * MP3 extractor. * @@ -3220,14 +3203,32 @@ export function extractMP3(bytes, offset) { const stream = new Stream(bytes.slice(offset)); // Constants for flag byte. - const bitRateIndexes = ["free", 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, "bad"]; + const bitRateIndexes = [ + "free", + 32000, + 40000, + 48000, + 56000, + 64000, + 80000, + 96000, + 112000, + 128000, + 160000, + 192000, + 224000, + 256000, + 320000, + "bad" + ]; const samplingRateFrequencyIndex = [44100, 48000, 32000, "reserved"]; // ID3 tag, move over it. - if ((stream.getBytes(3).toString() === [0x49, 0x44, 0x33].toString())) { + if (stream.getBytes(3).toString() === [0x49, 0x44, 0x33].toString()) { stream.moveTo(6); - const tagSize = (stream.readInt(1) << 21) | (stream.readInt(1) << 14) | (stream.readInt(1) << 7) | stream.readInt(1); + const tagSize + = (stream.readInt(1) << 21) | (stream.readInt(1) << 14) | (stream.readInt(1) << 7) | stream.readInt(1); stream.moveForwardsBy(tagSize); } else { stream.moveTo(0); @@ -3235,7 +3236,6 @@ export function extractMP3(bytes, offset) { // Loop over all the frame headers in the file. while (stream.hasMore()) { - // If it has an old TAG frame at the end of it, fixed size, 128 bytes. if (stream.getBytes(3) === [0x54, 0x41, 0x47].toString()) { stream.moveForwardsBy(125); @@ -3267,11 +3267,11 @@ export function extractMP3(bytes, offset) { } // Formula: FrameLength = (144 * BitRate / SampleRate ) + Padding - const frameSize = Math.floor(((144 * bitRate) / sampleRate) + padding); + const frameSize = Math.floor((144 * bitRate) / sampleRate + padding); // If the next move goes past the end of the bytestream then extract the entire bytestream. // We assume complete frames in the above formula because there is no field that suggests otherwise. - if ((stream.position + frameSize) > stream.length) { + if (stream.position + frameSize > stream.length) { stream.moveTo(stream.length); break; } else { @@ -3281,7 +3281,6 @@ export function extractMP3(bytes, offset) { return stream.carve(); } - /** * FLV extractor. * @@ -3312,7 +3311,7 @@ export function extractFLV(bytes, offset) { break; } - if (prevTagSize !== (tagSize + 11)) { + if (prevTagSize !== tagSize + 11) { // Previous tag was not valid, reverse back over this header // and the previous tag body and header stream.moveBackwardsBy(tagSize + 11 + 5); @@ -3328,7 +3327,6 @@ export function extractFLV(bytes, offset) { return stream.carve(); } - /** * RTF extractor. * @@ -3341,7 +3339,8 @@ export function extractRTF(bytes, offset) { let openTags = 0; - if (stream.readInt(1) !== 0x7b) { // { + if (stream.readInt(1) !== 0x7b) { + // { throw new Error("Not a valid RTF file"); } else { openTags++; @@ -3368,7 +3367,6 @@ export function extractRTF(bytes, offset) { return stream.carve(); } - /** * SQLITE extractor. * @@ -3388,12 +3386,11 @@ export function extractSQLITE(bytes, offset) { const numPages = stream.readInt(4); // Move to the end of all the pages. - stream.moveTo(pageSize*numPages); + stream.moveTo(pageSize * numPages); return stream.carve(); } - /** * PList (XML) extractor. * @@ -3414,7 +3411,6 @@ export function extractPListXML(bytes, offset) { // While we have an unequal amount of braces. while (braceCount > 0 && stream.hasMore()) { if (stream.readInt(1) === 0x3c) { - // If we hit an stream.moveForwardsBy(8); while (stream.hasMore()) { - // Move to size field. stream.moveForwardsBy(48); - let fsize= ""; + let fsize = ""; // Convert size to a usable number. for (const elem of stream.getBytes(10)) { @@ -3732,7 +3756,6 @@ export function extractDEB(bytes, offset) { return stream.carve(); } - /** * ELF extractor. * @@ -3776,15 +3799,10 @@ export function extractELF(bytes, offset) { return stream.carve(); } - // Construct required Huffman Tables const fixedLiteralTableLengths = new Array(288); for (let i = 0; i < fixedLiteralTableLengths.length; i++) { - fixedLiteralTableLengths[i] = - (i <= 143) ? 8 : - (i <= 255) ? 9 : - (i <= 279) ? 7 : - 8; + fixedLiteralTableLengths[i] = i <= 143 ? 8 : i <= 255 ? 9 : i <= 279 ? 7 : 8; } const fixedLiteralTable = buildHuffmanTable(fixedLiteralTableLengths); const fixedDistanceTableLengths = new Array(30).fill(5); @@ -3873,15 +3891,11 @@ function parseDEFLATE(stream) { } // Consume final byte if it has not been fully consumed yet - if (stream.bitPos > 0) - stream.moveForwardsBy(1); + if (stream.bitPos > 0) stream.moveForwardsBy(1); } - // Static length tables -const lengthExtraTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0 -]; +const lengthExtraTable = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0]; const distanceExtraTable = [ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 ]; @@ -3903,8 +3917,7 @@ function parseHuffmanBlock(stream, litTab, distTab) { if (code === 256) break; // Detect probably infinite loops - if (++loops > 10000) - throw new Error("Caught in probable infinite loop while parsing Huffman Block"); + if (++loops > 10000) throw new Error("Caught in probable infinite loop while parsing Huffman Block"); // Literal if (code < 256) continue; @@ -3918,7 +3931,6 @@ function parseHuffmanBlock(stream, litTab, distTab) { } } - /** * Builds a Huffman table given the relevant code lengths * @@ -3960,7 +3972,6 @@ function buildHuffmanTable(lengths) { return [table, maxCodeLength, minCodeLength]; } - /** * Reads the next Huffman code from the stream, given the relevant code table * @@ -3977,7 +3988,9 @@ function readHuffmanCode(stream, table) { const codeLength = codeWithLength >>> 16; if (codeLength > maxCodeLength) { - throw new Error(`Invalid Huffman Code length while parsing DEFLATE block at pos ${stream.position}: ${codeLength}`); + throw new Error( + `Invalid Huffman Code length while parsing DEFLATE block at pos ${stream.position}: ${codeLength}` + ); } stream.moveBackwardsByBits(maxCodeLength - codeLength); @@ -3985,7 +3998,6 @@ function readHuffmanCode(stream, table) { return codeWithLength & 0xffff; } - /** * EVTX extractor. * @@ -4003,15 +4015,13 @@ export function extractEVTX(bytes, offset) { while (stream.hasMore()) { // Loop through ELFCHNKs. - if (stream.getBytes(7).join("") !== [0x45, 0x6c, 0x66, 0x43, 0x68, 0x6e, 0x6b].join("")) - break; + if (stream.getBytes(7).join("") !== [0x45, 0x6c, 0x66, 0x43, 0x68, 0x6e, 0x6b].join("")) break; stream.moveForwardsBy(0xfff9); } stream.consumeWhile(0x00); return stream.carve(); } - /** * EVT extractor. * @@ -4031,11 +4041,10 @@ export function extractEVT(bytes, offset) { const eofSize = stream.readInt(4, "le"); // Move past EOF. - stream.moveForwardsBy(eofSize-4); + stream.moveForwardsBy(eofSize - 4); return stream.carve(); } - /** * DMP extractor. * @@ -4055,7 +4064,6 @@ export function extractDMP(bytes, offset) { return stream.carve(); } - /** * PF extractor. * @@ -4073,7 +4081,6 @@ export function extractPF(bytes, offset) { return stream.carve(); } - /** * PF (Win 10) extractor. * @@ -4090,7 +4097,6 @@ export function extractPFWin10(bytes, offset) { return stream.carve(); } - /** * LNK extractor. * @@ -4108,7 +4114,6 @@ export function extractLNK(bytes, offset) { return stream.carve(); } - /** * LZOP extractor. * @@ -4127,7 +4132,8 @@ export function extractLZOP(bytes, offset) { const F_H_FILTER = 0x00000800; const F_H_EXTRA_FIELD = 0x00000040; - let numCheckSumC = 0, numCheckSumD = 0; + let numCheckSumC = 0, + numCheckSumD = 0; // Move over magic bytes. stream.moveForwardsBy(9); @@ -4138,26 +4144,20 @@ export function extractLZOP(bytes, offset) { stream.moveForwardsBy(6); const flags = stream.readInt(4, "be"); - if (version & F_H_FILTER) - stream.moveForwardsBy(4); + if (version & F_H_FILTER) stream.moveForwardsBy(4); - if (flags & F_ADLER32_C) - numCheckSumC++; + if (flags & F_ADLER32_C) numCheckSumC++; - if (flags & F_CRC32_C) - numCheckSumC++; + if (flags & F_CRC32_C) numCheckSumC++; - if (flags & F_ADLER32_D) - numCheckSumD++; + if (flags & F_ADLER32_D) numCheckSumD++; - if (flags & F_CRC32_D) - numCheckSumD++; + if (flags & F_CRC32_D) numCheckSumD++; // Move over the mode, mtime_low stream.moveForwardsBy(8); - if (version >= 0x0940) - stream.moveForwardsBy(4); + if (version >= 0x0940) stream.moveForwardsBy(4); const fnameSize = stream.readInt(1, "be"); @@ -4176,16 +4176,14 @@ export function extractLZOP(bytes, offset) { const uncompSize = stream.readInt(4, "be"); // If data has no length, break. - if (uncompSize === 0) - break; + if (uncompSize === 0) break; const compSize = stream.readInt(4, "be"); - const numCheckSumSkip = (uncompSize === compSize) ? numCheckSumD : numCheckSumD + numCheckSumC; + const numCheckSumSkip = uncompSize === compSize ? numCheckSumD : numCheckSumD + numCheckSumC; // skip forwards by compressed data size and the size of the checksum(s). - stream.moveForwardsBy(compSize + (numCheckSumSkip * 4)); + stream.moveForwardsBy(compSize + numCheckSumSkip * 4); } return stream.carve(); - } diff --git a/src/core/lib/FileType.mjs b/src/core/lib/FileType.mjs index 7a6a0a4e..2aadc750 100644 --- a/src/core/lib/FileType.mjs +++ b/src/core/lib/FileType.mjs @@ -6,9 +6,8 @@ * @license Apache-2.0 * */ -import {FILE_SIGNATURES} from "./FileSignatures.mjs"; -import {sendStatusMessage} from "../Utils.mjs"; - +import { FILE_SIGNATURES } from "./FileSignatures.mjs"; +import { sendStatusMessage } from "../Utils.mjs"; /** * Checks whether a signature matches a buffer. @@ -20,7 +19,7 @@ import {sendStatusMessage} from "../Utils.mjs"; * @param {number} [offset=0] Where in the buffer to start searching from * @returns {boolean} */ -function signatureMatches(sig, buf, offset=0) { +function signatureMatches(sig, buf, offset = 0) { // Using a length check seems to be more performant than `sig instanceof Array` if (sig.length) { // sig is an Array - return true if any of them match @@ -36,7 +35,6 @@ function signatureMatches(sig, buf, offset=0) { } } - /** * Checks whether a set of bytes match the given buffer. * @@ -47,21 +45,18 @@ function signatureMatches(sig, buf, offset=0) { * @param {number} [offset=0] Where in the buffer to start searching from * @returns {boolean} */ -function bytesMatch(sig, buf, offset=0) { +function bytesMatch(sig, buf, offset = 0) { for (const sigoffset in sig) { const pos = parseInt(sigoffset, 10) + offset; switch (typeof sig[sigoffset]) { case "number": // Static check - if (buf[pos] !== sig[sigoffset]) - return false; + if (buf[pos] !== sig[sigoffset]) return false; break; case "object": // Array of options - if (sig[sigoffset].indexOf(buf[pos]) < 0) - return false; + if (sig[sigoffset].indexOf(buf[pos]) < 0) return false; break; case "function": // More complex calculation - if (!sig[sigoffset](buf[pos])) - return false; + if (!sig[sigoffset](buf[pos])) return false; break; default: throw new Error(`Unrecognised signature type at offset ${sigoffset}`); @@ -70,7 +65,6 @@ function bytesMatch(sig, buf, offset=0) { return true; } - /** * Given a buffer, detects magic byte sequences at specific positions and returns the * extension and mime type. @@ -83,7 +77,7 @@ function bytesMatch(sig, buf, offset=0) { * @returns {string} type.mime - Mime type * @returns {string} [type.desc] - Description */ -export function detectFileType(buf, categories=Object.keys(FILE_SIGNATURES)) { +export function detectFileType(buf, categories = Object.keys(FILE_SIGNATURES)) { if (buf instanceof ArrayBuffer) { buf = new Uint8Array(buf); } @@ -104,7 +98,7 @@ export function detectFileType(buf, categories=Object.keys(FILE_SIGNATURES)) { for (const cat in signatures) { const category = signatures[cat]; - category.forEach(filetype => { + category.forEach((filetype) => { if (signatureMatches(filetype.signature, buf)) { matchingFiles.push(filetype); } @@ -113,7 +107,6 @@ export function detectFileType(buf, categories=Object.keys(FILE_SIGNATURES)) { return matchingFiles; } - /** * Given a buffer, searches for magic byte sequences at all possible positions and returns * the extensions and mime types. @@ -128,7 +121,7 @@ export function detectFileType(buf, categories=Object.keys(FILE_SIGNATURES)) { * @returns {string} foundFiles.fileDetails.mime - Mime type * @returns {string} [foundFiles.fileDetails.desc] - Description */ -export function scanForFileTypes(buf, categories=Object.keys(FILE_SIGNATURES)) { +export function scanForFileTypes(buf, categories = Object.keys(FILE_SIGNATURES)) { if (!(buf && buf.length > 1)) { return []; } @@ -149,7 +142,7 @@ export function scanForFileTypes(buf, categories=Object.keys(FILE_SIGNATURES)) { const filetype = category[i]; const sigs = filetype.signature.length ? filetype.signature : [filetype.signature]; - sigs.forEach(sig => { + sigs.forEach((sig) => { let pos = 0; while ((pos = locatePotentialSig(buf, sig, pos)) >= 0) { if (bytesMatch(sig, buf, pos)) { @@ -171,7 +164,6 @@ export function scanForFileTypes(buf, categories=Object.keys(FILE_SIGNATURES)) { }); } - /** * Fastcheck function to quickly scan the buffer for the first byte in a signature. * @@ -202,7 +194,6 @@ function locatePotentialSig(buf, sig, offset) { } } - /** * Detects whether the given buffer is a file of the type specified. * @@ -230,7 +221,6 @@ export function isType(type, buf) { } } - /** * Detects whether the given buffer contains an image file. * @@ -241,7 +231,6 @@ export function isImage(buf) { return isType("image", buf); } - /** * Attempts to extract a file from a data stream given its offset and extractor function. * diff --git a/src/core/lib/FlowControl.mjs b/src/core/lib/FlowControl.mjs index 56679ece..da758d8c 100644 --- a/src/core/lib/FlowControl.mjs +++ b/src/core/lib/FlowControl.mjs @@ -15,6 +15,6 @@ */ export function getLabelIndex(name, state) { return state.opList.findIndex((operation) => { - return (operation.name === "Label") && (name === operation.ingValues[0]); + return operation.name === "Label" && name === operation.ingValues[0]; }); } diff --git a/src/core/lib/FuzzyMatch.mjs b/src/core/lib/FuzzyMatch.mjs index 693527a5..bd3c96c4 100644 --- a/src/core/lib/FuzzyMatch.mjs +++ b/src/core/lib/FuzzyMatch.mjs @@ -35,7 +35,7 @@ export const DEFAULT_WEIGHTS = { * @returns [boolean, number] a boolean which tells if pattern was * found or not and a search score */ -export function fuzzyMatch(pattern, str, global=false, weights=DEFAULT_WEIGHTS) { +export function fuzzyMatch(pattern, str, global = false, weights = DEFAULT_WEIGHTS) { const recursionCount = 0; const recursionLimit = 10; const matches = []; @@ -121,9 +121,7 @@ function fuzzyMatchRecursive( let firstMatch = true; while (patternCurIndex < pattern.length && strCurrIndex < str.length) { // Match found. - if ( - pattern[patternCurIndex].toLowerCase() === str[strCurrIndex].toLowerCase() - ) { + if (pattern[patternCurIndex].toLowerCase() === str[strCurrIndex].toLowerCase()) { if (nextMatch >= maxMatches) { return [false, outScore, []]; } @@ -169,10 +167,7 @@ function fuzzyMatchRecursive( // Apply leading letter penalty let penalty = weights.leadingLetterPenalty * matches[0]; - penalty = - penalty < weights.maxLeadingLetterPenalty ? - weights.maxLeadingLetterPenalty : - penalty; + penalty = penalty < weights.maxLeadingLetterPenalty ? weights.maxLeadingLetterPenalty : penalty; outScore += penalty; // Apply unmatched penalty @@ -195,10 +190,7 @@ function fuzzyMatchRecursive( // Camel case const neighbor = str[currIdx - 1]; const curr = str[currIdx]; - if ( - neighbor !== neighbor.toUpperCase() && - curr !== curr.toLowerCase() - ) { + if (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) { outScore += weights.camelBonus; } const isNeighbourSeparator = neighbor === "_" || neighbor === " "; @@ -239,7 +231,7 @@ export function calcMatchRanges(matches) { let start = matches[0], curr = start; - matches.forEach(m => { + matches.forEach((m) => { if (m === curr || m === curr + 1) curr = m; else { ranges.push([start, curr - start + 1]); diff --git a/src/core/lib/Hash.mjs b/src/core/lib/Hash.mjs index d572b8b0..29bc88cf 100644 --- a/src/core/lib/Hash.mjs +++ b/src/core/lib/Hash.mjs @@ -10,7 +10,6 @@ import Utils from "../Utils.mjs"; import CryptoApi from "crypto-api/src/crypto-api.mjs"; - /** * Generic hash function. * @@ -19,10 +18,9 @@ import CryptoApi from "crypto-api/src/crypto-api.mjs"; * @param {Object} [options={}] * @returns {string} */ -export function runHash(name, input, options={}) { +export function runHash(name, input, options = {}) { const msg = Utils.arrayBufferToStr(input, false), hasher = CryptoApi.getHasher(name, options); hasher.update(msg); return CryptoApi.encoder.toHex(hasher.finalize()); } - diff --git a/src/core/lib/Hex.mjs b/src/core/lib/Hex.mjs index 78e1ad58..a8fa0cf0 100644 --- a/src/core/lib/Hex.mjs +++ b/src/core/lib/Hex.mjs @@ -9,7 +9,6 @@ import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; - /** * Convert a byte array into a hex string. * @@ -28,12 +27,12 @@ import OperationError from "../errors/OperationError.mjs"; * // returns "0x0a,0x14,0x1e" * toHex([10,20,30], "0x", 2, ",") */ -export function toHex(data, delim=" ", padding=2, extraDelim="", lineSize=0) { +export function toHex(data, delim = " ", padding = 2, extraDelim = "", lineSize = 0) { if (!data) return ""; if (data instanceof ArrayBuffer) data = new Uint8Array(data); let output = ""; - const prepend = (delim === "0x" || delim === "\\x"); + const prepend = delim === "0x" || delim === "\\x"; for (let i = 0; i < data.length; i++) { const hex = data[i].toString(16).padStart(padding, "0"); @@ -43,7 +42,7 @@ export function toHex(data, delim=" ", padding=2, extraDelim="", lineSize=0) { output += extraDelim; } // Add LF after each lineSize amount of bytes but not at the end - if ((i !== data.length - 1) && ((i + 1) % lineSize === 0)) { + if (i !== data.length - 1 && (i + 1) % lineSize === 0) { output += "\n"; } } @@ -59,7 +58,6 @@ export function toHex(data, delim=" ", padding=2, extraDelim="", lineSize=0) { } } - /** * Convert a byte array into a hex string as efficiently as possible with no options. * @@ -84,7 +82,6 @@ export function toHexFast(data) { return output.join(""); } - /** * Convert a hex string into a byte array. * @@ -100,7 +97,7 @@ export function toHexFast(data) { * // returns [10,20,30] * fromHex("0a:14:1e", "Colon"); */ -export function fromHex(data, delim="Auto", byteLen=2) { +export function fromHex(data, delim = "Auto", byteLen = 2) { if (byteLen < 1 || Math.round(byteLen) !== byteLen) throw new OperationError("Byte length must be a positive integer"); @@ -120,12 +117,22 @@ export function fromHex(data, delim="Auto", byteLen=2) { return output; } - /** * To Hexadecimal delimiters. */ -export const TO_HEX_DELIM_OPTIONS = ["Space", "Percent", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF", "0x", "0x with comma", "\\x", "None"]; - +export const TO_HEX_DELIM_OPTIONS = [ + "Space", + "Percent", + "Comma", + "Semi-colon", + "Colon", + "Line feed", + "CRLF", + "0x", + "0x with comma", + "\\x", + "None" +]; /** * From Hexadecimal delimiters. diff --git a/src/core/lib/IP.mjs b/src/core/lib/IP.mjs index c97f87ab..47f90990 100644 --- a/src/core/lib/IP.mjs +++ b/src/core/lib/IP.mjs @@ -29,7 +29,7 @@ export function ipv4CidrRange(cidr, includeNetworkInfo, enumerateAddresses, allo throw new OperationError("IPv4 CIDR must be less than 32"); } - const mask = ~(0xFFFFFFFF >>> cidrRange), + const mask = ~(0xffffffff >>> cidrRange), ip1 = network & mask, ip2 = ip1 | ~mask; @@ -61,7 +61,7 @@ export function ipv4CidrRange(cidr, includeNetworkInfo, enumerateAddresses, allo export function ipv6CidrRange(cidr, includeNetworkInfo) { let output = ""; const network = strToIpv6(cidr[1]), - cidrRange = parseInt(cidr[cidr.length-1], 10); + cidrRange = parseInt(cidr[cidr.length - 1], 10); if (cidrRange < 0 || cidrRange > 127) { throw new OperationError("IPv6 CIDR must be less than 128"); @@ -74,15 +74,14 @@ export function ipv6CidrRange(cidr, includeNetworkInfo) { const mask = genIpv6Mask(cidrRange); let totalDiff = ""; - for (let i = 0; i < 8; i++) { ip1[i] = network[i] & mask[i]; - ip2[i] = ip1[i] | (~mask[i] & 0x0000FFFF); + ip2[i] = ip1[i] | (~mask[i] & 0x0000ffff); totalDiff = (ip2[i] - ip1[i]).toString(2); if (totalDiff !== "0") { for (let n = 0; n < totalDiff.length; n++) { - total[i*16 + 16-(totalDiff.length-n)] = totalDiff[n]; + total[i * 16 + 16 - (totalDiff.length - n)] = totalDiff[n]; } } } @@ -137,16 +136,16 @@ export function ipv4HyphenatedRange(range, includeNetworkInfo, enumerateAddresse \tCIDR: ${cidr} \tMask: ${ipv4ToStr(mask)} \tSubnet range: ${ipv4ToStr(subIp1)} - ${ipv4ToStr(subIp2)} -\tTotal addresses in subnet: ${(((subIp2 - subIp1) >>> 0) + 1)} +\tTotal addresses in subnet: ${((subIp2 - subIp1) >>> 0) + 1} Range: ${ipv4ToStr(ip1)} - ${ipv4ToStr(ip2)} -Total addresses in range: ${(((ip2 - ip1) >>> 0) + 1)} +Total addresses in range: ${((ip2 - ip1) >>> 0) + 1} `; } if (enumerateAddresses) { - if (((ip2 - ip1) >>> 0) <= 65536 || allowLargeList) { + if ((ip2 - ip1) >>> 0 <= 65536 || allowLargeList) { output += generateIpv4Range(ip1, ip2).join("\n"); } else { output += _LARGE_RANGE_ERROR; @@ -175,7 +174,7 @@ export function ipv6HyphenatedRange(range, includeNetworkInfo) { t = (ip2[i] - ip1[i]).toString(2); if (t !== "0") { for (let n = 0; n < t.length; n++) { - total[i*16 + 16-(t.length-n)] = t[n]; + total[i * 16 + 16 - (t.length - n)] = t[n]; } } } @@ -200,11 +199,10 @@ export function ipv6HyphenatedRange(range, includeNetworkInfo) { * @returns {string} */ export function ipv4ListedRange(match, includeNetworkInfo, enumerateAddresses, allowLargeList) { - let ipv4List = match[0].split("\n"); ipv4List = ipv4List.filter(Boolean); - const ipv4CidrList = ipv4List.filter(function(a) { + const ipv4CidrList = ipv4List.filter(function (a) { return a.includes("/"); }); for (let i = 0; i < ipv4CidrList.length; i++) { @@ -213,7 +211,7 @@ export function ipv4ListedRange(match, includeNetworkInfo, enumerateAddresses, a if (cidrRange < 0 || cidrRange > 31) { throw new OperationError("IPv4 CIDR must be less than 32"); } - const mask = ~(0xFFFFFFFF >>> cidrRange), + const mask = ~(0xffffffff >>> cidrRange), cidrIp1 = network & mask, cidrIp2 = cidrIp1 | ~mask; ipv4List.splice(ipv4List.indexOf(ipv4CidrList[i]), 1); @@ -236,20 +234,18 @@ export function ipv4ListedRange(match, includeNetworkInfo, enumerateAddresses, a * @returns {string} */ export function ipv6ListedRange(match, includeNetworkInfo) { - let ipv6List = match[0].split("\n"); - ipv6List = ipv6List.filter(function(str) { + ipv6List = ipv6List.filter(function (str) { return str.trim(); }); - for (let i =0; i < ipv6List.length; i++) { + for (let i = 0; i < ipv6List.length; i++) { ipv6List[i] = ipv6List[i].trim(); } - const ipv6CidrList = ipv6List.filter(function(a) { + const ipv6CidrList = ipv6List.filter(function (a) { return a.includes("/"); }); for (let i = 0; i < ipv6CidrList.length; i++) { - const network = strToIpv6(ipv6CidrList[i].split("/")[0]); const cidrRange = parseInt(ipv6CidrList[i].split("/")[1], 10); @@ -264,7 +260,7 @@ export function ipv6ListedRange(match, includeNetworkInfo) { for (let j = 0; j < 8; j++) { cidrIp1[j] = network[j] & mask[j]; - cidrIp2[j] = cidrIp1[j] | (~mask[j] & 0x0000FFFF); + cidrIp2[j] = cidrIp1[j] | (~mask[j] & 0x0000ffff); } ipv6List.splice(ipv6List.indexOf(ipv6CidrList[i]), 1); ipv6List.push(ipv6ToStr(cidrIp1), ipv6ToStr(cidrIp2)); @@ -302,14 +298,12 @@ export function strToIpv4(ipStr) { * Converts a list of 4 numeric strings in the range 0-255 to a list of numbers. */ function parseBlocks(blocks) { - if (blocks.length !== 4) - throw new OperationError("More than 4 blocks."); + if (blocks.length !== 4) throw new OperationError("More than 4 blocks."); const numBlocks = []; for (let i = 0; i < 4; i++) { numBlocks[i] = parseInt(blocks[i], 10); - if (numBlocks[i] < 0 || numBlocks[i] > 255) - throw new OperationError("Block out of range."); + if (numBlocks[i] < 0 || numBlocks[i] > 255) throw new OperationError("Block out of range."); } return numBlocks; } @@ -334,7 +328,6 @@ export function ipv4ToStr(ipInt) { return blockA + "." + blockB + "." + blockC + "." + blockD; } - /** * Converts an IPv6 address from string format to numerical array format. * @@ -354,7 +347,7 @@ export function strToIpv6(ipStr) { for (let i = 0; i < 8; i++) { if (isNaN(numBlocks[j])) { ipv6[i] = 0; - if (i === (8-numBlocks.slice(j).length)) j++; + if (i === 8 - numBlocks.slice(j).length) j++; } else { ipv6[i] = numBlocks[j]; j++; @@ -366,13 +359,11 @@ export function strToIpv6(ipStr) { * Converts a list of 3-8 numeric hex strings in the range 0-65535 to a list of numbers. */ function parseBlocks(blocks) { - if (blocks.length < 3 || blocks.length > 8) - throw new OperationError("Badly formatted IPv6 address."); + if (blocks.length < 3 || blocks.length > 8) throw new OperationError("Badly formatted IPv6 address."); const numBlocks = []; for (let i = 0; i < blocks.length; i++) { numBlocks[i] = parseInt(blocks[i], 16); - if (numBlocks[i] < 0 || numBlocks[i] > 65535) - throw new OperationError("Block out of range."); + if (numBlocks[i] < 0 || numBlocks[i] > 65535) throw new OperationError("Block out of range."); } return numBlocks; } @@ -403,12 +394,13 @@ export function ipv6ToStr(ipv6, compact) { e = -1; for (i = 0; i < 8; i++) { - if (ipv6[i] === 0 && e === (i-1)) { + if (ipv6[i] === 0 && e === i - 1) { e = i; } else if (ipv6[i] === 0) { - s = i; e = i; + s = i; + e = i; } - if (e >= 0 && (e-s) > (end - start)) { + if (e >= 0 && e - s > end - start) { start = s; end = e; } @@ -423,14 +415,13 @@ export function ipv6ToStr(ipv6, compact) { if (end === 7) output += ":"; } } - if (output[0] === ":") - output = ":" + output; + if (output[0] === ":") output = ":" + output; } else { for (i = 0; i < 8; i++) { output += Utils.hex(ipv6[i], 4) + ":"; } } - return output.slice(0, output.length-1); + return output.slice(0, output.length - 1); } /** @@ -467,12 +458,12 @@ export function genIpv6Mask(cidr) { let shift; for (let i = 0; i < 8; i++) { - if (cidr > ((i+1)*16)) { - mask[i] = 0x0000FFFF; + if (cidr > (i + 1) * 16) { + mask[i] = 0x0000ffff; } else { - shift = cidr-(i*16); + shift = cidr - i * 16; if (shift < 0) shift = 0; - mask[i] = ~((0x0000FFFF >>> shift) | 0xFFFF0000); + mask[i] = ~((0x0000ffff >>> shift) | 0xffff0000); } } @@ -498,7 +489,6 @@ export function ipv4Compare(a, b) { * @returns {number} */ export function ipv6Compare(a, b) { - const a_ = strToIpv6(a), b_ = strToIpv6(b); @@ -510,7 +500,8 @@ export function ipv6Compare(a, b) { return 0; } -const _LARGE_RANGE_ERROR = "The specified range contains more than 65,536 addresses. Running this query could crash your browser. If you want to run it, select the \"Allow large queries\" option. You are advised to turn off \"Auto Bake\" whilst editing large ranges."; +const _LARGE_RANGE_ERROR + = 'The specified range contains more than 65,536 addresses. Running this query could crash your browser. If you want to run it, select the "Allow large queries" option. You are advised to turn off "Auto Bake" whilst editing large ranges.'; /** * A regular expression that matches an IPv4 address @@ -520,157 +511,158 @@ export const IPV4_REGEX = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/; /** * A regular expression that matches an IPv6 address */ -export const IPV6_REGEX = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i; +export const IPV6_REGEX + = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i; /** * Lookup table for Internet Protocols. * Taken from https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml */ export const protocolLookup = { - 0: {keyword: "HOPOPT", protocol: "IPv6 Hop-by-Hop Option"}, - 1: {keyword: "ICMP", protocol: "Internet Control Message"}, - 2: {keyword: "IGMP", protocol: "Internet Group Management"}, - 3: {keyword: "GGP", protocol: "Gateway-to-Gateway"}, - 4: {keyword: "IPv4", protocol: "IPv4 encapsulation"}, - 5: {keyword: "ST", protocol: "Stream"}, - 6: {keyword: "TCP", protocol: "Transmission Control"}, - 7: {keyword: "CBT", protocol: "CBT"}, - 8: {keyword: "EGP", protocol: "Exterior Gateway Protocol"}, - 9: {keyword: "IGP", protocol: "any private interior gateway (used by Cisco for their IGRP)"}, - 10: {keyword: "BBN-RCC-MON", protocol: "BBN RCC Monitoring"}, - 11: {keyword: "NVP-II", protocol: "Network Voice Protocol"}, - 12: {keyword: "PUP", protocol: "PUP"}, - 13: {keyword: "ARGUS (deprecated)", protocol: "ARGUS"}, - 14: {keyword: "EMCON", protocol: "EMCON"}, - 15: {keyword: "XNET", protocol: "Cross Net Debugger"}, - 16: {keyword: "CHAOS", protocol: "Chaos"}, - 17: {keyword: "UDP", protocol: "User Datagram"}, - 18: {keyword: "MUX", protocol: "Multiplexing"}, - 19: {keyword: "DCN-MEAS", protocol: "DCN Measurement Subsystems"}, - 20: {keyword: "HMP", protocol: "Host Monitoring"}, - 21: {keyword: "PRM", protocol: "Packet Radio Measurement"}, - 22: {keyword: "XNS-IDP", protocol: "XEROX NS IDP"}, - 23: {keyword: "TRUNK-1", protocol: "Trunk-1"}, - 24: {keyword: "TRUNK-2", protocol: "Trunk-2"}, - 25: {keyword: "LEAF-1", protocol: "Leaf-1"}, - 26: {keyword: "LEAF-2", protocol: "Leaf-2"}, - 27: {keyword: "RDP", protocol: "Reliable Data Protocol"}, - 28: {keyword: "IRTP", protocol: "Internet Reliable Transaction"}, - 29: {keyword: "ISO-TP4", protocol: "ISO Transport Protocol Class 4"}, - 30: {keyword: "NETBLT", protocol: "Bulk Data Transfer Protocol"}, - 31: {keyword: "MFE-NSP", protocol: "MFE Network Services Protocol"}, - 32: {keyword: "MERIT-INP", protocol: "MERIT Internodal Protocol"}, - 33: {keyword: "DCCP", protocol: "Datagram Congestion Control Protocol"}, - 34: {keyword: "3PC", protocol: "Third Party Connect Protocol"}, - 35: {keyword: "IDPR", protocol: "Inter-Domain Policy Routing Protocol"}, - 36: {keyword: "XTP", protocol: "XTP"}, - 37: {keyword: "DDP", protocol: "Datagram Delivery Protocol"}, - 38: {keyword: "IDPR-CMTP", protocol: "IDPR Control Message Transport Proto"}, - 39: {keyword: "TP++", protocol: "TP++ Transport Protocol"}, - 40: {keyword: "IL", protocol: "IL Transport Protocol"}, - 41: {keyword: "IPv6", protocol: "IPv6 encapsulation"}, - 42: {keyword: "SDRP", protocol: "Source Demand Routing Protocol"}, - 43: {keyword: "IPv6-Route", protocol: "Routing Header for IPv6"}, - 44: {keyword: "IPv6-Frag", protocol: "Fragment Header for IPv6"}, - 45: {keyword: "IDRP", protocol: "Inter-Domain Routing Protocol"}, - 46: {keyword: "RSVP", protocol: "Reservation Protocol"}, - 47: {keyword: "GRE", protocol: "Generic Routing Encapsulation"}, - 48: {keyword: "DSR", protocol: "Dynamic Source Routing Protocol"}, - 49: {keyword: "BNA", protocol: "BNA"}, - 50: {keyword: "ESP", protocol: "Encap Security Payload"}, - 51: {keyword: "AH", protocol: "Authentication Header"}, - 52: {keyword: "I-NLSP", protocol: "Integrated Net Layer Security TUBA"}, - 53: {keyword: "SWIPE (deprecated)", protocol: "IP with Encryption"}, - 54: {keyword: "NARP", protocol: "NBMA Address Resolution Protocol"}, - 55: {keyword: "MOBILE", protocol: "IP Mobility"}, - 56: {keyword: "TLSP", protocol: "Transport Layer Security Protocol using Kryptonet key management"}, - 57: {keyword: "SKIP", protocol: "SKIP"}, - 58: {keyword: "IPv6-ICMP", protocol: "ICMP for IPv6"}, - 59: {keyword: "IPv6-NoNxt", protocol: "No Next Header for IPv6"}, - 60: {keyword: "IPv6-Opts", protocol: "Destination Options for IPv6"}, - 61: {keyword: "", protocol: "any host internal protocol"}, - 62: {keyword: "CFTP", protocol: "CFTP"}, - 63: {keyword: "", protocol: "any local network"}, - 64: {keyword: "SAT-EXPAK", protocol: "SATNET and Backroom EXPAK"}, - 65: {keyword: "KRYPTOLAN", protocol: "Kryptolan"}, - 66: {keyword: "RVD", protocol: "MIT Remote Virtual Disk Protocol"}, - 67: {keyword: "IPPC", protocol: "Internet Pluribus Packet Core"}, - 68: {keyword: "", protocol: "any distributed file system"}, - 69: {keyword: "SAT-MON", protocol: "SATNET Monitoring"}, - 70: {keyword: "VISA", protocol: "VISA Protocol"}, - 71: {keyword: "IPCV", protocol: "Internet Packet Core Utility"}, - 72: {keyword: "CPNX", protocol: "Computer Protocol Network Executive"}, - 73: {keyword: "CPHB", protocol: "Computer Protocol Heart Beat"}, - 74: {keyword: "WSN", protocol: "Wang Span Network"}, - 75: {keyword: "PVP", protocol: "Packet Video Protocol"}, - 76: {keyword: "BR-SAT-MON", protocol: "Backroom SATNET Monitoring"}, - 77: {keyword: "SUN-ND", protocol: "SUN ND PROTOCOL-Temporary"}, - 78: {keyword: "WB-MON", protocol: "WIDEBAND Monitoring"}, - 79: {keyword: "WB-EXPAK", protocol: "WIDEBAND EXPAK"}, - 80: {keyword: "ISO-IP", protocol: "ISO Internet Protocol"}, - 81: {keyword: "VMTP", protocol: "VMTP"}, - 82: {keyword: "SECURE-VMTP", protocol: "SECURE-VMTP"}, - 83: {keyword: "VINES", protocol: "VINES"}, - 84: {keyword: "TTP", protocol: "Transaction Transport Protocol"}, - 85: {keyword: "NSFNET-IGP", protocol: "NSFNET-IGP"}, - 86: {keyword: "DGP", protocol: "Dissimilar Gateway Protocol"}, - 87: {keyword: "TCF", protocol: "TCF"}, - 88: {keyword: "EIGRP", protocol: "EIGRP"}, - 89: {keyword: "OSPFIGP", protocol: "OSPFIGP"}, - 90: {keyword: "Sprite-RPC", protocol: "Sprite RPC Protocol"}, - 91: {keyword: "LARP", protocol: "Locus Address Resolution Protocol"}, - 92: {keyword: "MTP", protocol: "Multicast Transport Protocol"}, - 93: {keyword: "AX.25", protocol: "AX.25 Frames"}, - 94: {keyword: "IPIP", protocol: "IP-within-IP Encapsulation Protocol"}, - 95: {keyword: "MICP (deprecated)", protocol: "Mobile Internetworking Control Pro."}, - 96: {keyword: "SCC-SP", protocol: "Semaphore Communications Sec. Pro."}, - 97: {keyword: "ETHERIP", protocol: "Ethernet-within-IP Encapsulation"}, - 98: {keyword: "ENCAP", protocol: "Encapsulation Header"}, - 99: {keyword: "", protocol: "any private encryption scheme"}, - 100: {keyword: "GMTP", protocol: "GMTP"}, - 101: {keyword: "IFMP", protocol: "Ipsilon Flow Management Protocol"}, - 102: {keyword: "PNNI", protocol: "PNNI over IP"}, - 103: {keyword: "PIM", protocol: "Protocol Independent Multicast"}, - 104: {keyword: "ARIS", protocol: "ARIS"}, - 105: {keyword: "SCPS", protocol: "SCPS"}, - 106: {keyword: "QNX", protocol: "QNX"}, - 107: {keyword: "A/N", protocol: "Active Networks"}, - 108: {keyword: "IPComp", protocol: "IP Payload Compression Protocol"}, - 109: {keyword: "SNP", protocol: "Sitara Networks Protocol"}, - 110: {keyword: "Compaq-Peer", protocol: "Compaq Peer Protocol"}, - 111: {keyword: "IPX-in-IP", protocol: "IPX in IP"}, - 112: {keyword: "VRRP", protocol: "Virtual Router Redundancy Protocol"}, - 113: {keyword: "PGM", protocol: "PGM Reliable Transport Protocol"}, - 114: {keyword: "", protocol: "any 0-hop protocol"}, - 115: {keyword: "L2TP", protocol: "Layer Two Tunneling Protocol"}, - 116: {keyword: "DDX", protocol: "D-II Data Exchange (DDX)"}, - 117: {keyword: "IATP", protocol: "Interactive Agent Transfer Protocol"}, - 118: {keyword: "STP", protocol: "Schedule Transfer Protocol"}, - 119: {keyword: "SRP", protocol: "SpectraLink Radio Protocol"}, - 120: {keyword: "UTI", protocol: "UTI"}, - 121: {keyword: "SMP", protocol: "Simple Message Protocol"}, - 122: {keyword: "SM (deprecated)", protocol: "Simple Multicast Protocol"}, - 123: {keyword: "PTP", protocol: "Performance Transparency Protocol"}, - 124: {keyword: "ISIS over IPv4", protocol: ""}, - 125: {keyword: "FIRE", protocol: ""}, - 126: {keyword: "CRTP", protocol: "Combat Radio Transport Protocol"}, - 127: {keyword: "CRUDP", protocol: "Combat Radio User Datagram"}, - 128: {keyword: "SSCOPMCE", protocol: ""}, - 129: {keyword: "IPLT", protocol: ""}, - 130: {keyword: "SPS", protocol: "Secure Packet Shield"}, - 131: {keyword: "PIPE", protocol: "Private IP Encapsulation within IP"}, - 132: {keyword: "SCTP", protocol: "Stream Control Transmission Protocol"}, - 133: {keyword: "FC", protocol: "Fibre Channel"}, - 134: {keyword: "RSVP-E2E-IGNORE", protocol: ""}, - 135: {keyword: "Mobility Header", protocol: ""}, - 136: {keyword: "UDPLite", protocol: ""}, - 137: {keyword: "MPLS-in-IP", protocol: ""}, - 138: {keyword: "manet", protocol: "MANET Protocols"}, - 139: {keyword: "HIP", protocol: "Host Identity Protocol"}, - 140: {keyword: "Shim6", protocol: "Shim6 Protocol"}, - 141: {keyword: "WESP", protocol: "Wrapped Encapsulating Security Payload"}, - 142: {keyword: "ROHC", protocol: "Robust Header Compression"}, - 253: {keyword: "", protocol: "Use for experimentation and testing"}, - 254: {keyword: "", protocol: "Use for experimentation and testing"}, - 255: {keyword: "Reserved", protocol: ""} + 0: { keyword: "HOPOPT", protocol: "IPv6 Hop-by-Hop Option" }, + 1: { keyword: "ICMP", protocol: "Internet Control Message" }, + 2: { keyword: "IGMP", protocol: "Internet Group Management" }, + 3: { keyword: "GGP", protocol: "Gateway-to-Gateway" }, + 4: { keyword: "IPv4", protocol: "IPv4 encapsulation" }, + 5: { keyword: "ST", protocol: "Stream" }, + 6: { keyword: "TCP", protocol: "Transmission Control" }, + 7: { keyword: "CBT", protocol: "CBT" }, + 8: { keyword: "EGP", protocol: "Exterior Gateway Protocol" }, + 9: { keyword: "IGP", protocol: "any private interior gateway (used by Cisco for their IGRP)" }, + 10: { keyword: "BBN-RCC-MON", protocol: "BBN RCC Monitoring" }, + 11: { keyword: "NVP-II", protocol: "Network Voice Protocol" }, + 12: { keyword: "PUP", protocol: "PUP" }, + 13: { keyword: "ARGUS (deprecated)", protocol: "ARGUS" }, + 14: { keyword: "EMCON", protocol: "EMCON" }, + 15: { keyword: "XNET", protocol: "Cross Net Debugger" }, + 16: { keyword: "CHAOS", protocol: "Chaos" }, + 17: { keyword: "UDP", protocol: "User Datagram" }, + 18: { keyword: "MUX", protocol: "Multiplexing" }, + 19: { keyword: "DCN-MEAS", protocol: "DCN Measurement Subsystems" }, + 20: { keyword: "HMP", protocol: "Host Monitoring" }, + 21: { keyword: "PRM", protocol: "Packet Radio Measurement" }, + 22: { keyword: "XNS-IDP", protocol: "XEROX NS IDP" }, + 23: { keyword: "TRUNK-1", protocol: "Trunk-1" }, + 24: { keyword: "TRUNK-2", protocol: "Trunk-2" }, + 25: { keyword: "LEAF-1", protocol: "Leaf-1" }, + 26: { keyword: "LEAF-2", protocol: "Leaf-2" }, + 27: { keyword: "RDP", protocol: "Reliable Data Protocol" }, + 28: { keyword: "IRTP", protocol: "Internet Reliable Transaction" }, + 29: { keyword: "ISO-TP4", protocol: "ISO Transport Protocol Class 4" }, + 30: { keyword: "NETBLT", protocol: "Bulk Data Transfer Protocol" }, + 31: { keyword: "MFE-NSP", protocol: "MFE Network Services Protocol" }, + 32: { keyword: "MERIT-INP", protocol: "MERIT Internodal Protocol" }, + 33: { keyword: "DCCP", protocol: "Datagram Congestion Control Protocol" }, + 34: { keyword: "3PC", protocol: "Third Party Connect Protocol" }, + 35: { keyword: "IDPR", protocol: "Inter-Domain Policy Routing Protocol" }, + 36: { keyword: "XTP", protocol: "XTP" }, + 37: { keyword: "DDP", protocol: "Datagram Delivery Protocol" }, + 38: { keyword: "IDPR-CMTP", protocol: "IDPR Control Message Transport Proto" }, + 39: { keyword: "TP++", protocol: "TP++ Transport Protocol" }, + 40: { keyword: "IL", protocol: "IL Transport Protocol" }, + 41: { keyword: "IPv6", protocol: "IPv6 encapsulation" }, + 42: { keyword: "SDRP", protocol: "Source Demand Routing Protocol" }, + 43: { keyword: "IPv6-Route", protocol: "Routing Header for IPv6" }, + 44: { keyword: "IPv6-Frag", protocol: "Fragment Header for IPv6" }, + 45: { keyword: "IDRP", protocol: "Inter-Domain Routing Protocol" }, + 46: { keyword: "RSVP", protocol: "Reservation Protocol" }, + 47: { keyword: "GRE", protocol: "Generic Routing Encapsulation" }, + 48: { keyword: "DSR", protocol: "Dynamic Source Routing Protocol" }, + 49: { keyword: "BNA", protocol: "BNA" }, + 50: { keyword: "ESP", protocol: "Encap Security Payload" }, + 51: { keyword: "AH", protocol: "Authentication Header" }, + 52: { keyword: "I-NLSP", protocol: "Integrated Net Layer Security TUBA" }, + 53: { keyword: "SWIPE (deprecated)", protocol: "IP with Encryption" }, + 54: { keyword: "NARP", protocol: "NBMA Address Resolution Protocol" }, + 55: { keyword: "MOBILE", protocol: "IP Mobility" }, + 56: { keyword: "TLSP", protocol: "Transport Layer Security Protocol using Kryptonet key management" }, + 57: { keyword: "SKIP", protocol: "SKIP" }, + 58: { keyword: "IPv6-ICMP", protocol: "ICMP for IPv6" }, + 59: { keyword: "IPv6-NoNxt", protocol: "No Next Header for IPv6" }, + 60: { keyword: "IPv6-Opts", protocol: "Destination Options for IPv6" }, + 61: { keyword: "", protocol: "any host internal protocol" }, + 62: { keyword: "CFTP", protocol: "CFTP" }, + 63: { keyword: "", protocol: "any local network" }, + 64: { keyword: "SAT-EXPAK", protocol: "SATNET and Backroom EXPAK" }, + 65: { keyword: "KRYPTOLAN", protocol: "Kryptolan" }, + 66: { keyword: "RVD", protocol: "MIT Remote Virtual Disk Protocol" }, + 67: { keyword: "IPPC", protocol: "Internet Pluribus Packet Core" }, + 68: { keyword: "", protocol: "any distributed file system" }, + 69: { keyword: "SAT-MON", protocol: "SATNET Monitoring" }, + 70: { keyword: "VISA", protocol: "VISA Protocol" }, + 71: { keyword: "IPCV", protocol: "Internet Packet Core Utility" }, + 72: { keyword: "CPNX", protocol: "Computer Protocol Network Executive" }, + 73: { keyword: "CPHB", protocol: "Computer Protocol Heart Beat" }, + 74: { keyword: "WSN", protocol: "Wang Span Network" }, + 75: { keyword: "PVP", protocol: "Packet Video Protocol" }, + 76: { keyword: "BR-SAT-MON", protocol: "Backroom SATNET Monitoring" }, + 77: { keyword: "SUN-ND", protocol: "SUN ND PROTOCOL-Temporary" }, + 78: { keyword: "WB-MON", protocol: "WIDEBAND Monitoring" }, + 79: { keyword: "WB-EXPAK", protocol: "WIDEBAND EXPAK" }, + 80: { keyword: "ISO-IP", protocol: "ISO Internet Protocol" }, + 81: { keyword: "VMTP", protocol: "VMTP" }, + 82: { keyword: "SECURE-VMTP", protocol: "SECURE-VMTP" }, + 83: { keyword: "VINES", protocol: "VINES" }, + 84: { keyword: "TTP", protocol: "Transaction Transport Protocol" }, + 85: { keyword: "NSFNET-IGP", protocol: "NSFNET-IGP" }, + 86: { keyword: "DGP", protocol: "Dissimilar Gateway Protocol" }, + 87: { keyword: "TCF", protocol: "TCF" }, + 88: { keyword: "EIGRP", protocol: "EIGRP" }, + 89: { keyword: "OSPFIGP", protocol: "OSPFIGP" }, + 90: { keyword: "Sprite-RPC", protocol: "Sprite RPC Protocol" }, + 91: { keyword: "LARP", protocol: "Locus Address Resolution Protocol" }, + 92: { keyword: "MTP", protocol: "Multicast Transport Protocol" }, + 93: { keyword: "AX.25", protocol: "AX.25 Frames" }, + 94: { keyword: "IPIP", protocol: "IP-within-IP Encapsulation Protocol" }, + 95: { keyword: "MICP (deprecated)", protocol: "Mobile Internetworking Control Pro." }, + 96: { keyword: "SCC-SP", protocol: "Semaphore Communications Sec. Pro." }, + 97: { keyword: "ETHERIP", protocol: "Ethernet-within-IP Encapsulation" }, + 98: { keyword: "ENCAP", protocol: "Encapsulation Header" }, + 99: { keyword: "", protocol: "any private encryption scheme" }, + 100: { keyword: "GMTP", protocol: "GMTP" }, + 101: { keyword: "IFMP", protocol: "Ipsilon Flow Management Protocol" }, + 102: { keyword: "PNNI", protocol: "PNNI over IP" }, + 103: { keyword: "PIM", protocol: "Protocol Independent Multicast" }, + 104: { keyword: "ARIS", protocol: "ARIS" }, + 105: { keyword: "SCPS", protocol: "SCPS" }, + 106: { keyword: "QNX", protocol: "QNX" }, + 107: { keyword: "A/N", protocol: "Active Networks" }, + 108: { keyword: "IPComp", protocol: "IP Payload Compression Protocol" }, + 109: { keyword: "SNP", protocol: "Sitara Networks Protocol" }, + 110: { keyword: "Compaq-Peer", protocol: "Compaq Peer Protocol" }, + 111: { keyword: "IPX-in-IP", protocol: "IPX in IP" }, + 112: { keyword: "VRRP", protocol: "Virtual Router Redundancy Protocol" }, + 113: { keyword: "PGM", protocol: "PGM Reliable Transport Protocol" }, + 114: { keyword: "", protocol: "any 0-hop protocol" }, + 115: { keyword: "L2TP", protocol: "Layer Two Tunneling Protocol" }, + 116: { keyword: "DDX", protocol: "D-II Data Exchange (DDX)" }, + 117: { keyword: "IATP", protocol: "Interactive Agent Transfer Protocol" }, + 118: { keyword: "STP", protocol: "Schedule Transfer Protocol" }, + 119: { keyword: "SRP", protocol: "SpectraLink Radio Protocol" }, + 120: { keyword: "UTI", protocol: "UTI" }, + 121: { keyword: "SMP", protocol: "Simple Message Protocol" }, + 122: { keyword: "SM (deprecated)", protocol: "Simple Multicast Protocol" }, + 123: { keyword: "PTP", protocol: "Performance Transparency Protocol" }, + 124: { keyword: "ISIS over IPv4", protocol: "" }, + 125: { keyword: "FIRE", protocol: "" }, + 126: { keyword: "CRTP", protocol: "Combat Radio Transport Protocol" }, + 127: { keyword: "CRUDP", protocol: "Combat Radio User Datagram" }, + 128: { keyword: "SSCOPMCE", protocol: "" }, + 129: { keyword: "IPLT", protocol: "" }, + 130: { keyword: "SPS", protocol: "Secure Packet Shield" }, + 131: { keyword: "PIPE", protocol: "Private IP Encapsulation within IP" }, + 132: { keyword: "SCTP", protocol: "Stream Control Transmission Protocol" }, + 133: { keyword: "FC", protocol: "Fibre Channel" }, + 134: { keyword: "RSVP-E2E-IGNORE", protocol: "" }, + 135: { keyword: "Mobility Header", protocol: "" }, + 136: { keyword: "UDPLite", protocol: "" }, + 137: { keyword: "MPLS-in-IP", protocol: "" }, + 138: { keyword: "manet", protocol: "MANET Protocols" }, + 139: { keyword: "HIP", protocol: "Host Identity Protocol" }, + 140: { keyword: "Shim6", protocol: "Shim6 Protocol" }, + 141: { keyword: "WESP", protocol: "Wrapped Encapsulating Security Payload" }, + 142: { keyword: "ROHC", protocol: "Robust Header Compression" }, + 253: { keyword: "", protocol: "Use for experimentation and testing" }, + 254: { keyword: "", protocol: "Use for experimentation and testing" }, + 255: { keyword: "Reserved", protocol: "" } }; diff --git a/src/core/lib/ImageManipulation.mjs b/src/core/lib/ImageManipulation.mjs index 63a80fe4..661962ac 100644 --- a/src/core/lib/ImageManipulation.mjs +++ b/src/core/lib/ImageManipulation.mjs @@ -16,7 +16,7 @@ import OperationError from "../errors/OperationError.mjs"; * @param {boolean} fast * @returns {jimp} */ -export function gaussianBlur (input, radius) { +export function gaussianBlur(input, radius) { try { // From http://blog.ivank.net/fastest-gaussian-blur.html const boxes = boxesForGauss(radius, 3); @@ -37,7 +37,7 @@ export function gaussianBlur (input, radius) { * @returns {Array} */ function boxesForGauss(radius, numBoxes) { - const idealWidth = Math.sqrt((12 * radius * radius / numBoxes) + 1); + const idealWidth = Math.sqrt((12 * radius * radius) / numBoxes + 1); let wl = Math.floor(idealWidth); @@ -64,7 +64,7 @@ function boxesForGauss(radius, numBoxes) { * @param {number} radius * @returns {jimp} */ -function boxBlur (source, radius) { +function boxBlur(source, radius) { const width = source.bitmap.width; const height = source.bitmap.height; let output = source.clone(); @@ -84,7 +84,7 @@ function boxBlur (source, radius) { * @param {number} radius * @returns {jimp} */ -function boxBlurH (source, output, width, height, radius) { +function boxBlurH(source, output, width, height, radius) { const iarr = 1 / (radius + radius + 1); for (let i = 0; i < height; i++) { let ti = 0, @@ -171,7 +171,7 @@ function boxBlurH (source, output, width, height, radius) { * @param {number} radius * @returns {jimp} */ -function boxBlurV (source, output, width, height, radius) { +function boxBlurV(source, output, width, height, radius) { const iarr = 1 / (radius + radius + 1); for (let i = 0; i < width; i++) { let ti = 0, diff --git a/src/core/lib/JWT.mjs b/src/core/lib/JWT.mjs index fee7fec5..d68bff97 100644 --- a/src/core/lib/JWT.mjs +++ b/src/core/lib/JWT.mjs @@ -6,19 +6,7 @@ * @license Apache-2.0 */ - /** * List of the JWT algorithms that can be used */ -export const JWT_ALGORITHMS = [ - "HS256", - "HS384", - "HS512", - "RS256", - "RS384", - "RS512", - "ES256", - "ES384", - "ES512", - "None" -]; +export const JWT_ALGORITHMS = ["HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "ES256", "ES384", "ES512", "None"]; diff --git a/src/core/lib/LS47.mjs b/src/core/lib/LS47.mjs index ac7ca839..22879b5c 100644 --- a/src/core/lib/LS47.mjs +++ b/src/core/lib/LS47.mjs @@ -13,8 +13,7 @@ const tiles = []; * Initialises the tiles with values and positions. */ export function initTiles() { - for (let i = 0; i < 49; i++) - tiles.push([letters.charAt(i), [Math.floor(i/7), i % 7]]); + for (let i = 0; i < 49; i++) tiles.push([letters.charAt(i), [Math.floor(i / 7), i % 7]]); } /** @@ -27,21 +26,19 @@ export function initTiles() { */ function rotateDown(key, col, n) { const lines = []; - for (let i = 0; i < 7; i++) - lines.push(key.slice(i*7, (i + 1) * 7)); + for (let i = 0; i < 7; i++) lines.push(key.slice(i * 7, (i + 1) * 7)); const lefts = []; let mids = []; const rights = []; lines.forEach((element) => { lefts.push(element.slice(0, col)); mids.push(element.charAt(col)); - rights.push(element.slice(col+1)); + rights.push(element.slice(col + 1)); }); - n = (7 - n % 7) % 7; + n = (7 - (n % 7)) % 7; mids = mids.slice(n).concat(mids.slice(0, n)); let result = ""; - for (let i = 0; i < 7; i++) - result += lefts[i] + mids[i] + rights[i]; + for (let i = 0; i < 7; i++) result += lefts[i] + mids[i] + rights[i]; return result; } @@ -55,7 +52,7 @@ function rotateDown(key, col, n) { */ function rotateRight(key, row, n) { const mid = key.slice(row * 7, (row + 1) * 7); - n = (7 - n % 7) % 7; + n = (7 - (n % 7)) % 7; return key.slice(0, 7 * row) + mid.slice(n) + mid.slice(0, n) + key.slice(7 * (row + 1)); } @@ -66,9 +63,7 @@ function rotateRight(key, row, n) { * @returns {string} */ function findIx(letter) { - for (let i = 0; i < tiles.length; i++) - if (tiles[i][0] === letter) - return tiles[i][1]; + for (let i = 0; i < tiles.length; i++) if (tiles[i][0] === letter) return tiles[i][1]; throw new OperationError("Letter " + letter + " is not included in LS47"); } @@ -95,17 +90,13 @@ export function deriveKey(password) { * @param {string} key */ function checkKey(key) { - if (key.length !== letters.length) - throw new OperationError("Wrong key size"); + if (key.length !== letters.length) throw new OperationError("Wrong key size"); const counts = new Array(); - for (let i = 0; i < letters.length; i++) - counts[letters.charAt(i)] = 0; + for (let i = 0; i < letters.length; i++) counts[letters.charAt(i)] = 0; for (const elem of letters) { - if (letters.indexOf(elem) === -1) - throw new OperationError("Letter " + elem + " not in LS47"); + if (letters.indexOf(elem) === -1) throw new OperationError("Letter " + elem + " not in LS47"); counts[elem]++; - if (counts[elem] > 1) - throw new OperationError("Letter duplicated in the key"); + if (counts[elem] > 1) throw new OperationError("Letter duplicated in the key"); } } @@ -116,10 +107,9 @@ function checkKey(key) { * @param {string} letter * @returns {object} */ -function findPos (key, letter) { +function findPos(key, letter) { const index = key.indexOf(letter); - if (index >= 0 && index < 49) - return [Math.floor(index/7), index%7]; + if (index >= 0 && index < 49) return [Math.floor(index / 7), index % 7]; throw new OperationError("Letter " + letter + " is not in the key"); } @@ -131,7 +121,7 @@ function findPos (key, letter) { * @returns {string} */ function findAtPos(key, coord) { - return key.charAt(coord[1] + (coord[0] * 7)); + return key.charAt(coord[1] + coord[0] * 7); } /** @@ -157,7 +147,7 @@ function addPos(a, b) { function subPos(a, b) { const asub = a[0] - b[0]; const bsub = a[1] - b[1]; - return [asub - (Math.floor(asub/7) * 7), bsub - (Math.floor(bsub/7) * 7)]; + return [asub - Math.floor(asub / 7) * 7, bsub - Math.floor(bsub / 7) * 7]; } /** @@ -226,7 +216,7 @@ export function encryptPad(key, plaintext, signature, paddingSize) { for (let i = 0; i < paddingSize; i++) { padding += letters.charAt(Math.floor(Math.random() * letters.length)); } - return encrypt(key, padding+plaintext+"---"+signature); + return encrypt(key, padding + plaintext + "---" + signature); } /** diff --git a/src/core/lib/LZNT1.mjs b/src/core/lib/LZNT1.mjs index 9a1c7fab..3cfd7314 100644 --- a/src/core/lib/LZNT1.mjs +++ b/src/core/lib/LZNT1.mjs @@ -64,7 +64,7 @@ export function decompress(compressed) { const displacement = getDisplacement(decompressed.length - doffset - 1); const symbolOffset = (pointer >> (12 - displacement)) + 1; - const symbolLength = (pointer & (0xFFF >> displacement)) + 2; + const symbolLength = (pointer & (0xfff >> displacement)) + 2; const shiftOffset = decompressed.length - symbolOffset; for (let shiftDelta = 0; shiftDelta < symbolLength + 1; shiftDelta++) { diff --git a/src/core/lib/LZString.mjs b/src/core/lib/LZString.mjs index c4919a87..cf271b59 100644 --- a/src/core/lib/LZString.mjs +++ b/src/core/lib/LZString.mjs @@ -11,11 +11,11 @@ import LZString from "lz-string"; export const COMPRESSION_OUTPUT_FORMATS = ["default", "UTF16", "Base64"]; export const COMPRESSION_FUNCTIONS = { "default": LZString.compress, - "UTF16": LZString.compressToUTF16, - "Base64": LZString.compressToBase64, + "UTF16": LZString.compressToUTF16, + "Base64": LZString.compressToBase64 }; export const DECOMPRESSION_FUNCTIONS = { "default": LZString.decompress, - "UTF16": LZString.decompressFromUTF16, - "Base64": LZString.decompressFromBase64, + "UTF16": LZString.decompressFromUTF16, + "Base64": LZString.decompressFromBase64 }; diff --git a/src/core/lib/LoremIpsum.mjs b/src/core/lib/LoremIpsum.mjs index 3d60fa89..e187966c 100644 --- a/src/core/lib/LoremIpsum.mjs +++ b/src/core/lib/LoremIpsum.mjs @@ -12,7 +12,7 @@ * @param {number} length * @returns {string} */ -export function GenerateParagraphs(length=3) { +export function GenerateParagraphs(length = 3) { const paragraphs = []; while (paragraphs.length < length) { const paragraphLength = getRandomLength(PARAGRAPH_LENGTH_MEAN, PARAGRAPH_LENGTH_STD_DEV); @@ -24,19 +24,18 @@ export function GenerateParagraphs(length=3) { } paragraphs.push(formatParagraph(sentences)); } - paragraphs[paragraphs.length-1] = paragraphs[paragraphs.length-1].slice(0, -2); + paragraphs[paragraphs.length - 1] = paragraphs[paragraphs.length - 1].slice(0, -2); paragraphs[0] = replaceStart(paragraphs[0]); return paragraphs.join(""); } - /** * Generate lorem ipsum sentences. * * @param {number} length * @returns {string} */ -export function GenerateSentences(length=3) { +export function GenerateSentences(length = 3) { const sentences = []; while (sentences.length < length) { const sentenceLength = getRandomLength(SENTENCE_LENGTH_MEAN, SENTENCE_LENGTH_STD_DEV); @@ -47,33 +46,30 @@ export function GenerateSentences(length=3) { return paragraphs.join(""); } - /** * Generate lorem ipsum words. * * @param {number} length * @returns {string} */ -export function GenerateWords(length=3) { +export function GenerateWords(length = 3) { const words = getWords(length); const sentences = wordsToSentences(words); const paragraphs = sentencesToParagraphs(sentences); return paragraphs.join(""); } - /** * Generate lorem ipsum bytes. * * @param {number} length * @returns {string} */ -export function GenerateBytes(length=3) { - const str = GenerateWords(length/3); +export function GenerateBytes(length = 3) { + const str = GenerateWords(length / 3); return str.slice(0, length); } - /** * Get array of randomly selected words from the lorem ipsum wordList. * @@ -81,7 +77,7 @@ export function GenerateBytes(length=3) { * @returns {string[]} * @private */ -function getWords(length=3) { +function getWords(length = 3) { const words = []; let word; let previousWord; @@ -95,7 +91,6 @@ function getWords(length=3) { return words; } - /** * Convert an array of words into an array of sentences * @@ -116,7 +111,6 @@ function wordsToSentences(words) { return sentences; } - /** * Convert an array of sentences into an array of paragraphs * @@ -130,12 +124,11 @@ function sentencesToParagraphs(sentences) { const paragraphLength = getRandomLength(PARAGRAPH_LENGTH_MEAN, PARAGRAPH_LENGTH_STD_DEV); paragraphs.push(formatParagraph(sentences.splice(0, paragraphLength))); } - paragraphs[paragraphs.length-1] = paragraphs[paragraphs.length-1].slice(0, -1); + paragraphs[paragraphs.length - 1] = paragraphs[paragraphs.length - 1].slice(0, -1); paragraphs[0] = replaceStart(paragraphs[0]); return paragraphs; } - /** * Format an array of words into a sentence. * @@ -146,8 +139,8 @@ function sentencesToParagraphs(sentences) { function formatSentence(words) { // 0.35 chance of a comma being added randomly to the sentence. if (Math.random() < PROBABILITY_OF_A_COMMA) { - const pos = Math.round(Math.random()*(words.length-1)); - words[pos] +=","; + const pos = Math.round(Math.random() * (words.length - 1)); + words[pos] += ","; } let sentence = words.join(" "); sentence = sentence.charAt(0).toUpperCase() + sentence.slice(1); @@ -155,7 +148,6 @@ function formatSentence(words) { return sentence; } - /** * Format an array of sentences into a paragraph. * @@ -169,7 +161,6 @@ function formatParagraph(sentences) { return paragraph; } - /** * Get a random number based on a mean and standard deviation. * @@ -181,12 +172,11 @@ function formatParagraph(sentences) { function getRandomLength(mean, stdDev) { let length; do { - length = Math.round((Math.random()*2-1)+(Math.random()*2-1)+(Math.random()*2-1)*stdDev+mean); + length = Math.round(Math.random() * 2 - 1 + (Math.random() * 2 - 1) + (Math.random() * 2 - 1) * stdDev + mean); } while (length <= 0); return length; } - /** * Replace first 5 words with "Lorem ipsum dolor sit amet" * @@ -208,7 +198,6 @@ function replaceStart(str) { } } - const SENTENCE_LENGTH_MEAN = 15; const SENTENCE_LENGTH_STD_DEV = 9; const PARAGRAPH_LENGTH_MEAN = 5; @@ -216,15 +205,66 @@ const PARAGRAPH_LENGTH_STD_DEV = 2; const PROBABILITY_OF_A_COMMA = 0.35; const wordList = [ - "ad", "adipisicing", "aliqua", "aliquip", "amet", "anim", - "aute", "cillum", "commodo", "consectetur", "consequat", "culpa", - "cupidatat", "deserunt", "do", "dolor", "dolore", "duis", - "ea", "eiusmod", "elit", "enim", "esse", "est", - "et", "eu", "ex", "excepteur", "exercitation", "fugiat", - "id", "in", "incididunt", "ipsum", "irure", "labore", - "laboris", "laborum", "Lorem", "magna", "minim", "mollit", - "nisi", "non", "nostrud", "nulla", "occaecat", "officia", - "pariatur", "proident", "qui", "quis", "reprehenderit", "sint", - "sit", "sunt", "tempor", "ullamco", "ut", "velit", - "veniam", "voluptate", + "ad", + "adipisicing", + "aliqua", + "aliquip", + "amet", + "anim", + "aute", + "cillum", + "commodo", + "consectetur", + "consequat", + "culpa", + "cupidatat", + "deserunt", + "do", + "dolor", + "dolore", + "duis", + "ea", + "eiusmod", + "elit", + "enim", + "esse", + "est", + "et", + "eu", + "ex", + "excepteur", + "exercitation", + "fugiat", + "id", + "in", + "incididunt", + "ipsum", + "irure", + "labore", + "laboris", + "laborum", + "Lorem", + "magna", + "minim", + "mollit", + "nisi", + "non", + "nostrud", + "nulla", + "occaecat", + "officia", + "pariatur", + "proident", + "qui", + "quis", + "reprehenderit", + "sint", + "sit", + "sunt", + "tempor", + "ullamco", + "ut", + "velit", + "veniam", + "voluptate" ]; diff --git a/src/core/lib/Lorenz.mjs b/src/core/lib/Lorenz.mjs index 1d336cef..71111e7f 100644 --- a/src/core/lib/Lorenz.mjs +++ b/src/core/lib/Lorenz.mjs @@ -7,9 +7,9 @@ */ export const SWITCHES = [ - {name: "Up (.)", value: "."}, - {name: "Centre", value: ""}, - {name: "Down (x)", value: "x"} + { name: "Up (.)", value: "." }, + { name: "Centre", value: "" }, + { name: "Down (x)", value: "x" } ]; export const VALID_ITA2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ34589+-./"; @@ -74,83 +74,178 @@ export const ROTOR_SIZES = { export const INIT_PATTERNS = { "No Pattern": { "X": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 + ], 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 5: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, "S": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 5: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + ], + 2: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + 3: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + 4: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + 5: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] }, "M": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + 2: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 + ] } - }, "KH Pattern": { "X": { - 1: [0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0], + 1: [ + 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 0, 0 + ], 2: [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0], 3: [0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0], 4: [1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0], 5: [1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0] }, "S": { - 1: [0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1], - 2: [0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1], - 3: [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1], - 4: [0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], - 5: [1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0] + 1: [ + 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 1, 0, 1 + ], + 2: [ + 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 + ], + 3: [ + 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1 + ], + 4: [ + 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, + 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 + ], + 5: [ + 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0 + ] }, - "M": { - 1: [0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0], - 2: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0] + "M": { + 1: [ + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0 + ], + 2: [ + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0 + ] } }, - "ZMUG Pattern": { + "ZMUG Pattern": { "X": { - 1: [0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0], + 1: [ + 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 1, 1, 0 + ], 2: [1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0], 3: [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0], 4: [1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1], 5: [0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1] }, "S": { - 1: [1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0], - 2: [0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1], - 3: [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1], - 4: [0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1], - 5: [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0] + 1: [ + 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 0, 0 + ], + 2: [ + 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1 + ], + 3: [ + 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1 + ], + 4: [ + 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1 + ], + 5: [ + 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0 + ] }, "M": { - 1: [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1], - 2: [0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1] + 1: [ + 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1 + ], + 2: [ + 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, + 1, 1 + ] } }, "BREAM Pattern": { "X": { - 1: [0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0], + 1: [ + 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0 + ], 2: [0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1], 3: [1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0], 4: [1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0], 5: [0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0] }, "S": { - 1: [0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0], - 2: [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0], - 3: [1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], - 4: [0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1], - 5: [1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0] + 1: [ + 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 0 + ], + 2: [ + 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0 + ], + 3: [ + 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 + ], + 4: [ + 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1 + ], + 5: [ + 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, + 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 + ] }, "M": { - 1: [1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1], - 2: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1] + 1: [ + 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, + 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1 + ], + 2: [ + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, + 0, 1 + ] } } }; diff --git a/src/core/lib/Magic.mjs b/src/core/lib/Magic.mjs index 921fc3f6..22d85055 100644 --- a/src/core/lib/Magic.mjs +++ b/src/core/lib/Magic.mjs @@ -1,8 +1,8 @@ -import OperationConfig from "../config/OperationConfig.json" assert {type: "json"}; +import OperationConfig from "../config/OperationConfig.json" assert { type: "json" }; import Utils, { isWorkerEnvironment } from "../Utils.mjs"; import Recipe from "../Recipe.mjs"; import Dish from "../Dish.mjs"; -import {detectFileType, isType} from "./FileType.mjs"; +import { detectFileType, isType } from "./FileType.mjs"; import chiSquared from "chi-squared"; /** @@ -14,7 +14,6 @@ import chiSquared from "chi-squared"; * @license Apache-2.0 */ class Magic { - /** * Magic constructor. * @@ -22,7 +21,7 @@ class Magic { * @param {Object[]} [opCriteria] * @param {Object} [prevOp] */ - constructor(buf, opCriteria=Magic._generateOpCriteria(), prevOp=null) { + constructor(buf, opCriteria = Magic._generateOpCriteria(), prevOp = null) { this.inputBuffer = new Uint8Array(buf); this.inputStr = Utils.arrayBufferToStr(buf); this.opCriteria = opCriteria; @@ -38,16 +37,12 @@ class Magic { const matches = [], inputEntropy = this.calcEntropy(); - this.opCriteria.forEach(check => { + this.opCriteria.forEach((check) => { // If the input doesn't lie in the required entropy range, move on - if (check.entropyRange && - (inputEntropy < check.entropyRange[0] || - inputEntropy > check.entropyRange[1])) + if (check.entropyRange && (inputEntropy < check.entropyRange[0] || inputEntropy > check.entropyRange[1])) return; // If the input doesn't match the pattern, move on - if (check.pattern && - !check.pattern.test(this.inputStr)) - return; + if (check.pattern && !check.pattern.test(this.inputStr)) return; matches.push(check); }); @@ -64,11 +59,14 @@ class Magic { * @returns {Object[]} */ detectLanguage(extLang = false) { - if (!this.inputBuffer.length) return [{ - lang: "Unknown", - score: Math.MAX_VALUE, - probability: Math.MIN_VALUE - }]; + if (!this.inputBuffer.length) + return [ + { + lang: "Unknown", + score: Math.MAX_VALUE, + probability: Math.MIN_VALUE + } + ]; const inputFreq = this._freqDist(); const langFreqs = extLang ? EXTENSIVE_LANG_FREQS : COMMON_LANG_FREQS; @@ -120,63 +118,75 @@ class Magic { const bytes = new Uint8Array(this.inputBuffer); let i = 0; while (i < bytes.length) { - if (( // ASCII - bytes[i] === 0x09 || - bytes[i] === 0x0A || - bytes[i] === 0x0D || - (0x20 <= bytes[i] && bytes[i] <= 0x7E) - )) { + if ( + // ASCII + bytes[i] === 0x09 + || bytes[i] === 0x0a + || bytes[i] === 0x0d + || (0x20 <= bytes[i] && bytes[i] <= 0x7e) + ) { i += 1; continue; } - if (( // non-overlong 2-byte - (0xC2 <= bytes[i] && bytes[i] <= 0xDF) && - (0x80 <= bytes[i+1] && bytes[i+1] <= 0xBF) - )) { + if ( + // non-overlong 2-byte + 0xc2 <= bytes[i] + && bytes[i] <= 0xdf + && 0x80 <= bytes[i + 1] + && bytes[i + 1] <= 0xbf + ) { i += 2; continue; } - if (( // excluding overlongs - bytes[i] === 0xE0 && - (0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && - (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) - ) || - ( // straight 3-byte - ((0xE1 <= bytes[i] && bytes[i] <= 0xEC) || - bytes[i] === 0xEE || - bytes[i] === 0xEF) && - (0x80 <= bytes[i + 1] && bytes[i+1] <= 0xBF) && - (0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF) - ) || - ( // excluding surrogates - bytes[i] === 0xED && - (0x80 <= bytes[i+1] && bytes[i+1] <= 0x9F) && - (0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF) - )) { + if ( + // excluding overlongs + (bytes[i] === 0xe0 + && 0xa0 <= bytes[i + 1] + && bytes[i + 1] <= 0xbf + && 0x80 <= bytes[i + 2] + && bytes[i + 2] <= 0xbf) // straight 3-byte + || (((0xe1 <= bytes[i] && bytes[i] <= 0xec) || bytes[i] === 0xee || bytes[i] === 0xef) + && 0x80 <= bytes[i + 1] + && bytes[i + 1] <= 0xbf + && 0x80 <= bytes[i + 2] + && bytes[i + 2] <= 0xbf) // excluding surrogates + || (bytes[i] === 0xed + && 0x80 <= bytes[i + 1] + && bytes[i + 1] <= 0x9f + && 0x80 <= bytes[i + 2] + && bytes[i + 2] <= 0xbf) + ) { i += 3; continue; } - if (( // planes 1-3 - bytes[i] === 0xF0 && - (0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && - (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && - (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) - ) || - ( // planes 4-15 - (0xF1 <= bytes[i] && bytes[i] <= 0xF3) && - (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && - (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && - (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) - ) || - ( // plane 16 - bytes[i] === 0xF4 && - (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) && - (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && - (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) - )) { + if ( + // planes 1-3 + (bytes[i] === 0xf0 + && 0x90 <= bytes[i + 1] + && bytes[i + 1] <= 0xbf + && 0x80 <= bytes[i + 2] + && bytes[i + 2] <= 0xbf + && 0x80 <= bytes[i + 3] + && bytes[i + 3] <= 0xbf) // planes 4-15 + || (0xf1 <= bytes[i] + && bytes[i] <= 0xf3 + && 0x80 <= bytes[i + 1] + && bytes[i + 1] <= 0xbf + && 0x80 <= bytes[i + 2] + && bytes[i + 2] <= 0xbf + && 0x80 <= bytes[i + 3] + && bytes[i + 3] <= 0xbf) // plane 16 + || (bytes[i] === 0xf4 + && 0x80 <= bytes[i + 1] + && bytes[i + 1] <= 0x8f + && 0x80 <= bytes[i + 2] + && bytes[i + 2] <= 0xbf + && 0x80 <= bytes[i + 3] + && bytes[i + 3] <= 0xbf) + ) { i += 4; continue; } @@ -192,7 +202,7 @@ class Magic { * * @returns {number} */ - calcEntropy(data=this.inputBuffer, standalone=false) { + calcEntropy(data = this.inputBuffer, standalone = false) { if (!standalone && this.inputEntropy) return this.inputEntropy; const prob = this._freqDist(data, standalone); @@ -202,7 +212,7 @@ class Magic { for (let i = 0; i < prob.length; i++) { p = prob[i] / 100; if (p === 0) continue; - entropy += p * Math.log(p) / Math.log(2); + entropy += (p * Math.log(p)) / Math.log(2); } if (!standalone) this.inputEntropy = -entropy; @@ -221,10 +231,10 @@ class Magic { // 1-byte XOR for (let i = 1; i < 256; i++) { results.push({ - data: sample.map(b => b ^ i).buffer, + data: sample.map((b) => b ^ i).buffer, conf: { op: "XOR", - args: [{"option": "Hex", "string": i.toString(16)}, "Standard", false] + args: [{ "option": "Hex", "string": i.toString(16) }, "Standard", false] } }); } @@ -232,7 +242,7 @@ class Magic { // Bit rotate for (let i = 1; i < 8; i++) { results.push({ - data: sample.map(b => (b >> i) | ((b & (Math.pow(2, i) - 1)) << (8 - i))).buffer, + data: sample.map((b) => (b >> i) | ((b & (Math.pow(2, i) - 1)) << (8 - i))).buffer, conf: { op: "Rotate right", args: [i, false] @@ -246,7 +256,7 @@ class Magic { /** * Test character encodings and add them if they change the data. */ - const testEnc = async op => { + const testEnc = async (op) => { for (let i = 0; i < encodings.length; i++) { const conf = { op: op, @@ -286,17 +296,13 @@ class Magic { if (criteria.pattern) { const dataStr = Utils.arrayBufferToStr(data), regex = new RegExp(criteria.pattern, criteria.flags); - if (!regex.test(dataStr)) - return false; + if (!regex.test(dataStr)) return false; } if (criteria.entropyRange) { const dataEntropy = this.calcEntropy(data, true); - if (dataEntropy < criteria.entropyRange[0] || dataEntropy > criteria.entropyRange[1]) - return false; + if (dataEntropy < criteria.entropyRange[0] || dataEntropy > criteria.entropyRange[1]) return false; } - if (criteria.mime && - !isType(criteria.mime, data)) - return false; + if (criteria.mime && !isType(criteria.mime, data)) return false; return true; } @@ -316,13 +322,13 @@ class Magic { * @returns {Object[]} - A sorted list of the recipes most likely to result in correct decoding */ async speculativeExecution( - depth=0, - extLang=false, - intensive=false, - recipeConfig=[], - useful=false, - crib=null) { - + depth = 0, + extLang = false, + intensive = false, + recipeConfig = [], + useful = false, + crib = null + ) { // If we have reached the recursion depth, return if (depth < 0) return []; @@ -346,57 +352,72 @@ class Magic { // Execute each of the matching operations, then recursively call the speculativeExecution() // method on the resulting data, recording the properties of each option. - await Promise.all(matchingOps.map(async op => { - const opConfig = { - op: op.op, - args: op.args - }, - output = await this._runRecipe([opConfig]); + await Promise.all( + matchingOps.map(async (op) => { + const opConfig = { + op: op.op, + args: op.args + }, + output = await this._runRecipe([opConfig]); - // If the recipe returned an empty buffer, do not continue - if (_buffersEqual(output, new ArrayBuffer())) { - return; - } + // If the recipe returned an empty buffer, do not continue + if (_buffersEqual(output, new ArrayBuffer())) { + return; + } - // If the recipe is repeating and returning the same data, do not continue - if (prevOp && op.op === prevOp.op && _buffersEqual(output, this.inputBuffer)) { - return; - } + // If the recipe is repeating and returning the same data, do not continue + if (prevOp && op.op === prevOp.op && _buffersEqual(output, this.inputBuffer)) { + return; + } - // If the output criteria for this op doesn't match the output, do not continue - if (op.output && !this.outputCheckPasses(output, op.output)) - return; + // If the output criteria for this op doesn't match the output, do not continue + if (op.output && !this.outputCheckPasses(output, op.output)) return; - const magic = new Magic(output, this.opCriteria, OperationConfig[op.op]), - speculativeResults = await magic.speculativeExecution( - depth-1, extLang, intensive, [...recipeConfig, opConfig], op.useful, crib); + const magic = new Magic(output, this.opCriteria, OperationConfig[op.op]), + speculativeResults = await magic.speculativeExecution( + depth - 1, + extLang, + intensive, + [...recipeConfig, opConfig], + op.useful, + crib + ); - results = results.concat(speculativeResults); - })); + results = results.concat(speculativeResults); + }) + ); if (intensive) { // Run brute forcing of various types on the data and create a new branch for each option const bfEncodings = await this.bruteForce(); - await Promise.all(bfEncodings.map(async enc => { - const magic = new Magic(enc.data, this.opCriteria, undefined), - bfResults = await magic.speculativeExecution( - depth-1, extLang, false, [...recipeConfig, enc.conf], false, crib); + await Promise.all( + bfEncodings.map(async (enc) => { + const magic = new Magic(enc.data, this.opCriteria, undefined), + bfResults = await magic.speculativeExecution( + depth - 1, + extLang, + false, + [...recipeConfig, enc.conf], + false, + crib + ); - results = results.concat(bfResults); - })); + results = results.concat(bfResults); + }) + ); } // Prune branches that result in unhelpful outputs - const prunedResults = results.filter(r => - (r.useful || r.data.length > 0) && // The operation resulted in "" - ( // One of the following must be true - r.languageScores[0].probability > 0 || // Some kind of language was found - r.fileType || // A file was found - r.isUTF8 || // UTF-8 was found - r.matchingOps.length || // A matching op was found - r.matchesCrib // The crib matches - ) + const prunedResults = results.filter( + (r) => + (r.useful || r.data.length > 0) // The operation resulted in "" + // One of the following must be true + && (r.languageScores[0].probability > 0 // Some kind of language was found + || r.fileType // A file was found + || r.isUTF8 // UTF-8 was found + || r.matchingOps.length // A matching op was found + || r.matchesCrib) // The crib matches ); // Return a sorted list of possible recipes along with their properties @@ -426,10 +447,8 @@ class Magic { bScore += b.entropy; // A result with no recipe but matching ops suggests there are better options - if ((!a.recipe.length && a.matchingOps.length) && b.recipe.length) - return 1; - if ((!b.recipe.length && b.matchingOps.length) && a.recipe.length) - return -1; + if (!a.recipe.length && a.matchingOps.length && b.recipe.length) return 1; + if (!b.recipe.length && b.matchingOps.length && a.recipe.length) return -1; return aScore - bScore; }); @@ -442,7 +461,7 @@ class Magic { * @param {ArrayBuffer} [input=this.inputBuffer] * @returns {ArrayBuffer} */ - async _runRecipe(recipeConfig, input=this.inputBuffer) { + async _runRecipe(recipeConfig, input = this.inputBuffer) { input = input instanceof ArrayBuffer ? input : input.buffer; const dish = new Dish(); dish.set(input, Dish.ARRAY_BUFFER); @@ -472,7 +491,7 @@ class Magic { * @param {boolean} [standalone] * @returns {number[]} */ - _freqDist(data=this.inputBuffer, standalone=false) { + _freqDist(data = this.inputBuffer, standalone = false) { if (!standalone && this.freqDist) return this.freqDist; const len = data.length, @@ -488,8 +507,8 @@ class Magic { counts[data[i]]++; } - const result = counts.map(c => { - return c / len * 100; + const result = counts.map((c) => { + return (c / len) * 100; }); if (!standalone) this.freqDist = result; @@ -506,10 +525,9 @@ class Magic { const opCriteria = []; for (const op in OperationConfig) { - if (!("checks" in OperationConfig[op])) - continue; + if (!("checks" in OperationConfig[op])) continue; - OperationConfig[op].checks.forEach(check => { + OperationConfig[op].checks.forEach((check) => { // Add to the opCriteria list. // Compile the regex here and cache the compiled version so we // don't have to keep calculating it. @@ -537,19 +555,16 @@ class Magic { * @param {number} ddof - Delta degrees of freedom * @returns {number[]} - The score and the probability */ - static _chiSqr(observed, expected, ddof=0) { + static _chiSqr(observed, expected, ddof = 0) { let tmp, score = 0; for (let i = 0; i < observed.length; i++) { tmp = observed[i] - expected[i]; - score += tmp * tmp / expected[i]; + score += (tmp * tmp) / expected[i]; } - return [ - score, - 1 - chiSquared.cdf(score, observed.length - 1 - ddof) - ]; + return [score, 1 - chiSquared.cdf(score, observed.length - 1 - ddof)]; } /** @@ -562,311 +577,309 @@ class Magic { */ static codeToLanguage(code) { return { - "aa": "Afar", - "ab": "Abkhazian", + "aa": "Afar", + "ab": "Abkhazian", "ace": "Acehnese", "ady": "Adyghe", - "af": "Afrikaans", - "ak": "Akan", + "af": "Afrikaans", + "ak": "Akan", "als": "Alemannic", - "am": "Amharic", - "an": "Aragonese", + "am": "Amharic", + "an": "Aragonese", "ang": "Anglo-Saxon", - "ar": "Arabic", + "ar": "Arabic", "arc": "Aramaic", "arz": "Egyptian Arabic", - "as": "Assamese", + "as": "Assamese", "ast": "Asturian", "atj": "Atikamekw", - "av": "Avar", - "ay": "Aymara", - "az": "Azerbaijani", + "av": "Avar", + "ay": "Aymara", + "az": "Azerbaijani", "azb": "South Azerbaijani", - "ba": "Bashkir", + "ba": "Bashkir", "bar": "Bavarian", "bat-smg": "Samogitian", "bcl": "Central_Bicolano", - "be": "Belarusian", + "be": "Belarusian", "be-tarask": "Belarusian (Taraškievica)", - "bg": "Bulgarian", - "bh": "Bihari", - "bi": "Bislama", + "bg": "Bulgarian", + "bh": "Bihari", + "bi": "Bislama", "bjn": "Banjar", - "bm": "Bambara", - "bn": "Bengali", - "bo": "Tibetan", + "bm": "Bambara", + "bn": "Bengali", + "bo": "Tibetan", "bpy": "Bishnupriya Manipuri", - "br": "Breton", - "bs": "Bosnian", + "br": "Breton", + "bs": "Bosnian", "bug": "Buginese", "bxr": "Buryat (Russia)", - "ca": "Catalan", + "ca": "Catalan", "cbk-zam": "Zamboanga Chavacano", "cdo": "Min Dong", - "ce": "Chechen", + "ce": "Chechen", "ceb": "Cebuano", - "ch": "Chamorro", + "ch": "Chamorro", "cho": "Choctaw", "chr": "Cherokee", "chy": "Cheyenne", "ckb": "Sorani", - "co": "Corsican", - "cr": "Cree", + "co": "Corsican", + "cr": "Cree", "crh": "Crimean Tatar", - "cs": "Czech", + "cs": "Czech", "csb": "Kashubian", - "cu": "Old Church Slavonic", - "cv": "Chuvash", - "cy": "Welsh", - "da": "Danish", - "de": "German", + "cu": "Old Church Slavonic", + "cv": "Chuvash", + "cy": "Welsh", + "da": "Danish", + "de": "German", "din": "Dinka", "diq": "Zazaki", "dsb": "Lower Sorbian", "dty": "Doteli", - "dv": "Divehi", - "dz": "Dzongkha", - "ee": "Ewe", - "el": "Greek", + "dv": "Divehi", + "dz": "Dzongkha", + "ee": "Ewe", + "el": "Greek", "eml": "Emilian-Romagnol", - "en": "English", - "eo": "Esperanto", - "es": "Spanish", - "et": "Estonian", - "eu": "Basque", + "en": "English", + "eo": "Esperanto", + "es": "Spanish", + "et": "Estonian", + "eu": "Basque", "ext": "Extremaduran", - "fa": "Persian", - "ff": "Fula", - "fi": "Finnish", + "fa": "Persian", + "ff": "Fula", + "fi": "Finnish", "fiu-vro": "Võro", - "fj": "Fijian", - "fo": "Faroese", - "fr": "French", + "fj": "Fijian", + "fo": "Faroese", + "fr": "French", "frp": "Franco-Provençal/Arpitan", "frr": "North Frisian", "fur": "Friulian", - "fy": "West Frisian", - "ga": "Irish", + "fy": "West Frisian", + "ga": "Irish", "gag": "Gagauz", "gan": "Gan", - "gd": "Scottish Gaelic", - "gl": "Galician", + "gd": "Scottish Gaelic", + "gl": "Galician", "glk": "Gilaki", - "gn": "Guarani", + "gn": "Guarani", "gom": "Goan Konkani", "got": "Gothic", - "gu": "Gujarati", - "gv": "Manx", - "ha": "Hausa", + "gu": "Gujarati", + "gv": "Manx", + "ha": "Hausa", "hak": "Hakka", "haw": "Hawaiian", - "he": "Hebrew", - "hi": "Hindi", + "he": "Hebrew", + "hi": "Hindi", "hif": "Fiji Hindi", - "ho": "Hiri Motu", - "hr": "Croatian", + "ho": "Hiri Motu", + "hr": "Croatian", "hsb": "Upper Sorbian", - "ht": "Haitian", - "hu": "Hungarian", - "hy": "Armenian", - "hz": "Herero", - "ia": "Interlingua", - "id": "Indonesian", - "ie": "Interlingue", - "ig": "Igbo", - "ii": "Sichuan Yi", - "ik": "Inupiak", + "ht": "Haitian", + "hu": "Hungarian", + "hy": "Armenian", + "hz": "Herero", + "ia": "Interlingua", + "id": "Indonesian", + "ie": "Interlingue", + "ig": "Igbo", + "ii": "Sichuan Yi", + "ik": "Inupiak", "ilo": "Ilokano", - "io": "Ido", - "is": "Icelandic", - "it": "Italian", - "iu": "Inuktitut", - "ja": "Japanese", + "io": "Ido", + "is": "Icelandic", + "it": "Italian", + "iu": "Inuktitut", + "ja": "Japanese", "jam": "Jamaican", "jbo": "Lojban", - "jv": "Javanese", - "ka": "Georgian", + "jv": "Javanese", + "ka": "Georgian", "kaa": "Karakalpak", "kab": "Kabyle", "kbd": "Kabardian Circassian", "kbp": "Kabiye", - "kg": "Kongo", - "ki": "Kikuyu", - "kj": "Kuanyama", - "kk": "Kazakh", - "kl": "Greenlandic", - "km": "Khmer", - "kn": "Kannada", - "ko": "Korean", + "kg": "Kongo", + "ki": "Kikuyu", + "kj": "Kuanyama", + "kk": "Kazakh", + "kl": "Greenlandic", + "km": "Khmer", + "kn": "Kannada", + "ko": "Korean", "koi": "Komi-Permyak", - "kr": "Kanuri", + "kr": "Kanuri", "krc": "Karachay-Balkar", - "ks": "Kashmiri", + "ks": "Kashmiri", "ksh": "Ripuarian", - "ku": "Kurdish", - "kv": "Komi", - "kw": "Cornish", - "ky": "Kirghiz", - "la": "Latin", + "ku": "Kurdish", + "kv": "Komi", + "kw": "Cornish", + "ky": "Kirghiz", + "la": "Latin", "lad": "Ladino", - "lb": "Luxembourgish", + "lb": "Luxembourgish", "lbe": "Lak", "lez": "Lezgian", - "lg": "Luganda", - "li": "Limburgish", + "lg": "Luganda", + "li": "Limburgish", "lij": "Ligurian", "lmo": "Lombard", - "ln": "Lingala", - "lo": "Lao", + "ln": "Lingala", + "lo": "Lao", "lrc": "Northern Luri", - "lt": "Lithuanian", + "lt": "Lithuanian", "ltg": "Latgalian", - "lv": "Latvian", + "lv": "Latvian", "mai": "Maithili", "map-bms": "Banyumasan", "mdf": "Moksha", - "mg": "Malagasy", - "mh": "Marshallese", + "mg": "Malagasy", + "mh": "Marshallese", "mhr": "Meadow Mari", - "mi": "Maori", + "mi": "Maori", "min": "Minangkabau", - "mk": "Macedonian", - "ml": "Malayalam", - "mn": "Mongolian", - "mo": "Moldovan", - "mr": "Marathi", + "mk": "Macedonian", + "ml": "Malayalam", + "mn": "Mongolian", + "mo": "Moldovan", + "mr": "Marathi", "mrj": "Hill Mari", - "ms": "Malay", - "mt": "Maltese", + "ms": "Malay", + "mt": "Maltese", "mus": "Muscogee", "mwl": "Mirandese", - "my": "Burmese", + "my": "Burmese", "myv": "Erzya", "mzn": "Mazandarani", - "na": "Nauruan", + "na": "Nauruan", "nah": "Nahuatl", "nap": "Neapolitan", "nds": "Low Saxon", "nds-nl": "Dutch Low Saxon", - "ne": "Nepali", + "ne": "Nepali", "new": "Newar / Nepal Bhasa", - "ng": "Ndonga", - "nl": "Dutch", - "nn": "Norwegian (Nynorsk)", - "no": "Norwegian (Bokmål)", + "ng": "Ndonga", + "nl": "Dutch", + "nn": "Norwegian (Nynorsk)", + "no": "Norwegian (Bokmål)", "nov": "Novial", "nrm": "Norman", "nso": "Northern Sotho", - "nv": "Navajo", - "ny": "Chichewa", - "oc": "Occitan", + "nv": "Navajo", + "ny": "Chichewa", + "oc": "Occitan", "olo": "Livvi-Karelian", - "om": "Oromo", - "or": "Oriya", - "os": "Ossetian", - "pa": "Punjabi", + "om": "Oromo", + "or": "Oriya", + "os": "Ossetian", + "pa": "Punjabi", "pag": "Pangasinan", "pam": "Kapampangan", "pap": "Papiamentu", "pcd": "Picard", "pdc": "Pennsylvania German", "pfl": "Palatinate German", - "pi": "Pali", + "pi": "Pali", "pih": "Norfolk", - "pl": "Polish", + "pl": "Polish", "pms": "Piedmontese", "pnb": "Western Panjabi", "pnt": "Pontic", - "ps": "Pashto", - "pt": "Portuguese", - "qu": "Quechua", - "rm": "Romansh", + "ps": "Pashto", + "pt": "Portuguese", + "qu": "Quechua", + "rm": "Romansh", "rmy": "Romani", - "rn": "Kirundi", - "ro": "Romanian", + "rn": "Kirundi", + "ro": "Romanian", "roa-rup": "Aromanian", "roa-tara": "Tarantino", - "ru": "Russian", + "ru": "Russian", "rue": "Rusyn", - "rw": "Kinyarwanda", - "sa": "Sanskrit", + "rw": "Kinyarwanda", + "sa": "Sanskrit", "sah": "Sakha", - "sc": "Sardinian", + "sc": "Sardinian", "scn": "Sicilian", "sco": "Scots", - "sd": "Sindhi", - "se": "Northern Sami", - "sg": "Sango", - "sh": "Serbo-Croatian", - "si": "Sinhalese", + "sd": "Sindhi", + "se": "Northern Sami", + "sg": "Sango", + "sh": "Serbo-Croatian", + "si": "Sinhalese", "simple": "Simple English", - "sk": "Slovak", - "sl": "Slovenian", - "sm": "Samoan", - "sn": "Shona", - "so": "Somali", - "sq": "Albanian", - "sr": "Serbian", + "sk": "Slovak", + "sl": "Slovenian", + "sm": "Samoan", + "sn": "Shona", + "so": "Somali", + "sq": "Albanian", + "sr": "Serbian", "srn": "Sranan", - "ss": "Swati", - "st": "Sesotho", + "ss": "Swati", + "st": "Sesotho", "stq": "Saterland Frisian", - "su": "Sundanese", - "sv": "Swedish", - "sw": "Swahili", + "su": "Sundanese", + "sv": "Swedish", + "sw": "Swahili", "szl": "Silesian", - "ta": "Tamil", + "ta": "Tamil", "tcy": "Tulu", - "te": "Telugu", + "te": "Telugu", "tet": "Tetum", - "tg": "Tajik", - "th": "Thai", - "ti": "Tigrinya", - "tk": "Turkmen", - "tl": "Tagalog", - "tn": "Tswana", - "to": "Tongan", + "tg": "Tajik", + "th": "Thai", + "ti": "Tigrinya", + "tk": "Turkmen", + "tl": "Tagalog", + "tn": "Tswana", + "to": "Tongan", "tpi": "Tok Pisin", - "tr": "Turkish", - "ts": "Tsonga", - "tt": "Tatar", + "tr": "Turkish", + "ts": "Tsonga", + "tt": "Tatar", "tum": "Tumbuka", - "tw": "Twi", - "ty": "Tahitian", + "tw": "Twi", + "ty": "Tahitian", "tyv": "Tuvan", "udm": "Udmurt", - "ug": "Uyghur", - "uk": "Ukrainian", - "ur": "Urdu", - "uz": "Uzbek", - "ve": "Venda", + "ug": "Uyghur", + "uk": "Ukrainian", + "ur": "Urdu", + "uz": "Uzbek", + "ve": "Venda", "vec": "Venetian", "vep": "Vepsian", - "vi": "Vietnamese", + "vi": "Vietnamese", "vls": "West Flemish", - "vo": "Volapük", - "wa": "Walloon", + "vo": "Volapük", + "wa": "Walloon", "war": "Waray-Waray", - "wo": "Wolof", + "wo": "Wolof", "wuu": "Wu", "xal": "Kalmyk", - "xh": "Xhosa", + "xh": "Xhosa", "xmf": "Mingrelian", - "yi": "Yiddish", - "yo": "Yoruba", - "za": "Zhuang", + "yi": "Yiddish", + "yo": "Yoruba", + "za": "Zhuang", "zea": "Zeelandic", - "zh": "Chinese", + "zh": "Chinese", "zh-classical": "Classical Chinese", "zh-min-nan": "Min Nan", "zh-yue": "Cantonese", - "zu": "Zulu", + "zu": "Zulu" }[code]; } - } - /** * Byte frequencies of various languages generated from Wikipedia dumps taken in late 2017 and early 2018. * The Chi-Squared test cannot accept expected values of 0, so 0.0001 has been used to account for bytes @@ -876,293 +889,5521 @@ class Magic { * as of early 2018. */ const COMMON_LANG_FREQS = { - "en": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.755, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.843, 0.004, 0.375, 0.002, 0.008, 0.019, 0.008, 0.134, 0.137, 0.137, 0.001, 0.001, 0.972, 0.19, 0.857, 0.017, 0.334, 0.421, 0.246, 0.108, 0.104, 0.112, 0.103, 0.1, 0.127, 0.237, 0.04, 0.027, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.338, 0.218, 0.326, 0.163, 0.121, 0.149, 0.133, 0.192, 0.232, 0.107, 0.082, 0.148, 0.248, 0.134, 0.103, 0.195, 0.012, 0.162, 0.368, 0.366, 0.077, 0.061, 0.127, 0.009, 0.03, 0.015, 0.004, 0.0001, 0.004, 0.0001, 0.003, 0.0001, 6.614, 1.039, 2.327, 2.934, 9.162, 1.606, 1.415, 3.503, 5.718, 0.081, 0.461, 3.153, 1.793, 5.723, 5.565, 1.415, 0.066, 5.036, 4.79, 6.284, 1.992, 0.759, 1.176, 0.139, 1.162, 0.102, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.06, 0.004, 0.003, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.031, 0.006, 0.001, 0.001, 0.001, 0.002, 0.014, 0.001, 0.001, 0.005, 0.005, 0.001, 0.002, 0.017, 0.007, 0.002, 0.003, 0.004, 0.002, 0.001, 0.002, 0.002, 0.012, 0.001, 0.002, 0.001, 0.004, 0.001, 0.001, 0.003, 0.003, 0.002, 0.005, 0.001, 0.001, 0.003, 0.001, 0.003, 0.001, 0.002, 0.001, 0.004, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.02, 0.047, 0.009, 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.061, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ru": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.512, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.274, 0.002, 0.063, 0.0001, 0.001, 0.009, 0.001, 0.001, 0.118, 0.118, 0.0001, 0.001, 0.595, 0.135, 0.534, 0.009, 0.18, 0.281, 0.15, 0.078, 0.076, 0.077, 0.068, 0.066, 0.083, 0.16, 0.036, 0.016, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.013, 0.009, 0.014, 0.009, 0.007, 0.006, 0.007, 0.006, 0.031, 0.002, 0.003, 0.007, 0.012, 0.007, 0.005, 0.01, 0.001, 0.008, 0.017, 0.011, 0.003, 0.009, 0.005, 0.012, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 0.065, 0.009, 0.022, 0.021, 0.074, 0.01, 0.013, 0.019, 0.054, 0.001, 0.008, 0.036, 0.02, 0.047, 0.055, 0.013, 0.001, 0.052, 0.037, 0.041, 0.026, 0.007, 0.006, 0.003, 0.011, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.469, 2.363, 2.342, 0.986, 0.156, 0.422, 0.252, 0.495, 0.217, 0.136, 0.014, 0.778, 0.56, 0.097, 0.251, 0.811, 0.09, 0.184, 0.165, 0.06, 0.179, 0.021, 0.013, 0.029, 0.05, 0.005, 0.116, 0.045, 0.087, 0.073, 0.067, 0.124, 0.211, 0.16, 0.055, 0.033, 0.036, 0.024, 0.013, 0.02, 0.022, 0.002, 0.0001, 0.1, 0.0001, 0.025, 0.009, 0.011, 3.536, 0.619, 1.963, 0.833, 1.275, 3.452, 0.323, 0.635, 3.408, 0.642, 1.486, 1.967, 1.26, 2.857, 4.587, 1.082, 0.0001, 0.0001, 0.339, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.0001, 0.002, 0.001, 31.356, 12.318, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.131, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "de": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.726, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.303, 0.002, 0.278, 0.0001, 0.0001, 0.007, 0.003, 0.005, 0.149, 0.149, 0.015, 0.001, 0.636, 0.237, 0.922, 0.023, 0.305, 0.472, 0.225, 0.115, 0.11, 0.121, 0.108, 0.11, 0.145, 0.271, 0.049, 0.022, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.413, 0.383, 0.144, 0.412, 0.275, 0.258, 0.273, 0.218, 0.18, 0.167, 0.277, 0.201, 0.328, 0.179, 0.111, 0.254, 0.012, 0.219, 0.602, 0.209, 0.1, 0.185, 0.206, 0.005, 0.01, 0.112, 0.002, 0.0001, 0.002, 0.0001, 0.006, 0.0001, 4.417, 1.306, 1.99, 3.615, 12.382, 1.106, 2.0, 2.958, 6.179, 0.082, 0.866, 2.842, 1.869, 7.338, 2.27, 0.606, 0.016, 6.056, 4.424, 4.731, 3.002, 0.609, 0.918, 0.053, 0.169, 0.824, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.147, 0.002, 0.003, 0.001, 0.006, 0.001, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.03, 0.0001, 0.0001, 0.009, 0.001, 0.002, 0.009, 0.002, 0.001, 0.061, 0.0001, 0.048, 0.122, 0.057, 0.009, 0.001, 0.001, 0.4, 0.001, 0.002, 0.003, 0.003, 0.017, 0.001, 0.003, 0.001, 0.005, 0.0001, 0.001, 0.003, 0.002, 0.003, 0.005, 0.001, 0.001, 0.203, 0.0001, 0.002, 0.001, 0.002, 0.002, 0.438, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.056, 1.237, 0.01, 0.013, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.148, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ja": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.834, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.258, 0.007, 0.036, 0.001, 0.0001, 0.005, 0.002, 0.003, 0.033, 0.033, 0.0001, 0.002, 0.019, 0.052, 0.026, 0.009, 0.281, 0.407, 0.259, 0.126, 0.108, 0.109, 0.095, 0.092, 0.104, 0.184, 0.008, 0.001, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.048, 0.026, 0.039, 0.027, 0.028, 0.022, 0.018, 0.016, 0.03, 0.012, 0.014, 0.02, 0.03, 0.025, 0.025, 0.026, 0.002, 0.026, 0.045, 0.031, 0.013, 0.014, 0.014, 0.006, 0.006, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.077, 0.012, 0.03, 0.026, 0.088, 0.012, 0.017, 0.025, 0.067, 0.002, 0.016, 0.041, 0.039, 0.059, 0.066, 0.016, 0.001, 0.06, 0.043, 0.051, 0.028, 0.009, 0.007, 0.004, 0.015, 0.004, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 2.555, 10.322, 5.875, 4.462, 0.784, 0.468, 0.442, 0.409, 1.173, 0.96, 0.657, 1.448, 1.442, 0.636, 0.341, 0.685, 0.495, 0.342, 0.651, 0.536, 0.435, 0.657, 0.51, 0.978, 0.31, 0.563, 0.439, 0.514, 0.668, 0.438, 0.29, 1.039, 0.423, 0.532, 0.407, 0.691, 0.677, 0.555, 0.911, 0.887, 1.086, 0.531, 0.836, 1.345, 0.438, 0.666, 1.528, 0.959, 0.535, 0.379, 0.302, 0.822, 0.614, 0.308, 0.253, 0.467, 0.807, 0.807, 0.777, 0.809, 1.292, 0.546, 0.524, 0.425, 0.0001, 0.0001, 0.002, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.015, 19.387, 1.167, 4.022, 2.518, 1.734, 1.339, 1.229, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.409, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "es": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.757, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.771, 0.003, 0.315, 0.001, 0.004, 0.019, 0.003, 0.014, 0.132, 0.133, 0.001, 0.001, 0.976, 0.078, 0.703, 0.014, 0.268, 0.331, 0.197, 0.095, 0.086, 0.095, 0.085, 0.084, 0.105, 0.183, 0.053, 0.027, 0.001, 0.002, 0.002, 0.002, 0.0001, 0.242, 0.129, 0.28, 0.129, 0.322, 0.105, 0.099, 0.077, 0.116, 0.074, 0.034, 0.209, 0.196, 0.086, 0.059, 0.187, 0.009, 0.118, 0.247, 0.128, 0.061, 0.072, 0.033, 0.023, 0.018, 0.013, 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 8.9, 0.939, 3.234, 4.015, 9.642, 0.603, 0.891, 0.531, 5.007, 0.262, 0.107, 4.355, 1.915, 5.487, 6.224, 1.805, 0.423, 4.992, 5.086, 3.402, 2.878, 0.667, 0.044, 0.125, 0.673, 0.299, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.033, 0.009, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.006, 0.006, 0.001, 0.0001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.008, 0.008, 0.001, 0.001, 0.025, 0.274, 0.002, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.221, 0.003, 0.019, 0.001, 0.373, 0.001, 0.001, 0.005, 0.144, 0.01, 0.631, 0.002, 0.001, 0.002, 0.001, 0.002, 0.001, 0.102, 0.018, 0.006, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.079, 1.766, 0.003, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.032, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.894, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.162, 0.003, 0.276, 0.0001, 0.0001, 0.012, 0.002, 0.638, 0.153, 0.153, 0.001, 0.002, 0.96, 0.247, 0.715, 0.011, 0.225, 0.339, 0.18, 0.084, 0.081, 0.086, 0.081, 0.084, 0.106, 0.194, 0.063, 0.018, 0.003, 0.002, 0.003, 0.002, 0.0001, 0.208, 0.141, 0.255, 0.128, 0.144, 0.1, 0.095, 0.071, 0.154, 0.072, 0.042, 0.331, 0.173, 0.077, 0.056, 0.167, 0.013, 0.108, 0.214, 0.102, 0.049, 0.062, 0.035, 0.009, 0.014, 0.011, 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 5.761, 0.627, 2.287, 3.136, 10.738, 0.723, 0.838, 0.669, 5.295, 0.172, 0.12, 4.204, 1.941, 5.522, 4.015, 2.005, 0.584, 5.043, 5.545, 5.13, 4.06, 0.906, 0.051, 0.295, 0.278, 0.085, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.136, 0.003, 0.004, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.034, 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.019, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.112, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.367, 0.007, 0.034, 0.001, 0.003, 0.001, 0.003, 0.046, 0.303, 1.817, 0.082, 0.045, 0.001, 0.004, 0.029, 0.017, 0.004, 0.002, 0.002, 0.005, 0.038, 0.001, 0.003, 0.0001, 0.002, 0.02, 0.002, 0.054, 0.004, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.113, 2.813, 0.007, 0.026, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.122, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pt": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.934, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.319, 0.004, 0.372, 0.001, 0.002, 0.012, 0.004, 0.016, 0.15, 0.15, 0.001, 0.002, 1.16, 0.21, 0.746, 0.022, 0.296, 0.361, 0.226, 0.106, 0.098, 0.105, 0.096, 0.094, 0.114, 0.207, 0.054, 0.022, 0.006, 0.004, 0.006, 0.002, 0.0001, 0.345, 0.166, 0.295, 0.143, 0.233, 0.136, 0.112, 0.077, 0.129, 0.093, 0.039, 0.119, 0.217, 0.135, 0.164, 0.222, 0.016, 0.14, 0.259, 0.142, 0.064, 0.078, 0.041, 0.021, 0.013, 0.012, 0.007, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 9.026, 0.717, 2.572, 4.173, 8.551, 0.751, 0.906, 0.629, 5.107, 0.172, 0.12, 2.357, 3.189, 4.024, 7.683, 1.87, 0.445, 5.017, 5.188, 3.559, 2.852, 0.875, 0.055, 0.186, 0.122, 0.257, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.034, 0.01, 0.003, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.014, 0.001, 0.001, 0.001, 0.005, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.009, 0.006, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.007, 0.007, 0.0001, 0.001, 0.079, 0.267, 0.045, 0.508, 0.002, 0.001, 0.001, 0.424, 0.003, 0.417, 0.113, 0.003, 0.001, 0.255, 0.001, 0.001, 0.005, 0.003, 0.015, 0.161, 0.032, 0.087, 0.003, 0.001, 0.002, 0.001, 0.095, 0.002, 0.005, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.067, 2.471, 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.033, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "it": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.828, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.918, 0.002, 0.385, 0.0001, 0.001, 0.007, 0.003, 0.383, 0.13, 0.131, 0.0001, 0.001, 0.948, 0.103, 0.657, 0.014, 0.252, 0.332, 0.195, 0.093, 0.089, 0.095, 0.088, 0.084, 0.098, 0.183, 0.061, 0.035, 0.006, 0.002, 0.006, 0.001, 0.0001, 0.215, 0.131, 0.235, 0.125, 0.08, 0.104, 0.125, 0.057, 0.24, 0.04, 0.038, 0.208, 0.179, 0.133, 0.054, 0.164, 0.025, 0.114, 0.256, 0.12, 0.052, 0.079, 0.038, 0.021, 0.012, 0.012, 0.002, 0.0001, 0.002, 0.0001, 0.005, 0.0001, 8.583, 0.65, 3.106, 3.081, 8.81, 0.801, 1.321, 0.694, 8.492, 0.02, 0.115, 5.238, 1.88, 5.659, 6.812, 1.981, 0.236, 4.962, 3.674, 5.112, 2.35, 1.107, 0.055, 0.027, 0.118, 0.709, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.022, 0.004, 0.002, 0.002, 0.001, 0.001, 0.001, 0.002, 0.013, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.006, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.005, 0.0001, 0.001, 0.005, 0.005, 0.0001, 0.001, 0.153, 0.007, 0.001, 0.001, 0.003, 0.001, 0.001, 0.002, 0.174, 0.033, 0.004, 0.009, 0.036, 0.004, 0.001, 0.001, 0.006, 0.003, 0.097, 0.004, 0.001, 0.001, 0.003, 0.001, 0.002, 0.056, 0.009, 0.007, 0.004, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.043, 0.574, 0.01, 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.021, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "zh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.074, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.273, 0.003, 0.045, 0.0001, 0.001, 0.012, 0.001, 0.004, 0.032, 0.032, 0.001, 0.003, 0.032, 0.068, 0.063, 0.017, 0.386, 0.478, 0.308, 0.149, 0.134, 0.146, 0.127, 0.121, 0.136, 0.231, 0.018, 0.009, 0.007, 0.006, 0.007, 0.0001, 0.0001, 0.045, 0.029, 0.041, 0.028, 0.022, 0.017, 0.02, 0.019, 0.025, 0.01, 0.013, 0.02, 0.033, 0.021, 0.018, 0.028, 0.002, 0.022, 0.045, 0.031, 0.01, 0.013, 0.012, 0.007, 0.005, 0.003, 0.004, 0.0001, 0.004, 0.0001, 0.009, 0.0001, 0.159, 0.026, 0.051, 0.047, 0.17, 0.025, 0.032, 0.057, 0.124, 0.003, 0.021, 0.089, 0.049, 0.12, 0.129, 0.028, 0.002, 0.124, 0.083, 0.1, 0.058, 0.016, 0.016, 0.008, 0.03, 0.012, 0.006, 0.004, 0.006, 0.001, 0.0001, 2.707, 1.09, 1.398, 0.705, 1.23, 1.04, 0.715, 0.952, 1.455, 1.297, 0.845, 1.19, 2.403, 1.193, 0.813, 1.077, 0.889, 0.565, 0.387, 0.47, 0.931, 0.663, 1.035, 0.837, 0.77, 0.772, 1.434, 1.023, 1.668, 0.609, 0.437, 0.793, 0.535, 0.706, 0.48, 0.538, 0.785, 0.909, 0.7, 0.697, 1.017, 0.519, 0.441, 0.567, 0.626, 1.082, 0.814, 1.054, 1.074, 0.811, 0.556, 0.684, 0.903, 0.43, 0.642, 0.78, 2.083, 1.147, 2.006, 1.331, 2.547, 1.015, 0.911, 0.807, 0.0001, 0.0001, 0.069, 0.007, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.126, 1.369, 3.539, 8.968, 5.44, 4.358, 3.141, 2.48, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 1.821, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.841, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.03, 0.001, 0.048, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.117, 0.117, 0.001, 0.001, 0.009, 0.038, 0.486, 0.012, 0.007, 0.009, 0.007, 0.005, 0.003, 0.004, 0.003, 0.003, 0.003, 0.004, 0.048, 0.001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.011, 0.006, 0.011, 0.006, 0.005, 0.005, 0.004, 0.005, 0.007, 0.002, 0.002, 0.005, 0.008, 0.005, 0.005, 0.008, 0.001, 0.005, 0.011, 0.008, 0.002, 0.003, 0.004, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.007, 0.0001, 0.058, 0.008, 0.02, 0.02, 0.06, 0.011, 0.012, 0.017, 0.051, 0.001, 0.009, 0.031, 0.018, 0.042, 0.047, 0.015, 0.001, 0.043, 0.03, 0.037, 0.022, 0.005, 0.008, 0.003, 0.009, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.678, 0.557, 0.438, 0.001, 1.227, 2.118, 3.004, 2.445, 2.539, 0.0001, 0.003, 0.021, 5.067, 0.002, 0.007, 0.006, 0.015, 0.005, 0.002, 0.008, 0.07, 0.0001, 0.0001, 0.0001, 0.053, 0.001, 0.0001, 0.018, 0.0001, 0.001, 0.0001, 0.002, 0.002, 0.006, 0.337, 0.015, 0.006, 0.001, 0.059, 6.029, 1.704, 1.216, 2.096, 0.113, 0.433, 0.309, 0.439, 3.398, 0.192, 3.798, 0.977, 1.716, 1.137, 0.259, 0.129, 0.264, 0.12, 0.588, 0.085, 0.033, 0.001, 0.0001, 0.327, 0.0001, 0.0001, 0.0001, 0.068, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 23.012, 12.666, 1.946, 5.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.676, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.97, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.695, 0.002, 0.242, 0.0001, 0.0001, 0.007, 0.002, 0.011, 0.194, 0.194, 0.0001, 0.001, 0.805, 0.129, 1.016, 0.02, 0.347, 0.542, 0.289, 0.14, 0.138, 0.144, 0.123, 0.13, 0.153, 0.343, 0.068, 0.014, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.17, 0.165, 0.143, 0.124, 0.066, 0.081, 0.113, 0.075, 0.141, 0.107, 0.18, 0.108, 0.192, 0.142, 0.119, 0.322, 0.004, 0.139, 0.268, 0.117, 0.058, 0.041, 0.322, 0.032, 0.008, 0.109, 0.001, 0.0001, 0.001, 0.0001, 0.006, 0.0001, 6.697, 0.859, 2.856, 2.291, 5.604, 0.259, 1.117, 0.918, 6.017, 1.562, 2.537, 1.759, 1.903, 4.231, 5.86, 1.841, 0.006, 3.854, 3.145, 2.863, 1.965, 0.061, 3.408, 0.016, 2.669, 3.631, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.208, 0.018, 1.343, 0.004, 0.168, 0.653, 0.002, 0.145, 0.003, 0.001, 0.001, 0.001, 0.002, 0.004, 0.001, 0.002, 0.002, 0.001, 0.003, 0.126, 0.002, 0.001, 0.002, 0.002, 0.001, 0.65, 0.023, 0.378, 0.002, 0.035, 0.035, 0.002, 0.018, 0.011, 0.001, 0.002, 0.005, 0.001, 0.001, 0.002, 0.003, 0.012, 0.001, 0.002, 0.001, 0.005, 0.001, 0.001, 0.01, 0.004, 0.011, 0.641, 0.003, 0.006, 0.005, 0.001, 0.008, 0.004, 0.056, 0.014, 0.433, 0.007, 0.008, 0.002, 0.0001, 0.0001, 0.025, 0.694, 1.442, 2.413, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.003, 0.06, 0.02, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.205, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.91, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.447, 0.013, 0.297, 0.0001, 0.001, 0.013, 0.003, 0.465, 0.123, 0.123, 0.001, 0.002, 0.653, 0.111, 0.957, 0.015, 0.312, 0.387, 0.238, 0.107, 0.101, 0.108, 0.097, 0.095, 0.109, 0.217, 0.04, 0.028, 0.007, 0.019, 0.007, 0.002, 0.0001, 0.336, 0.309, 0.117, 0.167, 0.132, 0.105, 0.13, 0.135, 0.063, 0.042, 0.261, 0.085, 0.236, 0.083, 0.095, 0.131, 0.004, 0.092, 0.247, 0.219, 0.038, 0.052, 0.037, 0.008, 0.095, 0.019, 0.007, 0.0001, 0.007, 0.0001, 0.005, 0.001, 8.533, 1.3, 0.65, 3.067, 6.656, 0.419, 0.804, 0.718, 6.178, 0.059, 2.986, 5.127, 2.286, 5.537, 2.04, 0.623, 0.006, 5.247, 2.411, 2.743, 2.225, 0.903, 0.049, 0.018, 2.076, 0.792, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.096, 0.004, 0.004, 0.004, 0.002, 0.002, 0.002, 0.041, 0.002, 0.001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.002, 0.001, 0.031, 0.001, 0.003, 0.065, 0.001, 0.001, 0.033, 0.009, 0.047, 1.71, 0.04, 0.005, 0.027, 0.002, 0.003, 0.001, 0.001, 0.647, 0.002, 0.008, 0.002, 0.003, 0.001, 0.004, 0.019, 0.002, 0.132, 3.435, 0.005, 0.004, 0.003, 0.003, 0.525, 0.001, 0.004, 0.002, 0.003, 0.007, 1.206, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.046, 2.539, 4.197, 1.125, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.01, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.094, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.158, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.747, 0.002, 0.267, 0.0001, 0.001, 0.008, 0.01, 0.052, 0.196, 0.196, 0.0001, 0.001, 0.504, 0.205, 0.944, 0.013, 0.311, 0.428, 0.229, 0.104, 0.101, 0.109, 0.102, 0.102, 0.137, 0.252, 0.048, 0.012, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.205, 0.192, 0.181, 0.371, 0.131, 0.088, 0.11, 0.236, 0.167, 0.069, 0.091, 0.119, 0.172, 0.137, 0.117, 0.141, 0.005, 0.112, 0.229, 0.137, 0.034, 0.123, 0.084, 0.006, 0.011, 0.064, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 6.042, 1.063, 1.294, 4.124, 13.689, 0.579, 2.105, 1.822, 5.542, 0.948, 1.42, 3.124, 1.72, 7.129, 4.759, 1.349, 0.015, 5.115, 3.623, 4.903, 1.642, 1.84, 1.06, 0.063, 0.226, 0.656, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.023, 0.003, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.008, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.007, 0.001, 0.001, 0.003, 0.003, 0.001, 0.002, 0.008, 0.009, 0.003, 0.002, 0.005, 0.002, 0.001, 0.003, 0.009, 0.038, 0.001, 0.051, 0.001, 0.005, 0.001, 0.011, 0.004, 0.003, 0.013, 0.008, 0.002, 0.002, 0.008, 0.001, 0.004, 0.001, 0.003, 0.002, 0.01, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.02, 0.166, 0.007, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.016, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.022, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ko": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.893, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.919, 0.003, 0.069, 0.0001, 0.0001, 0.007, 0.002, 0.048, 0.269, 0.269, 0.0001, 0.002, 0.501, 0.04, 0.699, 0.01, 0.29, 0.417, 0.259, 0.125, 0.109, 0.112, 0.1, 0.094, 0.109, 0.192, 0.015, 0.002, 0.006, 0.002, 0.006, 0.003, 0.0001, 0.038, 0.026, 0.038, 0.022, 0.02, 0.024, 0.015, 0.013, 0.023, 0.008, 0.015, 0.017, 0.027, 0.016, 0.016, 0.023, 0.002, 0.017, 0.041, 0.027, 0.011, 0.013, 0.01, 0.005, 0.004, 0.002, 0.006, 0.0001, 0.006, 0.0001, 0.012, 0.0001, 0.108, 0.014, 0.037, 0.031, 0.116, 0.024, 0.022, 0.032, 0.084, 0.002, 0.021, 0.064, 0.06, 0.077, 0.092, 0.02, 0.001, 0.086, 0.056, 0.066, 0.046, 0.011, 0.008, 0.004, 0.019, 0.004, 0.0001, 0.002, 0.0001, 0.025, 0.0001, 2.21, 0.565, 0.766, 0.471, 3.043, 0.671, 0.334, 0.049, 1.404, 0.218, 1.17, 1.657, 1.23, 0.278, 0.091, 0.557, 1.645, 0.451, 0.058, 0.386, 1.38, 2.193, 0.506, 1.29, 2.708, 0.68, 0.385, 0.399, 2.758, 3.352, 0.954, 0.141, 1.848, 0.829, 0.071, 0.249, 1.741, 0.637, 0.43, 0.888, 0.537, 0.506, 0.243, 0.027, 1.4, 0.355, 0.026, 0.179, 2.38, 0.404, 0.739, 1.021, 2.205, 0.729, 0.454, 0.308, 1.635, 0.561, 0.035, 0.084, 1.612, 0.309, 0.024, 0.047, 0.0001, 0.0001, 0.034, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.039, 0.089, 0.025, 0.107, 0.071, 0.044, 0.037, 0.043, 3.199, 8.716, 12.558, 3.298, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cs": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.804, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.066, 0.002, 0.232, 0.0001, 0.0001, 0.008, 0.002, 0.009, 0.188, 0.188, 0.007, 0.002, 0.814, 0.094, 1.008, 0.025, 0.299, 0.437, 0.233, 0.115, 0.111, 0.119, 0.106, 0.102, 0.129, 0.233, 0.051, 0.011, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.143, 0.145, 0.103, 0.117, 0.06, 0.072, 0.055, 0.092, 0.08, 0.13, 0.142, 0.093, 0.169, 0.137, 0.088, 0.246, 0.003, 0.104, 0.236, 0.127, 0.039, 0.213, 0.033, 0.007, 0.007, 0.069, 0.002, 0.0001, 0.002, 0.0001, 0.005, 0.0001, 5.018, 1.137, 1.8, 2.299, 5.465, 0.243, 0.288, 1.623, 3.2, 1.177, 2.624, 3.218, 2.048, 4.447, 5.813, 1.952, 0.006, 3.062, 3.218, 3.502, 2.227, 3.008, 0.043, 0.058, 1.313, 1.405, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.104, 0.003, 0.004, 0.003, 0.001, 0.001, 0.001, 0.003, 0.041, 0.001, 0.001, 0.001, 0.049, 0.57, 0.001, 0.012, 0.001, 0.001, 0.002, 0.048, 0.002, 0.001, 0.001, 0.002, 0.011, 0.748, 0.01, 0.981, 0.025, 0.001, 0.025, 0.002, 0.191, 1.9, 0.003, 0.001, 0.005, 0.024, 0.002, 0.002, 0.002, 0.87, 0.001, 0.001, 0.001, 1.984, 0.001, 0.336, 0.006, 0.002, 0.004, 0.031, 0.002, 0.003, 0.006, 0.001, 0.003, 0.001, 0.094, 0.002, 0.007, 0.671, 0.58, 0.001, 0.0001, 0.0001, 0.173, 5.104, 1.615, 2.233, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.009, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.103, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ar": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.65, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.194, 0.002, 0.102, 0.0001, 0.0001, 0.007, 0.001, 0.002, 0.109, 0.108, 0.002, 0.001, 0.03, 0.046, 0.42, 0.018, 0.182, 0.202, 0.135, 0.063, 0.065, 0.061, 0.055, 0.053, 0.062, 0.113, 0.054, 0.001, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.01, 0.006, 0.009, 0.007, 0.005, 0.004, 0.004, 0.004, 0.005, 0.002, 0.002, 0.005, 0.007, 0.005, 0.004, 0.007, 0.001, 0.005, 0.009, 0.006, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.007, 0.001, 0.007, 0.0001, 0.004, 0.0001, 0.052, 0.008, 0.019, 0.018, 0.055, 0.008, 0.011, 0.016, 0.045, 0.001, 0.006, 0.028, 0.016, 0.037, 0.04, 0.012, 0.001, 0.038, 0.03, 0.035, 0.02, 0.006, 0.006, 0.002, 0.009, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.055, 1.131, 0.874, 0.939, 4.804, 2.787, 2.235, 1.018, 2.407, 0.349, 3.542, 0.092, 0.4, 0.007, 0.051, 0.053, 0.022, 0.061, 0.01, 0.008, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.008, 0.001, 0.001, 0.0001, 0.002, 0.013, 0.133, 0.049, 0.782, 0.037, 0.335, 0.157, 6.208, 1.599, 1.486, 1.889, 0.276, 0.607, 0.762, 0.341, 1.38, 0.239, 2.041, 0.293, 1.149, 0.411, 0.383, 0.246, 0.406, 0.094, 1.401, 0.223, 0.006, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.027, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 23.298, 20.414, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.019, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "vi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.205, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.546, 0.002, 0.241, 0.0001, 0.001, 0.015, 0.013, 0.009, 0.13, 0.13, 0.0001, 0.002, 0.714, 0.089, 0.813, 0.02, 0.259, 0.361, 0.203, 0.104, 0.097, 0.104, 0.089, 0.089, 0.116, 0.194, 0.047, 0.017, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.148, 0.175, 0.293, 0.111, 0.056, 0.04, 0.092, 0.206, 0.057, 0.03, 0.119, 0.232, 0.178, 0.247, 0.036, 0.156, 0.056, 0.062, 0.184, 0.397, 0.022, 0.114, 0.033, 0.033, 0.019, 0.009, 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 2.683, 0.66, 3.149, 0.627, 1.148, 0.076, 2.542, 4.362, 3.528, 0.019, 0.59, 1.486, 1.611, 5.924, 2.001, 0.761, 0.201, 1.559, 1.014, 3.555, 1.77, 0.861, 0.05, 0.173, 0.826, 0.047, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.021, 0.214, 0.011, 0.478, 0.002, 0.039, 0.001, 0.324, 0.002, 0.072, 0.001, 0.198, 0.002, 0.32, 0.002, 0.048, 0.141, 1.485, 0.001, 0.116, 0.015, 0.106, 0.001, 0.025, 0.002, 0.579, 0.004, 0.289, 0.004, 0.257, 0.005, 0.174, 1.516, 1.221, 0.326, 0.818, 0.013, 0.337, 0.005, 0.51, 0.014, 0.324, 0.408, 0.115, 0.147, 0.492, 0.002, 0.218, 0.82, 0.26, 0.102, 0.383, 0.379, 0.016, 0.006, 0.094, 0.005, 0.132, 2.233, 4.628, 0.009, 0.062, 0.003, 0.385, 0.0001, 0.0001, 0.047, 4.542, 1.653, 0.065, 0.997, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 6.74, 0.019, 0.004, 0.002, 0.009, 0.006, 0.004, 0.003, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "el": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.389, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.245, 0.003, 0.167, 0.001, 0.0001, 0.005, 0.002, 0.015, 0.1, 0.101, 0.0001, 0.001, 0.487, 0.058, 0.449, 0.01, 0.151, 0.215, 0.114, 0.058, 0.055, 0.058, 0.052, 0.051, 0.065, 0.119, 0.032, 0.001, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.021, 0.016, 0.024, 0.014, 0.012, 0.012, 0.011, 0.013, 0.012, 0.005, 0.006, 0.013, 0.018, 0.01, 0.009, 0.015, 0.001, 0.013, 0.025, 0.017, 0.005, 0.006, 0.008, 0.002, 0.002, 0.001, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.0001, 0.125, 0.018, 0.039, 0.039, 0.142, 0.017, 0.026, 0.036, 0.105, 0.002, 0.017, 0.072, 0.036, 0.093, 0.102, 0.022, 0.002, 0.099, 0.07, 0.077, 0.046, 0.014, 0.01, 0.005, 0.02, 0.005, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 1.502, 1.948, 1.522, 1.805, 3.613, 1.458, 0.354, 0.481, 0.073, 0.584, 0.024, 0.002, 0.912, 0.435, 0.305, 0.001, 0.006, 0.156, 0.057, 0.068, 0.049, 0.097, 0.01, 0.064, 0.017, 0.048, 0.112, 0.037, 0.115, 0.048, 0.003, 0.099, 0.122, 0.029, 0.001, 0.129, 0.119, 0.011, 0.03, 0.034, 0.002, 0.008, 0.0001, 0.022, 0.85, 0.749, 0.601, 1.063, 0.004, 3.95, 0.27, 0.716, 0.649, 2.656, 0.14, 1.63, 0.422, 2.831, 1.733, 1.214, 1.337, 2.636, 0.149, 3.615, 0.0001, 0.0001, 0.06, 0.007, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 28.675, 14.922, 0.013, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.282, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.667, 0.001, 0.345, 0.0001, 0.0001, 0.007, 0.002, 0.013, 0.083, 0.083, 0.0001, 0.0001, 0.902, 0.146, 1.182, 0.007, 0.152, 0.25, 0.108, 0.06, 0.06, 0.065, 0.065, 0.066, 0.089, 0.153, 0.044, 0.004, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.178, 0.164, 0.421, 0.354, 0.095, 0.078, 0.149, 0.127, 0.181, 0.06, 0.161, 0.209, 0.174, 0.099, 0.072, 0.149, 0.019, 0.12, 0.249, 0.206, 0.034, 0.058, 0.04, 0.006, 0.012, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 6.63, 0.945, 0.963, 3.448, 8.696, 0.922, 2.03, 1.373, 4.448, 0.429, 1.949, 3.417, 3.024, 6.448, 3.193, 1.076, 0.019, 6.923, 3.891, 5.562, 1.877, 1.653, 0.074, 0.114, 0.424, 0.075, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.022, 0.039, 0.002, 0.003, 0.007, 0.074, 0.004, 0.007, 0.005, 0.002, 0.002, 0.0001, 0.003, 0.008, 0.002, 0.004, 0.001, 0.002, 0.0001, 0.011, 0.001, 0.001, 0.012, 0.001, 0.005, 0.002, 0.001, 0.001, 0.001, 0.004, 0.001, 0.003, 0.21, 0.017, 0.005, 0.004, 1.574, 0.853, 0.002, 0.007, 0.008, 0.038, 0.004, 0.047, 0.001, 0.014, 0.002, 0.009, 0.187, 0.01, 0.004, 0.012, 0.004, 0.002, 0.808, 0.001, 0.008, 0.002, 0.004, 0.002, 0.006, 0.002, 0.003, 0.001, 0.0001, 0.0001, 0.393, 3.436, 0.069, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.014, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.021, 0.021, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.019, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.827, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.714, 0.004, 0.265, 0.0001, 0.0001, 0.007, 0.001, 0.007, 0.159, 0.159, 0.001, 0.002, 1.016, 0.461, 0.937, 0.013, 0.261, 0.429, 0.206, 0.109, 0.106, 0.113, 0.103, 0.105, 0.137, 0.238, 0.073, 0.019, 0.004, 0.004, 0.004, 0.002, 0.0001, 0.469, 0.135, 0.097, 0.073, 0.142, 0.093, 0.075, 0.087, 0.095, 0.062, 0.133, 0.086, 0.175, 0.085, 0.042, 0.096, 0.003, 0.071, 0.186, 0.107, 0.027, 0.069, 0.028, 0.009, 0.008, 0.025, 0.002, 0.0001, 0.002, 0.0001, 0.004, 0.0001, 6.316, 1.591, 0.619, 1.364, 7.125, 0.648, 2.159, 0.946, 3.15, 0.796, 3.265, 4.526, 2.054, 3.978, 3.047, 0.846, 0.006, 3.327, 4.35, 5.787, 0.902, 1.395, 0.037, 0.035, 1.463, 2.94, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.129, 0.02, 0.003, 0.003, 0.001, 0.001, 0.001, 0.003, 0.002, 0.014, 0.001, 0.001, 0.001, 0.006, 0.0001, 0.001, 0.004, 0.667, 0.001, 0.068, 0.001, 0.0001, 0.005, 0.001, 0.001, 0.009, 0.007, 0.002, 0.003, 0.026, 0.026, 0.002, 0.024, 2.603, 0.002, 0.001, 0.003, 0.001, 0.002, 0.002, 0.003, 2.374, 0.001, 0.002, 0.001, 0.448, 0.001, 0.001, 0.005, 0.169, 0.003, 0.702, 0.002, 0.002, 0.76, 0.001, 0.004, 0.002, 0.223, 0.002, 0.382, 0.004, 0.004, 0.001, 0.0001, 0.0001, 0.028, 7.544, 0.01, 0.845, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.021, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.128, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ro": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.178, 0.003, 0.287, 0.001, 0.001, 0.038, 0.002, 0.011, 0.2, 0.201, 0.001, 0.002, 1.114, 0.333, 0.783, 0.015, 0.314, 0.397, 0.224, 0.108, 0.105, 0.107, 0.098, 0.099, 0.123, 0.221, 0.062, 0.021, 0.007, 0.006, 0.007, 0.002, 0.0001, 0.27, 0.164, 0.289, 0.16, 0.109, 0.099, 0.098, 0.077, 0.163, 0.044, 0.047, 0.132, 0.205, 0.095, 0.07, 0.207, 0.004, 0.158, 0.242, 0.12, 0.072, 0.085, 0.033, 0.021, 0.01, 0.019, 0.006, 0.0001, 0.006, 0.0001, 0.007, 0.0001, 7.568, 0.638, 3.253, 2.492, 8.352, 0.862, 0.693, 0.377, 7.77, 0.16, 0.142, 3.906, 1.919, 5.009, 3.799, 1.948, 0.008, 5.326, 2.857, 4.711, 4.259, 0.743, 0.045, 0.139, 0.103, 0.506, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.128, 0.004, 0.004, 1.675, 0.002, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.003, 0.104, 0.001, 0.001, 0.002, 0.001, 0.018, 0.003, 0.001, 0.001, 0.001, 0.016, 0.733, 0.007, 0.695, 0.006, 0.05, 0.046, 0.002, 0.038, 0.012, 0.339, 0.002, 0.003, 0.001, 0.001, 0.002, 0.004, 0.016, 0.001, 0.003, 0.001, 0.004, 0.716, 0.001, 0.007, 0.003, 0.004, 0.005, 0.003, 0.002, 0.005, 0.001, 0.003, 0.001, 0.002, 0.003, 0.007, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.048, 1.213, 1.681, 0.01, 0.0001, 0.003, 1.446, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.016, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.127, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "id": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.029, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.265, 0.003, 0.293, 0.001, 0.002, 0.008, 0.004, 0.02, 0.156, 0.156, 0.001, 0.002, 0.897, 0.232, 0.837, 0.025, 0.281, 0.301, 0.205, 0.089, 0.081, 0.088, 0.077, 0.074, 0.084, 0.156, 0.047, 0.017, 0.004, 0.004, 0.004, 0.002, 0.0001, 0.336, 0.259, 0.156, 0.221, 0.076, 0.084, 0.101, 0.111, 0.249, 0.128, 0.292, 0.143, 0.276, 0.131, 0.06, 0.365, 0.008, 0.137, 0.448, 0.233, 0.076, 0.043, 0.063, 0.011, 0.049, 0.014, 0.01, 0.0001, 0.01, 0.0001, 0.002, 0.0001, 14.771, 1.913, 0.506, 3.424, 6.588, 0.273, 2.854, 1.797, 6.389, 0.58, 3.078, 2.893, 3.104, 7.626, 2.047, 2.047, 0.011, 4.279, 3.371, 3.841, 3.795, 0.171, 0.34, 0.026, 1.249, 0.063, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.031, 0.005, 0.004, 0.003, 0.003, 0.002, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.004, 0.002, 0.001, 0.001, 0.001, 0.001, 0.012, 0.003, 0.001, 0.001, 0.001, 0.002, 0.005, 0.001, 0.001, 0.006, 0.006, 0.001, 0.002, 0.051, 0.005, 0.002, 0.002, 0.003, 0.001, 0.002, 0.003, 0.002, 0.009, 0.001, 0.002, 0.001, 0.003, 0.001, 0.001, 0.004, 0.003, 0.004, 0.003, 0.002, 0.002, 0.002, 0.001, 0.003, 0.002, 0.002, 0.002, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.055, 0.03, 0.005, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.03, 0.003, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.159, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.105, 0.002, 0.192, 0.0001, 0.0001, 0.007, 0.002, 0.005, 0.209, 0.21, 0.013, 0.002, 0.819, 0.162, 1.046, 0.023, 0.302, 0.407, 0.233, 0.125, 0.121, 0.119, 0.111, 0.11, 0.127, 0.222, 0.055, 0.011, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.172, 0.157, 0.128, 0.107, 0.068, 0.073, 0.08, 0.101, 0.088, 0.103, 0.136, 0.098, 0.191, 0.186, 0.106, 0.263, 0.004, 0.11, 0.26, 0.138, 0.041, 0.2, 0.032, 0.006, 0.008, 0.071, 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.0001, 6.363, 1.243, 1.749, 2.177, 5.774, 0.29, 0.367, 1.611, 4.04, 1.457, 2.743, 2.816, 2.062, 4.279, 6.818, 1.868, 0.006, 3.912, 3.184, 3.285, 2.066, 3.292, 0.044, 0.067, 1.073, 1.331, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.113, 0.006, 0.004, 0.002, 0.002, 0.001, 0.001, 0.002, 0.077, 0.003, 0.0001, 0.001, 0.033, 0.618, 0.006, 0.066, 0.001, 0.001, 0.001, 0.046, 0.001, 0.006, 0.001, 0.001, 0.001, 0.013, 0.009, 0.007, 0.027, 0.001, 0.026, 0.001, 0.106, 1.828, 0.001, 0.001, 0.067, 0.259, 0.001, 0.002, 0.006, 0.586, 0.001, 0.001, 0.001, 0.717, 0.001, 0.002, 0.005, 0.002, 0.004, 0.16, 0.12, 0.002, 0.005, 0.038, 0.002, 0.001, 0.54, 0.002, 0.006, 0.806, 0.828, 0.001, 0.0001, 0.0001, 0.114, 4.297, 1.036, 1.463, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.112, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "da": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.925, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.716, 0.002, 0.323, 0.001, 0.001, 0.007, 0.004, 0.044, 0.149, 0.15, 0.001, 0.001, 0.888, 0.199, 1.047, 0.017, 0.356, 0.494, 0.245, 0.119, 0.115, 0.124, 0.118, 0.127, 0.168, 0.257, 0.046, 0.018, 0.001, 0.002, 0.001, 0.002, 0.0001, 0.185, 0.17, 0.132, 0.265, 0.124, 0.155, 0.096, 0.211, 0.151, 0.076, 0.153, 0.12, 0.178, 0.102, 0.069, 0.125, 0.005, 0.111, 0.307, 0.131, 0.057, 0.087, 0.054, 0.005, 0.012, 0.01, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 4.818, 1.29, 0.375, 4.241, 11.595, 1.856, 2.915, 1.153, 4.647, 0.373, 2.179, 3.858, 2.304, 5.903, 3.8, 1.073, 0.008, 6.456, 4.455, 5.128, 1.418, 1.705, 0.066, 0.033, 0.579, 0.056, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.052, 0.003, 0.002, 0.001, 0.001, 0.008, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.033, 0.003, 0.0001, 0.001, 0.001, 0.013, 0.005, 0.0001, 0.001, 0.002, 0.008, 0.001, 0.002, 0.01, 0.006, 0.001, 0.001, 0.01, 0.595, 0.559, 0.002, 0.002, 0.02, 0.001, 0.004, 0.001, 0.004, 0.001, 0.001, 0.005, 0.002, 0.003, 0.005, 0.001, 0.001, 0.011, 0.001, 0.585, 0.001, 0.002, 0.003, 0.011, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.02, 1.836, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.052, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.851, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.647, 0.002, 0.239, 0.0001, 0.0001, 0.006, 0.003, 0.009, 0.115, 0.115, 0.0001, 0.004, 0.594, 0.296, 1.014, 0.011, 0.404, 0.475, 0.268, 0.112, 0.107, 0.117, 0.106, 0.107, 0.133, 0.295, 0.069, 0.007, 0.003, 0.004, 0.003, 0.001, 0.0001, 0.183, 0.111, 0.1, 0.068, 0.113, 0.064, 0.065, 0.195, 0.087, 0.098, 0.225, 0.146, 0.211, 0.097, 0.06, 0.172, 0.005, 0.116, 0.314, 0.181, 0.037, 0.143, 0.044, 0.006, 0.048, 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.0001, 9.681, 0.162, 0.176, 0.832, 6.272, 0.12, 0.289, 1.322, 8.475, 1.576, 3.754, 4.597, 2.281, 6.958, 4.47, 1.345, 0.007, 2.326, 6.029, 6.589, 4.108, 1.653, 0.05, 0.021, 1.301, 0.041, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.101, 0.002, 0.002, 0.001, 0.004, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.061, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.008, 0.0001, 0.001, 0.001, 0.032, 0.0001, 0.001, 0.032, 0.02, 0.001, 0.001, 2.624, 0.003, 0.001, 0.001, 0.002, 0.014, 0.0001, 0.002, 0.001, 0.01, 0.001, 0.001, 0.003, 0.002, 0.002, 0.005, 0.001, 0.001, 0.349, 0.001, 0.002, 0.001, 0.002, 0.001, 0.005, 0.002, 0.004, 0.001, 0.0001, 0.0001, 0.039, 3.028, 0.006, 0.023, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.101, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "th": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.353, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.736, 0.001, 0.084, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.081, 0.081, 0.0001, 0.001, 0.043, 0.029, 0.16, 0.005, 0.088, 0.106, 0.121, 0.047, 0.051, 0.082, 0.032, 0.03, 0.033, 0.045, 0.008, 0.004, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.013, 0.009, 0.013, 0.008, 0.008, 0.006, 0.006, 0.006, 0.008, 0.003, 0.003, 0.006, 0.01, 0.006, 0.005, 0.009, 0.001, 0.007, 0.015, 0.012, 0.003, 0.003, 0.006, 0.001, 0.002, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.08, 0.011, 0.029, 0.025, 0.092, 0.012, 0.017, 0.027, 0.069, 0.001, 0.009, 0.042, 0.023, 0.063, 0.066, 0.017, 0.001, 0.062, 0.045, 0.056, 0.028, 0.008, 0.007, 0.003, 0.015, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 1.311, 1.859, 0.629, 0.364, 0.845, 0.001, 0.034, 1.547, 1.721, 0.971, 0.381, 0.156, 0.367, 0.089, 0.014, 0.016, 0.045, 0.009, 0.014, 0.115, 0.776, 0.653, 0.138, 0.742, 0.12, 1.918, 0.573, 0.602, 0.112, 0.028, 0.443, 0.069, 0.115, 1.089, 0.883, 1.745, 0.026, 0.859, 0.001, 0.829, 0.228, 0.108, 0.682, 0.53, 0.008, 1.369, 0.031, 0.006, 0.627, 1.083, 2.149, 0.218, 0.714, 0.916, 0.178, 0.322, 26.536, 5.927, 0.003, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.884, 0.001, 0.018, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.55, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.448, 0.001, 0.106, 0.0001, 0.0001, 0.005, 0.001, 0.003, 0.12, 0.12, 0.002, 0.001, 0.557, 0.131, 0.613, 0.011, 0.182, 0.272, 0.137, 0.074, 0.072, 0.075, 0.066, 0.065, 0.083, 0.144, 0.028, 0.009, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.013, 0.009, 0.015, 0.008, 0.007, 0.006, 0.006, 0.006, 0.041, 0.002, 0.003, 0.007, 0.011, 0.006, 0.005, 0.01, 0.001, 0.006, 0.015, 0.011, 0.003, 0.01, 0.005, 0.007, 0.001, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.002, 0.0001, 0.088, 0.012, 0.031, 0.028, 0.092, 0.009, 0.016, 0.024, 0.077, 0.002, 0.014, 0.045, 0.037, 0.056, 0.066, 0.019, 0.001, 0.063, 0.052, 0.05, 0.037, 0.008, 0.006, 0.003, 0.013, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.651, 2.091, 3.127, 0.625, 0.166, 0.165, 0.297, 0.452, 0.133, 0.189, 0.677, 0.001, 0.018, 0.001, 0.079, 0.727, 0.091, 0.092, 0.108, 0.095, 0.081, 0.039, 0.009, 0.034, 0.052, 0.011, 0.114, 0.044, 0.167, 0.089, 0.136, 0.155, 0.116, 0.171, 0.083, 0.024, 0.037, 0.04, 0.014, 0.018, 0.016, 0.009, 0.001, 0.0001, 0.001, 0.002, 0.012, 0.008, 5.212, 0.516, 1.875, 0.701, 1.296, 3.589, 0.274, 0.882, 3.979, 0.288, 1.391, 1.465, 0.909, 3.169, 3.698, 1.109, 0.0001, 0.0001, 0.048, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.0001, 0.015, 0.006, 31.942, 11.185, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.201, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "he": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.485, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.289, 0.001, 0.262, 0.0001, 0.0001, 0.005, 0.001, 0.096, 0.104, 0.103, 0.0001, 0.001, 0.64, 0.203, 0.573, 0.005, 0.181, 0.234, 0.129, 0.06, 0.061, 0.062, 0.055, 0.054, 0.065, 0.138, 0.049, 0.013, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.016, 0.011, 0.014, 0.009, 0.007, 0.007, 0.006, 0.007, 0.009, 0.003, 0.003, 0.008, 0.012, 0.007, 0.005, 0.01, 0.001, 0.008, 0.016, 0.012, 0.003, 0.004, 0.005, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.007, 0.0001, 0.073, 0.008, 0.021, 0.022, 0.081, 0.015, 0.013, 0.021, 0.056, 0.001, 0.007, 0.043, 0.024, 0.051, 0.061, 0.011, 0.001, 0.058, 0.038, 0.043, 0.032, 0.007, 0.005, 0.003, 0.012, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.003, 0.002, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 2.008, 2.447, 0.696, 1.135, 3.773, 4.868, 0.394, 0.995, 0.678, 4.903, 0.173, 0.854, 2.776, 1.153, 2.22, 0.562, 1.585, 0.919, 1.159, 0.101, 0.969, 0.062, 0.568, 1.054, 2.634, 1.902, 2.428, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.009, 0.002, 0.002, 0.002, 0.006, 0.004, 0.005, 0.005, 0.008, 0.005, 0.001, 0.002, 0.01, 0.002, 0.005, 0.001, 0.0001, 0.0001, 0.008, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.015, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.044, 42.985, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.013, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "uk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.595, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.309, 0.001, 0.06, 0.0001, 0.001, 0.01, 0.001, 0.059, 0.134, 0.135, 0.002, 0.002, 0.619, 0.137, 0.568, 0.01, 0.199, 0.281, 0.159, 0.081, 0.077, 0.082, 0.071, 0.067, 0.079, 0.158, 0.041, 0.017, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.014, 0.009, 0.015, 0.009, 0.007, 0.006, 0.007, 0.006, 0.029, 0.002, 0.003, 0.007, 0.011, 0.006, 0.005, 0.01, 0.001, 0.008, 0.016, 0.01, 0.003, 0.01, 0.004, 0.011, 0.001, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 0.067, 0.008, 0.022, 0.02, 0.069, 0.01, 0.012, 0.018, 0.056, 0.001, 0.008, 0.037, 0.02, 0.046, 0.054, 0.014, 0.001, 0.051, 0.037, 0.039, 0.027, 0.007, 0.006, 0.003, 0.012, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.481, 1.842, 2.043, 1.429, 0.162, 0.46, 0.448, 0.496, 0.265, 0.125, 0.001, 0.003, 0.806, 0.001, 0.316, 0.84, 0.08, 0.077, 0.114, 0.065, 0.394, 0.018, 2.734, 0.422, 0.001, 0.01, 0.11, 0.047, 0.088, 0.083, 0.052, 0.13, 0.228, 0.124, 0.058, 0.089, 0.032, 0.023, 0.02, 0.023, 0.023, 0.004, 0.0001, 0.09, 0.0001, 0.001, 0.008, 0.014, 3.574, 0.601, 2.221, 0.664, 1.335, 1.986, 0.299, 0.851, 2.427, 0.557, 1.658, 1.688, 1.249, 3.061, 4.029, 1.082, 0.0001, 0.0001, 0.335, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, 0.0001, 0.002, 0.001, 28.71, 14.784, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.144, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lt": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.086, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.626, 0.002, 0.167, 0.001, 0.0001, 0.009, 0.001, 0.01, 0.234, 0.234, 0.001, 0.002, 1.069, 0.088, 1.436, 0.009, 0.347, 0.549, 0.256, 0.135, 0.132, 0.151, 0.128, 0.13, 0.15, 0.368, 0.06, 0.018, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.213, 0.143, 0.054, 0.128, 0.066, 0.049, 0.096, 0.041, 0.157, 0.121, 0.23, 0.188, 0.16, 0.109, 0.037, 0.238, 0.002, 0.129, 0.21, 0.163, 0.036, 0.209, 0.013, 0.047, 0.01, 0.016, 0.002, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 8.107, 0.954, 0.391, 1.797, 4.13, 0.204, 1.223, 0.172, 9.411, 1.587, 2.883, 2.415, 2.501, 3.736, 4.946, 1.811, 0.003, 4.047, 5.62, 3.782, 3.399, 1.76, 0.016, 0.008, 1.047, 0.248, 0.0001, 0.015, 0.0001, 0.002, 0.0001, 0.475, 0.005, 0.003, 0.002, 0.002, 0.411, 0.001, 0.001, 0.006, 0.001, 0.001, 0.001, 0.019, 0.313, 0.0001, 0.001, 0.001, 0.001, 0.006, 0.247, 0.001, 0.0001, 0.001, 1.225, 0.001, 0.136, 0.001, 0.001, 0.108, 0.003, 0.111, 0.001, 0.364, 0.781, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.003, 0.002, 0.299, 0.001, 0.004, 0.013, 0.355, 0.007, 0.002, 0.007, 0.931, 0.001, 0.004, 0.001, 0.001, 0.004, 0.002, 0.003, 0.003, 0.003, 0.037, 0.575, 0.001, 0.0001, 0.0001, 0.29, 0.016, 2.467, 2.697, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.033, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.477, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.127, 0.002, 0.244, 0.0001, 0.0001, 0.007, 0.004, 0.029, 0.125, 0.125, 0.001, 0.001, 0.736, 0.236, 1.026, 0.016, 0.357, 0.45, 0.2, 0.113, 0.108, 0.13, 0.122, 0.121, 0.148, 0.271, 0.033, 0.009, 0.004, 0.002, 0.004, 0.001, 0.0001, 0.218, 0.193, 0.121, 0.247, 0.133, 0.148, 0.105, 0.221, 0.171, 0.071, 0.137, 0.127, 0.194, 0.145, 0.08, 0.133, 0.007, 0.124, 0.352, 0.152, 0.062, 0.099, 0.053, 0.006, 0.016, 0.016, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.001, 6.479, 0.879, 0.246, 3.008, 9.683, 1.285, 2.701, 0.948, 5.112, 0.784, 2.645, 3.726, 2.383, 5.836, 3.991, 1.273, 0.009, 6.373, 4.403, 5.512, 1.465, 1.904, 0.067, 0.025, 0.761, 0.055, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.031, 0.01, 0.005, 0.003, 0.003, 0.012, 0.002, 0.003, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.02, 0.003, 0.002, 0.002, 0.001, 0.013, 0.005, 0.002, 0.001, 0.002, 0.001, 0.001, 0.003, 0.042, 0.013, 0.002, 0.002, 0.016, 0.934, 0.093, 0.004, 0.01, 0.021, 0.004, 0.076, 0.002, 0.01, 0.001, 0.002, 0.012, 0.007, 0.039, 0.01, 0.004, 0.006, 0.015, 0.002, 0.552, 0.004, 0.006, 0.078, 0.011, 0.006, 0.007, 0.003, 0.0001, 0.0001, 0.197, 1.726, 0.009, 0.008, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.017, 0.007, 0.044, 0.016, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.01, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.002, 0.027, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.893, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.172, 0.002, 0.34, 0.0001, 0.001, 0.011, 0.002, 0.016, 0.182, 0.182, 0.001, 0.002, 0.943, 0.135, 1.23, 0.019, 0.3, 0.38, 0.204, 0.106, 0.1, 0.109, 0.096, 0.094, 0.112, 0.22, 0.065, 0.02, 0.009, 0.004, 0.009, 0.002, 0.0001, 0.156, 0.17, 0.109, 0.14, 0.063, 0.069, 0.111, 0.12, 0.137, 0.079, 0.163, 0.086, 0.175, 0.178, 0.118, 0.22, 0.004, 0.116, 0.267, 0.137, 0.108, 0.095, 0.03, 0.008, 0.009, 0.078, 0.011, 0.0001, 0.011, 0.0001, 0.002, 0.0001, 8.648, 1.028, 0.78, 2.344, 6.653, 0.218, 1.346, 0.572, 7.393, 3.932, 2.783, 2.724, 2.195, 4.91, 6.755, 1.994, 0.007, 4.039, 3.61, 3.329, 3.254, 2.478, 0.043, 0.016, 0.083, 1.288, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.039, 0.005, 0.004, 0.003, 0.002, 0.001, 0.003, 0.353, 0.002, 0.001, 0.001, 0.001, 0.016, 0.678, 0.001, 0.001, 0.004, 0.158, 0.001, 0.011, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.009, 0.005, 0.008, 0.001, 0.033, 0.524, 0.003, 0.002, 0.003, 0.001, 0.001, 0.002, 0.002, 0.01, 0.001, 0.005, 0.001, 0.004, 0.001, 0.001, 0.008, 0.004, 0.005, 0.005, 0.002, 0.004, 0.004, 0.001, 0.004, 0.002, 0.004, 0.006, 0.006, 0.016, 0.36, 0.002, 0.0001, 0.0001, 0.021, 0.044, 1.208, 0.914, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.011, 0.005, 0.028, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.038, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "no": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.853, 0.002, 0.247, 0.0001, 0.001, 0.006, 0.004, 0.016, 0.159, 0.158, 0.001, 0.001, 0.698, 0.213, 1.037, 0.017, 0.377, 0.496, 0.255, 0.116, 0.113, 0.123, 0.117, 0.116, 0.152, 0.295, 0.042, 0.013, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.196, 0.176, 0.125, 0.246, 0.126, 0.148, 0.099, 0.211, 0.167, 0.071, 0.132, 0.135, 0.185, 0.133, 0.091, 0.127, 0.006, 0.11, 0.321, 0.146, 0.058, 0.092, 0.051, 0.007, 0.014, 0.011, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 4.956, 1.168, 0.243, 2.996, 11.38, 1.384, 2.632, 1.02, 4.719, 0.546, 2.591, 3.946, 2.341, 6.218, 3.979, 1.354, 0.009, 6.417, 4.712, 5.821, 1.424, 1.732, 0.061, 0.029, 0.639, 0.049, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.041, 0.006, 0.003, 0.002, 0.002, 0.009, 0.002, 0.002, 0.001, 0.002, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.034, 0.002, 0.001, 0.002, 0.001, 0.014, 0.003, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.028, 0.009, 0.001, 0.002, 0.012, 0.765, 0.126, 0.003, 0.003, 0.021, 0.001, 0.062, 0.001, 0.006, 0.001, 0.001, 0.007, 0.003, 0.006, 0.006, 0.002, 0.003, 0.012, 0.001, 0.598, 0.002, 0.004, 0.062, 0.009, 0.004, 0.004, 0.002, 0.0001, 0.0001, 0.152, 1.588, 0.007, 0.007, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.004, 0.022, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.039, 0.001, 0.001, 0.004, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.872, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.68, 0.001, 0.1, 0.0001, 0.0001, 0.009, 0.0001, 0.005, 0.176, 0.176, 0.0001, 0.003, 0.5, 0.178, 0.762, 0.011, 0.275, 0.318, 0.214, 0.099, 0.096, 0.093, 0.078, 0.075, 0.084, 0.129, 0.031, 0.008, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.017, 0.01, 0.025, 0.013, 0.007, 0.006, 0.019, 0.007, 0.026, 0.003, 0.008, 0.007, 0.014, 0.016, 0.013, 0.016, 0.001, 0.009, 0.02, 0.011, 0.006, 0.008, 0.003, 0.004, 0.001, 0.003, 0.002, 0.0001, 0.002, 0.0001, 0.018, 0.0001, 0.453, 0.047, 0.05, 0.128, 0.37, 0.027, 0.066, 0.039, 0.393, 0.16, 0.152, 0.148, 0.154, 0.268, 0.352, 0.1, 0.001, 0.219, 0.193, 0.185, 0.165, 0.107, 0.003, 0.002, 0.007, 0.07, 0.053, 0.001, 0.053, 0.0001, 0.0001, 2.152, 2.07, 1.61, 1.756, 0.112, 0.204, 0.344, 0.339, 0.366, 0.003, 0.007, 0.001, 0.001, 0.031, 0.0001, 0.007, 0.082, 0.095, 0.143, 0.054, 0.071, 0.047, 0.006, 0.035, 1.459, 0.284, 0.347, 0.2, 0.143, 0.119, 0.086, 0.186, 0.072, 0.175, 0.071, 0.052, 0.034, 0.041, 0.014, 0.02, 0.016, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 4.933, 0.477, 1.401, 0.663, 1.33, 3.708, 0.225, 0.704, 3.913, 0.001, 1.472, 1.2, 1.198, 2.623, 3.682, 1.022, 0.0001, 0.0001, 0.018, 0.003, 0.054, 0.041, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 30.181, 10.982, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.062, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ca": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.816, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.948, 0.002, 0.294, 0.001, 0.011, 0.035, 0.001, 0.634, 0.154, 0.154, 0.001, 0.002, 1.001, 0.144, 0.747, 0.01, 0.301, 0.411, 0.25, 0.137, 0.131, 0.135, 0.12, 0.123, 0.144, 0.212, 0.051, 0.029, 0.002, 0.003, 0.003, 0.001, 0.0001, 0.252, 0.125, 0.23, 0.119, 0.296, 0.09, 0.091, 0.066, 0.12, 0.061, 0.034, 0.213, 0.174, 0.072, 0.049, 0.171, 0.012, 0.097, 0.192, 0.11, 0.053, 0.092, 0.024, 0.034, 0.01, 0.009, 0.002, 0.0001, 0.002, 0.0001, 0.004, 0.0001, 9.132, 1.004, 2.746, 3.236, 9.343, 0.681, 0.95, 0.465, 5.412, 0.169, 0.095, 4.932, 2.114, 4.848, 3.551, 1.884, 0.571, 5.202, 5.696, 4.416, 2.672, 1.094, 0.036, 0.312, 0.252, 0.123, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.044, 0.004, 0.004, 0.002, 0.002, 0.001, 0.001, 0.001, 0.002, 0.015, 0.001, 0.001, 0.001, 0.005, 0.001, 0.001, 0.001, 0.001, 0.002, 0.006, 0.003, 0.001, 0.001, 0.001, 0.001, 0.021, 0.001, 0.001, 0.003, 0.003, 0.001, 0.001, 0.327, 0.012, 0.002, 0.002, 0.002, 0.001, 0.001, 0.088, 0.218, 0.355, 0.001, 0.01, 0.003, 0.236, 0.001, 0.038, 0.005, 0.007, 0.161, 0.374, 0.002, 0.003, 0.003, 0.047, 0.003, 0.002, 0.063, 0.01, 0.034, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.099, 1.903, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.004, 0.012, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.039, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.06, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.437, 0.024, 0.237, 0.001, 0.001, 0.007, 0.002, 0.011, 0.174, 0.174, 0.021, 0.002, 1.072, 0.17, 1.037, 0.022, 0.277, 0.429, 0.215, 0.122, 0.124, 0.121, 0.109, 0.108, 0.134, 0.239, 0.061, 0.025, 0.005, 0.006, 0.005, 0.002, 0.0001, 0.162, 0.141, 0.1, 0.122, 0.063, 0.075, 0.091, 0.086, 0.111, 0.082, 0.154, 0.138, 0.185, 0.145, 0.099, 0.224, 0.004, 0.106, 0.263, 0.133, 0.042, 0.163, 0.031, 0.007, 0.007, 0.087, 0.013, 0.0001, 0.014, 0.0001, 0.006, 0.0001, 7.7, 1.204, 0.709, 2.364, 7.782, 0.229, 1.139, 0.879, 6.985, 3.327, 2.701, 3.64, 2.037, 5.283, 6.653, 2.232, 0.006, 4.152, 3.513, 3.409, 1.654, 3.049, 0.039, 0.016, 0.079, 1.473, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.054, 0.004, 0.003, 0.002, 0.002, 0.001, 0.001, 0.011, 0.002, 0.002, 0.0001, 0.001, 0.021, 0.847, 0.001, 0.0001, 0.001, 0.002, 0.002, 0.027, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.056, 0.644, 0.007, 0.001, 0.003, 0.001, 0.001, 0.002, 0.003, 0.013, 0.001, 0.027, 0.001, 0.005, 0.001, 0.001, 0.007, 0.003, 0.004, 0.005, 0.002, 0.003, 0.006, 0.001, 0.004, 0.002, 0.004, 0.028, 0.008, 0.018, 0.391, 0.002, 0.0001, 0.0001, 0.071, 0.059, 0.881, 1.071, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.005, 0.024, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.054, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.879, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.099, 0.004, 0.432, 0.0001, 0.0001, 0.013, 0.002, 0.007, 0.207, 0.208, 0.0001, 0.003, 0.965, 0.082, 1.276, 0.01, 0.332, 0.476, 0.254, 0.122, 0.117, 0.123, 0.105, 0.106, 0.127, 0.271, 0.045, 0.023, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.208, 0.134, 0.062, 0.128, 0.074, 0.067, 0.074, 0.058, 0.112, 0.068, 0.189, 0.194, 0.144, 0.089, 0.055, 0.234, 0.002, 0.136, 0.249, 0.163, 0.042, 0.182, 0.012, 0.007, 0.003, 0.051, 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 8.58, 1.078, 0.806, 2.221, 4.451, 0.231, 1.228, 0.175, 6.667, 1.704, 2.603, 2.424, 2.389, 3.209, 2.883, 1.908, 0.003, 4.056, 5.825, 4.121, 3.633, 1.801, 0.012, 0.009, 0.029, 1.289, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.124, 2.988, 0.003, 0.002, 0.001, 0.006, 0.331, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.015, 0.083, 0.0001, 0.001, 0.001, 0.001, 0.007, 1.174, 0.07, 0.0001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.005, 0.012, 0.009, 0.001, 0.06, 0.627, 0.004, 0.097, 0.002, 0.001, 0.001, 0.001, 0.001, 0.002, 0.006, 1.565, 0.0001, 0.002, 0.0001, 0.0001, 0.01, 0.002, 0.005, 0.002, 0.002, 0.005, 0.01, 0.106, 0.006, 0.002, 0.003, 0.01, 0.298, 0.012, 0.176, 0.002, 0.0001, 0.0001, 0.03, 0.013, 6.068, 1.452, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.051, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.11, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "et": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.183, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.759, 0.003, 0.281, 0.0001, 0.0001, 0.013, 0.001, 0.037, 0.198, 0.199, 0.001, 0.003, 0.786, 0.203, 1.175, 0.017, 0.35, 0.548, 0.272, 0.142, 0.137, 0.143, 0.127, 0.129, 0.154, 0.323, 0.059, 0.022, 0.017, 0.003, 0.017, 0.003, 0.0001, 0.235, 0.096, 0.074, 0.061, 0.173, 0.056, 0.064, 0.105, 0.122, 0.088, 0.255, 0.166, 0.186, 0.114, 0.065, 0.208, 0.003, 0.138, 0.296, 0.251, 0.046, 0.167, 0.033, 0.011, 0.008, 0.01, 0.008, 0.0001, 0.008, 0.0001, 0.004, 0.0001, 9.665, 0.664, 0.152, 2.822, 7.678, 0.189, 1.393, 1.095, 7.816, 1.25, 3.234, 4.738, 2.585, 4.03, 3.549, 1.167, 0.005, 3.003, 6.68, 5.333, 4.153, 1.613, 0.043, 0.017, 0.074, 0.045, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.13, 0.015, 0.01, 0.006, 0.004, 0.003, 0.003, 0.004, 0.002, 0.002, 0.001, 0.002, 0.003, 0.005, 0.001, 0.003, 0.002, 0.002, 0.003, 0.102, 0.002, 0.008, 0.003, 0.003, 0.002, 0.004, 0.002, 0.001, 0.044, 0.005, 0.006, 0.003, 0.016, 0.035, 0.003, 0.002, 0.833, 0.002, 0.001, 0.002, 0.002, 0.01, 0.001, 0.006, 0.001, 0.005, 0.001, 0.001, 0.017, 0.004, 0.012, 0.007, 0.005, 0.763, 0.179, 0.003, 0.015, 0.005, 0.008, 0.007, 0.518, 0.012, 0.028, 0.003, 0.0001, 0.0001, 0.02, 2.358, 0.019, 0.061, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.004, 0.104, 0.037, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.123, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.374, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.123, 0.002, 0.071, 0.0001, 0.001, 0.004, 0.0001, 0.023, 0.08, 0.08, 0.0001, 0.001, 0.255, 0.072, 0.052, 0.006, 0.068, 0.07, 0.044, 0.02, 0.019, 0.023, 0.019, 0.019, 0.021, 0.04, 0.021, 0.006, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.008, 0.004, 0.007, 0.004, 0.005, 0.003, 0.004, 0.003, 0.006, 0.001, 0.002, 0.003, 0.005, 0.004, 0.003, 0.005, 0.0001, 0.003, 0.008, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.007, 0.0001, 0.008, 0.0001, 0.001, 0.0001, 0.049, 0.007, 0.017, 0.016, 0.052, 0.008, 0.01, 0.017, 0.038, 0.001, 0.004, 0.024, 0.015, 0.034, 0.035, 0.012, 0.001, 0.033, 0.03, 0.034, 0.015, 0.005, 0.005, 0.002, 0.008, 0.001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 1.039, 0.443, 1.278, 0.061, 0.0001, 0.273, 0.146, 1.879, 0.535, 0.214, 0.013, 0.729, 0.054, 1.826, 0.0001, 0.253, 0.014, 0.012, 0.0001, 0.042, 0.14, 2.07, 0.133, 0.43, 0.035, 0.004, 0.215, 0.046, 0.503, 0.014, 0.016, 0.269, 0.037, 0.213, 0.023, 0.155, 24.777, 7.162, 0.554, 0.224, 1.23, 0.009, 0.8, 0.117, 0.393, 0.245, 0.995, 0.828, 2.018, 0.001, 0.771, 0.001, 0.001, 0.707, 0.299, 0.18, 1.226, 0.94, 0.0001, 0.0001, 0.133, 0.001, 2.558, 1.303, 0.0001, 0.0001, 0.008, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.261, 0.0001, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], + "en": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.755, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.843, 0.004, 0.375, 0.002, 0.008, 0.019, 0.008, 0.134, 0.137, 0.137, 0.001, + 0.001, 0.972, 0.19, 0.857, 0.017, 0.334, 0.421, 0.246, 0.108, 0.104, 0.112, 0.103, 0.1, 0.127, 0.237, 0.04, + 0.027, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.338, 0.218, 0.326, 0.163, 0.121, 0.149, 0.133, 0.192, 0.232, 0.107, + 0.082, 0.148, 0.248, 0.134, 0.103, 0.195, 0.012, 0.162, 0.368, 0.366, 0.077, 0.061, 0.127, 0.009, 0.03, 0.015, + 0.004, 0.0001, 0.004, 0.0001, 0.003, 0.0001, 6.614, 1.039, 2.327, 2.934, 9.162, 1.606, 1.415, 3.503, 5.718, + 0.081, 0.461, 3.153, 1.793, 5.723, 5.565, 1.415, 0.066, 5.036, 4.79, 6.284, 1.992, 0.759, 1.176, 0.139, 1.162, + 0.102, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.06, 0.004, 0.003, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.031, 0.006, 0.001, 0.001, 0.001, + 0.002, 0.014, 0.001, 0.001, 0.005, 0.005, 0.001, 0.002, 0.017, 0.007, 0.002, 0.003, 0.004, 0.002, 0.001, 0.002, + 0.002, 0.012, 0.001, 0.002, 0.001, 0.004, 0.001, 0.001, 0.003, 0.003, 0.002, 0.005, 0.001, 0.001, 0.003, 0.001, + 0.003, 0.001, 0.002, 0.001, 0.004, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.02, 0.047, 0.009, 0.009, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.061, 0.001, + 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ru": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.512, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.274, 0.002, 0.063, 0.0001, 0.001, 0.009, 0.001, 0.001, 0.118, 0.118, 0.0001, + 0.001, 0.595, 0.135, 0.534, 0.009, 0.18, 0.281, 0.15, 0.078, 0.076, 0.077, 0.068, 0.066, 0.083, 0.16, 0.036, + 0.016, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.013, 0.009, 0.014, 0.009, 0.007, 0.006, 0.007, 0.006, 0.031, 0.002, + 0.003, 0.007, 0.012, 0.007, 0.005, 0.01, 0.001, 0.008, 0.017, 0.011, 0.003, 0.009, 0.005, 0.012, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 0.065, 0.009, 0.022, 0.021, 0.074, 0.01, 0.013, 0.019, 0.054, + 0.001, 0.008, 0.036, 0.02, 0.047, 0.055, 0.013, 0.001, 0.052, 0.037, 0.041, 0.026, 0.007, 0.006, 0.003, 0.011, + 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.469, 2.363, 2.342, 0.986, 0.156, 0.422, 0.252, 0.495, 0.217, + 0.136, 0.014, 0.778, 0.56, 0.097, 0.251, 0.811, 0.09, 0.184, 0.165, 0.06, 0.179, 0.021, 0.013, 0.029, 0.05, + 0.005, 0.116, 0.045, 0.087, 0.073, 0.067, 0.124, 0.211, 0.16, 0.055, 0.033, 0.036, 0.024, 0.013, 0.02, 0.022, + 0.002, 0.0001, 0.1, 0.0001, 0.025, 0.009, 0.011, 3.536, 0.619, 1.963, 0.833, 1.275, 3.452, 0.323, 0.635, 3.408, + 0.642, 1.486, 1.967, 1.26, 2.857, 4.587, 1.082, 0.0001, 0.0001, 0.339, 0.003, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.0001, 0.002, 0.001, 31.356, 12.318, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.131, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "de": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.726, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.303, 0.002, 0.278, 0.0001, 0.0001, 0.007, 0.003, 0.005, 0.149, 0.149, 0.015, + 0.001, 0.636, 0.237, 0.922, 0.023, 0.305, 0.472, 0.225, 0.115, 0.11, 0.121, 0.108, 0.11, 0.145, 0.271, 0.049, + 0.022, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.413, 0.383, 0.144, 0.412, 0.275, 0.258, 0.273, 0.218, 0.18, 0.167, + 0.277, 0.201, 0.328, 0.179, 0.111, 0.254, 0.012, 0.219, 0.602, 0.209, 0.1, 0.185, 0.206, 0.005, 0.01, 0.112, + 0.002, 0.0001, 0.002, 0.0001, 0.006, 0.0001, 4.417, 1.306, 1.99, 3.615, 12.382, 1.106, 2.0, 2.958, 6.179, 0.082, + 0.866, 2.842, 1.869, 7.338, 2.27, 0.606, 0.016, 6.056, 4.424, 4.731, 3.002, 0.609, 0.918, 0.053, 0.169, 0.824, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.147, 0.002, 0.003, 0.001, 0.006, 0.001, 0.001, 0.002, 0.001, 0.001, + 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.03, 0.0001, 0.0001, 0.009, 0.001, 0.002, + 0.009, 0.002, 0.001, 0.061, 0.0001, 0.048, 0.122, 0.057, 0.009, 0.001, 0.001, 0.4, 0.001, 0.002, 0.003, 0.003, + 0.017, 0.001, 0.003, 0.001, 0.005, 0.0001, 0.001, 0.003, 0.002, 0.003, 0.005, 0.001, 0.001, 0.203, 0.0001, + 0.002, 0.001, 0.002, 0.002, 0.438, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.056, 1.237, 0.01, 0.013, 0.0001, + 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.148, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "ja": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.834, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.258, 0.007, 0.036, 0.001, 0.0001, 0.005, 0.002, 0.003, 0.033, 0.033, 0.0001, + 0.002, 0.019, 0.052, 0.026, 0.009, 0.281, 0.407, 0.259, 0.126, 0.108, 0.109, 0.095, 0.092, 0.104, 0.184, 0.008, + 0.001, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.048, 0.026, 0.039, 0.027, 0.028, 0.022, 0.018, 0.016, 0.03, 0.012, + 0.014, 0.02, 0.03, 0.025, 0.025, 0.026, 0.002, 0.026, 0.045, 0.031, 0.013, 0.014, 0.014, 0.006, 0.006, 0.003, + 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.077, 0.012, 0.03, 0.026, 0.088, 0.012, 0.017, 0.025, 0.067, + 0.002, 0.016, 0.041, 0.039, 0.059, 0.066, 0.016, 0.001, 0.06, 0.043, 0.051, 0.028, 0.009, 0.007, 0.004, 0.015, + 0.004, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 2.555, 10.322, 5.875, 4.462, 0.784, 0.468, 0.442, 0.409, 1.173, + 0.96, 0.657, 1.448, 1.442, 0.636, 0.341, 0.685, 0.495, 0.342, 0.651, 0.536, 0.435, 0.657, 0.51, 0.978, 0.31, + 0.563, 0.439, 0.514, 0.668, 0.438, 0.29, 1.039, 0.423, 0.532, 0.407, 0.691, 0.677, 0.555, 0.911, 0.887, 1.086, + 0.531, 0.836, 1.345, 0.438, 0.666, 1.528, 0.959, 0.535, 0.379, 0.302, 0.822, 0.614, 0.308, 0.253, 0.467, 0.807, + 0.807, 0.777, 0.809, 1.292, 0.546, 0.524, 0.425, 0.0001, 0.0001, 0.002, 0.004, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.015, 19.387, + 1.167, 4.022, 2.518, 1.734, 1.339, 1.229, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.409, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "es": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.757, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.771, 0.003, 0.315, 0.001, 0.004, 0.019, 0.003, 0.014, 0.132, 0.133, 0.001, + 0.001, 0.976, 0.078, 0.703, 0.014, 0.268, 0.331, 0.197, 0.095, 0.086, 0.095, 0.085, 0.084, 0.105, 0.183, 0.053, + 0.027, 0.001, 0.002, 0.002, 0.002, 0.0001, 0.242, 0.129, 0.28, 0.129, 0.322, 0.105, 0.099, 0.077, 0.116, 0.074, + 0.034, 0.209, 0.196, 0.086, 0.059, 0.187, 0.009, 0.118, 0.247, 0.128, 0.061, 0.072, 0.033, 0.023, 0.018, 0.013, + 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 8.9, 0.939, 3.234, 4.015, 9.642, 0.603, 0.891, 0.531, 5.007, 0.262, + 0.107, 4.355, 1.915, 5.487, 6.224, 1.805, 0.423, 4.992, 5.086, 3.402, 2.878, 0.667, 0.044, 0.125, 0.673, 0.299, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.033, 0.009, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.003, + 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.006, 0.006, 0.001, 0.0001, 0.001, 0.001, + 0.003, 0.001, 0.001, 0.008, 0.008, 0.001, 0.001, 0.025, 0.274, 0.002, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, + 0.221, 0.003, 0.019, 0.001, 0.373, 0.001, 0.001, 0.005, 0.144, 0.01, 0.631, 0.002, 0.001, 0.002, 0.001, 0.002, + 0.001, 0.102, 0.018, 0.006, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.079, 1.766, 0.003, 0.005, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.032, 0.001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "fr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.894, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.162, 0.003, 0.276, 0.0001, 0.0001, 0.012, 0.002, 0.638, 0.153, 0.153, 0.001, + 0.002, 0.96, 0.247, 0.715, 0.011, 0.225, 0.339, 0.18, 0.084, 0.081, 0.086, 0.081, 0.084, 0.106, 0.194, 0.063, + 0.018, 0.003, 0.002, 0.003, 0.002, 0.0001, 0.208, 0.141, 0.255, 0.128, 0.144, 0.1, 0.095, 0.071, 0.154, 0.072, + 0.042, 0.331, 0.173, 0.077, 0.056, 0.167, 0.013, 0.108, 0.214, 0.102, 0.049, 0.062, 0.035, 0.009, 0.014, 0.011, + 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 5.761, 0.627, 2.287, 3.136, 10.738, 0.723, 0.838, 0.669, 5.295, + 0.172, 0.12, 4.204, 1.941, 5.522, 4.015, 2.005, 0.584, 5.043, 5.545, 5.13, 4.06, 0.906, 0.051, 0.295, 0.278, + 0.085, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.136, 0.003, 0.004, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, + 0.034, 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.019, 0.003, 0.0001, 0.0001, 0.001, + 0.001, 0.112, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.367, 0.007, 0.034, 0.001, 0.003, 0.001, 0.003, 0.046, + 0.303, 1.817, 0.082, 0.045, 0.001, 0.004, 0.029, 0.017, 0.004, 0.002, 0.002, 0.005, 0.038, 0.001, 0.003, 0.0001, + 0.002, 0.02, 0.002, 0.054, 0.004, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.113, 2.813, 0.007, 0.026, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.122, 0.001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "pt": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.934, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.319, 0.004, 0.372, 0.001, 0.002, 0.012, 0.004, 0.016, 0.15, 0.15, 0.001, + 0.002, 1.16, 0.21, 0.746, 0.022, 0.296, 0.361, 0.226, 0.106, 0.098, 0.105, 0.096, 0.094, 0.114, 0.207, 0.054, + 0.022, 0.006, 0.004, 0.006, 0.002, 0.0001, 0.345, 0.166, 0.295, 0.143, 0.233, 0.136, 0.112, 0.077, 0.129, 0.093, + 0.039, 0.119, 0.217, 0.135, 0.164, 0.222, 0.016, 0.14, 0.259, 0.142, 0.064, 0.078, 0.041, 0.021, 0.013, 0.012, + 0.007, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 9.026, 0.717, 2.572, 4.173, 8.551, 0.751, 0.906, 0.629, 5.107, + 0.172, 0.12, 2.357, 3.189, 4.024, 7.683, 1.87, 0.445, 5.017, 5.188, 3.559, 2.852, 0.875, 0.055, 0.186, 0.122, + 0.257, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.034, 0.01, 0.003, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.014, 0.001, 0.001, 0.001, 0.005, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.009, 0.006, 0.0001, 0.0001, 0.001, + 0.001, 0.003, 0.001, 0.001, 0.007, 0.007, 0.0001, 0.001, 0.079, 0.267, 0.045, 0.508, 0.002, 0.001, 0.001, 0.424, + 0.003, 0.417, 0.113, 0.003, 0.001, 0.255, 0.001, 0.001, 0.005, 0.003, 0.015, 0.161, 0.032, 0.087, 0.003, 0.001, + 0.002, 0.001, 0.095, 0.002, 0.005, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.067, 2.471, 0.004, 0.006, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.033, 0.002, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "it": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.828, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.918, 0.002, 0.385, 0.0001, 0.001, 0.007, 0.003, 0.383, 0.13, 0.131, 0.0001, + 0.001, 0.948, 0.103, 0.657, 0.014, 0.252, 0.332, 0.195, 0.093, 0.089, 0.095, 0.088, 0.084, 0.098, 0.183, 0.061, + 0.035, 0.006, 0.002, 0.006, 0.001, 0.0001, 0.215, 0.131, 0.235, 0.125, 0.08, 0.104, 0.125, 0.057, 0.24, 0.04, + 0.038, 0.208, 0.179, 0.133, 0.054, 0.164, 0.025, 0.114, 0.256, 0.12, 0.052, 0.079, 0.038, 0.021, 0.012, 0.012, + 0.002, 0.0001, 0.002, 0.0001, 0.005, 0.0001, 8.583, 0.65, 3.106, 3.081, 8.81, 0.801, 1.321, 0.694, 8.492, 0.02, + 0.115, 5.238, 1.88, 5.659, 6.812, 1.981, 0.236, 4.962, 3.674, 5.112, 2.35, 1.107, 0.055, 0.027, 0.118, 0.709, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.022, 0.004, 0.002, 0.002, 0.001, 0.001, 0.001, 0.002, 0.013, 0.001, + 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.006, 0.001, 0.0001, 0.001, 0.001, 0.001, + 0.005, 0.0001, 0.001, 0.005, 0.005, 0.0001, 0.001, 0.153, 0.007, 0.001, 0.001, 0.003, 0.001, 0.001, 0.002, + 0.174, 0.033, 0.004, 0.009, 0.036, 0.004, 0.001, 0.001, 0.006, 0.003, 0.097, 0.004, 0.001, 0.001, 0.003, 0.001, + 0.002, 0.056, 0.009, 0.007, 0.004, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.043, 0.574, 0.01, 0.009, 0.0001, + 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.007, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.021, 0.001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "zh": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.074, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.273, 0.003, 0.045, 0.0001, 0.001, 0.012, 0.001, 0.004, 0.032, 0.032, 0.001, + 0.003, 0.032, 0.068, 0.063, 0.017, 0.386, 0.478, 0.308, 0.149, 0.134, 0.146, 0.127, 0.121, 0.136, 0.231, 0.018, + 0.009, 0.007, 0.006, 0.007, 0.0001, 0.0001, 0.045, 0.029, 0.041, 0.028, 0.022, 0.017, 0.02, 0.019, 0.025, 0.01, + 0.013, 0.02, 0.033, 0.021, 0.018, 0.028, 0.002, 0.022, 0.045, 0.031, 0.01, 0.013, 0.012, 0.007, 0.005, 0.003, + 0.004, 0.0001, 0.004, 0.0001, 0.009, 0.0001, 0.159, 0.026, 0.051, 0.047, 0.17, 0.025, 0.032, 0.057, 0.124, + 0.003, 0.021, 0.089, 0.049, 0.12, 0.129, 0.028, 0.002, 0.124, 0.083, 0.1, 0.058, 0.016, 0.016, 0.008, 0.03, + 0.012, 0.006, 0.004, 0.006, 0.001, 0.0001, 2.707, 1.09, 1.398, 0.705, 1.23, 1.04, 0.715, 0.952, 1.455, 1.297, + 0.845, 1.19, 2.403, 1.193, 0.813, 1.077, 0.889, 0.565, 0.387, 0.47, 0.931, 0.663, 1.035, 0.837, 0.77, 0.772, + 1.434, 1.023, 1.668, 0.609, 0.437, 0.793, 0.535, 0.706, 0.48, 0.538, 0.785, 0.909, 0.7, 0.697, 1.017, 0.519, + 0.441, 0.567, 0.626, 1.082, 0.814, 1.054, 1.074, 0.811, 0.556, 0.684, 0.903, 0.43, 0.642, 0.78, 2.083, 1.147, + 2.006, 1.331, 2.547, 1.015, 0.911, 0.807, 0.0001, 0.0001, 0.069, 0.007, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.126, 1.369, 3.539, 8.968, + 5.44, 4.358, 3.141, 2.48, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 1.821, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "fa": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.841, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 10.03, 0.001, 0.048, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.117, 0.117, 0.001, + 0.001, 0.009, 0.038, 0.486, 0.012, 0.007, 0.009, 0.007, 0.005, 0.003, 0.004, 0.003, 0.003, 0.003, 0.004, 0.048, + 0.001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.011, 0.006, 0.011, 0.006, 0.005, 0.005, 0.004, 0.005, 0.007, 0.002, + 0.002, 0.005, 0.008, 0.005, 0.005, 0.008, 0.001, 0.005, 0.011, 0.008, 0.002, 0.003, 0.004, 0.001, 0.001, 0.001, + 0.002, 0.0001, 0.002, 0.0001, 0.007, 0.0001, 0.058, 0.008, 0.02, 0.02, 0.06, 0.011, 0.012, 0.017, 0.051, 0.001, + 0.009, 0.031, 0.018, 0.042, 0.047, 0.015, 0.001, 0.043, 0.03, 0.037, 0.022, 0.005, 0.008, 0.003, 0.009, 0.003, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.678, 0.557, 0.438, 0.001, 1.227, 2.118, 3.004, 2.445, 2.539, 0.0001, + 0.003, 0.021, 5.067, 0.002, 0.007, 0.006, 0.015, 0.005, 0.002, 0.008, 0.07, 0.0001, 0.0001, 0.0001, 0.053, + 0.001, 0.0001, 0.018, 0.0001, 0.001, 0.0001, 0.002, 0.002, 0.006, 0.337, 0.015, 0.006, 0.001, 0.059, 6.029, + 1.704, 1.216, 2.096, 0.113, 0.433, 0.309, 0.439, 3.398, 0.192, 3.798, 0.977, 1.716, 1.137, 0.259, 0.129, 0.264, + 0.12, 0.588, 0.085, 0.033, 0.001, 0.0001, 0.327, 0.0001, 0.0001, 0.0001, 0.068, 0.003, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.001, 23.012, 12.666, 1.946, 5.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.676, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "pl": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.97, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.695, 0.002, 0.242, 0.0001, 0.0001, 0.007, 0.002, 0.011, 0.194, 0.194, 0.0001, + 0.001, 0.805, 0.129, 1.016, 0.02, 0.347, 0.542, 0.289, 0.14, 0.138, 0.144, 0.123, 0.13, 0.153, 0.343, 0.068, + 0.014, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.17, 0.165, 0.143, 0.124, 0.066, 0.081, 0.113, 0.075, 0.141, 0.107, + 0.18, 0.108, 0.192, 0.142, 0.119, 0.322, 0.004, 0.139, 0.268, 0.117, 0.058, 0.041, 0.322, 0.032, 0.008, 0.109, + 0.001, 0.0001, 0.001, 0.0001, 0.006, 0.0001, 6.697, 0.859, 2.856, 2.291, 5.604, 0.259, 1.117, 0.918, 6.017, + 1.562, 2.537, 1.759, 1.903, 4.231, 5.86, 1.841, 0.006, 3.854, 3.145, 2.863, 1.965, 0.061, 3.408, 0.016, 2.669, + 3.631, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.208, 0.018, 1.343, 0.004, 0.168, 0.653, 0.002, 0.145, 0.003, + 0.001, 0.001, 0.001, 0.002, 0.004, 0.001, 0.002, 0.002, 0.001, 0.003, 0.126, 0.002, 0.001, 0.002, 0.002, 0.001, + 0.65, 0.023, 0.378, 0.002, 0.035, 0.035, 0.002, 0.018, 0.011, 0.001, 0.002, 0.005, 0.001, 0.001, 0.002, 0.003, + 0.012, 0.001, 0.002, 0.001, 0.005, 0.001, 0.001, 0.01, 0.004, 0.011, 0.641, 0.003, 0.006, 0.005, 0.001, 0.008, + 0.004, 0.056, 0.014, 0.433, 0.007, 0.008, 0.002, 0.0001, 0.0001, 0.025, 0.694, 1.442, 2.413, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.003, 0.06, 0.02, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.205, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "tr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.91, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.447, 0.013, 0.297, 0.0001, 0.001, 0.013, 0.003, 0.465, 0.123, 0.123, 0.001, + 0.002, 0.653, 0.111, 0.957, 0.015, 0.312, 0.387, 0.238, 0.107, 0.101, 0.108, 0.097, 0.095, 0.109, 0.217, 0.04, + 0.028, 0.007, 0.019, 0.007, 0.002, 0.0001, 0.336, 0.309, 0.117, 0.167, 0.132, 0.105, 0.13, 0.135, 0.063, 0.042, + 0.261, 0.085, 0.236, 0.083, 0.095, 0.131, 0.004, 0.092, 0.247, 0.219, 0.038, 0.052, 0.037, 0.008, 0.095, 0.019, + 0.007, 0.0001, 0.007, 0.0001, 0.005, 0.001, 8.533, 1.3, 0.65, 3.067, 6.656, 0.419, 0.804, 0.718, 6.178, 0.059, + 2.986, 5.127, 2.286, 5.537, 2.04, 0.623, 0.006, 5.247, 2.411, 2.743, 2.225, 0.903, 0.049, 0.018, 2.076, 0.792, + 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.096, 0.004, 0.004, 0.004, 0.002, 0.002, 0.002, 0.041, 0.002, 0.001, + 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.002, 0.001, 0.031, 0.001, 0.003, 0.065, + 0.001, 0.001, 0.033, 0.009, 0.047, 1.71, 0.04, 0.005, 0.027, 0.002, 0.003, 0.001, 0.001, 0.647, 0.002, 0.008, + 0.002, 0.003, 0.001, 0.004, 0.019, 0.002, 0.132, 3.435, 0.005, 0.004, 0.003, 0.003, 0.525, 0.001, 0.004, 0.002, + 0.003, 0.007, 1.206, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.046, 2.539, 4.197, 1.125, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, + 0.01, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.094, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "nl": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.158, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.747, 0.002, 0.267, 0.0001, 0.001, 0.008, 0.01, 0.052, 0.196, 0.196, 0.0001, + 0.001, 0.504, 0.205, 0.944, 0.013, 0.311, 0.428, 0.229, 0.104, 0.101, 0.109, 0.102, 0.102, 0.137, 0.252, 0.048, + 0.012, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.205, 0.192, 0.181, 0.371, 0.131, 0.088, 0.11, 0.236, 0.167, 0.069, + 0.091, 0.119, 0.172, 0.137, 0.117, 0.141, 0.005, 0.112, 0.229, 0.137, 0.034, 0.123, 0.084, 0.006, 0.011, 0.064, + 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 6.042, 1.063, 1.294, 4.124, 13.689, 0.579, 2.105, 1.822, 5.542, + 0.948, 1.42, 3.124, 1.72, 7.129, 4.759, 1.349, 0.015, 5.115, 3.623, 4.903, 1.642, 1.84, 1.06, 0.063, 0.226, + 0.656, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.023, 0.003, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.001, + 0.002, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.008, 0.001, 0.0001, 0.001, 0.001, + 0.002, 0.007, 0.001, 0.001, 0.003, 0.003, 0.001, 0.002, 0.008, 0.009, 0.003, 0.002, 0.005, 0.002, 0.001, 0.003, + 0.009, 0.038, 0.001, 0.051, 0.001, 0.005, 0.001, 0.011, 0.004, 0.003, 0.013, 0.008, 0.002, 0.002, 0.008, 0.001, + 0.004, 0.001, 0.003, 0.002, 0.01, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.02, 0.166, 0.007, 0.01, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.016, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.022, 0.001, 0.0001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ko": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.893, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.919, 0.003, 0.069, 0.0001, 0.0001, 0.007, 0.002, 0.048, 0.269, 0.269, 0.0001, + 0.002, 0.501, 0.04, 0.699, 0.01, 0.29, 0.417, 0.259, 0.125, 0.109, 0.112, 0.1, 0.094, 0.109, 0.192, 0.015, + 0.002, 0.006, 0.002, 0.006, 0.003, 0.0001, 0.038, 0.026, 0.038, 0.022, 0.02, 0.024, 0.015, 0.013, 0.023, 0.008, + 0.015, 0.017, 0.027, 0.016, 0.016, 0.023, 0.002, 0.017, 0.041, 0.027, 0.011, 0.013, 0.01, 0.005, 0.004, 0.002, + 0.006, 0.0001, 0.006, 0.0001, 0.012, 0.0001, 0.108, 0.014, 0.037, 0.031, 0.116, 0.024, 0.022, 0.032, 0.084, + 0.002, 0.021, 0.064, 0.06, 0.077, 0.092, 0.02, 0.001, 0.086, 0.056, 0.066, 0.046, 0.011, 0.008, 0.004, 0.019, + 0.004, 0.0001, 0.002, 0.0001, 0.025, 0.0001, 2.21, 0.565, 0.766, 0.471, 3.043, 0.671, 0.334, 0.049, 1.404, + 0.218, 1.17, 1.657, 1.23, 0.278, 0.091, 0.557, 1.645, 0.451, 0.058, 0.386, 1.38, 2.193, 0.506, 1.29, 2.708, + 0.68, 0.385, 0.399, 2.758, 3.352, 0.954, 0.141, 1.848, 0.829, 0.071, 0.249, 1.741, 0.637, 0.43, 0.888, 0.537, + 0.506, 0.243, 0.027, 1.4, 0.355, 0.026, 0.179, 2.38, 0.404, 0.739, 1.021, 2.205, 0.729, 0.454, 0.308, 1.635, + 0.561, 0.035, 0.084, 1.612, 0.309, 0.024, 0.047, 0.0001, 0.0001, 0.034, 0.005, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.039, 0.089, 0.025, + 0.107, 0.071, 0.044, 0.037, 0.043, 3.199, 8.716, 12.558, 3.298, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "cs": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.804, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.066, 0.002, 0.232, 0.0001, 0.0001, 0.008, 0.002, 0.009, 0.188, 0.188, 0.007, + 0.002, 0.814, 0.094, 1.008, 0.025, 0.299, 0.437, 0.233, 0.115, 0.111, 0.119, 0.106, 0.102, 0.129, 0.233, 0.051, + 0.011, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.143, 0.145, 0.103, 0.117, 0.06, 0.072, 0.055, 0.092, 0.08, 0.13, + 0.142, 0.093, 0.169, 0.137, 0.088, 0.246, 0.003, 0.104, 0.236, 0.127, 0.039, 0.213, 0.033, 0.007, 0.007, 0.069, + 0.002, 0.0001, 0.002, 0.0001, 0.005, 0.0001, 5.018, 1.137, 1.8, 2.299, 5.465, 0.243, 0.288, 1.623, 3.2, 1.177, + 2.624, 3.218, 2.048, 4.447, 5.813, 1.952, 0.006, 3.062, 3.218, 3.502, 2.227, 3.008, 0.043, 0.058, 1.313, 1.405, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.104, 0.003, 0.004, 0.003, 0.001, 0.001, 0.001, 0.003, 0.041, 0.001, + 0.001, 0.001, 0.049, 0.57, 0.001, 0.012, 0.001, 0.001, 0.002, 0.048, 0.002, 0.001, 0.001, 0.002, 0.011, 0.748, + 0.01, 0.981, 0.025, 0.001, 0.025, 0.002, 0.191, 1.9, 0.003, 0.001, 0.005, 0.024, 0.002, 0.002, 0.002, 0.87, + 0.001, 0.001, 0.001, 1.984, 0.001, 0.336, 0.006, 0.002, 0.004, 0.031, 0.002, 0.003, 0.006, 0.001, 0.003, 0.001, + 0.094, 0.002, 0.007, 0.671, 0.58, 0.001, 0.0001, 0.0001, 0.173, 5.104, 1.615, 2.233, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.009, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.103, 0.001, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ar": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.65, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.194, 0.002, 0.102, 0.0001, 0.0001, 0.007, 0.001, 0.002, 0.109, 0.108, 0.002, + 0.001, 0.03, 0.046, 0.42, 0.018, 0.182, 0.202, 0.135, 0.063, 0.065, 0.061, 0.055, 0.053, 0.062, 0.113, 0.054, + 0.001, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.01, 0.006, 0.009, 0.007, 0.005, 0.004, 0.004, 0.004, 0.005, 0.002, + 0.002, 0.005, 0.007, 0.005, 0.004, 0.007, 0.001, 0.005, 0.009, 0.006, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, + 0.007, 0.001, 0.007, 0.0001, 0.004, 0.0001, 0.052, 0.008, 0.019, 0.018, 0.055, 0.008, 0.011, 0.016, 0.045, + 0.001, 0.006, 0.028, 0.016, 0.037, 0.04, 0.012, 0.001, 0.038, 0.03, 0.035, 0.02, 0.006, 0.006, 0.002, 0.009, + 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.055, 1.131, 0.874, 0.939, 4.804, 2.787, 2.235, 1.018, 2.407, + 0.349, 3.542, 0.092, 0.4, 0.007, 0.051, 0.053, 0.022, 0.061, 0.01, 0.008, 0.001, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.0001, 0.008, 0.001, 0.001, 0.0001, 0.002, 0.013, 0.133, 0.049, 0.782, 0.037, 0.335, 0.157, 6.208, + 1.599, 1.486, 1.889, 0.276, 0.607, 0.762, 0.341, 1.38, 0.239, 2.041, 0.293, 1.149, 0.411, 0.383, 0.246, 0.406, + 0.094, 1.401, 0.223, 0.006, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.027, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 23.298, 20.414, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.019, + 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "vi": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.205, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.546, 0.002, 0.241, 0.0001, 0.001, 0.015, 0.013, 0.009, 0.13, 0.13, 0.0001, + 0.002, 0.714, 0.089, 0.813, 0.02, 0.259, 0.361, 0.203, 0.104, 0.097, 0.104, 0.089, 0.089, 0.116, 0.194, 0.047, + 0.017, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.148, 0.175, 0.293, 0.111, 0.056, 0.04, 0.092, 0.206, 0.057, 0.03, + 0.119, 0.232, 0.178, 0.247, 0.036, 0.156, 0.056, 0.062, 0.184, 0.397, 0.022, 0.114, 0.033, 0.033, 0.019, 0.009, + 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 2.683, 0.66, 3.149, 0.627, 1.148, 0.076, 2.542, 4.362, 3.528, + 0.019, 0.59, 1.486, 1.611, 5.924, 2.001, 0.761, 0.201, 1.559, 1.014, 3.555, 1.77, 0.861, 0.05, 0.173, 0.826, + 0.047, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.021, 0.214, 0.011, 0.478, 0.002, 0.039, 0.001, 0.324, 0.002, + 0.072, 0.001, 0.198, 0.002, 0.32, 0.002, 0.048, 0.141, 1.485, 0.001, 0.116, 0.015, 0.106, 0.001, 0.025, 0.002, + 0.579, 0.004, 0.289, 0.004, 0.257, 0.005, 0.174, 1.516, 1.221, 0.326, 0.818, 0.013, 0.337, 0.005, 0.51, 0.014, + 0.324, 0.408, 0.115, 0.147, 0.492, 0.002, 0.218, 0.82, 0.26, 0.102, 0.383, 0.379, 0.016, 0.006, 0.094, 0.005, + 0.132, 2.233, 4.628, 0.009, 0.062, 0.003, 0.385, 0.0001, 0.0001, 0.047, 4.542, 1.653, 0.065, 0.997, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 6.74, 0.019, 0.004, 0.002, + 0.009, 0.006, 0.004, 0.003, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "el": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.389, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.245, 0.003, 0.167, 0.001, 0.0001, 0.005, 0.002, 0.015, 0.1, 0.101, 0.0001, + 0.001, 0.487, 0.058, 0.449, 0.01, 0.151, 0.215, 0.114, 0.058, 0.055, 0.058, 0.052, 0.051, 0.065, 0.119, 0.032, + 0.001, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.021, 0.016, 0.024, 0.014, 0.012, 0.012, 0.011, 0.013, 0.012, + 0.005, 0.006, 0.013, 0.018, 0.01, 0.009, 0.015, 0.001, 0.013, 0.025, 0.017, 0.005, 0.006, 0.008, 0.002, 0.002, + 0.001, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.0001, 0.125, 0.018, 0.039, 0.039, 0.142, 0.017, 0.026, 0.036, + 0.105, 0.002, 0.017, 0.072, 0.036, 0.093, 0.102, 0.022, 0.002, 0.099, 0.07, 0.077, 0.046, 0.014, 0.01, 0.005, + 0.02, 0.005, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 1.502, 1.948, 1.522, 1.805, 3.613, 1.458, 0.354, 0.481, + 0.073, 0.584, 0.024, 0.002, 0.912, 0.435, 0.305, 0.001, 0.006, 0.156, 0.057, 0.068, 0.049, 0.097, 0.01, 0.064, + 0.017, 0.048, 0.112, 0.037, 0.115, 0.048, 0.003, 0.099, 0.122, 0.029, 0.001, 0.129, 0.119, 0.011, 0.03, 0.034, + 0.002, 0.008, 0.0001, 0.022, 0.85, 0.749, 0.601, 1.063, 0.004, 3.95, 0.27, 0.716, 0.649, 2.656, 0.14, 1.63, + 0.422, 2.831, 1.733, 1.214, 1.337, 2.636, 0.149, 3.615, 0.0001, 0.0001, 0.06, 0.007, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 28.675, 14.922, 0.013, 0.004, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.013, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "sv": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.282, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.667, 0.001, 0.345, 0.0001, 0.0001, 0.007, 0.002, 0.013, 0.083, 0.083, 0.0001, + 0.0001, 0.902, 0.146, 1.182, 0.007, 0.152, 0.25, 0.108, 0.06, 0.06, 0.065, 0.065, 0.066, 0.089, 0.153, 0.044, + 0.004, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.178, 0.164, 0.421, 0.354, 0.095, 0.078, 0.149, 0.127, 0.181, 0.06, + 0.161, 0.209, 0.174, 0.099, 0.072, 0.149, 0.019, 0.12, 0.249, 0.206, 0.034, 0.058, 0.04, 0.006, 0.012, 0.014, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 6.63, 0.945, 0.963, 3.448, 8.696, 0.922, 2.03, 1.373, 4.448, + 0.429, 1.949, 3.417, 3.024, 6.448, 3.193, 1.076, 0.019, 6.923, 3.891, 5.562, 1.877, 1.653, 0.074, 0.114, 0.424, + 0.075, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.022, 0.039, 0.002, 0.003, 0.007, 0.074, 0.004, 0.007, 0.005, + 0.002, 0.002, 0.0001, 0.003, 0.008, 0.002, 0.004, 0.001, 0.002, 0.0001, 0.011, 0.001, 0.001, 0.012, 0.001, + 0.005, 0.002, 0.001, 0.001, 0.001, 0.004, 0.001, 0.003, 0.21, 0.017, 0.005, 0.004, 1.574, 0.853, 0.002, 0.007, + 0.008, 0.038, 0.004, 0.047, 0.001, 0.014, 0.002, 0.009, 0.187, 0.01, 0.004, 0.012, 0.004, 0.002, 0.808, 0.001, + 0.008, 0.002, 0.004, 0.002, 0.006, 0.002, 0.003, 0.001, 0.0001, 0.0001, 0.393, 3.436, 0.069, 0.044, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.014, 0.004, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.021, 0.021, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.019, 0.0001, + 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "hu": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.827, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.714, 0.004, 0.265, 0.0001, 0.0001, 0.007, 0.001, 0.007, 0.159, 0.159, 0.001, + 0.002, 1.016, 0.461, 0.937, 0.013, 0.261, 0.429, 0.206, 0.109, 0.106, 0.113, 0.103, 0.105, 0.137, 0.238, 0.073, + 0.019, 0.004, 0.004, 0.004, 0.002, 0.0001, 0.469, 0.135, 0.097, 0.073, 0.142, 0.093, 0.075, 0.087, 0.095, 0.062, + 0.133, 0.086, 0.175, 0.085, 0.042, 0.096, 0.003, 0.071, 0.186, 0.107, 0.027, 0.069, 0.028, 0.009, 0.008, 0.025, + 0.002, 0.0001, 0.002, 0.0001, 0.004, 0.0001, 6.316, 1.591, 0.619, 1.364, 7.125, 0.648, 2.159, 0.946, 3.15, + 0.796, 3.265, 4.526, 2.054, 3.978, 3.047, 0.846, 0.006, 3.327, 4.35, 5.787, 0.902, 1.395, 0.037, 0.035, 1.463, + 2.94, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.129, 0.02, 0.003, 0.003, 0.001, 0.001, 0.001, 0.003, 0.002, + 0.014, 0.001, 0.001, 0.001, 0.006, 0.0001, 0.001, 0.004, 0.667, 0.001, 0.068, 0.001, 0.0001, 0.005, 0.001, + 0.001, 0.009, 0.007, 0.002, 0.003, 0.026, 0.026, 0.002, 0.024, 2.603, 0.002, 0.001, 0.003, 0.001, 0.002, 0.002, + 0.003, 2.374, 0.001, 0.002, 0.001, 0.448, 0.001, 0.001, 0.005, 0.169, 0.003, 0.702, 0.002, 0.002, 0.76, 0.001, + 0.004, 0.002, 0.223, 0.002, 0.382, 0.004, 0.004, 0.001, 0.0001, 0.0001, 0.028, 7.544, 0.01, 0.845, 0.0001, + 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.021, 0.007, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.128, 0.001, + 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ro": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.044, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.178, 0.003, 0.287, 0.001, 0.001, 0.038, 0.002, 0.011, 0.2, 0.201, 0.001, + 0.002, 1.114, 0.333, 0.783, 0.015, 0.314, 0.397, 0.224, 0.108, 0.105, 0.107, 0.098, 0.099, 0.123, 0.221, 0.062, + 0.021, 0.007, 0.006, 0.007, 0.002, 0.0001, 0.27, 0.164, 0.289, 0.16, 0.109, 0.099, 0.098, 0.077, 0.163, 0.044, + 0.047, 0.132, 0.205, 0.095, 0.07, 0.207, 0.004, 0.158, 0.242, 0.12, 0.072, 0.085, 0.033, 0.021, 0.01, 0.019, + 0.006, 0.0001, 0.006, 0.0001, 0.007, 0.0001, 7.568, 0.638, 3.253, 2.492, 8.352, 0.862, 0.693, 0.377, 7.77, 0.16, + 0.142, 3.906, 1.919, 5.009, 3.799, 1.948, 0.008, 5.326, 2.857, 4.711, 4.259, 0.743, 0.045, 0.139, 0.103, 0.506, + 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.128, 0.004, 0.004, 1.675, 0.002, 0.001, 0.001, 0.002, 0.001, 0.002, + 0.001, 0.001, 0.001, 0.003, 0.104, 0.001, 0.001, 0.002, 0.001, 0.018, 0.003, 0.001, 0.001, 0.001, 0.016, 0.733, + 0.007, 0.695, 0.006, 0.05, 0.046, 0.002, 0.038, 0.012, 0.339, 0.002, 0.003, 0.001, 0.001, 0.002, 0.004, 0.016, + 0.001, 0.003, 0.001, 0.004, 0.716, 0.001, 0.007, 0.003, 0.004, 0.005, 0.003, 0.002, 0.005, 0.001, 0.003, 0.001, + 0.002, 0.003, 0.007, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.048, 1.213, 1.681, 0.01, 0.0001, 0.003, 1.446, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.016, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.127, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "id": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.029, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.265, 0.003, 0.293, 0.001, 0.002, 0.008, 0.004, 0.02, 0.156, 0.156, 0.001, + 0.002, 0.897, 0.232, 0.837, 0.025, 0.281, 0.301, 0.205, 0.089, 0.081, 0.088, 0.077, 0.074, 0.084, 0.156, 0.047, + 0.017, 0.004, 0.004, 0.004, 0.002, 0.0001, 0.336, 0.259, 0.156, 0.221, 0.076, 0.084, 0.101, 0.111, 0.249, 0.128, + 0.292, 0.143, 0.276, 0.131, 0.06, 0.365, 0.008, 0.137, 0.448, 0.233, 0.076, 0.043, 0.063, 0.011, 0.049, 0.014, + 0.01, 0.0001, 0.01, 0.0001, 0.002, 0.0001, 14.771, 1.913, 0.506, 3.424, 6.588, 0.273, 2.854, 1.797, 6.389, 0.58, + 3.078, 2.893, 3.104, 7.626, 2.047, 2.047, 0.011, 4.279, 3.371, 3.841, 3.795, 0.171, 0.34, 0.026, 1.249, 0.063, + 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.031, 0.005, 0.004, 0.003, 0.003, 0.002, 0.001, 0.002, 0.002, 0.001, + 0.001, 0.001, 0.001, 0.004, 0.002, 0.001, 0.001, 0.001, 0.001, 0.012, 0.003, 0.001, 0.001, 0.001, 0.002, 0.005, + 0.001, 0.001, 0.006, 0.006, 0.001, 0.002, 0.051, 0.005, 0.002, 0.002, 0.003, 0.001, 0.002, 0.003, 0.002, 0.009, + 0.001, 0.002, 0.001, 0.003, 0.001, 0.001, 0.004, 0.003, 0.004, 0.003, 0.002, 0.002, 0.002, 0.001, 0.003, 0.002, + 0.002, 0.002, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.055, 0.03, 0.005, 0.008, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.003, 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.03, 0.003, 0.001, 0.003, + 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sk": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.159, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.105, 0.002, 0.192, 0.0001, 0.0001, 0.007, 0.002, 0.005, 0.209, 0.21, 0.013, + 0.002, 0.819, 0.162, 1.046, 0.023, 0.302, 0.407, 0.233, 0.125, 0.121, 0.119, 0.111, 0.11, 0.127, 0.222, 0.055, + 0.011, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.172, 0.157, 0.128, 0.107, 0.068, 0.073, 0.08, 0.101, 0.088, 0.103, + 0.136, 0.098, 0.191, 0.186, 0.106, 0.263, 0.004, 0.11, 0.26, 0.138, 0.041, 0.2, 0.032, 0.006, 0.008, 0.071, + 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.0001, 6.363, 1.243, 1.749, 2.177, 5.774, 0.29, 0.367, 1.611, 4.04, 1.457, + 2.743, 2.816, 2.062, 4.279, 6.818, 1.868, 0.006, 3.912, 3.184, 3.285, 2.066, 3.292, 0.044, 0.067, 1.073, 1.331, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.113, 0.006, 0.004, 0.002, 0.002, 0.001, 0.001, 0.002, 0.077, 0.003, + 0.0001, 0.001, 0.033, 0.618, 0.006, 0.066, 0.001, 0.001, 0.001, 0.046, 0.001, 0.006, 0.001, 0.001, 0.001, 0.013, + 0.009, 0.007, 0.027, 0.001, 0.026, 0.001, 0.106, 1.828, 0.001, 0.001, 0.067, 0.259, 0.001, 0.002, 0.006, 0.586, + 0.001, 0.001, 0.001, 0.717, 0.001, 0.002, 0.005, 0.002, 0.004, 0.16, 0.12, 0.002, 0.005, 0.038, 0.002, 0.001, + 0.54, 0.002, 0.006, 0.806, 0.828, 0.001, 0.0001, 0.0001, 0.114, 4.297, 1.036, 1.463, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.112, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "da": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.925, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.716, 0.002, 0.323, 0.001, 0.001, 0.007, 0.004, 0.044, 0.149, 0.15, 0.001, + 0.001, 0.888, 0.199, 1.047, 0.017, 0.356, 0.494, 0.245, 0.119, 0.115, 0.124, 0.118, 0.127, 0.168, 0.257, 0.046, + 0.018, 0.001, 0.002, 0.001, 0.002, 0.0001, 0.185, 0.17, 0.132, 0.265, 0.124, 0.155, 0.096, 0.211, 0.151, 0.076, + 0.153, 0.12, 0.178, 0.102, 0.069, 0.125, 0.005, 0.111, 0.307, 0.131, 0.057, 0.087, 0.054, 0.005, 0.012, 0.01, + 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 4.818, 1.29, 0.375, 4.241, 11.595, 1.856, 2.915, 1.153, 4.647, + 0.373, 2.179, 3.858, 2.304, 5.903, 3.8, 1.073, 0.008, 6.456, 4.455, 5.128, 1.418, 1.705, 0.066, 0.033, 0.579, + 0.056, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.052, 0.003, 0.002, 0.001, 0.001, 0.008, 0.003, 0.001, 0.001, + 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.033, 0.003, 0.0001, 0.001, 0.001, + 0.013, 0.005, 0.0001, 0.001, 0.002, 0.008, 0.001, 0.002, 0.01, 0.006, 0.001, 0.001, 0.01, 0.595, 0.559, 0.002, + 0.002, 0.02, 0.001, 0.004, 0.001, 0.004, 0.001, 0.001, 0.005, 0.002, 0.003, 0.005, 0.001, 0.001, 0.011, 0.001, + 0.585, 0.001, 0.002, 0.003, 0.011, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.02, 1.836, 0.004, 0.005, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.006, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.052, 0.001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "fi": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.851, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 10.647, 0.002, 0.239, 0.0001, 0.0001, 0.006, 0.003, 0.009, 0.115, 0.115, 0.0001, + 0.004, 0.594, 0.296, 1.014, 0.011, 0.404, 0.475, 0.268, 0.112, 0.107, 0.117, 0.106, 0.107, 0.133, 0.295, 0.069, + 0.007, 0.003, 0.004, 0.003, 0.001, 0.0001, 0.183, 0.111, 0.1, 0.068, 0.113, 0.064, 0.065, 0.195, 0.087, 0.098, + 0.225, 0.146, 0.211, 0.097, 0.06, 0.172, 0.005, 0.116, 0.314, 0.181, 0.037, 0.143, 0.044, 0.006, 0.048, 0.009, + 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.0001, 9.681, 0.162, 0.176, 0.832, 6.272, 0.12, 0.289, 1.322, 8.475, + 1.576, 3.754, 4.597, 2.281, 6.958, 4.47, 1.345, 0.007, 2.326, 6.029, 6.589, 4.108, 1.653, 0.05, 0.021, 1.301, + 0.041, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.101, 0.002, 0.002, 0.001, 0.004, 0.002, 0.001, 0.002, 0.001, + 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.061, 0.001, 0.0001, 0.001, 0.001, + 0.0001, 0.008, 0.0001, 0.001, 0.001, 0.032, 0.0001, 0.001, 0.032, 0.02, 0.001, 0.001, 2.624, 0.003, 0.001, + 0.001, 0.002, 0.014, 0.0001, 0.002, 0.001, 0.01, 0.001, 0.001, 0.003, 0.002, 0.002, 0.005, 0.001, 0.001, 0.349, + 0.001, 0.002, 0.001, 0.002, 0.001, 0.005, 0.002, 0.004, 0.001, 0.0001, 0.0001, 0.039, 3.028, 0.006, 0.023, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.007, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, + 0.101, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "th": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.353, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 1.736, 0.001, 0.084, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.081, 0.081, 0.0001, + 0.001, 0.043, 0.029, 0.16, 0.005, 0.088, 0.106, 0.121, 0.047, 0.051, 0.082, 0.032, 0.03, 0.033, 0.045, 0.008, + 0.004, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.013, 0.009, 0.013, 0.008, 0.008, 0.006, 0.006, 0.006, 0.008, + 0.003, 0.003, 0.006, 0.01, 0.006, 0.005, 0.009, 0.001, 0.007, 0.015, 0.012, 0.003, 0.003, 0.006, 0.001, 0.002, + 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.08, 0.011, 0.029, 0.025, 0.092, 0.012, 0.017, 0.027, + 0.069, 0.001, 0.009, 0.042, 0.023, 0.063, 0.066, 0.017, 0.001, 0.062, 0.045, 0.056, 0.028, 0.008, 0.007, 0.003, + 0.015, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 1.311, 1.859, 0.629, 0.364, 0.845, 0.001, 0.034, 1.547, + 1.721, 0.971, 0.381, 0.156, 0.367, 0.089, 0.014, 0.016, 0.045, 0.009, 0.014, 0.115, 0.776, 0.653, 0.138, 0.742, + 0.12, 1.918, 0.573, 0.602, 0.112, 0.028, 0.443, 0.069, 0.115, 1.089, 0.883, 1.745, 0.026, 0.859, 0.001, 0.829, + 0.228, 0.108, 0.682, 0.53, 0.008, 1.369, 0.031, 0.006, 0.627, 1.083, 2.149, 0.218, 0.714, 0.916, 0.178, 0.322, + 26.536, 5.927, 0.003, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.884, 0.001, 0.018, + 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "bg": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.55, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.448, 0.001, 0.106, 0.0001, 0.0001, 0.005, 0.001, 0.003, 0.12, 0.12, 0.002, + 0.001, 0.557, 0.131, 0.613, 0.011, 0.182, 0.272, 0.137, 0.074, 0.072, 0.075, 0.066, 0.065, 0.083, 0.144, 0.028, + 0.009, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.013, 0.009, 0.015, 0.008, 0.007, 0.006, 0.006, 0.006, 0.041, 0.002, + 0.003, 0.007, 0.011, 0.006, 0.005, 0.01, 0.001, 0.006, 0.015, 0.011, 0.003, 0.01, 0.005, 0.007, 0.001, 0.001, + 0.003, 0.0001, 0.003, 0.0001, 0.002, 0.0001, 0.088, 0.012, 0.031, 0.028, 0.092, 0.009, 0.016, 0.024, 0.077, + 0.002, 0.014, 0.045, 0.037, 0.056, 0.066, 0.019, 0.001, 0.063, 0.052, 0.05, 0.037, 0.008, 0.006, 0.003, 0.013, + 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.651, 2.091, 3.127, 0.625, 0.166, 0.165, 0.297, 0.452, 0.133, + 0.189, 0.677, 0.001, 0.018, 0.001, 0.079, 0.727, 0.091, 0.092, 0.108, 0.095, 0.081, 0.039, 0.009, 0.034, 0.052, + 0.011, 0.114, 0.044, 0.167, 0.089, 0.136, 0.155, 0.116, 0.171, 0.083, 0.024, 0.037, 0.04, 0.014, 0.018, 0.016, + 0.009, 0.001, 0.0001, 0.001, 0.002, 0.012, 0.008, 5.212, 0.516, 1.875, 0.701, 1.296, 3.589, 0.274, 0.882, 3.979, + 0.288, 1.391, 1.465, 0.909, 3.169, 3.698, 1.109, 0.0001, 0.0001, 0.048, 0.005, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.0001, 0.015, 0.006, 31.942, 11.185, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.201, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "he": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.485, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.289, 0.001, 0.262, 0.0001, 0.0001, 0.005, 0.001, 0.096, 0.104, 0.103, 0.0001, + 0.001, 0.64, 0.203, 0.573, 0.005, 0.181, 0.234, 0.129, 0.06, 0.061, 0.062, 0.055, 0.054, 0.065, 0.138, 0.049, + 0.013, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.016, 0.011, 0.014, 0.009, 0.007, 0.007, 0.006, 0.007, 0.009, + 0.003, 0.003, 0.008, 0.012, 0.007, 0.005, 0.01, 0.001, 0.008, 0.016, 0.012, 0.003, 0.004, 0.005, 0.002, 0.002, + 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.007, 0.0001, 0.073, 0.008, 0.021, 0.022, 0.081, 0.015, 0.013, 0.021, + 0.056, 0.001, 0.007, 0.043, 0.024, 0.051, 0.061, 0.011, 0.001, 0.058, 0.038, 0.043, 0.032, 0.007, 0.005, 0.003, + 0.012, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.003, 0.002, 0.003, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 2.008, 2.447, 0.696, 1.135, 3.773, 4.868, 0.394, + 0.995, 0.678, 4.903, 0.173, 0.854, 2.776, 1.153, 2.22, 0.562, 1.585, 0.919, 1.159, 0.101, 0.969, 0.062, 0.568, + 1.054, 2.634, 1.902, 2.428, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.009, 0.002, 0.002, 0.002, 0.006, 0.004, + 0.005, 0.005, 0.008, 0.005, 0.001, 0.002, 0.01, 0.002, 0.005, 0.001, 0.0001, 0.0001, 0.008, 0.005, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.015, 0.005, 0.0001, 0.0001, + 0.0001, 0.0001, 0.044, 42.985, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, + 0.013, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "uk": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.595, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.309, 0.001, 0.06, 0.0001, 0.001, 0.01, 0.001, 0.059, 0.134, 0.135, 0.002, + 0.002, 0.619, 0.137, 0.568, 0.01, 0.199, 0.281, 0.159, 0.081, 0.077, 0.082, 0.071, 0.067, 0.079, 0.158, 0.041, + 0.017, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.014, 0.009, 0.015, 0.009, 0.007, 0.006, 0.007, 0.006, 0.029, 0.002, + 0.003, 0.007, 0.011, 0.006, 0.005, 0.01, 0.001, 0.008, 0.016, 0.01, 0.003, 0.01, 0.004, 0.011, 0.001, 0.001, + 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 0.067, 0.008, 0.022, 0.02, 0.069, 0.01, 0.012, 0.018, 0.056, 0.001, + 0.008, 0.037, 0.02, 0.046, 0.054, 0.014, 0.001, 0.051, 0.037, 0.039, 0.027, 0.007, 0.006, 0.003, 0.012, 0.003, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.481, 1.842, 2.043, 1.429, 0.162, 0.46, 0.448, 0.496, 0.265, 0.125, + 0.001, 0.003, 0.806, 0.001, 0.316, 0.84, 0.08, 0.077, 0.114, 0.065, 0.394, 0.018, 2.734, 0.422, 0.001, 0.01, + 0.11, 0.047, 0.088, 0.083, 0.052, 0.13, 0.228, 0.124, 0.058, 0.089, 0.032, 0.023, 0.02, 0.023, 0.023, 0.004, + 0.0001, 0.09, 0.0001, 0.001, 0.008, 0.014, 3.574, 0.601, 2.221, 0.664, 1.335, 1.986, 0.299, 0.851, 2.427, 0.557, + 1.658, 1.688, 1.249, 3.061, 4.029, 1.082, 0.0001, 0.0001, 0.335, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.018, 0.0001, 0.002, 0.001, 28.71, 14.784, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.144, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "lt": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.086, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.626, 0.002, 0.167, 0.001, 0.0001, 0.009, 0.001, 0.01, 0.234, 0.234, 0.001, + 0.002, 1.069, 0.088, 1.436, 0.009, 0.347, 0.549, 0.256, 0.135, 0.132, 0.151, 0.128, 0.13, 0.15, 0.368, 0.06, + 0.018, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.213, 0.143, 0.054, 0.128, 0.066, 0.049, 0.096, 0.041, 0.157, 0.121, + 0.23, 0.188, 0.16, 0.109, 0.037, 0.238, 0.002, 0.129, 0.21, 0.163, 0.036, 0.209, 0.013, 0.047, 0.01, 0.016, + 0.002, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 8.107, 0.954, 0.391, 1.797, 4.13, 0.204, 1.223, 0.172, 9.411, + 1.587, 2.883, 2.415, 2.501, 3.736, 4.946, 1.811, 0.003, 4.047, 5.62, 3.782, 3.399, 1.76, 0.016, 0.008, 1.047, + 0.248, 0.0001, 0.015, 0.0001, 0.002, 0.0001, 0.475, 0.005, 0.003, 0.002, 0.002, 0.411, 0.001, 0.001, 0.006, + 0.001, 0.001, 0.001, 0.019, 0.313, 0.0001, 0.001, 0.001, 0.001, 0.006, 0.247, 0.001, 0.0001, 0.001, 1.225, + 0.001, 0.136, 0.001, 0.001, 0.108, 0.003, 0.111, 0.001, 0.364, 0.781, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, + 0.001, 0.003, 0.002, 0.299, 0.001, 0.004, 0.013, 0.355, 0.007, 0.002, 0.007, 0.931, 0.001, 0.004, 0.001, 0.001, + 0.004, 0.002, 0.003, 0.003, 0.003, 0.037, 0.575, 0.001, 0.0001, 0.0001, 0.29, 0.016, 2.467, 2.697, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.033, 0.011, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.477, 0.001, + 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "nn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.115, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.127, 0.002, 0.244, 0.0001, 0.0001, 0.007, 0.004, 0.029, 0.125, 0.125, 0.001, + 0.001, 0.736, 0.236, 1.026, 0.016, 0.357, 0.45, 0.2, 0.113, 0.108, 0.13, 0.122, 0.121, 0.148, 0.271, 0.033, + 0.009, 0.004, 0.002, 0.004, 0.001, 0.0001, 0.218, 0.193, 0.121, 0.247, 0.133, 0.148, 0.105, 0.221, 0.171, 0.071, + 0.137, 0.127, 0.194, 0.145, 0.08, 0.133, 0.007, 0.124, 0.352, 0.152, 0.062, 0.099, 0.053, 0.006, 0.016, 0.016, + 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.001, 6.479, 0.879, 0.246, 3.008, 9.683, 1.285, 2.701, 0.948, 5.112, + 0.784, 2.645, 3.726, 2.383, 5.836, 3.991, 1.273, 0.009, 6.373, 4.403, 5.512, 1.465, 1.904, 0.067, 0.025, 0.761, + 0.055, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.031, 0.01, 0.005, 0.003, 0.003, 0.012, 0.002, 0.003, 0.002, + 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.02, 0.003, 0.002, 0.002, 0.001, 0.013, + 0.005, 0.002, 0.001, 0.002, 0.001, 0.001, 0.003, 0.042, 0.013, 0.002, 0.002, 0.016, 0.934, 0.093, 0.004, 0.01, + 0.021, 0.004, 0.076, 0.002, 0.01, 0.001, 0.002, 0.012, 0.007, 0.039, 0.01, 0.004, 0.006, 0.015, 0.002, 0.552, + 0.004, 0.006, 0.078, 0.011, 0.006, 0.007, 0.003, 0.0001, 0.0001, 0.197, 1.726, 0.009, 0.008, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.017, 0.007, 0.044, 0.016, 0.0001, 0.0001, 0.0001, 0.001, 0.004, + 0.01, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.002, 0.027, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "hr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.893, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.172, 0.002, 0.34, 0.0001, 0.001, 0.011, 0.002, 0.016, 0.182, 0.182, 0.001, + 0.002, 0.943, 0.135, 1.23, 0.019, 0.3, 0.38, 0.204, 0.106, 0.1, 0.109, 0.096, 0.094, 0.112, 0.22, 0.065, 0.02, + 0.009, 0.004, 0.009, 0.002, 0.0001, 0.156, 0.17, 0.109, 0.14, 0.063, 0.069, 0.111, 0.12, 0.137, 0.079, 0.163, + 0.086, 0.175, 0.178, 0.118, 0.22, 0.004, 0.116, 0.267, 0.137, 0.108, 0.095, 0.03, 0.008, 0.009, 0.078, 0.011, + 0.0001, 0.011, 0.0001, 0.002, 0.0001, 8.648, 1.028, 0.78, 2.344, 6.653, 0.218, 1.346, 0.572, 7.393, 3.932, + 2.783, 2.724, 2.195, 4.91, 6.755, 1.994, 0.007, 4.039, 3.61, 3.329, 3.254, 2.478, 0.043, 0.016, 0.083, 1.288, + 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.039, 0.005, 0.004, 0.003, 0.002, 0.001, 0.003, 0.353, 0.002, 0.001, + 0.001, 0.001, 0.016, 0.678, 0.001, 0.001, 0.004, 0.158, 0.001, 0.011, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, + 0.001, 0.001, 0.009, 0.005, 0.008, 0.001, 0.033, 0.524, 0.003, 0.002, 0.003, 0.001, 0.001, 0.002, 0.002, 0.01, + 0.001, 0.005, 0.001, 0.004, 0.001, 0.001, 0.008, 0.004, 0.005, 0.005, 0.002, 0.004, 0.004, 0.001, 0.004, 0.002, + 0.004, 0.006, 0.006, 0.016, 0.36, 0.002, 0.0001, 0.0001, 0.021, 0.044, 1.208, 0.914, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.011, 0.005, 0.028, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.038, 0.001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "no": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.028, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.853, 0.002, 0.247, 0.0001, 0.001, 0.006, 0.004, 0.016, 0.159, 0.158, 0.001, + 0.001, 0.698, 0.213, 1.037, 0.017, 0.377, 0.496, 0.255, 0.116, 0.113, 0.123, 0.117, 0.116, 0.152, 0.295, 0.042, + 0.013, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.196, 0.176, 0.125, 0.246, 0.126, 0.148, 0.099, 0.211, 0.167, 0.071, + 0.132, 0.135, 0.185, 0.133, 0.091, 0.127, 0.006, 0.11, 0.321, 0.146, 0.058, 0.092, 0.051, 0.007, 0.014, 0.011, + 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 4.956, 1.168, 0.243, 2.996, 11.38, 1.384, 2.632, 1.02, 4.719, + 0.546, 2.591, 3.946, 2.341, 6.218, 3.979, 1.354, 0.009, 6.417, 4.712, 5.821, 1.424, 1.732, 0.061, 0.029, 0.639, + 0.049, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.041, 0.006, 0.003, 0.002, 0.002, 0.009, 0.002, 0.002, 0.001, + 0.002, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.034, 0.002, 0.001, 0.002, 0.001, 0.014, + 0.003, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.028, 0.009, 0.001, 0.002, 0.012, 0.765, 0.126, 0.003, 0.003, + 0.021, 0.001, 0.062, 0.001, 0.006, 0.001, 0.001, 0.007, 0.003, 0.006, 0.006, 0.002, 0.003, 0.012, 0.001, 0.598, + 0.002, 0.004, 0.062, 0.009, 0.004, 0.004, 0.002, 0.0001, 0.0001, 0.152, 1.588, 0.007, 0.007, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.004, 0.022, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.039, 0.001, 0.001, + 0.004, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.872, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.68, 0.001, 0.1, 0.0001, 0.0001, 0.009, 0.0001, 0.005, 0.176, 0.176, 0.0001, + 0.003, 0.5, 0.178, 0.762, 0.011, 0.275, 0.318, 0.214, 0.099, 0.096, 0.093, 0.078, 0.075, 0.084, 0.129, 0.031, + 0.008, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.017, 0.01, 0.025, 0.013, 0.007, 0.006, 0.019, 0.007, 0.026, 0.003, + 0.008, 0.007, 0.014, 0.016, 0.013, 0.016, 0.001, 0.009, 0.02, 0.011, 0.006, 0.008, 0.003, 0.004, 0.001, 0.003, + 0.002, 0.0001, 0.002, 0.0001, 0.018, 0.0001, 0.453, 0.047, 0.05, 0.128, 0.37, 0.027, 0.066, 0.039, 0.393, 0.16, + 0.152, 0.148, 0.154, 0.268, 0.352, 0.1, 0.001, 0.219, 0.193, 0.185, 0.165, 0.107, 0.003, 0.002, 0.007, 0.07, + 0.053, 0.001, 0.053, 0.0001, 0.0001, 2.152, 2.07, 1.61, 1.756, 0.112, 0.204, 0.344, 0.339, 0.366, 0.003, 0.007, + 0.001, 0.001, 0.031, 0.0001, 0.007, 0.082, 0.095, 0.143, 0.054, 0.071, 0.047, 0.006, 0.035, 1.459, 0.284, 0.347, + 0.2, 0.143, 0.119, 0.086, 0.186, 0.072, 0.175, 0.071, 0.052, 0.034, 0.041, 0.014, 0.02, 0.016, 0.001, 0.0001, + 0.001, 0.0001, 0.001, 0.0001, 0.0001, 4.933, 0.477, 1.401, 0.663, 1.33, 3.708, 0.225, 0.704, 3.913, 0.001, + 1.472, 1.2, 1.198, 2.623, 3.682, 1.022, 0.0001, 0.0001, 0.018, 0.003, 0.054, 0.041, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 30.181, 10.982, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.062, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ca": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.816, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.948, 0.002, 0.294, 0.001, 0.011, 0.035, 0.001, 0.634, 0.154, 0.154, 0.001, + 0.002, 1.001, 0.144, 0.747, 0.01, 0.301, 0.411, 0.25, 0.137, 0.131, 0.135, 0.12, 0.123, 0.144, 0.212, 0.051, + 0.029, 0.002, 0.003, 0.003, 0.001, 0.0001, 0.252, 0.125, 0.23, 0.119, 0.296, 0.09, 0.091, 0.066, 0.12, 0.061, + 0.034, 0.213, 0.174, 0.072, 0.049, 0.171, 0.012, 0.097, 0.192, 0.11, 0.053, 0.092, 0.024, 0.034, 0.01, 0.009, + 0.002, 0.0001, 0.002, 0.0001, 0.004, 0.0001, 9.132, 1.004, 2.746, 3.236, 9.343, 0.681, 0.95, 0.465, 5.412, + 0.169, 0.095, 4.932, 2.114, 4.848, 3.551, 1.884, 0.571, 5.202, 5.696, 4.416, 2.672, 1.094, 0.036, 0.312, 0.252, + 0.123, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.044, 0.004, 0.004, 0.002, 0.002, 0.001, 0.001, 0.001, 0.002, + 0.015, 0.001, 0.001, 0.001, 0.005, 0.001, 0.001, 0.001, 0.001, 0.002, 0.006, 0.003, 0.001, 0.001, 0.001, 0.001, + 0.021, 0.001, 0.001, 0.003, 0.003, 0.001, 0.001, 0.327, 0.012, 0.002, 0.002, 0.002, 0.001, 0.001, 0.088, 0.218, + 0.355, 0.001, 0.01, 0.003, 0.236, 0.001, 0.038, 0.005, 0.007, 0.161, 0.374, 0.002, 0.003, 0.003, 0.047, 0.003, + 0.002, 0.063, 0.01, 0.034, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.099, 1.903, 0.005, 0.005, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.004, 0.012, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.039, 0.001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sl": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.06, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.437, 0.024, 0.237, 0.001, 0.001, 0.007, 0.002, 0.011, 0.174, 0.174, 0.021, + 0.002, 1.072, 0.17, 1.037, 0.022, 0.277, 0.429, 0.215, 0.122, 0.124, 0.121, 0.109, 0.108, 0.134, 0.239, 0.061, + 0.025, 0.005, 0.006, 0.005, 0.002, 0.0001, 0.162, 0.141, 0.1, 0.122, 0.063, 0.075, 0.091, 0.086, 0.111, 0.082, + 0.154, 0.138, 0.185, 0.145, 0.099, 0.224, 0.004, 0.106, 0.263, 0.133, 0.042, 0.163, 0.031, 0.007, 0.007, 0.087, + 0.013, 0.0001, 0.014, 0.0001, 0.006, 0.0001, 7.7, 1.204, 0.709, 2.364, 7.782, 0.229, 1.139, 0.879, 6.985, 3.327, + 2.701, 3.64, 2.037, 5.283, 6.653, 2.232, 0.006, 4.152, 3.513, 3.409, 1.654, 3.049, 0.039, 0.016, 0.079, 1.473, + 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.054, 0.004, 0.003, 0.002, 0.002, 0.001, 0.001, 0.011, 0.002, 0.002, + 0.0001, 0.001, 0.021, 0.847, 0.001, 0.0001, 0.001, 0.002, 0.002, 0.027, 0.001, 0.0001, 0.001, 0.001, 0.001, + 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.056, 0.644, 0.007, 0.001, 0.003, 0.001, 0.001, 0.002, 0.003, + 0.013, 0.001, 0.027, 0.001, 0.005, 0.001, 0.001, 0.007, 0.003, 0.004, 0.005, 0.002, 0.003, 0.006, 0.001, 0.004, + 0.002, 0.004, 0.028, 0.008, 0.018, 0.391, 0.002, 0.0001, 0.0001, 0.071, 0.059, 0.881, 1.071, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.005, 0.024, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.054, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "lv": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.879, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.099, 0.004, 0.432, 0.0001, 0.0001, 0.013, 0.002, 0.007, 0.207, 0.208, 0.0001, + 0.003, 0.965, 0.082, 1.276, 0.01, 0.332, 0.476, 0.254, 0.122, 0.117, 0.123, 0.105, 0.106, 0.127, 0.271, 0.045, + 0.023, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.208, 0.134, 0.062, 0.128, 0.074, 0.067, 0.074, 0.058, 0.112, 0.068, + 0.189, 0.194, 0.144, 0.089, 0.055, 0.234, 0.002, 0.136, 0.249, 0.163, 0.042, 0.182, 0.012, 0.007, 0.003, 0.051, + 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 8.58, 1.078, 0.806, 2.221, 4.451, 0.231, 1.228, 0.175, 6.667, + 1.704, 2.603, 2.424, 2.389, 3.209, 2.883, 1.908, 0.003, 4.056, 5.825, 4.121, 3.633, 1.801, 0.012, 0.009, 0.029, + 1.289, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.124, 2.988, 0.003, 0.002, 0.001, 0.006, 0.331, 0.001, 0.002, + 0.001, 0.0001, 0.001, 0.015, 0.083, 0.0001, 0.001, 0.001, 0.001, 0.007, 1.174, 0.07, 0.0001, 0.001, 0.001, + 0.002, 0.003, 0.001, 0.001, 0.005, 0.012, 0.009, 0.001, 0.06, 0.627, 0.004, 0.097, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.002, 0.006, 1.565, 0.0001, 0.002, 0.0001, 0.0001, 0.01, 0.002, 0.005, 0.002, 0.002, 0.005, 0.01, 0.106, + 0.006, 0.002, 0.003, 0.01, 0.298, 0.012, 0.176, 0.002, 0.0001, 0.0001, 0.03, 0.013, 6.068, 1.452, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.051, 0.018, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.11, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "et": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.183, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.759, 0.003, 0.281, 0.0001, 0.0001, 0.013, 0.001, 0.037, 0.198, 0.199, 0.001, + 0.003, 0.786, 0.203, 1.175, 0.017, 0.35, 0.548, 0.272, 0.142, 0.137, 0.143, 0.127, 0.129, 0.154, 0.323, 0.059, + 0.022, 0.017, 0.003, 0.017, 0.003, 0.0001, 0.235, 0.096, 0.074, 0.061, 0.173, 0.056, 0.064, 0.105, 0.122, 0.088, + 0.255, 0.166, 0.186, 0.114, 0.065, 0.208, 0.003, 0.138, 0.296, 0.251, 0.046, 0.167, 0.033, 0.011, 0.008, 0.01, + 0.008, 0.0001, 0.008, 0.0001, 0.004, 0.0001, 9.665, 0.664, 0.152, 2.822, 7.678, 0.189, 1.393, 1.095, 7.816, + 1.25, 3.234, 4.738, 2.585, 4.03, 3.549, 1.167, 0.005, 3.003, 6.68, 5.333, 4.153, 1.613, 0.043, 0.017, 0.074, + 0.045, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.13, 0.015, 0.01, 0.006, 0.004, 0.003, 0.003, 0.004, 0.002, + 0.002, 0.001, 0.002, 0.003, 0.005, 0.001, 0.003, 0.002, 0.002, 0.003, 0.102, 0.002, 0.008, 0.003, 0.003, 0.002, + 0.004, 0.002, 0.001, 0.044, 0.005, 0.006, 0.003, 0.016, 0.035, 0.003, 0.002, 0.833, 0.002, 0.001, 0.002, 0.002, + 0.01, 0.001, 0.006, 0.001, 0.005, 0.001, 0.001, 0.017, 0.004, 0.012, 0.007, 0.005, 0.763, 0.179, 0.003, 0.015, + 0.005, 0.008, 0.007, 0.518, 0.012, 0.028, 0.003, 0.0001, 0.0001, 0.02, 2.358, 0.019, 0.061, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.004, 0.104, 0.037, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.123, 0.001, 0.0001, + 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "hi": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.374, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.123, 0.002, 0.071, 0.0001, 0.001, 0.004, 0.0001, 0.023, 0.08, 0.08, 0.0001, + 0.001, 0.255, 0.072, 0.052, 0.006, 0.068, 0.07, 0.044, 0.02, 0.019, 0.023, 0.019, 0.019, 0.021, 0.04, 0.021, + 0.006, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.008, 0.004, 0.007, 0.004, 0.005, 0.003, 0.004, 0.003, 0.006, 0.001, + 0.002, 0.003, 0.005, 0.004, 0.003, 0.005, 0.0001, 0.003, 0.008, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, + 0.007, 0.0001, 0.008, 0.0001, 0.001, 0.0001, 0.049, 0.007, 0.017, 0.016, 0.052, 0.008, 0.01, 0.017, 0.038, + 0.001, 0.004, 0.024, 0.015, 0.034, 0.035, 0.012, 0.001, 0.033, 0.03, 0.034, 0.015, 0.005, 0.005, 0.002, 0.008, + 0.001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 1.039, 0.443, 1.278, 0.061, 0.0001, 0.273, 0.146, 1.879, 0.535, + 0.214, 0.013, 0.729, 0.054, 1.826, 0.0001, 0.253, 0.014, 0.012, 0.0001, 0.042, 0.14, 2.07, 0.133, 0.43, 0.035, + 0.004, 0.215, 0.046, 0.503, 0.014, 0.016, 0.269, 0.037, 0.213, 0.023, 0.155, 24.777, 7.162, 0.554, 0.224, 1.23, + 0.009, 0.8, 0.117, 0.393, 0.245, 0.995, 0.828, 2.018, 0.001, 0.771, 0.001, 0.001, 0.707, 0.299, 0.18, 1.226, + 0.94, 0.0001, 0.0001, 0.133, 0.001, 2.558, 1.303, 0.0001, 0.0001, 0.008, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.261, 0.0001, 0.024, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ] }; const EXTENSIVE_LANG_FREQS = Object.assign({}, COMMON_LANG_FREQS, { - "aa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.161, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.548, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.452, 0.645, 0.645, 2.581, 9.032, 0.0001, 5.161, 3.871, 5.806, 0.0001, 1.935, 2.581, 1.29, 5.161, 2.581, 1.29, 0.0001, 4.516, 0.645, 3.226, 0.645, 0.0001, 1.29, 0.0001, 0.645, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.581, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.871, 0.645, 2.581, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ab": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.925, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.477, 0.003, 0.06, 0.0001, 0.0001, 0.005, 0.0001, 0.013, 0.269, 0.273, 0.001, 0.001, 0.518, 0.306, 0.76, 0.006, 0.291, 0.709, 0.42, 0.294, 0.242, 0.237, 0.242, 0.222, 0.25, 0.32, 0.04, 0.028, 0.008, 0.0001, 0.008, 0.002, 0.0001, 0.004, 0.004, 0.004, 0.006, 0.001, 0.002, 0.001, 0.001, 0.033, 0.012, 0.001, 0.001, 0.002, 0.001, 0.011, 0.003, 0.0001, 0.002, 0.009, 0.002, 0.002, 0.007, 0.006, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.679, 0.013, 0.02, 0.028, 0.073, 0.002, 0.006, 0.01, 0.057, 0.001, 0.005, 0.035, 0.039, 0.025, 0.031, 0.027, 0.011, 0.045, 0.036, 0.027, 0.037, 0.009, 0.002, 0.01, 0.027, 0.004, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 3.029, 1.109, 1.569, 1.131, 0.085, 0.805, 0.262, 0.083, 0.992, 0.002, 0.003, 2.495, 0.791, 0.003, 0.006, 0.03, 0.654, 0.059, 0.04, 0.137, 0.332, 0.075, 0.041, 0.012, 0.142, 2.586, 0.087, 1.002, 0.086, 0.047, 0.045, 0.323, 0.073, 0.328, 0.016, 0.067, 0.011, 0.052, 0.054, 0.455, 0.024, 0.199, 0.0001, 0.026, 0.015, 0.539, 0.001, 0.001, 7.771, 0.517, 0.209, 1.034, 0.683, 1.368, 0.238, 0.686, 3.093, 0.042, 0.729, 1.305, 0.754, 1.868, 1.136, 0.676, 0.0001, 0.0001, 0.065, 0.019, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.001, 0.155, 0.0001, 0.005, 0.002, 22.83, 11.878, 3.39, 2.86, 0.019, 0.007, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.386, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ace": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.36, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.198, 0.0001, 0.137, 0.0001, 0.001, 0.007, 0.0001, 0.256, 0.125, 0.125, 0.0001, 0.0001, 1.042, 0.179, 1.302, 0.01, 0.401, 0.568, 0.284, 0.118, 0.113, 0.112, 0.099, 0.093, 0.097, 0.13, 0.041, 0.007, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.777, 0.587, 0.153, 0.133, 0.028, 0.036, 0.256, 0.095, 0.205, 0.159, 0.483, 0.331, 0.444, 0.183, 0.028, 0.481, 0.019, 0.179, 0.473, 0.324, 0.101, 0.026, 0.042, 0.006, 0.021, 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 11.224, 1.773, 0.851, 1.583, 5.304, 0.086, 3.693, 3.458, 3.728, 0.528, 2.425, 2.037, 2.4, 8.165, 2.618, 1.607, 0.015, 2.485, 1.74, 2.806, 6.018, 0.112, 0.344, 0.01, 1.486, 0.04, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.039, 0.008, 0.005, 0.009, 0.016, 0.007, 0.006, 0.006, 0.01, 0.004, 0.008, 0.003, 0.002, 0.004, 0.012, 0.004, 0.007, 0.003, 0.004, 0.014, 0.002, 0.001, 0.001, 0.002, 0.004, 0.016, 0.001, 0.001, 0.002, 0.002, 0.001, 0.007, 0.007, 0.006, 0.003, 0.008, 0.005, 0.002, 0.001, 0.019, 1.193, 0.401, 0.007, 0.574, 0.003, 0.006, 0.002, 0.006, 0.025, 0.011, 0.006, 0.008, 0.873, 0.004, 0.151, 0.002, 0.005, 0.005, 0.008, 0.007, 0.004, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.025, 3.205, 0.014, 0.012, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.001, 0.012, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.061, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.011, 0.039, 0.001, 0.001, 0.005, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ady": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.142, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.359, 0.001, 0.089, 0.0001, 0.0001, 0.003, 0.0001, 0.006, 0.111, 0.11, 0.001, 0.001, 0.645, 0.309, 0.862, 0.007, 0.118, 0.279, 0.082, 0.059, 0.052, 0.055, 0.051, 0.045, 0.057, 0.071, 0.053, 0.011, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.008, 0.007, 0.003, 0.003, 0.002, 0.003, 0.0001, 0.002, 1.228, 0.004, 0.001, 0.003, 0.004, 0.002, 0.004, 0.005, 0.0001, 0.001, 0.006, 0.003, 0.002, 0.004, 0.002, 0.008, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.001, 0.0001, 0.05, 0.009, 0.016, 0.02, 0.067, 0.009, 0.011, 0.022, 0.046, 0.001, 0.006, 0.031, 0.02, 0.036, 0.037, 0.013, 0.0001, 0.038, 0.031, 0.043, 0.016, 0.004, 0.008, 0.003, 0.011, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.778, 0.778, 1.192, 2.098, 0.406, 1.886, 0.203, 0.188, 0.585, 0.672, 2.887, 2.927, 0.717, 6.004, 0.019, 0.21, 0.317, 0.122, 0.019, 0.226, 0.145, 0.045, 0.02, 0.041, 0.09, 0.005, 0.262, 0.059, 0.092, 0.079, 0.053, 0.07, 0.076, 0.092, 0.086, 0.055, 0.029, 0.124, 0.039, 0.031, 0.045, 0.011, 0.0001, 0.031, 0.0001, 0.018, 0.005, 0.018, 2.762, 0.645, 0.171, 1.681, 0.855, 1.134, 0.39, 0.89, 1.618, 0.147, 1.755, 1.169, 1.845, 1.192, 0.989, 0.792, 0.0001, 0.0001, 0.094, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.0001, 0.003, 0.004, 0.0001, 0.0001, 20.033, 23.044, 0.001, 0.227, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.229, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "af": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.732, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.494, 0.002, 0.361, 0.0001, 0.001, 0.008, 0.001, 0.297, 0.136, 0.136, 0.002, 0.001, 0.651, 0.269, 0.893, 0.01, 0.25, 0.371, 0.17, 0.095, 0.09, 0.104, 0.09, 0.086, 0.122, 0.213, 0.049, 0.019, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.241, 0.154, 0.103, 0.382, 0.093, 0.072, 0.119, 0.168, 0.14, 0.087, 0.137, 0.088, 0.157, 0.131, 0.103, 0.129, 0.004, 0.104, 0.29, 0.11, 0.03, 0.115, 0.083, 0.006, 0.008, 0.015, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 6.202, 1.128, 0.17, 4.12, 13.284, 0.609, 2.484, 1.201, 6.602, 0.17, 2.299, 2.976, 1.671, 6.221, 4.571, 1.147, 0.006, 5.197, 4.908, 4.263, 1.7, 1.691, 1.336, 0.018, 0.832, 0.043, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.182, 0.005, 0.004, 0.003, 0.002, 0.001, 0.001, 0.001, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.024, 0.002, 0.001, 0.001, 0.001, 0.003, 0.118, 0.001, 0.001, 0.017, 0.016, 0.001, 0.001, 0.076, 0.018, 0.001, 0.005, 0.004, 0.002, 0.002, 0.003, 0.003, 0.032, 0.053, 0.119, 0.001, 0.004, 0.001, 0.014, 0.007, 0.003, 0.004, 0.007, 0.002, 0.003, 0.005, 0.001, 0.005, 0.002, 0.003, 0.003, 0.007, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.084, 0.264, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.003, 0.001, 0.0001, 0.009, 0.004, 0.022, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.181, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ak": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.856, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.14, 0.001, 0.181, 0.0001, 0.002, 0.004, 0.001, 0.124, 0.134, 0.137, 0.001, 0.0001, 0.719, 0.119, 1.218, 0.014, 0.179, 0.257, 0.137, 0.052, 0.061, 0.075, 0.065, 0.054, 0.059, 0.197, 0.031, 0.029, 0.002, 0.015, 0.002, 0.018, 0.0001, 0.566, 0.167, 0.173, 0.118, 0.172, 0.085, 0.258, 0.093, 0.098, 0.056, 0.193, 0.111, 0.204, 0.399, 0.102, 0.121, 0.012, 0.083, 0.271, 0.145, 0.084, 0.04, 0.206, 0.011, 0.078, 0.02, 0.025, 0.0001, 0.025, 0.0001, 0.0001, 0.0001, 10.911, 1.752, 0.404, 1.704, 5.791, 1.18, 0.501, 1.542, 4.479, 0.04, 1.975, 0.667, 3.211, 7.434, 5.302, 0.888, 0.03, 2.693, 2.695, 1.838, 2.674, 0.126, 2.695, 0.023, 2.4, 0.077, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.046, 0.01, 0.002, 0.005, 0.002, 0.006, 0.095, 0.003, 0.01, 0.003, 0.006, 0.011, 0.002, 0.017, 0.002, 0.004, 0.052, 0.011, 0.001, 0.002, 1.774, 0.002, 0.002, 0.001, 0.0001, 0.02, 0.0001, 1.749, 0.01, 0.01, 0.0001, 0.0001, 0.151, 0.004, 0.001, 0.002, 0.006, 0.022, 0.001, 0.003, 0.005, 0.01, 0.002, 0.003, 0.002, 0.005, 0.001, 0.003, 0.01, 0.006, 0.005, 0.012, 0.015, 0.552, 0.007, 0.003, 0.008, 0.006, 0.006, 0.392, 0.013, 0.005, 0.007, 0.004, 0.0001, 0.0001, 0.146, 0.054, 0.004, 0.004, 0.139, 0.0001, 0.0001, 3.532, 0.002, 0.008, 0.003, 0.34, 0.547, 0.0001, 0.045, 0.018, 0.0001, 0.0001, 0.018, 0.055, 0.008, 0.002, 0.016, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.048, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "als": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.981, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.805, 0.003, 0.368, 0.0001, 0.0001, 0.09, 0.001, 0.06, 0.177, 0.177, 0.009, 0.001, 0.909, 0.215, 1.001, 0.022, 0.318, 0.46, 0.232, 0.128, 0.122, 0.132, 0.116, 0.119, 0.142, 0.206, 0.063, 0.024, 0.004, 0.003, 0.004, 0.001, 0.0001, 0.315, 0.452, 0.163, 0.512, 0.205, 0.236, 0.319, 0.219, 0.188, 0.156, 0.222, 0.212, 0.32, 0.172, 0.112, 0.199, 0.01, 0.225, 0.653, 0.132, 0.131, 0.173, 0.23, 0.004, 0.019, 0.129, 0.009, 0.0001, 0.009, 0.0001, 0.003, 0.001, 3.964, 1.276, 2.626, 3.453, 8.363, 1.057, 2.308, 3.744, 6.377, 0.069, 0.66, 2.78, 2.213, 4.452, 3.12, 0.516, 0.012, 5.572, 4.629, 4.341, 2.669, 0.935, 0.979, 0.046, 0.315, 0.925, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.124, 0.003, 0.002, 0.002, 0.034, 0.001, 0.001, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.023, 0.002, 0.001, 0.01, 0.001, 0.003, 0.02, 0.003, 0.002, 0.048, 0.001, 0.034, 0.042, 0.156, 0.005, 0.005, 0.003, 1.018, 0.003, 0.001, 0.003, 0.354, 0.039, 0.002, 0.022, 0.079, 0.004, 0.001, 0.002, 0.004, 0.003, 0.015, 0.003, 0.029, 0.017, 0.333, 0.001, 0.002, 0.045, 0.004, 0.015, 0.5, 0.004, 0.001, 0.002, 0.0001, 0.0001, 0.108, 2.635, 0.006, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.011, 0.005, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.12, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "am": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.067, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.441, 0.005, 0.08, 0.001, 0.0001, 0.003, 0.0001, 0.013, 0.12, 0.121, 0.002, 0.001, 0.021, 0.111, 0.25, 0.041, 0.102, 0.167, 0.089, 0.049, 0.044, 0.048, 0.044, 0.043, 0.057, 0.081, 0.018, 0.001, 0.048, 0.019, 0.048, 0.008, 0.0001, 0.009, 0.005, 0.007, 0.005, 0.005, 0.004, 0.003, 0.003, 0.004, 0.004, 0.002, 0.003, 0.006, 0.003, 0.002, 0.004, 0.001, 0.003, 0.007, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.017, 0.0001, 0.02, 0.0001, 0.007, 0.0001, 0.059, 0.06, 0.021, 0.018, 0.066, 0.009, 0.014, 0.02, 0.05, 0.001, 0.005, 0.029, 0.021, 0.042, 0.045, 0.014, 0.001, 0.09, 0.032, 0.04, 0.026, 0.005, 0.007, 0.003, 0.012, 0.002, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.402, 0.178, 0.052, 0.194, 0.053, 0.478, 0.259, 0.003, 10.51, 5.557, 5.996, 6.414, 2.305, 3.741, 0.258, 0.015, 0.706, 0.091, 0.071, 0.613, 0.064, 1.598, 0.107, 0.008, 0.907, 0.126, 0.312, 0.688, 0.12, 0.989, 0.129, 0.009, 2.006, 0.213, 0.679, 0.599, 0.206, 1.204, 0.134, 0.012, 1.72, 0.213, 0.231, 1.059, 0.087, 1.793, 0.284, 0.013, 1.151, 0.255, 0.312, 0.726, 0.115, 2.127, 0.177, 0.025, 0.19, 0.059, 0.032, 0.208, 0.015, 0.466, 0.016, 0.003, 0.0001, 0.0001, 0.096, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.005, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.017, 0.046, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 29.467, 0.047, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.001, 0.0001, 0.017, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "an": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.253, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.49, 0.005, 0.725, 0.0001, 0.0001, 0.005, 0.001, 0.998, 0.246, 0.246, 0.002, 0.002, 1.083, 0.164, 0.685, 0.057, 0.291, 0.382, 0.213, 0.125, 0.12, 0.124, 0.115, 0.119, 0.131, 0.221, 0.057, 0.029, 0.007, 0.01, 0.006, 0.001, 0.0001, 0.411, 0.169, 0.298, 0.091, 0.216, 0.095, 0.1, 0.059, 0.154, 0.037, 0.024, 0.177, 0.199, 0.072, 0.146, 0.19, 0.011, 0.122, 0.227, 0.128, 0.065, 0.101, 0.021, 0.037, 0.032, 0.028, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 9.483, 1.074, 3.3, 3.436, 7.765, 0.618, 0.822, 0.72, 5.365, 0.027, 0.17, 3.124, 1.916, 5.869, 6.23, 1.654, 0.435, 4.741, 4.813, 3.981, 2.96, 0.573, 0.028, 0.256, 1.248, 0.309, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.014, 0.007, 0.003, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.002, 0.028, 0.174, 0.002, 0.002, 0.003, 0.001, 0.001, 0.008, 0.012, 0.227, 0.002, 0.014, 0.002, 0.209, 0.001, 0.002, 0.004, 0.013, 0.086, 0.54, 0.002, 0.002, 0.003, 0.002, 0.004, 0.002, 0.027, 0.014, 0.019, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.127, 1.249, 0.007, 0.007, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.009, 0.005, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.013, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ang": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.542, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.629, 0.001, 0.406, 0.001, 0.001, 0.005, 0.001, 0.041, 0.166, 0.166, 0.001, 0.001, 0.772, 0.085, 0.973, 0.007, 0.229, 0.292, 0.152, 0.081, 0.082, 0.095, 0.083, 0.089, 0.101, 0.139, 0.058, 0.032, 0.011, 0.001, 0.011, 0.001, 0.0001, 0.204, 0.193, 0.317, 0.089, 0.179, 0.148, 0.229, 0.279, 0.189, 0.034, 0.031, 0.128, 0.195, 0.168, 0.087, 0.103, 0.007, 0.125, 0.419, 0.122, 0.043, 0.034, 0.145, 0.006, 0.012, 0.007, 0.02, 0.0001, 0.02, 0.0001, 0.0001, 0.0001, 5.666, 0.997, 2.318, 3.22, 8.139, 1.491, 2.061, 1.574, 3.89, 0.022, 0.109, 2.731, 2.332, 6.4, 3.389, 0.62, 0.014, 4.435, 4.532, 3.015, 1.701, 0.127, 1.341, 0.09, 0.658, 0.04, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.032, 0.62, 0.006, 0.006, 0.004, 0.003, 0.052, 0.002, 0.001, 0.001, 0.002, 0.033, 0.008, 0.478, 0.002, 0.002, 0.01, 0.003, 0.05, 1.069, 0.004, 0.001, 0.004, 0.002, 0.003, 0.003, 0.011, 0.012, 0.009, 0.068, 0.141, 0.003, 0.009, 0.037, 0.013, 0.751, 0.006, 0.002, 1.085, 0.003, 0.002, 0.01, 0.039, 0.996, 0.002, 0.008, 0.002, 0.002, 0.371, 0.007, 0.005, 0.069, 0.002, 0.003, 0.002, 0.008, 0.006, 0.003, 0.005, 0.004, 0.005, 0.004, 2.003, 0.078, 0.0001, 0.0001, 0.009, 3.7, 2.566, 0.742, 0.075, 0.766, 0.127, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.012, 0.006, 0.017, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.024, 0.022, 0.003, 0.001, 0.003, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "arc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.038, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.39, 0.001, 0.055, 0.0001, 0.0001, 0.007, 0.0001, 0.005, 0.294, 0.294, 0.0001, 0.0001, 0.039, 0.041, 0.295, 0.017, 0.207, 0.161, 0.078, 0.046, 0.044, 0.053, 0.042, 0.044, 0.043, 0.091, 0.189, 0.006, 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.01, 0.01, 0.013, 0.007, 0.004, 0.004, 0.006, 0.005, 0.007, 0.003, 0.005, 0.008, 0.011, 0.008, 0.004, 0.008, 0.001, 0.007, 0.013, 0.004, 0.003, 0.005, 0.004, 0.001, 0.001, 0.002, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.107, 0.013, 0.023, 0.039, 0.088, 0.011, 0.022, 0.025, 0.081, 0.003, 0.021, 0.05, 0.023, 0.07, 0.066, 0.018, 0.002, 0.062, 0.042, 0.051, 0.032, 0.013, 0.011, 0.006, 0.012, 0.006, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.359, 0.027, 0.139, 0.022, 0.095, 0.021, 0.095, 0.051, 0.776, 0.005, 0.029, 0.002, 0.032, 0.003, 0.011, 0.005, 6.959, 0.008, 1.918, 0.561, 0.013, 2.47, 0.003, 1.261, 3.75, 0.282, 0.787, 0.504, 0.018, 4.683, 0.009, 0.786, 1.796, 2.249, 2.761, 0.874, 0.009, 1.007, 0.747, 0.053, 0.199, 0.858, 2.538, 1.15, 2.879, 0.016, 0.009, 0.021, 0.023, 0.056, 0.023, 0.019, 0.01, 0.046, 0.007, 0.011, 0.024, 0.035, 0.015, 0.012, 0.048, 0.023, 0.008, 0.047, 0.0001, 0.0001, 0.004, 0.019, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.832, 0.001, 0.126, 0.053, 0.042, 0.017, 0.001, 0.0001, 0.0001, 0.009, 0.024, 0.108, 0.212, 0.141, 0.001, 0.004, 41.501, 0.031, 0.0001, 0.0001, 0.002, 0.019, 0.018, 0.0001, 0.001, 0.004, 0.004, 0.0001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "arz": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.739, 0.003, 0.126, 0.0001, 0.0001, 0.004, 0.001, 0.003, 0.118, 0.124, 0.002, 0.001, 0.064, 0.045, 0.405, 0.01, 0.141, 0.269, 0.129, 0.067, 0.063, 0.072, 0.064, 0.065, 0.08, 0.165, 0.039, 0.002, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.012, 0.009, 0.011, 0.008, 0.005, 0.005, 0.005, 0.006, 0.006, 0.005, 0.004, 0.009, 0.011, 0.005, 0.003, 0.007, 0.0001, 0.006, 0.013, 0.009, 0.001, 0.004, 0.004, 0.001, 0.001, 0.001, 0.006, 0.001, 0.006, 0.0001, 0.002, 0.0001, 0.091, 0.01, 0.025, 0.026, 0.093, 0.01, 0.015, 0.024, 0.072, 0.002, 0.01, 0.045, 0.023, 0.064, 0.06, 0.013, 0.001, 0.06, 0.046, 0.047, 0.027, 0.009, 0.007, 0.004, 0.017, 0.005, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.111, 1.136, 0.763, 1.043, 4.458, 2.752, 2.413, 1.721, 2.708, 1.077, 3.156, 0.021, 0.238, 0.002, 0.017, 0.028, 0.008, 0.018, 0.006, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.003, 0.003, 0.004, 0.0001, 0.003, 0.019, 0.06, 0.018, 0.274, 0.041, 0.116, 0.08, 6.51, 1.771, 0.79, 1.749, 0.151, 0.593, 0.743, 0.294, 1.313, 0.079, 2.202, 0.292, 1.274, 0.493, 0.453, 0.187, 0.361, 0.078, 1.267, 0.19, 0.005, 0.002, 0.002, 0.011, 0.002, 0.0001, 0.0001, 0.025, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.004, 0.01, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.004, 21.565, 21.383, 0.022, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.029, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "as": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.296, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.811, 0.001, 0.086, 0.0001, 0.0001, 0.005, 0.0001, 0.083, 0.075, 0.077, 0.0001, 0.001, 0.203, 0.086, 0.044, 0.006, 0.008, 0.009, 0.006, 0.004, 0.003, 0.003, 0.002, 0.002, 0.003, 0.004, 0.022, 0.007, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.015, 0.009, 0.013, 0.007, 0.006, 0.005, 0.005, 0.006, 0.011, 0.003, 0.003, 0.005, 0.01, 0.007, 0.004, 0.011, 0.001, 0.008, 0.013, 0.013, 0.003, 0.002, 0.004, 0.0001, 0.001, 0.001, 0.01, 0.0001, 0.01, 0.0001, 0.001, 0.0001, 0.213, 0.031, 0.074, 0.083, 0.255, 0.044, 0.045, 0.095, 0.18, 0.004, 0.017, 0.099, 0.058, 0.166, 0.164, 0.046, 0.002, 0.151, 0.14, 0.179, 0.063, 0.023, 0.027, 0.005, 0.036, 0.003, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.537, 0.769, 0.261, 0.102, 0.001, 0.242, 0.382, 1.586, 0.215, 0.133, 0.002, 0.429, 0.033, 1.928, 0.026, 0.213, 0.004, 0.0001, 0.0001, 0.14, 0.003, 1.299, 0.21, 0.401, 0.056, 0.073, 0.394, 0.328, 0.382, 0.006, 0.051, 0.353, 0.081, 0.128, 0.02, 0.231, 1.75, 0.525, 21.552, 9.182, 1.32, 0.031, 0.846, 0.112, 0.982, 0.29, 0.858, 1.027, 2.855, 0.297, 0.931, 0.0001, 0.0001, 0.0001, 0.293, 0.318, 0.674, 0.559, 0.001, 0.0001, 0.584, 0.0001, 2.717, 1.766, 0.0001, 0.0001, 0.009, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.161, 0.0001, 0.072, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ast": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.724, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.007, 0.002, 0.424, 0.002, 0.001, 0.01, 0.003, 0.548, 0.156, 0.156, 0.002, 0.003, 1.046, 0.096, 0.743, 0.015, 0.245, 0.288, 0.158, 0.086, 0.078, 0.093, 0.076, 0.077, 0.093, 0.166, 0.056, 0.032, 0.002, 0.005, 0.002, 0.002, 0.0001, 0.218, 0.121, 0.236, 0.117, 0.257, 0.089, 0.088, 0.078, 0.115, 0.051, 0.038, 0.23, 0.167, 0.117, 0.051, 0.161, 0.007, 0.094, 0.198, 0.134, 0.043, 0.06, 0.041, 0.061, 0.037, 0.011, 0.014, 0.0001, 0.014, 0.0001, 0.001, 0.0001, 8.074, 0.835, 3.151, 3.345, 9.578, 0.701, 0.803, 0.452, 5.046, 0.025, 0.11, 4.637, 2.087, 5.542, 5.253, 1.877, 0.488, 4.828, 5.384, 3.477, 3.909, 0.672, 0.055, 0.4, 0.967, 0.259, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.04, 0.01, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.01, 0.01, 0.001, 0.0001, 0.001, 0.002, 0.009, 0.001, 0.001, 0.005, 0.006, 0.0001, 0.001, 0.026, 0.531, 0.001, 0.001, 0.002, 0.001, 0.002, 0.002, 0.002, 0.291, 0.001, 0.019, 0.001, 0.46, 0.001, 0.001, 0.005, 0.157, 0.004, 0.608, 0.002, 0.002, 0.003, 0.002, 0.004, 0.002, 0.119, 0.021, 0.027, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.073, 2.207, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.012, 0.005, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.039, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "atj": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.34, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.835, 0.0001, 0.034, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.045, 0.047, 0.0001, 0.0001, 0.548, 0.045, 1.11, 0.006, 0.039, 0.075, 0.033, 0.013, 0.017, 0.015, 0.02, 0.018, 0.017, 0.061, 0.024, 0.003, 0.015, 0.0001, 0.015, 0.002, 0.0001, 0.175, 0.012, 0.062, 0.025, 0.193, 0.022, 0.01, 0.006, 0.035, 0.021, 0.212, 0.019, 0.332, 0.208, 0.141, 0.099, 0.007, 0.017, 0.034, 0.12, 0.001, 0.003, 0.089, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 11.805, 0.044, 6.264, 0.083, 5.028, 0.008, 0.026, 0.952, 15.443, 0.004, 9.886, 0.134, 2.846, 5.167, 5.337, 2.131, 0.022, 2.079, 2.27, 7.277, 0.131, 0.025, 4.581, 0.005, 0.015, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.009, 0.046, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.069, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "av": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.031, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.23, 0.001, 0.083, 0.0001, 0.0001, 0.007, 0.001, 0.001, 0.166, 0.166, 0.001, 0.001, 0.458, 0.25, 0.562, 0.01, 0.133, 0.234, 0.149, 0.084, 0.058, 0.065, 0.053, 0.053, 0.06, 0.094, 0.055, 0.017, 0.001, 0.003, 0.001, 0.003, 0.0001, 0.011, 0.006, 0.01, 0.003, 0.003, 0.003, 0.003, 0.002, 0.777, 0.001, 0.002, 0.002, 0.006, 0.003, 0.003, 0.002, 0.0001, 0.002, 0.007, 0.008, 0.003, 0.006, 0.001, 0.011, 0.001, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.009, 0.0001, 0.075, 0.008, 0.02, 0.025, 0.067, 0.007, 0.015, 0.018, 0.067, 0.001, 0.008, 0.038, 0.014, 0.043, 0.038, 0.019, 0.001, 0.041, 0.043, 0.036, 0.031, 0.01, 0.006, 0.003, 0.01, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.671, 1.227, 0.995, 2.675, 0.059, 0.905, 0.851, 0.335, 0.128, 0.084, 1.771, 0.03, 0.884, 0.039, 0.044, 0.818, 0.134, 0.075, 0.027, 0.273, 0.227, 0.015, 0.029, 0.016, 0.039, 0.006, 0.125, 0.043, 0.127, 0.032, 0.014, 0.032, 0.185, 0.089, 0.062, 0.016, 0.021, 0.082, 0.047, 0.033, 0.042, 0.006, 0.002, 0.039, 0.002, 0.019, 0.005, 0.013, 7.089, 1.927, 0.825, 1.964, 1.317, 1.929, 0.263, 0.636, 2.852, 0.187, 1.471, 3.734, 0.878, 1.983, 1.647, 0.208, 0.0001, 0.0001, 0.195, 0.006, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.022, 0.0001, 0.001, 0.0001, 30.778, 12.343, 0.0001, 0.534, 0.0001, 0.002, 0.0001, 0.001, 0.025, 0.022, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.177, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ay": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.588, 0.005, 0.247, 0.0001, 0.0001, 0.0001, 0.027, 1.72, 0.603, 0.602, 0.046, 0.001, 1.21, 0.158, 1.031, 0.021, 0.387, 0.817, 0.515, 0.316, 0.306, 0.36, 0.273, 0.279, 0.341, 0.428, 0.504, 0.129, 0.064, 0.005, 0.064, 0.147, 0.0001, 0.442, 0.126, 0.339, 0.185, 0.072, 0.071, 0.077, 0.1, 0.109, 0.302, 0.254, 0.268, 0.282, 0.145, 0.064, 0.43, 0.127, 0.121, 0.288, 0.2, 0.25, 0.05, 0.191, 0.012, 0.11, 0.013, 0.007, 0.0001, 0.008, 0.0001, 0.002, 0.004, 14.491, 0.243, 1.49, 0.745, 1.57, 0.085, 0.27, 2.104, 6.268, 1.613, 3.058, 2.342, 2.397, 3.14, 1.316, 1.65, 1.821, 3.874, 4.07, 2.906, 5.224, 0.153, 1.248, 0.859, 2.145, 0.119, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.211, 0.009, 0.003, 0.004, 0.002, 0.001, 0.002, 0.002, 0.003, 0.002, 0.001, 0.002, 0.002, 0.003, 0.002, 0.002, 0.004, 0.008, 0.001, 0.016, 0.006, 0.002, 0.001, 0.001, 0.005, 0.126, 0.002, 0.002, 0.008, 0.019, 0.001, 0.001, 0.061, 0.068, 0.001, 0.003, 0.22, 0.002, 0.002, 0.004, 0.004, 0.062, 0.002, 0.003, 0.001, 0.11, 0.003, 0.049, 0.044, 0.259, 0.029, 0.076, 0.026, 0.004, 0.004, 0.007, 0.009, 0.003, 0.038, 0.01, 0.012, 0.003, 0.005, 0.006, 0.0001, 0.0001, 0.133, 0.88, 0.003, 0.004, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.006, 0.002, 0.031, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.004, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.01, 0.003, 0.207, 0.001, 0.004, 0.008, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "az": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.803, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.785, 0.003, 0.222, 0.0001, 0.001, 0.009, 0.001, 0.007, 0.139, 0.141, 0.001, 0.002, 0.64, 0.404, 0.91, 0.014, 0.244, 0.339, 0.188, 0.096, 0.09, 0.102, 0.087, 0.087, 0.102, 0.202, 0.038, 0.019, 0.004, 0.002, 0.004, 0.004, 0.0001, 0.276, 0.242, 0.068, 0.094, 0.057, 0.061, 0.057, 0.095, 0.062, 0.008, 0.127, 0.055, 0.202, 0.081, 0.086, 0.077, 0.107, 0.098, 0.172, 0.115, 0.037, 0.055, 0.005, 0.062, 0.066, 0.023, 0.006, 0.0001, 0.006, 0.0001, 0.004, 0.001, 7.007, 1.378, 0.673, 3.497, 1.722, 0.535, 0.389, 0.748, 6.853, 0.041, 1.544, 4.525, 2.336, 5.203, 1.602, 0.396, 1.07, 4.974, 2.444, 2.338, 1.812, 1.06, 0.008, 0.478, 1.947, 0.87, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.147, 0.01, 0.009, 0.005, 0.005, 0.009, 0.003, 0.033, 0.002, 0.001, 0.001, 0.003, 0.002, 0.001, 0.002, 0.082, 0.004, 0.001, 0.002, 0.028, 0.04, 0.001, 0.012, 0.001, 0.002, 6.259, 0.001, 0.001, 0.046, 0.034, 0.075, 1.454, 0.026, 0.003, 0.003, 0.001, 0.001, 0.001, 0.001, 0.485, 0.001, 0.001, 0.001, 0.011, 0.002, 0.016, 0.001, 0.001, 0.187, 2.533, 0.009, 0.004, 0.005, 0.028, 0.457, 0.003, 0.014, 0.003, 0.01, 0.017, 1.158, 0.011, 0.03, 0.004, 0.0001, 0.0001, 0.067, 2.145, 2.985, 1.196, 0.079, 0.0001, 0.0001, 6.24, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.207, 0.052, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.001, 0.008, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.14, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "azb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.225, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.112, 0.002, 0.032, 0.0001, 0.0001, 0.003, 0.0001, 0.002, 0.275, 0.275, 0.002, 0.001, 0.028, 0.165, 0.744, 0.053, 0.037, 0.078, 0.041, 0.038, 0.027, 0.033, 0.024, 0.023, 0.03, 0.03, 0.059, 0.003, 0.004, 0.001, 0.003, 0.0001, 0.0001, 0.005, 0.004, 0.007, 0.004, 0.002, 0.002, 0.002, 0.003, 0.008, 0.002, 0.002, 0.004, 0.004, 0.003, 0.001, 0.007, 0.001, 0.004, 0.011, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.022, 0.0001, 0.096, 0.009, 0.017, 0.038, 0.09, 0.012, 0.02, 0.043, 0.1, 0.0001, 0.026, 0.053, 0.017, 0.052, 0.064, 0.04, 0.001, 0.055, 0.055, 0.106, 0.015, 0.003, 0.052, 0.004, 0.018, 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.77, 0.455, 0.528, 0.028, 2.648, 1.417, 3.922, 1.536, 3.205, 0.004, 0.23, 0.004, 7.975, 0.001, 0.011, 0.01, 0.002, 0.06, 0.27, 0.013, 0.004, 0.001, 0.0001, 0.0001, 0.033, 0.002, 0.0001, 0.023, 0.001, 0.001, 0.0001, 0.002, 0.02, 0.007, 0.378, 0.004, 0.281, 0.002, 0.413, 5.027, 1.244, 0.85, 1.199, 0.132, 0.444, 0.158, 0.386, 2.668, 0.253, 3.47, 0.613, 1.73, 0.767, 0.17, 0.092, 0.269, 0.09, 0.326, 0.153, 0.08, 0.001, 0.001, 0.271, 0.002, 0.0001, 0.0001, 0.181, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 18.661, 14.13, 1.511, 8.604, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.763, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ba": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.692, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.933, 0.002, 0.044, 0.0001, 0.0001, 0.005, 0.0001, 0.001, 0.147, 0.147, 0.0001, 0.004, 0.482, 0.143, 0.604, 0.015, 0.158, 0.244, 0.135, 0.077, 0.08, 0.076, 0.061, 0.06, 0.081, 0.125, 0.052, 0.011, 0.008, 0.003, 0.008, 0.001, 0.0001, 0.003, 0.003, 0.006, 0.002, 0.002, 0.001, 0.002, 0.002, 0.025, 0.001, 0.002, 0.002, 0.003, 0.002, 0.001, 0.002, 0.0001, 0.001, 0.004, 0.005, 0.004, 0.007, 0.001, 0.012, 0.0001, 0.001, 0.006, 0.0001, 0.006, 0.0001, 0.002, 0.0001, 0.021, 0.003, 0.012, 0.011, 0.026, 0.004, 0.004, 0.006, 0.021, 0.001, 0.003, 0.02, 0.007, 0.023, 0.02, 0.005, 0.0001, 0.016, 0.01, 0.014, 0.014, 0.002, 0.003, 0.001, 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.739, 1.424, 2.096, 1.348, 0.183, 0.244, 0.115, 0.088, 0.621, 0.006, 0.016, 3.259, 0.202, 0.093, 0.068, 0.404, 0.112, 0.175, 0.076, 1.0, 0.273, 0.018, 0.005, 0.012, 0.081, 3.093, 0.13, 0.026, 0.084, 0.041, 0.082, 0.063, 0.299, 0.879, 0.098, 0.434, 0.038, 0.036, 0.005, 0.017, 0.043, 0.504, 0.0001, 0.196, 0.001, 0.016, 0.036, 0.445, 4.844, 0.952, 0.303, 0.533, 0.952, 2.488, 0.102, 0.15, 1.49, 1.18, 1.231, 3.558, 1.237, 2.847, 1.277, 0.365, 0.0001, 0.0001, 0.244, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.004, 0.0001, 0.002, 0.001, 24.156, 12.667, 4.154, 3.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.235, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bar": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.604, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.871, 0.004, 0.418, 0.0001, 0.0001, 0.008, 0.002, 0.216, 0.21, 0.21, 0.009, 0.001, 0.803, 0.202, 1.146, 0.023, 0.266, 0.394, 0.199, 0.121, 0.109, 0.119, 0.109, 0.117, 0.138, 0.187, 0.117, 0.02, 0.004, 0.005, 0.004, 0.003, 0.0001, 0.352, 0.447, 0.201, 0.532, 0.247, 0.245, 0.332, 0.228, 0.204, 0.156, 0.293, 0.235, 0.338, 0.204, 0.224, 0.214, 0.034, 0.205, 0.697, 0.181, 0.119, 0.18, 0.276, 0.005, 0.01, 0.114, 0.021, 0.0001, 0.021, 0.0001, 0.003, 0.003, 8.177, 1.169, 1.993, 4.065, 6.625, 1.095, 2.102, 3.003, 6.12, 0.162, 0.941, 2.0, 2.327, 6.606, 4.578, 0.55, 0.014, 3.249, 4.677, 4.042, 3.018, 0.854, 1.171, 0.071, 0.239, 0.864, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.102, 0.003, 0.003, 0.002, 0.004, 0.004, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.014, 0.001, 0.001, 0.016, 0.001, 0.002, 0.009, 0.001, 0.001, 0.039, 0.001, 0.036, 0.116, 0.061, 0.007, 0.003, 0.001, 0.274, 0.073, 0.002, 0.002, 0.004, 0.027, 0.002, 0.002, 0.002, 0.004, 0.001, 0.001, 0.004, 0.002, 0.01, 0.016, 0.006, 0.001, 0.154, 0.002, 0.005, 0.001, 0.002, 0.002, 0.176, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.07, 0.891, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.103, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bcl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.379, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.071, 0.002, 0.217, 0.001, 0.003, 0.005, 0.002, 0.116, 0.161, 0.16, 0.0001, 0.001, 0.914, 0.25, 0.911, 0.022, 0.337, 0.439, 0.274, 0.132, 0.116, 0.128, 0.121, 0.133, 0.144, 0.229, 0.055, 0.02, 0.017, 0.001, 0.017, 0.022, 0.0001, 0.585, 0.233, 0.246, 0.128, 0.11, 0.148, 0.111, 0.118, 0.238, 0.077, 0.175, 0.149, 0.27, 0.198, 0.07, 0.296, 0.013, 0.12, 0.508, 0.14, 0.057, 0.048, 0.04, 0.004, 0.02, 0.015, 0.025, 0.0001, 0.025, 0.0001, 0.0001, 0.0001, 15.454, 1.486, 0.494, 1.897, 2.968, 0.126, 4.169, 0.861, 6.432, 0.033, 2.688, 2.392, 2.068, 10.392, 5.039, 1.872, 0.022, 3.21, 4.66, 2.796, 1.875, 0.174, 0.643, 0.021, 1.752, 0.121, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.039, 0.006, 0.003, 0.003, 0.005, 0.004, 0.002, 0.003, 0.009, 0.002, 0.004, 0.002, 0.003, 0.004, 0.003, 0.002, 0.007, 0.003, 0.002, 0.009, 0.004, 0.002, 0.001, 0.002, 0.002, 0.008, 0.004, 0.003, 0.013, 0.011, 0.003, 0.001, 0.027, 0.035, 0.013, 0.004, 0.005, 0.003, 0.003, 0.006, 0.004, 0.006, 0.004, 0.003, 0.007, 0.019, 0.005, 0.003, 0.005, 0.018, 0.01, 0.022, 0.014, 0.003, 0.004, 0.003, 0.01, 0.004, 0.006, 0.004, 0.005, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.019, 0.136, 0.005, 0.006, 0.0001, 0.0001, 0.0001, 0.011, 0.004, 0.01, 0.002, 0.0001, 0.006, 0.003, 0.016, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.017, 0.012, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.007, 0.034, 0.001, 0.008, 0.01, 0.006, 0.004, 0.002, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "be": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.607, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.35, 0.001, 0.055, 0.0001, 0.0001, 0.006, 0.0001, 0.05, 0.155, 0.156, 0.001, 0.002, 0.628, 0.121, 0.612, 0.009, 0.188, 0.295, 0.148, 0.088, 0.085, 0.087, 0.076, 0.074, 0.089, 0.156, 0.032, 0.017, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.009, 0.006, 0.026, 0.004, 0.005, 0.003, 0.019, 0.003, 0.047, 0.001, 0.002, 0.004, 0.009, 0.01, 0.004, 0.01, 0.0001, 0.005, 0.013, 0.005, 0.003, 0.013, 0.004, 0.018, 0.001, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 0.046, 0.006, 0.014, 0.013, 0.042, 0.007, 0.007, 0.01, 0.04, 0.001, 0.006, 0.023, 0.014, 0.029, 0.035, 0.009, 0.001, 0.032, 0.024, 0.024, 0.019, 0.004, 0.003, 0.002, 0.006, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.314, 1.922, 1.481, 1.13, 0.14, 0.481, 1.007, 0.569, 0.351, 0.001, 0.001, 1.93, 0.479, 0.541, 0.221, 1.357, 0.128, 0.261, 0.085, 0.08, 0.203, 0.012, 2.438, 0.059, 0.001, 0.01, 0.103, 0.048, 0.097, 0.076, 0.995, 0.141, 0.181, 0.137, 0.046, 0.12, 0.029, 0.02, 0.016, 0.019, 0.023, 0.001, 0.0001, 0.081, 0.0001, 0.017, 0.007, 0.023, 7.12, 0.583, 1.325, 0.884, 1.382, 1.613, 0.241, 1.022, 0.011, 0.528, 1.726, 1.757, 1.251, 2.924, 1.397, 1.062, 0.0001, 0.0001, 0.283, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.021, 0.0001, 0.002, 0.001, 26.294, 17.28, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.156, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.941, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.272, 0.0001, 0.067, 0.0001, 0.001, 0.014, 0.0001, 0.006, 0.074, 0.074, 0.0001, 0.001, 0.205, 0.047, 0.036, 0.005, 0.139, 0.215, 0.134, 0.072, 0.07, 0.074, 0.065, 0.069, 0.075, 0.087, 0.017, 0.007, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.006, 0.004, 0.005, 0.002, 0.003, 0.002, 0.004, 0.002, 0.007, 0.001, 0.002, 0.003, 0.003, 0.003, 0.002, 0.004, 0.0001, 0.002, 0.006, 0.006, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.009, 0.0001, 0.1, 0.014, 0.029, 0.038, 0.115, 0.019, 0.024, 0.049, 0.081, 0.001, 0.007, 0.043, 0.023, 0.079, 0.071, 0.019, 0.001, 0.072, 0.065, 0.081, 0.029, 0.011, 0.014, 0.002, 0.014, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.902, 0.534, 1.035, 0.031, 0.0001, 0.22, 0.29, 2.243, 0.258, 0.137, 0.021, 0.553, 0.066, 1.318, 0.0001, 0.336, 0.009, 0.009, 0.0001, 0.03, 0.023, 1.891, 0.248, 0.639, 0.037, 0.011, 0.202, 0.05, 0.683, 0.024, 0.014, 0.375, 0.074, 0.252, 0.031, 0.13, 24.792, 6.19, 0.487, 0.175, 1.097, 0.001, 0.677, 0.098, 0.808, 0.311, 0.975, 0.521, 2.028, 0.0001, 1.424, 0.0001, 0.0001, 0.605, 0.237, 0.107, 1.177, 0.742, 0.0001, 0.0001, 0.117, 0.003, 3.031, 1.138, 0.0001, 0.0001, 0.016, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 29.692, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.859, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.276, 0.003, 0.256, 0.0001, 0.0001, 0.003, 0.003, 0.016, 0.486, 0.484, 0.001, 0.0001, 0.638, 0.156, 1.372, 0.022, 0.455, 0.969, 0.456, 0.237, 0.231, 0.247, 0.248, 0.25, 0.297, 0.612, 0.044, 0.019, 0.005, 0.0001, 0.004, 0.004, 0.0001, 0.449, 0.264, 0.227, 0.165, 0.234, 0.192, 0.164, 0.234, 0.179, 0.456, 0.316, 0.231, 0.458, 0.197, 0.135, 0.315, 0.005, 0.168, 0.606, 0.235, 0.049, 0.123, 0.109, 0.008, 0.231, 0.017, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 8.019, 2.445, 0.575, 1.178, 6.318, 0.449, 2.782, 1.275, 5.992, 0.203, 1.688, 4.658, 3.419, 6.494, 6.015, 1.447, 0.023, 2.565, 2.973, 3.583, 1.992, 0.459, 0.92, 0.044, 0.557, 0.136, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.108, 0.019, 0.014, 0.005, 0.005, 0.004, 0.006, 0.01, 0.005, 0.008, 0.002, 0.002, 0.012, 0.031, 0.002, 0.001, 0.002, 0.004, 0.003, 0.089, 0.007, 0.003, 0.003, 0.004, 0.004, 0.002, 0.001, 0.001, 0.007, 0.004, 0.002, 0.004, 0.052, 0.019, 0.003, 0.005, 0.023, 0.009, 0.014, 0.014, 0.008, 0.023, 0.003, 0.01, 0.005, 0.015, 0.003, 0.004, 0.019, 0.013, 0.011, 0.022, 0.006, 0.01, 0.007, 0.004, 0.018, 0.01, 0.009, 0.009, 0.011, 0.009, 0.011, 0.009, 0.0001, 0.0001, 0.048, 0.113, 0.02, 0.046, 0.0001, 0.002, 0.0001, 0.005, 0.001, 0.002, 0.0001, 0.001, 0.032, 0.011, 0.078, 0.027, 0.001, 0.0001, 0.001, 0.018, 0.002, 0.0001, 0.017, 0.009, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.037, 0.005, 0.097, 0.0001, 0.0001, 0.007, 0.003, 0.001, 0.003, 0.001, 0.002, 0.001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bjn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.274, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.352, 0.002, 0.406, 0.0001, 0.001, 0.013, 0.001, 0.109, 0.199, 0.198, 0.002, 0.001, 0.988, 0.406, 0.819, 0.036, 0.185, 0.196, 0.136, 0.076, 0.062, 0.071, 0.054, 0.058, 0.057, 0.091, 0.102, 0.025, 0.002, 0.003, 0.002, 0.005, 0.0001, 0.244, 0.391, 0.098, 0.173, 0.034, 0.031, 0.106, 0.136, 0.207, 0.121, 0.411, 0.116, 0.312, 0.12, 0.035, 0.341, 0.003, 0.133, 0.409, 0.258, 0.061, 0.026, 0.09, 0.002, 0.038, 0.007, 0.012, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 19.717, 2.113, 0.418, 2.814, 2.089, 0.126, 3.097, 2.135, 6.446, 0.654, 2.733, 2.879, 2.871, 8.542, 1.048, 1.844, 0.007, 3.384, 2.985, 3.613, 4.514, 0.083, 0.972, 0.009, 1.107, 0.035, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.03, 0.008, 0.005, 0.007, 0.006, 0.006, 0.006, 0.004, 0.006, 0.004, 0.008, 0.003, 0.003, 0.007, 0.001, 0.001, 0.002, 0.002, 0.002, 0.008, 0.003, 0.002, 0.002, 0.004, 0.002, 0.014, 0.001, 0.002, 0.005, 0.005, 0.002, 0.002, 0.012, 0.002, 0.002, 0.004, 0.012, 0.005, 0.004, 0.011, 0.007, 0.182, 0.006, 0.005, 0.004, 0.004, 0.003, 0.005, 0.009, 0.008, 0.005, 0.005, 0.003, 0.002, 0.001, 0.003, 0.006, 0.004, 0.004, 0.003, 0.003, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.019, 0.193, 0.007, 0.009, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.002, 0.005, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.035, 0.03, 0.004, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.019, 0.008, 0.026, 0.006, 0.003, 0.008, 0.005, 0.003, 0.002, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bm": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.167, 0.007, 0.144, 0.0001, 0.001, 0.013, 0.002, 0.256, 0.237, 0.237, 0.007, 0.003, 0.973, 0.158, 0.97, 0.007, 0.243, 0.224, 0.128, 0.052, 0.064, 0.06, 0.072, 0.055, 0.07, 0.12, 0.287, 0.015, 0.0001, 0.01, 0.0001, 0.005, 0.0001, 0.444, 0.348, 0.111, 0.212, 0.105, 0.277, 0.105, 0.044, 0.094, 0.171, 0.429, 0.132, 0.368, 0.21, 0.091, 0.065, 0.003, 0.072, 0.446, 0.184, 0.079, 0.027, 0.078, 0.004, 0.046, 0.018, 0.018, 0.0001, 0.014, 0.0001, 0.017, 0.0001, 12.037, 2.27, 0.406, 1.816, 3.589, 1.305, 1.615, 0.299, 5.301, 0.672, 3.384, 3.18, 2.268, 7.22, 3.282, 0.194, 0.029, 2.428, 2.045, 1.645, 2.796, 0.059, 0.96, 0.016, 1.69, 0.107, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.237, 0.003, 0.001, 0.017, 0.017, 0.007, 0.015, 0.003, 0.008, 0.011, 0.026, 0.017, 0.001, 0.0001, 0.018, 0.005, 0.013, 0.002, 0.004, 0.018, 1.999, 0.0001, 0.0001, 0.0001, 0.002, 0.172, 0.0001, 1.879, 0.012, 0.017, 0.004, 0.0001, 0.054, 0.002, 0.001, 0.001, 0.002, 0.003, 0.005, 0.027, 0.322, 0.21, 0.005, 0.017, 0.007, 0.002, 0.001, 0.011, 0.002, 0.012, 0.238, 0.014, 0.415, 0.435, 0.001, 0.007, 0.005, 0.009, 0.01, 0.017, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.064, 1.039, 0.002, 0.033, 0.027, 0.0001, 0.0001, 4.089, 0.016, 0.002, 0.003, 0.0001, 0.433, 0.0001, 0.024, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.065, 0.05, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.0001, 0.003, 0.233, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.319, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.406, 0.001, 0.076, 0.0001, 0.0001, 0.012, 0.0001, 0.015, 0.057, 0.058, 0.0001, 0.001, 0.196, 0.086, 0.029, 0.005, 0.005, 0.006, 0.004, 0.002, 0.002, 0.002, 0.002, 0.001, 0.002, 0.002, 0.016, 0.009, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.005, 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.003, 0.002, 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.043, 0.007, 0.016, 0.016, 0.05, 0.009, 0.009, 0.017, 0.038, 0.001, 0.004, 0.022, 0.013, 0.034, 0.034, 0.01, 0.001, 0.031, 0.027, 0.033, 0.016, 0.005, 0.005, 0.002, 0.008, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.359, 0.551, 0.299, 0.082, 0.002, 0.229, 0.186, 2.436, 0.034, 0.152, 0.002, 0.333, 0.036, 2.245, 0.026, 0.384, 0.008, 0.001, 0.001, 0.181, 0.002, 1.31, 0.16, 0.34, 0.043, 0.053, 0.26, 0.209, 0.4, 0.015, 0.042, 0.46, 0.067, 0.212, 0.008, 0.16, 1.542, 0.621, 24.834, 6.808, 1.602, 0.04, 0.792, 0.149, 1.148, 0.261, 0.867, 1.261, 2.631, 0.001, 0.874, 0.001, 0.001, 0.001, 0.381, 0.232, 0.963, 0.451, 0.001, 0.001, 0.701, 0.0001, 2.837, 1.811, 0.0001, 0.0001, 0.013, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.991, 0.0001, 0.03, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.169, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.69, 0.0001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.01, 0.0001, 0.0001, 0.002, 0.003, 0.005, 0.001, 0.003, 0.004, 0.003, 0.002, 0.001, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.012, 0.002, 0.004, 0.004, 0.015, 0.003, 0.003, 0.006, 0.011, 0.0001, 0.001, 0.005, 0.003, 0.01, 0.01, 0.003, 0.0001, 0.008, 0.008, 0.01, 0.004, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.3, 0.21, 1.61, 0.004, 1.096, 0.171, 0.232, 0.056, 0.006, 0.125, 0.009, 7.85, 0.044, 0.821, 0.01, 0.147, 0.305, 1.571, 0.233, 1.086, 0.826, 0.17, 1.379, 0.052, 0.974, 0.101, 0.175, 0.065, 0.005, 0.008, 0.253, 0.318, 0.893, 0.39, 1.207, 0.915, 0.217, 0.014, 2.41, 0.028, 0.071, 0.06, 0.002, 0.023, 0.001, 0.018, 0.001, 0.001, 0.003, 0.913, 2.028, 0.112, 1.086, 0.005, 0.001, 0.055, 0.005, 0.003, 0.951, 0.005, 10.217, 21.49, 2.602, 0.016, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 32.905, 0.0001, 0.024, 0.009, 0.002, 0.006, 0.004, 0.005, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bpy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.902, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.282, 0.0001, 0.009, 0.0001, 0.0001, 0.224, 0.0001, 0.002, 0.281, 0.281, 0.0001, 0.0001, 0.306, 0.253, 0.183, 0.08, 0.005, 0.009, 0.002, 0.004, 0.002, 0.003, 0.003, 0.003, 0.003, 0.003, 0.197, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.016, 0.008, 0.017, 0.005, 0.005, 0.002, 0.004, 0.002, 0.003, 0.003, 0.005, 0.003, 0.007, 0.007, 0.001, 0.007, 0.0001, 0.004, 0.019, 0.004, 0.016, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.014, 0.0001, 0.118, 0.01, 0.016, 0.026, 0.05, 0.006, 0.015, 0.031, 0.057, 0.004, 0.009, 0.031, 0.017, 0.064, 0.06, 0.015, 0.001, 0.059, 0.03, 0.047, 0.04, 0.005, 0.005, 0.001, 0.018, 0.002, 0.0001, 0.016, 0.0001, 0.0001, 0.0001, 0.094, 0.582, 0.295, 0.004, 0.001, 0.199, 0.278, 1.651, 0.006, 0.325, 0.001, 0.49, 0.119, 1.057, 0.003, 0.285, 0.0001, 0.0001, 0.0001, 0.034, 0.032, 0.592, 0.143, 0.798, 0.084, 0.129, 0.075, 0.036, 0.484, 0.004, 0.03, 0.329, 0.051, 0.128, 0.007, 0.019, 1.405, 0.659, 24.309, 6.387, 2.166, 0.231, 0.814, 0.355, 0.961, 0.379, 1.131, 0.99, 2.941, 0.034, 0.919, 0.004, 0.001, 0.001, 0.243, 0.193, 0.791, 1.05, 0.0001, 0.0001, 0.626, 0.0001, 4.392, 1.335, 0.0001, 0.0001, 0.04, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.31, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "br": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.678, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.255, 0.004, 0.515, 0.0001, 0.0001, 0.007, 0.002, 0.663, 0.246, 0.246, 0.001, 0.002, 0.881, 0.746, 0.901, 0.014, 0.258, 0.444, 0.187, 0.109, 0.115, 0.122, 0.109, 0.12, 0.152, 0.228, 0.115, 0.024, 0.015, 0.004, 0.016, 0.003, 0.0001, 0.347, 0.279, 0.201, 0.205, 0.261, 0.098, 0.212, 0.134, 0.164, 0.075, 0.201, 0.168, 0.253, 0.109, 0.059, 0.199, 0.006, 0.146, 0.289, 0.136, 0.097, 0.091, 0.051, 0.019, 0.032, 0.015, 0.024, 0.0001, 0.024, 0.0001, 0.001, 0.0001, 9.146, 1.127, 0.833, 2.777, 10.42, 0.294, 1.799, 2.456, 3.655, 0.167, 1.352, 2.97, 1.505, 5.492, 4.696, 0.867, 0.019, 5.665, 2.33, 3.448, 2.744, 1.784, 0.434, 0.03, 0.247, 2.302, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.1, 0.012, 0.008, 0.007, 0.005, 0.004, 0.003, 0.003, 0.004, 0.005, 0.002, 0.002, 0.004, 0.005, 0.003, 0.002, 0.003, 0.002, 0.002, 0.011, 0.005, 0.002, 0.002, 0.002, 0.002, 0.074, 0.002, 0.003, 0.005, 0.005, 0.001, 0.004, 0.021, 0.015, 0.009, 0.005, 0.007, 0.003, 0.004, 0.009, 0.013, 0.045, 0.076, 0.018, 0.003, 0.013, 0.003, 0.005, 0.011, 0.591, 0.009, 0.012, 0.018, 0.007, 0.006, 0.004, 0.009, 0.467, 0.008, 0.021, 0.017, 0.008, 0.005, 0.006, 0.0001, 0.0001, 0.048, 1.28, 0.01, 0.011, 0.0001, 0.001, 0.0001, 0.004, 0.002, 0.002, 0.002, 0.0001, 0.032, 0.015, 0.039, 0.015, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.006, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.009, 0.096, 0.003, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bs": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.108, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.139, 0.002, 0.313, 0.001, 0.001, 0.017, 0.002, 0.011, 0.204, 0.204, 0.001, 0.006, 0.915, 0.157, 1.176, 0.034, 0.332, 0.467, 0.264, 0.159, 0.151, 0.151, 0.132, 0.126, 0.142, 0.226, 0.068, 0.015, 0.006, 0.007, 0.006, 0.001, 0.0001, 0.156, 0.174, 0.174, 0.143, 0.072, 0.074, 0.155, 0.136, 0.152, 0.073, 0.147, 0.082, 0.163, 0.218, 0.118, 0.225, 0.003, 0.11, 0.283, 0.122, 0.105, 0.088, 0.031, 0.007, 0.007, 0.073, 0.025, 0.0001, 0.025, 0.0001, 0.008, 0.0001, 8.723, 0.95, 0.762, 2.331, 6.777, 0.26, 1.369, 0.582, 7.412, 3.867, 2.673, 2.682, 2.205, 4.994, 6.632, 1.941, 0.005, 3.955, 3.612, 3.234, 3.103, 2.415, 0.036, 0.017, 0.061, 1.207, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.038, 0.004, 0.003, 0.002, 0.002, 0.001, 0.003, 0.388, 0.002, 0.001, 0.001, 0.001, 0.016, 0.618, 0.001, 0.0001, 0.003, 0.172, 0.002, 0.018, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.006, 0.003, 0.004, 0.002, 0.035, 0.482, 0.001, 0.001, 0.003, 0.001, 0.001, 0.002, 0.001, 0.008, 0.001, 0.002, 0.001, 0.003, 0.001, 0.001, 0.007, 0.004, 0.003, 0.004, 0.002, 0.003, 0.004, 0.002, 0.004, 0.002, 0.002, 0.003, 0.006, 0.012, 0.366, 0.002, 0.0001, 0.0001, 0.02, 0.032, 1.199, 0.874, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.014, 0.006, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bug": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.068, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.164, 0.0001, 0.016, 0.0001, 0.0001, 0.003, 0.001, 0.137, 0.016, 0.016, 0.0001, 0.001, 0.196, 1.935, 1.044, 0.004, 0.035, 0.02, 0.023, 0.01, 0.009, 0.007, 0.007, 0.006, 0.007, 0.013, 0.007, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.516, 0.311, 0.434, 0.185, 0.139, 0.134, 0.304, 0.324, 0.039, 0.055, 0.029, 0.369, 0.412, 0.063, 0.111, 1.316, 0.017, 0.157, 0.558, 0.13, 0.016, 0.233, 0.012, 0.002, 0.073, 0.002, 0.007, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 9.887, 0.241, 1.633, 1.832, 7.179, 0.088, 0.757, 0.513, 7.161, 0.111, 1.126, 1.683, 2.724, 6.291, 2.861, 1.308, 0.04, 7.537, 3.873, 3.7, 4.723, 0.375, 1.036, 0.149, 1.531, 0.172, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.047, 0.009, 0.005, 0.004, 0.009, 0.007, 0.006, 0.004, 0.009, 0.039, 0.01, 0.038, 0.003, 0.005, 0.002, 0.001, 0.004, 0.012, 0.007, 0.011, 0.011, 0.02, 0.001, 0.02, 0.012, 0.019, 0.011, 0.012, 0.002, 0.001, 0.006, 0.003, 0.004, 0.003, 0.047, 0.002, 0.016, 0.005, 0.004, 0.01, 0.405, 2.36, 0.01, 0.013, 0.003, 0.001, 0.008, 0.004, 0.008, 0.004, 0.008, 0.005, 0.176, 0.005, 0.002, 0.003, 0.012, 0.005, 0.008, 0.007, 0.003, 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.007, 2.887, 0.002, 0.04, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.023, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.008, 0.007, 0.001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.048, 0.15, 0.04, 0.0001, 0.0001, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bxr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.49, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.129, 0.001, 0.08, 0.0001, 0.0001, 0.012, 0.0001, 0.001, 0.147, 0.147, 0.0001, 0.002, 0.553, 0.131, 0.523, 0.004, 0.151, 0.243, 0.109, 0.074, 0.068, 0.074, 0.065, 0.062, 0.079, 0.12, 0.022, 0.018, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.004, 0.002, 0.007, 0.001, 0.002, 0.002, 0.002, 0.004, 0.037, 0.001, 0.001, 0.002, 0.003, 0.003, 0.003, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.011, 0.001, 0.019, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.037, 0.005, 0.011, 0.009, 0.029, 0.005, 0.007, 0.031, 0.027, 0.001, 0.005, 0.019, 0.012, 0.022, 0.025, 0.008, 0.001, 0.023, 0.018, 0.017, 0.016, 0.003, 0.002, 0.001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.392, 0.859, 1.489, 1.628, 0.046, 1.574, 0.057, 0.037, 0.549, 0.002, 0.003, 0.546, 0.265, 4.264, 0.148, 0.174, 0.118, 0.207, 0.029, 0.069, 0.123, 0.028, 0.013, 0.033, 0.034, 0.005, 0.055, 0.03, 0.09, 0.073, 0.049, 0.037, 0.094, 0.079, 0.088, 0.076, 0.026, 0.12, 0.011, 0.016, 0.032, 0.306, 0.001, 0.058, 0.001, 0.071, 0.033, 1.461, 5.842, 1.346, 0.152, 2.003, 2.072, 0.704, 0.52, 0.475, 1.576, 1.562, 0.254, 3.078, 0.893, 3.534, 3.045, 0.105, 0.0001, 0.0001, 0.188, 0.005, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.006, 0.002, 27.741, 14.028, 2.178, 0.307, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.075, 0.002, 0.001, 0.004, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cdo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.899, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.597, 0.001, 0.273, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.549, 0.551, 0.0001, 0.001, 0.624, 3.929, 0.732, 0.03, 0.251, 0.611, 0.29, 0.189, 0.163, 0.163, 0.16, 0.156, 0.166, 0.215, 0.133, 0.012, 0.001, 0.0001, 0.001, 0.002, 0.0001, 0.053, 0.117, 0.299, 0.251, 0.017, 0.027, 0.504, 0.23, 0.082, 0.03, 0.071, 0.135, 0.356, 0.159, 0.039, 0.068, 0.004, 0.027, 0.229, 0.101, 0.044, 0.025, 0.062, 0.001, 0.013, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.822, 0.392, 1.504, 1.05, 0.748, 0.033, 6.691, 1.959, 3.832, 0.006, 1.877, 0.724, 0.396, 5.597, 0.623, 0.123, 0.005, 0.411, 2.143, 0.557, 2.118, 0.037, 0.065, 0.039, 0.184, 0.014, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.562, 0.653, 0.229, 0.604, 0.418, 0.298, 0.318, 0.129, 0.175, 0.171, 0.118, 0.212, 0.31, 0.409, 0.113, 0.98, 0.125, 0.066, 0.036, 0.255, 0.106, 0.397, 0.142, 0.124, 0.138, 0.172, 0.096, 0.139, 0.338, 0.116, 0.144, 0.186, 0.41, 1.078, 0.77, 0.114, 1.515, 0.081, 0.097, 0.077, 0.628, 0.714, 1.044, 0.603, 1.183, 1.024, 0.119, 0.129, 0.135, 0.183, 0.537, 1.615, 1.19, 0.067, 0.211, 0.1, 0.216, 1.217, 0.179, 0.199, 0.306, 0.119, 0.135, 0.091, 0.0001, 0.0001, 0.041, 7.531, 2.472, 1.618, 0.001, 0.001, 0.0001, 0.002, 0.002, 0.001, 2.018, 0.0001, 0.014, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.757, 0.108, 0.212, 0.359, 1.361, 0.793, 0.503, 0.549, 0.397, 0.002, 0.003, 0.004, 0.001, 0.0001, 0.218, 0.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ce": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.477, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.593, 0.0001, 0.003, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.462, 0.462, 0.0001, 0.166, 0.461, 0.186, 0.813, 0.002, 0.175, 0.094, 0.109, 0.14, 0.045, 0.029, 0.022, 0.02, 0.031, 0.028, 0.033, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.145, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.145, 0.144, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.704, 1.438, 1.762, 1.875, 0.015, 2.329, 0.449, 0.169, 0.835, 0.009, 0.342, 0.05, 1.751, 0.164, 0.611, 0.21, 0.068, 0.113, 0.056, 0.04, 0.434, 0.02, 0.006, 0.019, 0.028, 0.002, 0.404, 0.034, 0.196, 0.056, 0.049, 0.075, 0.184, 0.229, 0.057, 0.026, 0.146, 0.02, 0.017, 0.02, 0.129, 0.002, 0.0001, 0.004, 0.0001, 0.008, 0.009, 0.018, 7.603, 0.877, 1.017, 0.93, 0.629, 1.84, 0.05, 0.386, 1.788, 1.009, 1.778, 2.253, 0.873, 3.199, 2.291, 0.075, 0.0001, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 28.632, 13.675, 0.0001, 0.638, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.405, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ceb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.228, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.341, 0.0001, 0.15, 0.0001, 0.0001, 0.002, 0.0001, 0.016, 0.068, 0.068, 0.0001, 0.0001, 1.15, 0.441, 1.259, 0.001, 0.028, 0.059, 0.035, 0.022, 0.021, 0.022, 0.021, 0.021, 0.026, 0.036, 0.037, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.098, 0.168, 0.578, 0.161, 0.203, 0.063, 0.093, 0.198, 0.052, 0.044, 0.126, 0.151, 0.236, 0.118, 0.082, 0.261, 0.02, 0.131, 0.295, 0.118, 0.081, 0.041, 0.087, 0.005, 0.015, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 15.378, 2.318, 0.367, 1.953, 2.974, 0.093, 5.126, 1.479, 4.851, 0.069, 2.449, 3.4, 2.839, 8.407, 4.701, 1.442, 0.019, 2.43, 4.783, 3.214, 2.941, 0.169, 0.623, 0.03, 1.539, 0.068, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.059, 0.004, 0.005, 0.004, 0.004, 0.003, 0.008, 0.005, 0.003, 0.002, 0.001, 0.004, 0.009, 0.002, 0.004, 0.002, 0.003, 0.0001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.01, 0.005, 0.001, 0.002, 0.001, 0.001, 0.002, 0.006, 0.184, 0.019, 0.007, 0.005, 0.008, 0.019, 0.003, 0.009, 0.007, 0.025, 0.004, 0.049, 0.001, 0.018, 0.002, 0.008, 0.279, 0.015, 0.004, 0.013, 0.004, 0.003, 0.007, 0.001, 0.046, 0.006, 0.007, 0.005, 0.006, 0.004, 0.006, 0.001, 0.0001, 0.0001, 0.452, 0.166, 0.097, 0.047, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.031, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.019, 0.018, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.012, 0.008, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ch": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.587, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.467, 0.008, 0.286, 0.0001, 0.0001, 0.018, 0.0001, 1.077, 0.189, 0.189, 0.0001, 0.0001, 1.14, 0.532, 1.257, 0.007, 0.648, 0.639, 0.504, 0.182, 0.3, 0.173, 0.195, 0.169, 0.204, 0.218, 0.042, 0.013, 0.0001, 0.001, 0.0001, 0.005, 0.0001, 0.26, 0.146, 0.257, 0.104, 0.401, 0.111, 0.564, 0.173, 0.223, 0.038, 0.106, 0.097, 0.317, 0.12, 0.025, 0.199, 0.01, 0.074, 0.256, 0.153, 0.279, 0.066, 0.06, 0.002, 0.047, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 10.968, 0.472, 0.524, 1.575, 4.239, 0.44, 3.776, 1.808, 6.943, 0.028, 1.21, 2.019, 1.749, 8.291, 5.798, 1.592, 0.018, 1.795, 5.81, 3.872, 3.565, 0.141, 0.106, 0.012, 0.845, 0.055, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.016, 0.008, 0.003, 0.001, 0.002, 0.01, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.0001, 0.0001, 0.006, 0.001, 0.0001, 0.005, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.011, 0.0001, 0.003, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.02, 0.002, 0.003, 0.001, 0.974, 0.0001, 0.004, 0.003, 0.012, 0.0001, 0.0001, 0.001, 0.009, 0.0001, 0.0001, 0.002, 0.432, 0.0001, 0.044, 0.0001, 0.001, 0.003, 0.001, 0.002, 0.002, 0.006, 0.007, 0.002, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.001, 1.51, 0.004, 0.013, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 0.0001, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.012, 0.0001, 0.0001, 0.003, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cho": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.477, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.446, 0.089, 1.242, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.621, 0.621, 0.0001, 0.0001, 0.799, 0.0001, 0.532, 0.0001, 0.0001, 0.177, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.355, 0.266, 0.0001, 0.0001, 0.0001, 0.089, 0.0001, 0.444, 0.0001, 1.154, 0.0001, 0.0001, 0.0001, 0.089, 0.799, 0.177, 0.0001, 0.177, 0.0001, 0.355, 0.177, 0.177, 0.444, 0.0001, 0.0001, 0.355, 0.0001, 0.0001, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.955, 1.154, 0.799, 0.0001, 2.839, 0.177, 0.621, 7.365, 8.252, 0.0001, 5.146, 2.662, 3.549, 3.727, 5.413, 1.597, 0.0001, 0.799, 3.638, 5.146, 1.597, 1.065, 0.089, 0.0001, 1.331, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.154, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.266, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.177, 0.0001, 0.0001, 0.0001, 1.154, 0.0001, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "chr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.394, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.115, 0.002, 0.174, 0.0001, 0.001, 0.005, 0.001, 0.018, 0.095, 0.095, 0.0001, 0.001, 0.499, 0.081, 0.439, 0.009, 0.086, 0.076, 0.045, 0.025, 0.02, 0.027, 0.02, 0.018, 0.025, 0.029, 0.03, 0.019, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.037, 0.02, 0.038, 0.014, 0.023, 0.017, 0.012, 0.014, 0.019, 0.011, 0.01, 0.013, 0.028, 0.014, 0.01, 0.02, 0.002, 0.016, 0.034, 0.027, 0.013, 0.008, 0.015, 0.002, 0.005, 0.003, 0.065, 0.0001, 0.065, 0.0001, 0.004, 0.0001, 0.692, 0.092, 0.264, 0.31, 0.823, 0.092, 0.184, 0.209, 0.663, 0.01, 0.064, 0.374, 0.188, 0.502, 0.498, 0.163, 0.016, 0.479, 0.482, 0.523, 0.235, 0.107, 0.076, 0.023, 0.123, 0.021, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.027, 0.355, 0.722, 0.213, 0.313, 0.628, 0.115, 0.06, 0.021, 0.056, 0.084, 0.04, 0.154, 1.876, 13.554, 13.952, 0.082, 0.032, 0.441, 0.837, 0.268, 0.161, 0.041, 1.986, 0.138, 0.561, 0.191, 0.664, 0.014, 0.045, 0.005, 0.13, 2.057, 0.126, 1.445, 0.138, 1.031, 0.39, 0.904, 0.381, 0.457, 1.048, 0.569, 0.458, 0.748, 0.433, 0.062, 1.427, 0.213, 0.207, 0.29, 0.574, 0.831, 0.687, 0.218, 0.077, 0.387, 0.051, 0.016, 0.01, 0.004, 0.004, 1.405, 0.134, 0.0001, 0.0001, 0.009, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 27.238, 0.017, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "chy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.992, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.662, 0.002, 0.655, 0.0001, 0.0001, 0.0001, 0.0001, 4.281, 0.488, 0.49, 0.012, 0.039, 1.209, 0.935, 1.193, 0.009, 0.099, 0.186, 0.07, 0.039, 0.048, 0.046, 0.051, 0.032, 0.087, 0.113, 0.294, 0.06, 0.044, 0.012, 0.043, 0.009, 0.0001, 0.28, 0.143, 0.271, 0.068, 0.058, 0.046, 0.056, 0.705, 0.041, 0.084, 0.094, 0.075, 0.71, 0.203, 0.133, 0.21, 0.01, 0.123, 0.333, 0.369, 0.109, 0.326, 0.043, 0.02, 0.015, 0.015, 0.017, 0.0001, 0.017, 0.0001, 0.0001, 0.005, 5.694, 0.454, 0.435, 0.594, 8.431, 0.195, 0.654, 4.544, 1.753, 0.053, 1.313, 1.118, 1.931, 4.523, 6.14, 0.553, 0.043, 1.203, 5.097, 4.735, 0.637, 1.842, 0.224, 0.461, 0.27, 0.08, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.024, 0.014, 0.009, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.113, 0.0001, 0.002, 0.007, 0.005, 0.0001, 0.0001, 0.005, 0.002, 0.0001, 0.058, 0.012, 0.0001, 0.003, 0.029, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.002, 0.044, 1.384, 0.696, 0.009, 0.027, 0.002, 0.002, 0.039, 0.005, 3.484, 0.98, 0.162, 0.003, 0.009, 0.002, 0.017, 0.009, 0.003, 0.005, 1.282, 0.993, 0.003, 0.142, 0.0001, 0.017, 0.0001, 0.002, 0.009, 0.007, 0.0001, 0.007, 0.005, 0.0001, 0.0001, 0.014, 8.846, 0.043, 0.545, 0.0001, 0.005, 0.046, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.031, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.019, 0.003, 0.017, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ckb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.676, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.035, 0.002, 0.062, 0.0001, 0.0001, 0.003, 0.0001, 0.002, 0.131, 0.13, 0.001, 0.001, 0.011, 0.034, 0.374, 0.013, 0.01, 0.014, 0.008, 0.005, 0.004, 0.004, 0.004, 0.004, 0.005, 0.007, 0.05, 0.0001, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.009, 0.006, 0.007, 0.006, 0.004, 0.004, 0.004, 0.004, 0.005, 0.002, 0.003, 0.004, 0.007, 0.005, 0.003, 0.007, 0.001, 0.005, 0.01, 0.007, 0.002, 0.002, 0.003, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.003, 0.0001, 0.058, 0.008, 0.018, 0.017, 0.063, 0.009, 0.012, 0.017, 0.048, 0.001, 0.008, 0.031, 0.019, 0.043, 0.045, 0.012, 0.001, 0.045, 0.029, 0.036, 0.019, 0.006, 0.008, 0.003, 0.011, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.386, 0.193, 0.124, 0.067, 1.187, 1.207, 3.947, 0.41, 3.556, 0.028, 0.015, 0.002, 5.576, 0.003, 1.191, 0.005, 0.006, 0.005, 0.002, 0.004, 0.001, 6.665, 0.001, 0.002, 0.236, 0.001, 0.002, 0.008, 0.002, 0.002, 0.001, 0.006, 0.161, 0.192, 0.114, 0.062, 0.112, 0.064, 0.707, 4.366, 1.564, 2.13, 1.551, 0.015, 0.253, 0.092, 0.303, 2.261, 0.008, 2.411, 0.524, 1.151, 0.651, 0.531, 0.001, 0.004, 0.003, 0.092, 0.048, 0.036, 0.003, 0.003, 0.823, 0.003, 0.0001, 0.0001, 0.028, 0.007, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 15.514, 10.978, 4.45, 13.188, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.375, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.063, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "co": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.449, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.862, 0.008, 0.387, 0.0001, 0.0001, 0.006, 0.001, 0.763, 0.212, 0.212, 0.003, 0.001, 0.925, 0.075, 0.859, 0.019, 0.189, 0.28, 0.146, 0.097, 0.087, 0.101, 0.081, 0.085, 0.107, 0.132, 0.097, 0.026, 0.009, 0.003, 0.01, 0.004, 0.0001, 0.325, 0.102, 0.335, 0.094, 0.091, 0.089, 0.126, 0.077, 0.208, 0.025, 0.02, 0.156, 0.189, 0.082, 0.052, 0.201, 0.016, 0.093, 0.268, 0.121, 0.17, 0.078, 0.019, 0.022, 0.005, 0.013, 0.032, 0.0001, 0.032, 0.0001, 0.016, 0.0001, 8.602, 0.557, 3.322, 3.101, 4.329, 0.784, 1.174, 1.381, 10.092, 0.419, 0.069, 2.83, 1.864, 5.457, 2.618, 1.888, 0.179, 4.342, 3.458, 4.676, 6.626, 0.877, 0.033, 0.017, 0.063, 0.595, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.058, 0.006, 0.004, 0.002, 0.003, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.002, 0.002, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.039, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.789, 0.005, 0.002, 0.002, 0.004, 0.001, 0.002, 0.004, 0.94, 0.016, 0.001, 0.007, 0.251, 0.004, 0.001, 0.002, 0.005, 0.006, 0.189, 0.011, 0.005, 0.003, 0.002, 0.024, 0.003, 0.252, 0.004, 0.007, 0.006, 0.005, 0.002, 0.004, 0.0001, 0.0001, 0.05, 2.469, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.032, 0.015, 0.008, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.04, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.443, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.088, 0.004, 0.073, 0.0001, 0.0001, 0.02, 0.0001, 0.023, 0.121, 0.12, 0.0001, 0.002, 0.629, 0.081, 0.971, 0.012, 0.119, 0.193, 0.101, 0.064, 0.076, 0.066, 0.061, 0.066, 0.062, 0.105, 0.063, 0.027, 0.0001, 0.0001, 0.0001, 0.015, 0.0001, 0.161, 0.04, 0.143, 0.045, 0.195, 0.034, 0.029, 0.053, 0.081, 0.084, 0.151, 0.056, 0.235, 0.167, 0.103, 0.138, 0.009, 0.033, 0.115, 0.119, 0.03, 0.034, 0.067, 0.012, 0.01, 0.004, 0.05, 0.0001, 0.047, 0.0001, 0.014, 0.0001, 9.914, 0.233, 4.69, 1.145, 5.906, 0.235, 0.326, 1.052, 10.924, 0.134, 6.149, 1.256, 2.551, 4.689, 5.033, 1.928, 0.073, 2.706, 3.099, 5.744, 0.924, 0.192, 2.967, 0.038, 0.312, 0.067, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.088, 0.031, 0.077, 0.099, 0.046, 0.115, 0.007, 0.048, 0.054, 0.011, 0.091, 0.103, 0.074, 0.037, 0.073, 0.005, 0.766, 0.405, 0.312, 0.295, 0.175, 0.052, 0.036, 0.009, 0.01, 0.038, 0.001, 0.005, 0.002, 0.0001, 0.001, 0.021, 0.037, 0.111, 0.205, 0.026, 0.084, 0.087, 0.065, 0.093, 0.076, 0.063, 0.057, 0.032, 0.002, 0.144, 0.111, 0.096, 0.017, 0.078, 0.065, 0.232, 0.037, 0.005, 0.0001, 0.0001, 0.021, 0.005, 0.022, 0.02, 0.014, 0.002, 0.005, 0.005, 0.0001, 0.0001, 0.046, 0.821, 0.023, 0.077, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 1.861, 0.08, 0.005, 0.002, 0.009, 0.005, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "crh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.666, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.545, 0.003, 0.2, 0.0001, 0.003, 0.006, 0.0001, 0.011, 0.498, 0.498, 0.001, 0.003, 0.581, 0.375, 1.265, 0.029, 0.54, 0.844, 0.447, 0.25, 0.254, 0.244, 0.225, 0.224, 0.237, 0.353, 0.036, 0.017, 0.017, 0.002, 0.017, 0.003, 0.0001, 0.292, 0.227, 0.115, 0.122, 0.258, 0.045, 0.081, 0.079, 0.299, 0.014, 0.172, 0.079, 0.19, 0.068, 0.102, 0.074, 0.317, 0.092, 0.196, 0.162, 0.157, 0.161, 0.003, 0.13, 0.089, 0.035, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 7.42, 1.383, 0.39, 2.173, 6.493, 0.253, 0.439, 0.324, 6.527, 0.039, 1.974, 3.301, 1.629, 5.164, 1.476, 0.486, 0.955, 4.625, 3.637, 2.416, 1.149, 1.071, 0.013, 0.004, 1.959, 0.598, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.415, 0.022, 0.015, 0.022, 0.008, 0.007, 0.005, 0.065, 0.008, 0.005, 0.004, 0.008, 0.007, 0.007, 0.003, 0.008, 0.005, 0.004, 0.004, 0.069, 0.234, 0.004, 0.026, 0.004, 0.006, 0.008, 0.008, 0.005, 0.067, 0.049, 0.094, 1.497, 0.026, 0.01, 0.278, 0.006, 0.008, 0.006, 0.005, 0.416, 0.004, 0.006, 0.005, 0.014, 0.004, 0.007, 0.006, 0.006, 0.149, 5.025, 0.014, 0.011, 0.012, 0.067, 0.295, 0.006, 0.022, 0.01, 0.019, 0.017, 0.605, 0.022, 0.039, 0.006, 0.0001, 0.0001, 0.035, 2.796, 4.495, 1.1, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.002, 0.256, 0.079, 0.004, 0.002, 0.0001, 0.004, 0.008, 0.013, 0.021, 0.017, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.015, 0.009, 0.398, 0.007, 0.004, 0.019, 0.009, 0.005, 0.004, 0.004, 0.003, 0.002, 0.004, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "csb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.825, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.296, 0.002, 0.584, 0.0001, 0.0001, 0.003, 0.001, 0.009, 0.331, 0.334, 0.002, 0.0001, 0.877, 0.236, 1.256, 0.065, 0.271, 0.637, 0.291, 0.193, 0.181, 0.174, 0.153, 0.187, 0.256, 0.339, 0.093, 0.04, 0.024, 0.004, 0.024, 0.003, 0.0001, 0.093, 0.136, 0.203, 0.135, 0.053, 0.045, 0.141, 0.038, 0.163, 0.132, 0.28, 0.122, 0.184, 0.116, 0.024, 0.275, 0.002, 0.1, 0.23, 0.118, 0.014, 0.056, 0.218, 0.119, 0.003, 0.085, 0.006, 0.0001, 0.007, 0.0001, 0.002, 0.0001, 4.612, 0.986, 3.096, 2.007, 3.546, 0.161, 1.136, 0.946, 4.255, 1.343, 2.142, 1.634, 1.571, 3.378, 2.668, 1.384, 0.004, 3.469, 3.152, 2.405, 0.834, 0.037, 2.89, 0.011, 0.614, 4.079, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.169, 0.025, 0.879, 0.003, 0.332, 0.515, 0.031, 0.005, 0.001, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.005, 0.001, 0.013, 0.102, 0.134, 0.005, 0.002, 0.001, 0.001, 0.003, 0.049, 0.005, 0.012, 0.006, 0.026, 0.025, 0.003, 0.016, 0.006, 0.006, 0.677, 0.002, 0.001, 0.001, 0.001, 0.003, 1.17, 0.001, 2.19, 0.001, 0.003, 0.0001, 0.002, 0.009, 0.003, 2.322, 0.76, 1.31, 0.003, 0.004, 0.001, 0.007, 0.615, 0.005, 0.077, 0.465, 0.007, 0.003, 0.002, 0.0001, 0.0001, 0.14, 9.122, 0.543, 1.724, 0.0001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.006, 0.002, 0.024, 0.023, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.197, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.095, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.137, 0.0001, 0.05, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.026, 0.026, 0.001, 0.0001, 0.049, 0.014, 0.024, 0.015, 0.131, 0.259, 0.12, 0.082, 0.083, 0.082, 0.076, 0.078, 0.096, 0.129, 0.009, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.001, 0.006, 0.001, 0.001, 0.001, 0.0001, 0.006, 0.004, 0.0001, 0.001, 0.001, 0.002, 0.002, 0.004, 0.001, 0.0001, 0.002, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 0.023, 0.002, 0.008, 0.007, 0.018, 0.001, 0.005, 0.004, 0.017, 0.005, 0.009, 0.01, 0.003, 0.016, 0.015, 0.003, 0.001, 0.01, 0.011, 0.009, 0.011, 0.004, 0.0001, 0.002, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.938, 4.019, 2.29, 0.582, 0.265, 0.184, 0.28, 0.33, 0.175, 0.126, 2.698, 0.002, 1.962, 0.002, 0.135, 0.0001, 0.124, 0.906, 0.12, 0.072, 1.561, 0.0001, 0.139, 0.857, 0.034, 2.179, 0.103, 0.119, 0.097, 0.099, 0.095, 0.124, 0.126, 0.438, 0.049, 1.297, 0.06, 0.96, 0.01, 0.295, 0.011, 0.359, 0.005, 0.236, 0.002, 0.101, 0.019, 0.025, 3.114, 0.623, 1.373, 0.62, 1.221, 0.086, 0.518, 0.573, 2.627, 0.002, 1.325, 1.567, 0.924, 2.121, 2.823, 0.585, 0.0001, 0.0001, 0.514, 0.003, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.408, 0.0001, 0.016, 0.012, 21.25, 18.718, 0.249, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.51, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 1.747, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.247, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.093, 0.001, 0.059, 0.0001, 0.0001, 0.007, 0.0001, 0.003, 0.152, 0.151, 0.0001, 0.002, 0.478, 0.273, 0.79, 0.011, 0.204, 0.309, 0.183, 0.104, 0.101, 0.1, 0.081, 0.081, 0.096, 0.17, 0.076, 0.008, 0.002, 0.002, 0.002, 0.003, 0.0001, 0.004, 0.003, 0.005, 0.002, 0.002, 0.002, 0.002, 0.002, 0.019, 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.003, 0.005, 0.003, 0.002, 0.006, 0.001, 0.01, 0.001, 0.0001, 0.013, 0.0001, 0.013, 0.0001, 0.001, 0.0001, 0.027, 0.004, 0.007, 0.008, 0.027, 0.004, 0.006, 0.007, 0.02, 0.001, 0.004, 0.016, 0.009, 0.019, 0.018, 0.006, 0.0001, 0.019, 0.014, 0.015, 0.011, 0.003, 0.002, 0.002, 0.004, 0.001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 3.257, 1.78, 2.381, 2.851, 0.156, 1.36, 0.178, 0.773, 1.001, 0.006, 0.006, 0.869, 0.319, 0.035, 0.373, 0.165, 0.161, 0.088, 0.098, 0.049, 0.312, 2.25, 0.007, 0.017, 0.069, 0.007, 0.174, 0.039, 0.101, 0.06, 0.095, 0.155, 0.212, 0.157, 0.129, 0.054, 0.061, 0.066, 0.005, 1.16, 0.101, 0.002, 0.0001, 0.045, 0.001, 0.021, 0.156, 0.041, 4.16, 0.372, 1.295, 0.368, 0.304, 3.139, 0.041, 0.13, 2.185, 0.64, 1.311, 1.785, 0.994, 3.619, 1.18, 1.135, 0.0001, 0.0001, 0.101, 1.175, 3.79, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.002, 0.001, 24.733, 13.586, 0.004, 0.088, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.282, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.628, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.48, 0.003, 0.545, 0.0001, 0.001, 0.007, 0.002, 0.872, 0.259, 0.258, 0.001, 0.001, 0.777, 0.194, 0.96, 0.016, 0.363, 0.487, 0.244, 0.138, 0.133, 0.135, 0.125, 0.126, 0.164, 0.239, 0.149, 0.081, 0.022, 0.001, 0.022, 0.003, 0.0001, 0.36, 0.242, 0.56, 0.267, 0.155, 0.163, 0.331, 0.126, 0.112, 0.06, 0.033, 0.279, 0.433, 0.133, 0.073, 0.238, 0.004, 0.18, 0.303, 0.196, 0.061, 0.026, 0.092, 0.003, 0.167, 0.006, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 7.082, 0.905, 1.506, 6.475, 6.263, 2.165, 2.494, 2.4, 4.773, 0.015, 0.114, 3.901, 1.419, 6.217, 4.277, 0.556, 0.008, 5.57, 2.092, 2.13, 1.941, 0.086, 2.82, 0.025, 5.712, 0.034, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.074, 0.005, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.021, 0.002, 0.001, 0.0001, 0.001, 0.002, 0.033, 0.001, 0.001, 0.007, 0.009, 0.001, 0.001, 0.033, 0.007, 0.059, 0.003, 0.003, 0.001, 0.001, 0.003, 0.004, 0.015, 0.016, 0.004, 0.001, 0.004, 0.01, 0.012, 0.004, 0.003, 0.003, 0.004, 0.074, 0.043, 0.005, 0.016, 0.003, 0.006, 0.003, 0.002, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.036, 0.221, 0.003, 0.06, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.007, 0.004, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.072, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "din": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.698, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.927, 0.0001, 0.06, 0.0001, 0.003, 0.013, 0.0001, 0.015, 0.171, 0.17, 0.0001, 0.0001, 0.878, 0.077, 0.901, 0.027, 0.297, 0.229, 0.151, 0.055, 0.064, 0.078, 0.053, 0.048, 0.049, 0.126, 0.018, 0.013, 0.002, 0.0001, 0.002, 0.005, 0.0001, 0.424, 0.153, 0.093, 0.101, 0.075, 0.019, 0.074, 0.021, 0.051, 0.069, 0.324, 0.085, 0.16, 0.163, 0.021, 0.306, 0.002, 0.087, 0.062, 0.288, 0.034, 0.007, 0.069, 0.0001, 0.136, 0.003, 0.027, 0.0001, 0.027, 0.0001, 0.0001, 0.0001, 5.438, 0.999, 2.9, 1.603, 4.394, 0.024, 0.521, 1.912, 3.749, 0.362, 4.818, 2.02, 1.512, 4.26, 1.668, 1.035, 0.003, 2.29, 0.155, 3.595, 3.428, 0.022, 0.527, 0.011, 2.005, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.036, 0.001, 0.001, 0.0001, 0.027, 0.0001, 0.026, 0.0001, 1.487, 0.0001, 0.005, 1.04, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 2.319, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 1.678, 0.006, 0.006, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.222, 1.181, 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.0001, 3.25, 0.0001, 0.001, 0.006, 1.508, 0.003, 0.002, 0.006, 0.002, 0.0001, 0.011, 1.021, 0.001, 0.004, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.016, 6.971, 0.0001, 1.041, 0.02, 0.0001, 0.0001, 4.193, 0.0001, 0.0001, 1.487, 0.0001, 0.027, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.062, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "diq": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.719, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.354, 0.008, 0.4, 0.0001, 0.0001, 0.009, 0.0001, 0.031, 0.299, 0.3, 0.001, 0.003, 0.98, 0.165, 1.27, 0.045, 0.227, 0.302, 0.162, 0.087, 0.08, 0.089, 0.076, 0.082, 0.096, 0.17, 0.156, 0.035, 0.026, 0.008, 0.027, 0.01, 0.0001, 0.309, 0.187, 0.135, 0.206, 0.243, 0.108, 0.12, 0.188, 0.05, 0.033, 0.209, 0.106, 0.271, 0.167, 0.06, 0.167, 0.062, 0.13, 0.271, 0.259, 0.059, 0.085, 0.06, 0.052, 0.088, 0.128, 0.014, 0.0001, 0.014, 0.0001, 0.002, 0.001, 7.586, 1.293, 0.911, 2.514, 8.148, 0.439, 0.62, 0.759, 4.61, 0.11, 2.125, 1.599, 2.095, 4.93, 3.468, 0.588, 0.377, 4.808, 2.018, 2.359, 1.695, 0.626, 1.106, 0.479, 3.36, 1.081, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.078, 0.018, 0.011, 0.012, 0.02, 0.015, 0.019, 0.078, 0.016, 0.004, 0.018, 0.002, 0.014, 0.004, 0.014, 0.003, 0.006, 0.005, 0.003, 0.011, 0.005, 0.006, 0.005, 0.002, 0.009, 0.023, 0.002, 0.004, 0.022, 0.016, 0.065, 0.865, 0.032, 0.01, 0.013, 0.005, 0.007, 0.004, 0.006, 0.242, 0.014, 0.032, 2.716, 0.012, 0.007, 0.008, 0.29, 0.015, 0.191, 2.379, 0.013, 0.015, 0.01, 0.006, 0.021, 0.004, 0.009, 0.01, 0.007, 0.128, 0.093, 0.009, 0.008, 0.006, 0.0001, 0.0001, 0.039, 3.563, 2.668, 0.816, 0.0001, 0.001, 0.0001, 0.005, 0.003, 0.002, 0.002, 0.0001, 0.03, 0.013, 0.034, 0.014, 0.001, 0.0001, 0.001, 0.012, 0.005, 0.037, 0.126, 0.091, 0.007, 0.013, 0.003, 0.0001, 0.0001, 0.0001, 0.019, 0.012, 0.072, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "dsb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.783, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.853, 0.003, 0.608, 0.0001, 0.0001, 0.007, 0.002, 0.016, 0.311, 0.311, 0.022, 0.002, 0.839, 0.138, 1.194, 0.023, 0.287, 0.411, 0.214, 0.128, 0.124, 0.131, 0.109, 0.104, 0.125, 0.201, 0.084, 0.035, 0.006, 0.007, 0.007, 0.003, 0.0001, 0.155, 0.168, 0.123, 0.122, 0.077, 0.058, 0.102, 0.068, 0.054, 0.115, 0.164, 0.108, 0.197, 0.144, 0.038, 0.256, 0.004, 0.113, 0.246, 0.119, 0.042, 0.025, 0.244, 0.005, 0.007, 0.075, 0.008, 0.0001, 0.008, 0.0001, 0.002, 0.0001, 6.833, 1.047, 1.719, 1.818, 5.619, 0.234, 0.977, 0.835, 3.647, 3.795, 2.962, 1.965, 2.079, 4.006, 5.923, 1.615, 0.008, 3.224, 3.399, 2.803, 2.458, 0.071, 3.327, 0.021, 1.623, 1.195, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.148, 0.049, 0.931, 0.01, 0.22, 0.006, 0.005, 0.266, 0.005, 0.002, 0.002, 0.002, 0.017, 0.029, 0.002, 0.002, 0.007, 0.003, 0.004, 0.026, 0.004, 0.064, 0.004, 0.004, 0.009, 0.024, 0.008, 1.886, 0.043, 0.009, 0.04, 0.009, 0.064, 0.625, 0.008, 0.004, 0.017, 0.003, 0.003, 0.004, 0.006, 0.017, 0.003, 0.004, 0.001, 0.008, 0.001, 0.002, 0.019, 0.008, 0.014, 1.225, 0.005, 0.009, 0.011, 0.005, 0.012, 0.012, 0.395, 0.009, 0.027, 0.02, 0.616, 0.016, 0.0001, 0.0001, 0.039, 1.311, 1.431, 3.692, 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.0001, 0.017, 0.009, 0.074, 0.029, 0.001, 0.0001, 0.0001, 0.002, 0.007, 0.043, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.012, 0.141, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "dty": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.724, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.716, 0.001, 0.019, 0.0001, 0.0001, 0.003, 0.0001, 0.008, 0.063, 0.066, 0.001, 0.0001, 0.189, 0.033, 0.052, 0.008, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.027, 0.004, 0.012, 0.001, 0.012, 0.001, 0.0001, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.017, 0.012, 0.004, 0.005, 0.014, 0.002, 0.003, 0.006, 0.016, 0.001, 0.004, 0.007, 0.008, 0.013, 0.011, 0.003, 0.0001, 0.019, 0.008, 0.009, 0.004, 0.001, 0.003, 0.0001, 0.003, 0.001, 0.0001, 0.015, 0.0001, 0.0001, 0.0001, 0.87, 0.744, 0.354, 0.069, 0.0001, 0.295, 0.114, 1.106, 0.404, 0.216, 0.006, 1.008, 0.08, 2.434, 0.0001, 0.171, 0.009, 0.001, 0.001, 0.025, 0.014, 1.53, 0.174, 0.539, 0.045, 0.068, 0.25, 0.269, 0.443, 0.023, 0.04, 0.304, 0.083, 0.214, 0.028, 0.182, 24.937, 7.5, 0.641, 0.298, 1.687, 0.033, 0.816, 0.129, 0.459, 0.371, 1.179, 1.062, 2.109, 0.002, 1.084, 0.0001, 0.0001, 0.578, 0.275, 0.191, 1.004, 0.659, 0.001, 0.0001, 0.01, 0.01, 3.197, 1.534, 0.0001, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.897, 0.0001, 0.034, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "dv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.449, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.782, 0.003, 0.057, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.068, 0.068, 0.0001, 0.001, 0.01, 0.02, 0.58, 0.003, 0.08, 0.111, 0.068, 0.041, 0.031, 0.037, 0.03, 0.031, 0.035, 0.052, 0.01, 0.001, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.002, 0.002, 0.001, 0.003, 0.003, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.002, 0.003, 0.005, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.004, 0.0001, 0.069, 0.013, 0.026, 0.027, 0.096, 0.015, 0.017, 0.033, 0.065, 0.001, 0.006, 0.037, 0.021, 0.063, 0.061, 0.016, 0.001, 0.05, 0.05, 0.064, 0.025, 0.009, 0.011, 0.002, 0.014, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.961, 0.592, 2.65, 1.657, 0.723, 0.269, 1.597, 3.461, 1.72, 1.651, 0.757, 0.977, 1.223, 0.768, 1.538, 0.011, 0.778, 0.359, 0.094, 0.266, 0.255, 0.126, 0.187, 0.051, 0.006, 0.076, 0.047, 0.004, 0.004, 0.086, 0.041, 0.008, 0.02, 0.003, 0.091, 0.008, 0.069, 0.003, 5.331, 1.558, 2.986, 0.988, 3.164, 0.17, 3.662, 0.439, 0.51, 0.17, 3.636, 0.006, 0.014, 0.003, 0.002, 0.002, 0.001, 0.014, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.201, 0.101, 0.0001, 0.002, 0.0001, 0.0001, 45.417, 0.0001, 0.002, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "dz": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.39, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.815, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.023, 0.023, 0.0001, 0.002, 0.003, 0.013, 0.008, 0.001, 0.017, 0.015, 0.012, 0.006, 0.005, 0.004, 0.005, 0.004, 0.004, 0.004, 0.001, 0.0001, 0.007, 0.0001, 0.007, 0.001, 0.0001, 0.002, 0.004, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.003, 0.001, 0.0001, 0.004, 0.0001, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.03, 0.011, 0.006, 0.008, 0.024, 0.002, 0.006, 0.009, 0.021, 0.002, 0.004, 0.014, 0.011, 0.019, 0.021, 0.004, 0.0001, 0.02, 0.011, 0.013, 0.01, 0.002, 0.002, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.269, 0.247, 1.794, 0.002, 1.18, 0.189, 0.19, 0.052, 0.002, 0.102, 0.016, 7.859, 0.051, 0.549, 0.008, 0.12, 0.301, 1.592, 0.28, 1.053, 0.694, 0.157, 1.278, 0.061, 0.824, 0.093, 0.2, 0.068, 0.006, 0.019, 0.267, 0.283, 0.898, 0.517, 1.238, 0.954, 0.214, 0.015, 2.251, 0.029, 0.117, 0.081, 0.001, 0.058, 0.0001, 0.012, 0.002, 0.0001, 0.002, 0.89, 2.149, 0.094, 1.08, 0.001, 0.0001, 0.053, 0.001, 0.0001, 0.926, 0.001, 10.076, 21.494, 2.583, 0.002, 0.0001, 0.0001, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 32.733, 0.0001, 0.016, 0.005, 0.001, 0.002, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ee": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.047, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.659, 0.001, 0.347, 0.0001, 0.001, 0.004, 0.004, 0.044, 0.199, 0.199, 0.001, 0.0001, 0.713, 0.054, 1.348, 0.005, 0.312, 0.38, 0.219, 0.115, 0.09, 0.132, 0.118, 0.118, 0.109, 0.211, 0.064, 0.006, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.552, 0.172, 0.134, 0.182, 0.397, 0.085, 0.215, 0.112, 0.083, 0.04, 0.209, 0.217, 0.202, 0.168, 0.043, 0.117, 0.006, 0.112, 0.229, 0.176, 0.053, 0.059, 0.177, 0.021, 0.139, 0.02, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 7.214, 1.62, 0.258, 2.122, 10.212, 0.557, 1.427, 0.62, 4.11, 0.028, 2.137, 3.419, 2.267, 3.348, 4.663, 0.886, 0.007, 1.264, 2.303, 2.327, 2.541, 0.557, 2.031, 0.389, 1.697, 0.84, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.058, 0.011, 0.016, 0.109, 0.004, 0.002, 0.009, 0.001, 0.003, 0.01, 0.044, 0.61, 0.005, 0.002, 0.0001, 0.003, 0.018, 0.018, 1.229, 0.009, 2.883, 0.003, 1.23, 0.001, 0.002, 0.008, 0.003, 0.085, 0.02, 0.018, 0.001, 0.001, 0.052, 0.01, 0.004, 0.485, 0.002, 0.0001, 0.002, 0.004, 0.005, 0.042, 0.003, 0.002, 0.003, 0.025, 0.002, 0.002, 0.007, 0.009, 0.047, 0.01, 0.005, 0.003, 0.005, 0.003, 0.006, 0.005, 0.14, 0.007, 0.005, 0.138, 0.008, 0.004, 0.0001, 0.0001, 0.039, 0.487, 0.018, 0.548, 1.276, 0.0001, 0.004, 4.335, 0.128, 0.004, 0.106, 0.013, 0.028, 0.013, 0.041, 0.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.138, 0.051, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "eml": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.684, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.039, 0.004, 0.415, 0.0001, 0.0001, 0.004, 0.001, 1.632, 0.216, 0.216, 0.001, 0.001, 0.746, 0.069, 0.997, 0.011, 0.415, 0.659, 0.408, 0.216, 0.231, 0.235, 0.226, 0.213, 0.215, 0.256, 0.061, 0.026, 0.05, 0.006, 0.05, 0.003, 0.0001, 0.44, 0.139, 0.4, 0.112, 0.078, 0.095, 0.114, 0.018, 0.424, 0.019, 0.012, 0.251, 0.226, 0.059, 0.026, 0.233, 0.016, 0.153, 0.231, 0.099, 0.036, 0.164, 0.011, 0.127, 0.003, 0.015, 0.004, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 7.63, 0.549, 2.301, 3.601, 3.529, 0.617, 1.263, 0.808, 5.22, 0.113, 0.052, 4.92, 1.657, 5.406, 1.72, 1.353, 0.118, 3.957, 2.689, 3.146, 2.026, 0.904, 0.024, 0.02, 0.047, 0.34, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.239, 0.003, 0.006, 0.003, 0.004, 0.052, 0.002, 0.003, 0.008, 0.003, 0.006, 0.001, 0.002, 0.193, 0.002, 0.001, 0.002, 0.002, 0.003, 0.098, 0.002, 0.001, 0.001, 0.001, 0.033, 0.188, 0.003, 0.047, 0.006, 0.006, 0.001, 0.078, 0.562, 0.025, 0.617, 0.129, 0.182, 0.072, 0.003, 0.005, 1.444, 0.829, 0.895, 0.057, 0.235, 0.011, 0.346, 0.001, 0.004, 0.003, 0.664, 0.345, 0.314, 0.007, 0.019, 0.001, 0.003, 0.275, 0.004, 0.186, 0.062, 0.002, 0.002, 0.006, 0.0001, 0.0001, 0.011, 6.936, 0.1, 0.325, 0.0001, 0.004, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.003, 0.002, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.192, 0.237, 0.003, 0.002, 0.005, 0.003, 0.003, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "eo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.154, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.737, 0.006, 0.429, 0.0001, 0.0001, 0.01, 0.001, 0.015, 0.235, 0.235, 0.001, 0.003, 0.936, 0.306, 0.916, 0.015, 0.284, 0.481, 0.226, 0.14, 0.134, 0.143, 0.121, 0.123, 0.155, 0.273, 0.072, 0.027, 0.012, 0.007, 0.013, 0.002, 0.0001, 0.209, 0.154, 0.114, 0.106, 0.232, 0.094, 0.127, 0.102, 0.106, 0.077, 0.183, 0.354, 0.184, 0.118, 0.083, 0.187, 0.004, 0.116, 0.241, 0.149, 0.061, 0.074, 0.035, 0.004, 0.009, 0.024, 0.021, 0.0001, 0.021, 0.0001, 0.004, 0.0001, 9.544, 0.784, 0.841, 2.534, 6.934, 0.706, 0.989, 0.423, 6.212, 2.407, 2.868, 4.302, 1.963, 5.456, 7.143, 1.699, 0.009, 4.617, 4.113, 4.222, 2.31, 1.083, 0.045, 0.017, 0.108, 0.46, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.058, 0.01, 0.009, 0.008, 0.004, 0.004, 0.002, 0.003, 0.037, 0.239, 0.001, 0.001, 0.004, 0.007, 0.001, 0.002, 0.002, 0.007, 0.002, 0.018, 0.008, 0.001, 0.002, 0.002, 0.002, 0.012, 0.003, 0.005, 0.093, 0.609, 0.008, 0.005, 0.021, 0.066, 0.005, 0.003, 0.01, 0.029, 0.002, 0.005, 0.005, 0.035, 0.002, 0.007, 0.002, 0.34, 0.001, 0.002, 0.012, 0.007, 0.011, 0.025, 0.006, 0.093, 0.016, 0.003, 0.007, 0.003, 0.008, 0.009, 0.016, 0.009, 0.009, 0.003, 0.0001, 0.0001, 0.038, 0.2, 0.946, 0.502, 0.0001, 0.001, 0.005, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.012, 0.006, 0.045, 0.015, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.003, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.056, 0.002, 0.001, 0.003, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "eu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.418, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.177, 0.001, 0.297, 0.0001, 0.0001, 0.006, 0.001, 0.01, 0.167, 0.167, 0.0001, 0.001, 1.097, 0.307, 1.039, 0.006, 0.582, 0.665, 0.539, 0.263, 0.232, 0.207, 0.196, 0.233, 0.193, 0.297, 0.077, 0.037, 0.019, 0.004, 0.019, 0.001, 0.0001, 0.228, 0.197, 0.105, 0.074, 0.177, 0.09, 0.111, 0.131, 0.123, 0.048, 0.077, 0.106, 0.134, 0.065, 0.059, 0.121, 0.005, 0.05, 0.134, 0.08, 0.034, 0.046, 0.019, 0.022, 0.008, 0.029, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.0001, 11.924, 1.97, 0.229, 2.409, 9.817, 0.3, 1.545, 0.915, 6.874, 0.162, 4.015, 2.508, 1.08, 6.457, 4.385, 0.883, 0.011, 6.261, 2.025, 5.706, 3.55, 0.077, 0.032, 0.337, 0.117, 3.463, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.014, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.008, 0.009, 0.002, 0.002, 0.004, 0.001, 0.001, 0.003, 0.009, 0.023, 0.001, 0.012, 0.001, 0.01, 0.001, 0.001, 0.003, 0.012, 0.007, 0.008, 0.006, 0.001, 0.003, 0.001, 0.002, 0.001, 0.004, 0.012, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.039, 0.094, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.013, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ext": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.183, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.144, 0.002, 0.474, 0.0001, 0.0001, 0.008, 0.001, 0.271, 0.191, 0.19, 0.004, 0.002, 1.06, 0.101, 0.854, 0.021, 0.249, 0.293, 0.188, 0.105, 0.088, 0.096, 0.085, 0.084, 0.099, 0.161, 0.072, 0.026, 0.008, 0.003, 0.006, 0.002, 0.0001, 0.241, 0.103, 0.248, 0.095, 0.369, 0.065, 0.091, 0.071, 0.128, 0.047, 0.018, 0.238, 0.161, 0.09, 0.062, 0.171, 0.026, 0.094, 0.188, 0.116, 0.077, 0.083, 0.02, 0.035, 0.009, 0.011, 0.028, 0.0001, 0.029, 0.0001, 0.001, 0.002, 8.822, 0.896, 2.974, 2.338, 7.586, 0.409, 0.951, 0.639, 6.63, 0.18, 0.079, 4.794, 1.966, 5.508, 3.713, 1.742, 0.451, 4.358, 5.625, 3.427, 5.456, 0.664, 0.026, 0.047, 0.265, 0.205, 0.0001, 0.012, 0.0001, 0.001, 0.0001, 0.09, 0.042, 0.016, 0.012, 0.021, 0.01, 0.009, 0.007, 0.019, 0.01, 0.009, 0.002, 0.007, 0.012, 0.003, 0.002, 0.01, 0.006, 0.003, 0.011, 0.012, 0.003, 0.002, 0.002, 0.004, 0.049, 0.003, 0.005, 0.01, 0.009, 0.003, 0.003, 0.02, 0.663, 0.003, 0.009, 0.008, 0.004, 0.004, 0.092, 0.006, 0.332, 0.01, 0.012, 0.009, 0.354, 0.005, 0.01, 0.016, 0.295, 0.019, 0.537, 0.024, 0.015, 0.008, 0.008, 0.011, 0.017, 0.174, 0.02, 0.041, 0.023, 0.01, 0.023, 0.0001, 0.0001, 0.078, 2.453, 0.012, 0.009, 0.0001, 0.0001, 0.0001, 0.019, 0.008, 0.025, 0.005, 0.0001, 0.151, 0.073, 0.021, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.034, 0.026, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.021, 0.082, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ff": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.229, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.756, 0.003, 0.154, 0.0001, 0.0001, 0.002, 0.0001, 0.07, 0.321, 0.324, 0.004, 0.001, 1.19, 0.201, 1.011, 0.039, 0.221, 0.281, 0.197, 0.076, 0.082, 0.099, 0.098, 0.084, 0.101, 0.154, 0.153, 0.028, 0.04, 0.008, 0.04, 0.01, 0.0001, 0.371, 0.159, 0.12, 0.097, 0.095, 0.198, 0.111, 0.12, 0.065, 0.102, 0.267, 0.138, 0.299, 0.201, 0.095, 0.085, 0.014, 0.046, 0.262, 0.159, 0.061, 0.013, 0.059, 0.003, 0.066, 0.008, 0.007, 0.0001, 0.007, 0.0001, 0.006, 0.0001, 10.449, 0.928, 0.343, 3.119, 8.063, 0.727, 1.432, 1.127, 6.432, 0.966, 2.387, 3.274, 2.586, 6.222, 6.89, 0.484, 0.058, 2.623, 1.086, 2.251, 3.239, 0.048, 1.581, 0.013, 1.385, 0.042, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.25, 0.043, 0.0001, 0.008, 0.007, 0.001, 0.007, 0.002, 0.023, 0.003, 0.031, 0.086, 0.001, 0.0001, 0.009, 0.005, 0.007, 0.017, 0.003, 1.378, 0.001, 0.001, 0.0001, 1.485, 0.01, 0.123, 0.001, 0.002, 0.036, 0.035, 0.003, 0.0001, 0.06, 0.009, 0.0001, 0.003, 0.0001, 0.002, 0.02, 0.011, 0.007, 0.04, 0.001, 0.024, 0.001, 0.003, 0.0001, 0.0001, 0.006, 0.154, 0.006, 0.01, 0.135, 0.002, 0.002, 0.009, 0.004, 0.002, 0.004, 0.025, 0.02, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.111, 0.229, 0.005, 0.088, 0.202, 0.0001, 0.0001, 2.86, 0.02, 0.001, 0.001, 0.0001, 0.003, 0.0001, 0.017, 0.011, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.023, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.248, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fj": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.647, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.11, 0.005, 0.222, 0.0001, 0.0001, 0.0001, 0.002, 0.182, 0.39, 0.39, 0.002, 0.003, 0.665, 0.202, 1.418, 0.055, 0.382, 0.504, 0.342, 0.179, 0.168, 0.196, 0.159, 0.133, 0.129, 0.164, 0.07, 0.04, 0.02, 0.002, 0.02, 0.013, 0.002, 0.352, 0.212, 0.246, 0.146, 0.319, 0.066, 0.096, 0.061, 0.166, 0.217, 0.277, 0.179, 0.262, 0.29, 0.095, 0.254, 0.022, 0.118, 0.377, 0.355, 0.066, 0.534, 0.043, 0.003, 0.05, 0.01, 0.0001, 0.0001, 0.005, 0.0001, 0.008, 0.0001, 13.891, 0.708, 1.055, 1.505, 4.909, 0.352, 0.936, 0.685, 8.96, 0.075, 2.998, 2.827, 2.182, 5.506, 3.831, 0.546, 0.257, 2.747, 2.722, 3.592, 4.532, 2.046, 0.526, 0.045, 0.71, 0.111, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.267, 0.01, 0.007, 0.005, 0.007, 0.002, 0.0001, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.008, 0.0001, 0.0001, 0.013, 0.192, 0.0001, 0.003, 0.002, 0.0001, 0.008, 0.002, 0.0001, 0.023, 0.022, 0.002, 0.0001, 0.007, 0.005, 0.0001, 0.01, 0.003, 0.0001, 0.002, 0.005, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.008, 0.0001, 0.003, 0.022, 0.003, 0.002, 0.005, 0.0001, 0.008, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.013, 0.065, 0.0001, 0.023, 0.002, 0.0001, 0.0001, 0.013, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.002, 0.01, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.26, 0.0001, 0.003, 0.002, 0.0001, 0.003, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.171, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.257, 0.003, 0.223, 0.0001, 0.0001, 0.01, 0.002, 0.015, 0.14, 0.141, 0.001, 0.001, 0.983, 0.292, 1.473, 0.021, 0.562, 0.624, 0.361, 0.197, 0.187, 0.183, 0.177, 0.172, 0.176, 0.285, 0.092, 0.018, 0.015, 0.005, 0.015, 0.002, 0.0001, 0.162, 0.14, 0.076, 0.088, 0.116, 0.204, 0.083, 0.244, 0.058, 0.087, 0.291, 0.108, 0.161, 0.114, 0.065, 0.092, 0.004, 0.082, 0.312, 0.204, 0.061, 0.078, 0.034, 0.003, 0.012, 0.006, 0.004, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 6.488, 0.752, 0.145, 1.557, 3.939, 1.383, 2.415, 1.123, 6.407, 0.628, 2.151, 3.099, 2.563, 5.616, 2.172, 0.663, 0.005, 6.541, 3.536, 4.094, 3.571, 2.164, 0.044, 0.017, 0.862, 0.025, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.054, 0.049, 0.002, 0.002, 0.002, 0.004, 0.003, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.091, 0.001, 0.001, 0.001, 0.001, 0.001, 0.033, 0.002, 0.001, 0.002, 0.001, 0.017, 0.004, 0.006, 0.001, 0.006, 0.009, 0.001, 0.001, 0.01, 0.939, 0.001, 0.001, 0.016, 0.008, 0.277, 0.003, 0.006, 0.007, 0.001, 0.002, 0.001, 1.13, 0.001, 0.004, 1.899, 0.003, 0.003, 0.718, 0.002, 0.002, 0.014, 0.001, 0.801, 0.002, 0.333, 0.003, 0.004, 0.203, 0.003, 0.002, 0.0001, 0.0001, 0.022, 6.504, 0.004, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.012, 0.005, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.004, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.053, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "frp": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.788, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.014, 0.012, 0.659, 0.001, 0.0001, 0.001, 0.001, 0.361, 0.368, 0.368, 0.001, 0.0001, 0.743, 0.467, 0.873, 0.02, 0.214, 0.426, 0.274, 0.128, 0.113, 0.117, 0.113, 0.107, 0.116, 0.228, 0.11, 0.019, 0.081, 0.005, 0.081, 0.002, 0.0001, 0.35, 0.279, 0.333, 0.142, 0.141, 0.152, 0.135, 0.066, 0.159, 0.087, 0.033, 0.593, 0.22, 0.099, 0.082, 0.206, 0.019, 0.236, 0.314, 0.121, 0.062, 0.179, 0.013, 0.025, 0.027, 0.009, 0.022, 0.0001, 0.022, 0.0001, 0.006, 0.0001, 6.3, 0.639, 2.237, 2.924, 6.953, 0.549, 0.996, 0.581, 3.639, 0.252, 0.124, 3.838, 1.505, 5.552, 4.982, 1.442, 0.366, 4.363, 4.487, 4.4, 2.763, 0.919, 0.029, 0.168, 0.501, 0.132, 0.0001, 0.008, 0.0001, 0.001, 0.0001, 0.591, 0.012, 0.04, 0.026, 0.003, 0.003, 0.002, 0.002, 0.077, 0.083, 0.002, 0.003, 0.004, 0.003, 0.002, 0.005, 0.007, 0.003, 0.002, 0.023, 0.039, 0.002, 0.001, 0.002, 0.013, 0.56, 0.002, 0.002, 0.004, 0.004, 0.002, 0.004, 0.079, 0.014, 0.761, 0.004, 0.005, 0.003, 0.004, 0.044, 1.724, 0.994, 0.451, 0.049, 0.014, 0.007, 0.008, 0.004, 0.024, 0.005, 0.02, 0.03, 0.411, 0.012, 0.002, 0.176, 0.006, 0.01, 0.014, 0.089, 0.007, 0.007, 0.007, 0.005, 0.0001, 0.0001, 0.277, 4.789, 0.008, 0.018, 0.001, 0.0001, 0.0001, 0.008, 0.004, 0.004, 0.003, 0.001, 0.014, 0.004, 0.075, 0.032, 0.0001, 0.0001, 0.001, 0.005, 0.001, 0.004, 0.007, 0.005, 0.0001, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.004, 0.024, 0.586, 0.003, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "frr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.212, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.548, 0.003, 0.682, 0.0001, 0.001, 0.008, 0.0001, 0.237, 0.407, 0.407, 0.015, 0.002, 0.738, 0.264, 1.349, 0.032, 0.426, 0.487, 0.285, 0.155, 0.131, 0.142, 0.153, 0.132, 0.154, 0.213, 0.163, 0.033, 0.094, 0.019, 0.094, 0.014, 0.0001, 0.424, 0.235, 0.114, 0.463, 0.142, 0.219, 0.132, 0.243, 0.123, 0.143, 0.217, 0.156, 0.239, 0.202, 0.1, 0.178, 0.008, 0.163, 0.493, 0.169, 0.107, 0.04, 0.158, 0.005, 0.006, 0.018, 0.02, 0.0001, 0.02, 0.0001, 0.015, 0.0001, 7.38, 1.026, 0.694, 2.643, 7.751, 1.48, 1.329, 1.414, 5.143, 0.835, 1.946, 2.506, 1.658, 6.635, 2.847, 0.757, 0.017, 4.866, 3.953, 4.835, 3.559, 0.125, 1.078, 0.025, 0.13, 0.078, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.121, 0.04, 0.005, 0.007, 0.011, 0.01, 0.004, 0.003, 0.014, 0.003, 0.007, 0.003, 0.003, 0.004, 0.004, 0.002, 0.006, 0.041, 0.003, 0.029, 0.004, 0.002, 0.039, 0.002, 0.005, 0.057, 0.003, 0.003, 0.033, 0.001, 0.015, 0.005, 0.043, 0.01, 0.008, 0.004, 0.702, 0.24, 0.006, 0.008, 0.007, 0.041, 0.006, 0.01, 0.003, 0.013, 0.002, 0.004, 0.015, 0.008, 0.014, 0.009, 0.006, 0.008, 0.971, 0.003, 0.022, 0.007, 0.006, 0.005, 0.964, 0.005, 0.004, 0.003, 0.0001, 0.0001, 0.041, 3.039, 0.101, 0.012, 0.0001, 0.001, 0.0001, 0.016, 0.008, 0.014, 0.003, 0.0001, 0.014, 0.006, 0.019, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.018, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.024, 0.122, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fur": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.465, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.803, 0.002, 0.385, 0.0001, 0.0001, 0.006, 0.001, 0.135, 0.204, 0.203, 0.001, 0.001, 0.945, 0.084, 1.045, 0.015, 0.262, 0.474, 0.24, 0.16, 0.15, 0.158, 0.149, 0.15, 0.168, 0.219, 0.076, 0.046, 0.024, 0.003, 0.006, 0.002, 0.0001, 0.268, 0.102, 0.337, 0.116, 0.078, 0.115, 0.121, 0.022, 0.278, 0.048, 0.02, 0.218, 0.154, 0.07, 0.05, 0.172, 0.005, 0.086, 0.217, 0.131, 0.073, 0.108, 0.016, 0.024, 0.002, 0.027, 0.004, 0.001, 0.004, 0.0001, 0.016, 0.0001, 6.873, 0.54, 3.119, 3.521, 7.672, 0.855, 0.912, 0.901, 8.131, 0.838, 0.065, 4.486, 1.745, 5.361, 3.491, 1.873, 0.016, 4.269, 4.833, 4.488, 2.566, 1.056, 0.024, 0.012, 0.029, 0.497, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.039, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.013, 0.0001, 0.001, 0.008, 0.008, 0.0001, 0.002, 0.187, 0.005, 0.973, 0.001, 0.004, 0.001, 0.001, 0.127, 0.268, 0.009, 0.161, 0.005, 0.069, 0.003, 0.185, 0.001, 0.033, 0.003, 0.05, 0.006, 0.254, 0.001, 0.005, 0.001, 0.001, 0.015, 0.003, 0.208, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.042, 2.523, 0.01, 0.009, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.01, 0.005, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.038, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.82, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.701, 0.001, 0.398, 0.0001, 0.001, 0.014, 0.003, 0.455, 0.166, 0.166, 0.001, 0.0001, 0.747, 0.192, 0.908, 0.008, 0.277, 0.415, 0.181, 0.098, 0.101, 0.113, 0.107, 0.108, 0.145, 0.219, 0.052, 0.025, 0.005, 0.001, 0.005, 0.002, 0.0001, 0.213, 0.183, 0.091, 0.343, 0.093, 0.196, 0.109, 0.18, 0.193, 0.088, 0.132, 0.122, 0.161, 0.156, 0.11, 0.106, 0.003, 0.108, 0.302, 0.13, 0.038, 0.048, 0.113, 0.006, 0.12, 0.009, 0.007, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 6.027, 1.091, 0.691, 3.439, 11.73, 1.889, 1.306, 1.373, 5.412, 1.009, 2.464, 2.808, 1.837, 7.368, 3.471, 1.074, 0.006, 5.381, 4.264, 5.226, 1.268, 0.226, 1.241, 0.017, 1.595, 0.254, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.043, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.007, 0.001, 0.0001, 0.001, 0.001, 0.004, 0.021, 0.0001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.013, 0.004, 0.263, 0.001, 0.008, 0.001, 0.001, 0.002, 0.002, 0.01, 0.258, 0.016, 0.001, 0.003, 0.001, 0.013, 0.005, 0.004, 0.006, 0.003, 0.084, 0.002, 0.006, 0.001, 0.003, 0.002, 0.21, 0.348, 0.006, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.02, 1.229, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.015, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.042, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ga": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.234, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.249, 0.002, 0.288, 0.0001, 0.001, 0.013, 0.002, 0.109, 0.15, 0.15, 0.0001, 0.002, 0.872, 0.193, 0.872, 0.017, 0.241, 0.359, 0.187, 0.093, 0.09, 0.096, 0.095, 0.093, 0.117, 0.202, 0.044, 0.013, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.26, 0.338, 0.441, 0.188, 0.097, 0.15, 0.18, 0.066, 0.279, 0.041, 0.036, 0.154, 0.249, 0.121, 0.062, 0.138, 0.005, 0.145, 0.311, 0.272, 0.036, 0.033, 0.04, 0.007, 0.009, 0.007, 0.033, 0.0001, 0.031, 0.0001, 0.002, 0.0001, 11.315, 1.29, 2.859, 2.236, 4.184, 0.692, 2.117, 5.503, 7.212, 0.011, 0.093, 2.991, 1.605, 6.018, 2.868, 0.471, 0.007, 4.409, 3.653, 3.32, 1.715, 0.088, 0.061, 0.021, 0.135, 0.028, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.063, 0.032, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.059, 0.001, 0.002, 0.002, 0.009, 0.001, 0.001, 0.001, 0.001, 0.001, 0.044, 0.003, 0.001, 0.001, 0.001, 0.005, 0.023, 0.008, 0.001, 0.006, 0.006, 0.0001, 0.001, 0.02, 1.278, 0.008, 0.002, 0.005, 0.001, 0.001, 0.002, 0.002, 1.021, 0.001, 0.002, 0.002, 1.343, 0.001, 0.001, 0.006, 0.004, 0.004, 0.674, 0.002, 0.003, 0.005, 0.001, 0.004, 0.002, 0.624, 0.002, 0.005, 0.004, 0.003, 0.002, 0.0001, 0.0001, 0.022, 5.087, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.011, 0.005, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.061, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gag": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.391, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.28, 0.016, 0.1, 0.0001, 0.001, 0.011, 0.0001, 0.023, 0.153, 0.154, 0.0001, 0.0001, 0.918, 0.454, 1.065, 0.029, 0.183, 0.22, 0.131, 0.062, 0.067, 0.072, 0.06, 0.06, 0.062, 0.143, 0.13, 0.023, 0.015, 0.004, 0.015, 0.028, 0.0001, 0.378, 0.403, 0.048, 0.156, 0.135, 0.049, 0.237, 0.117, 0.049, 0.029, 0.415, 0.105, 0.242, 0.108, 0.187, 0.134, 0.003, 0.159, 0.189, 0.383, 0.092, 0.136, 0.005, 0.011, 0.079, 0.04, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 9.932, 1.463, 0.503, 2.949, 4.34, 0.314, 1.11, 0.547, 5.816, 0.052, 2.859, 4.285, 1.983, 5.174, 2.034, 0.659, 0.007, 5.297, 2.304, 2.138, 2.154, 0.741, 0.006, 0.007, 1.825, 1.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.33, 0.02, 0.014, 0.017, 0.012, 0.006, 0.003, 0.09, 0.004, 0.002, 0.005, 0.006, 0.005, 0.012, 0.002, 0.007, 0.002, 0.004, 0.002, 0.034, 0.066, 0.003, 0.036, 0.002, 0.004, 0.038, 0.004, 0.03, 0.138, 0.106, 0.046, 1.073, 0.005, 0.011, 0.07, 0.054, 1.028, 0.001, 0.006, 0.629, 0.003, 0.006, 0.12, 0.006, 0.002, 0.001, 0.004, 0.003, 0.193, 2.957, 0.016, 0.012, 0.008, 0.03, 0.347, 0.009, 0.023, 0.005, 0.018, 0.016, 1.278, 0.014, 0.03, 0.005, 0.0001, 0.0001, 0.012, 3.601, 3.155, 1.149, 0.001, 0.0001, 0.029, 0.03, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.224, 0.106, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.003, 0.019, 0.015, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.005, 0.317, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gan": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.76, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.481, 0.002, 0.018, 0.0001, 0.0001, 0.024, 0.003, 0.008, 0.023, 0.024, 0.002, 0.006, 0.023, 0.038, 0.047, 0.01, 0.315, 0.585, 0.297, 0.204, 0.191, 0.202, 0.185, 0.171, 0.182, 0.259, 0.005, 0.001, 0.007, 0.003, 0.007, 0.002, 0.0001, 0.033, 0.019, 0.032, 0.016, 0.012, 0.012, 0.016, 0.021, 0.015, 0.011, 0.012, 0.015, 0.023, 0.016, 0.01, 0.022, 0.002, 0.018, 0.031, 0.022, 0.006, 0.009, 0.014, 0.002, 0.005, 0.001, 0.008, 0.001, 0.008, 0.0001, 0.002, 0.0001, 0.219, 0.03, 0.061, 0.069, 0.246, 0.023, 0.046, 0.084, 0.187, 0.005, 0.034, 0.116, 0.064, 0.184, 0.17, 0.035, 0.003, 0.158, 0.115, 0.138, 0.085, 0.023, 0.019, 0.007, 0.04, 0.007, 0.001, 0.001, 0.001, 0.0001, 0.0001, 3.244, 1.279, 2.127, 0.643, 0.387, 0.883, 0.435, 0.848, 1.431, 1.201, 0.629, 1.296, 2.258, 1.163, 0.623, 0.808, 0.937, 0.395, 0.26, 0.593, 0.667, 0.608, 1.031, 1.999, 0.578, 0.845, 0.936, 0.665, 1.536, 0.644, 0.439, 0.928, 0.498, 0.603, 0.631, 0.704, 0.585, 0.768, 0.515, 0.538, 0.76, 0.649, 0.365, 0.712, 0.597, 1.095, 0.882, 0.565, 2.328, 1.119, 0.438, 0.543, 1.012, 0.372, 0.441, 0.708, 1.829, 1.205, 1.47, 1.203, 2.219, 1.044, 0.843, 1.251, 0.0001, 0.0001, 0.055, 0.02, 0.005, 0.006, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.018, 0.009, 0.031, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.007, 0.036, 0.032, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.029, 0.011, 0.055, 2.062, 3.549, 9.312, 4.838, 3.056, 2.889, 2.67, 0.003, 0.005, 0.013, 0.003, 0.002, 1.772, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gd": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.483, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.829, 0.001, 0.374, 0.0001, 0.0001, 0.027, 0.001, 0.653, 0.225, 0.224, 0.001, 0.001, 0.74, 0.732, 0.959, 0.016, 0.275, 0.512, 0.251, 0.163, 0.143, 0.16, 0.146, 0.151, 0.187, 0.234, 0.126, 0.023, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.399, 0.354, 0.494, 0.195, 0.121, 0.114, 0.226, 0.061, 0.158, 0.033, 0.034, 0.204, 0.239, 0.107, 0.062, 0.151, 0.004, 0.164, 0.477, 0.402, 0.038, 0.033, 0.037, 0.023, 0.009, 0.008, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.001, 13.191, 1.481, 2.674, 2.933, 4.722, 0.55, 2.044, 6.832, 6.396, 0.019, 0.13, 2.757, 1.684, 7.147, 2.433, 0.32, 0.014, 3.962, 3.004, 2.554, 2.054, 0.073, 0.068, 0.016, 0.125, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.262, 0.013, 0.005, 0.005, 0.004, 0.003, 0.002, 0.002, 0.031, 0.005, 0.004, 0.001, 0.011, 0.003, 0.002, 0.001, 0.006, 0.003, 0.012, 0.014, 0.004, 0.002, 0.002, 0.002, 0.027, 0.178, 0.003, 0.005, 0.012, 0.011, 0.001, 0.003, 0.677, 0.029, 0.002, 0.003, 0.009, 0.003, 0.004, 0.005, 0.218, 0.029, 0.004, 0.003, 0.303, 0.022, 0.002, 0.003, 0.018, 0.008, 0.323, 0.026, 0.004, 0.004, 0.01, 0.002, 0.006, 0.223, 0.01, 0.003, 0.014, 0.004, 0.005, 0.002, 0.0001, 0.0001, 0.041, 1.912, 0.009, 0.011, 0.0001, 0.0001, 0.0001, 0.018, 0.01, 0.015, 0.003, 0.0001, 0.015, 0.007, 0.02, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.008, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.244, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.812, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.39, 0.002, 0.342, 0.0001, 0.0001, 0.01, 0.001, 0.013, 0.144, 0.144, 0.001, 0.002, 1.02, 0.075, 0.726, 0.01, 0.251, 0.326, 0.181, 0.093, 0.083, 0.092, 0.082, 0.082, 0.102, 0.185, 0.047, 0.021, 0.003, 0.002, 0.002, 0.001, 0.0001, 0.331, 0.122, 0.257, 0.114, 0.192, 0.107, 0.104, 0.065, 0.139, 0.039, 0.03, 0.104, 0.167, 0.127, 0.177, 0.186, 0.007, 0.111, 0.187, 0.12, 0.054, 0.074, 0.026, 0.055, 0.009, 0.01, 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 9.121, 0.85, 3.271, 4.11, 8.668, 0.721, 0.784, 0.524, 5.185, 0.017, 0.092, 2.548, 2.069, 5.528, 7.673, 1.889, 0.464, 5.046, 5.357, 3.627, 2.8, 0.704, 0.036, 0.564, 0.085, 0.291, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.015, 0.013, 0.003, 0.002, 0.002, 0.001, 0.002, 0.002, 0.001, 0.012, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.006, 0.003, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.028, 0.396, 0.001, 0.002, 0.002, 0.001, 0.001, 0.003, 0.003, 0.383, 0.003, 0.007, 0.001, 0.442, 0.001, 0.001, 0.005, 0.193, 0.006, 0.599, 0.002, 0.002, 0.003, 0.001, 0.003, 0.002, 0.219, 0.007, 0.008, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.05, 2.267, 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.011, 0.005, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.014, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "glk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.405, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.911, 0.005, 0.048, 0.0001, 0.0001, 0.001, 0.0001, 0.017, 0.104, 0.105, 0.0001, 0.001, 0.019, 0.086, 0.553, 0.019, 0.043, 0.074, 0.037, 0.051, 0.028, 0.037, 0.027, 0.021, 0.025, 0.021, 0.078, 0.0001, 0.005, 0.006, 0.007, 0.001, 0.0001, 0.004, 0.003, 0.008, 0.003, 0.003, 0.002, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.004, 0.002, 0.001, 0.003, 0.0001, 0.003, 0.005, 0.008, 0.006, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.177, 0.041, 0.015, 0.061, 0.102, 0.013, 0.028, 0.036, 0.115, 0.015, 0.035, 0.047, 0.057, 0.128, 0.083, 0.024, 0.008, 0.098, 0.063, 0.07, 0.058, 0.027, 0.009, 0.013, 0.021, 0.022, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.159, 0.386, 0.313, 0.148, 1.28, 2.09, 3.65, 3.311, 2.644, 0.084, 1.185, 0.003, 3.768, 0.001, 0.042, 0.015, 0.057, 0.007, 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.027, 0.07, 0.004, 0.009, 0.002, 0.001, 0.0001, 0.024, 0.001, 0.005, 0.174, 0.185, 0.526, 0.0001, 0.349, 5.779, 1.561, 0.992, 2.058, 0.045, 0.725, 0.235, 0.5, 2.399, 0.083, 3.048, 0.622, 2.068, 1.214, 0.15, 0.072, 0.14, 0.046, 0.343, 0.079, 0.014, 0.001, 0.0001, 0.271, 0.0001, 0.0001, 0.0001, 0.044, 0.065, 0.002, 0.021, 0.0001, 0.003, 0.0001, 0.068, 0.0001, 0.285, 0.001, 0.0001, 0.001, 0.0001, 0.005, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 21.901, 14.77, 1.833, 3.683, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.141, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.37, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.685, 0.002, 0.175, 0.0001, 0.0001, 0.007, 0.0001, 0.625, 0.171, 0.173, 0.001, 0.002, 1.108, 0.288, 0.925, 0.011, 0.221, 0.306, 0.165, 0.094, 0.084, 0.088, 0.078, 0.08, 0.105, 0.172, 0.107, 0.053, 0.096, 0.001, 0.096, 0.001, 0.0001, 0.314, 0.094, 0.194, 0.053, 0.124, 0.074, 0.125, 0.128, 0.14, 0.097, 0.171, 0.086, 0.202, 0.077, 0.188, 0.312, 0.005, 0.119, 0.136, 0.188, 0.098, 0.072, 0.01, 0.015, 0.073, 0.005, 0.013, 0.0001, 0.013, 0.0001, 0.0001, 0.003, 10.368, 1.134, 1.037, 1.076, 7.653, 0.097, 1.575, 2.931, 4.208, 1.013, 1.951, 0.867, 2.302, 2.015, 5.216, 3.17, 0.036, 4.342, 1.438, 2.887, 4.01, 2.242, 0.013, 0.023, 2.052, 0.103, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 1.036, 0.019, 0.002, 0.069, 0.003, 0.001, 0.001, 0.001, 0.002, 0.002, 0.001, 0.003, 0.001, 0.004, 0.0001, 0.001, 0.002, 0.06, 0.001, 0.011, 0.003, 0.002, 0.001, 0.001, 0.002, 0.862, 0.001, 0.001, 0.08, 0.08, 0.0001, 0.001, 0.04, 0.787, 0.003, 0.72, 0.019, 0.002, 0.003, 0.003, 0.016, 1.383, 0.003, 0.016, 0.003, 0.256, 0.002, 0.013, 0.007, 0.786, 0.011, 0.399, 0.027, 0.172, 0.004, 0.001, 0.003, 0.065, 0.529, 0.066, 0.013, 0.527, 0.003, 0.003, 0.0001, 0.0001, 0.078, 4.545, 0.392, 0.1, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.002, 0.065, 0.0001, 0.004, 0.002, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.405, 1.034, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gom": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.459, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.409, 0.004, 0.032, 0.0001, 0.0001, 0.004, 0.001, 0.065, 0.082, 0.086, 0.0001, 0.001, 0.31, 0.092, 0.614, 0.025, 0.037, 0.076, 0.035, 0.025, 0.021, 0.026, 0.02, 0.018, 0.022, 0.033, 0.044, 0.02, 0.0001, 0.003, 0.0001, 0.007, 0.0001, 0.043, 0.023, 0.024, 0.027, 0.017, 0.011, 0.022, 0.028, 0.023, 0.016, 0.018, 0.014, 0.036, 0.017, 0.018, 0.033, 0.001, 0.019, 0.035, 0.046, 0.011, 0.011, 0.005, 0.004, 0.003, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.007, 0.001, 1.398, 0.134, 0.264, 0.41, 0.83, 0.062, 0.182, 0.613, 0.742, 0.041, 0.372, 0.505, 0.457, 0.862, 0.987, 0.203, 0.002, 0.568, 0.367, 0.732, 0.344, 0.233, 0.034, 0.102, 0.093, 0.096, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 1.014, 0.337, 1.717, 0.03, 0.0001, 0.2, 0.49, 1.091, 0.031, 0.184, 0.021, 0.587, 0.017, 1.766, 0.002, 0.057, 0.002, 0.019, 0.005, 0.016, 0.001, 1.048, 0.146, 0.534, 0.083, 0.03, 0.659, 0.006, 0.381, 0.026, 0.006, 0.26, 0.031, 0.261, 0.004, 0.294, 21.971, 5.237, 0.529, 0.24, 0.912, 0.021, 0.699, 0.107, 0.285, 0.131, 0.613, 1.017, 1.508, 0.008, 1.629, 0.499, 0.008, 0.864, 0.313, 0.067, 0.93, 0.419, 0.0001, 0.006, 0.002, 0.0001, 3.471, 0.661, 0.0001, 0.0001, 0.008, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 26.65, 0.0001, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "got": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.339, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.094, 0.003, 1.291, 0.0001, 0.0001, 0.0001, 0.0001, 0.038, 0.115, 0.115, 0.004, 0.002, 1.558, 0.264, 1.449, 0.007, 0.147, 0.29, 0.265, 0.261, 0.158, 0.118, 0.082, 0.102, 0.128, 0.101, 0.042, 0.039, 0.006, 0.003, 0.008, 0.017, 0.0001, 0.013, 0.006, 0.028, 0.006, 0.126, 0.004, 0.142, 0.123, 0.192, 0.004, 0.003, 0.01, 0.007, 0.004, 0.248, 0.007, 0.0001, 0.011, 0.012, 0.024, 0.014, 0.037, 0.008, 0.0001, 0.001, 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 1.416, 0.252, 0.277, 0.447, 1.622, 0.345, 0.341, 0.482, 1.005, 0.151, 0.167, 0.523, 0.441, 1.296, 0.895, 0.224, 0.019, 0.998, 0.984, 0.975, 0.495, 0.221, 0.388, 0.018, 0.135, 0.029, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.227, 0.027, 0.943, 1.525, 0.623, 0.417, 0.281, 0.024, 0.043, 0.442, 0.017, 0.001, 12.517, 4.391, 0.0001, 0.004, 16.904, 0.001, 0.002, 0.005, 0.001, 0.003, 0.004, 0.004, 0.0001, 0.003, 0.047, 0.043, 0.003, 0.003, 0.004, 0.002, 1.424, 0.066, 0.105, 0.001, 0.004, 0.001, 0.009, 0.002, 0.017, 0.005, 0.002, 0.005, 0.002, 0.035, 0.001, 0.003, 3.235, 0.309, 0.439, 0.698, 0.617, 0.042, 0.143, 0.379, 0.509, 2.203, 0.495, 0.498, 0.573, 1.215, 0.432, 0.907, 0.0001, 0.0001, 1.432, 0.164, 0.007, 0.004, 0.001, 0.002, 0.0001, 0.004, 0.018, 0.002, 0.024, 0.0001, 0.034, 0.019, 0.033, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.002, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.003, 0.09, 0.108, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.902, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.271, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.449, 0.001, 0.421, 0.002, 0.001, 0.012, 0.004, 0.833, 0.218, 0.217, 0.001, 0.004, 1.036, 0.572, 0.962, 0.016, 0.26, 0.327, 0.165, 0.089, 0.084, 0.093, 0.087, 0.088, 0.107, 0.189, 0.087, 0.045, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.277, 0.194, 0.324, 0.123, 0.14, 0.124, 0.191, 0.146, 0.079, 0.067, 0.068, 0.129, 0.207, 0.152, 0.084, 0.138, 0.02, 0.179, 0.402, 0.526, 0.063, 0.198, 0.043, 0.005, 0.079, 0.006, 0.009, 0.0001, 0.009, 0.0001, 0.001, 0.0001, 8.563, 0.792, 1.691, 1.903, 8.594, 0.377, 2.885, 5.368, 3.902, 0.512, 0.598, 3.599, 1.506, 6.663, 4.174, 0.394, 0.032, 4.839, 4.581, 2.625, 1.233, 0.647, 0.279, 0.018, 6.112, 0.053, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.052, 0.016, 0.011, 0.007, 0.006, 0.002, 0.002, 0.033, 0.003, 0.008, 0.001, 0.001, 0.002, 0.004, 0.001, 0.003, 0.004, 0.002, 0.001, 0.008, 0.005, 0.001, 0.002, 0.002, 0.007, 0.032, 0.003, 0.002, 0.002, 0.002, 0.001, 0.001, 0.013, 0.034, 0.001, 0.003, 0.006, 0.002, 0.002, 0.259, 0.003, 0.024, 0.003, 0.005, 0.003, 0.021, 0.001, 0.003, 0.016, 0.006, 0.011, 0.021, 0.003, 0.006, 0.005, 0.006, 0.011, 0.008, 0.015, 0.005, 0.007, 0.005, 0.006, 0.004, 0.0001, 0.0001, 0.024, 0.446, 0.012, 0.021, 0.0001, 0.001, 0.0001, 0.006, 0.003, 0.004, 0.002, 0.0001, 0.012, 0.007, 0.044, 0.019, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.006, 0.05, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ha": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.755, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.253, 0.006, 0.093, 0.001, 0.0001, 0.003, 0.001, 0.233, 0.264, 0.267, 0.0001, 0.001, 0.745, 0.202, 0.904, 0.054, 0.25, 0.351, 0.185, 0.101, 0.092, 0.11, 0.102, 0.101, 0.107, 0.226, 0.077, 0.015, 0.009, 0.002, 0.009, 0.006, 0.001, 0.703, 0.295, 0.111, 0.155, 0.055, 0.098, 0.113, 0.13, 0.318, 0.133, 0.225, 0.088, 0.271, 0.163, 0.048, 0.074, 0.005, 0.115, 0.268, 0.173, 0.05, 0.018, 0.079, 0.003, 0.091, 0.042, 0.023, 0.0001, 0.025, 0.0001, 0.021, 0.001, 18.747, 1.651, 0.919, 2.906, 2.679, 0.906, 1.302, 1.831, 6.455, 0.467, 3.514, 2.109, 2.474, 6.749, 1.839, 0.213, 0.023, 4.031, 3.401, 2.21, 3.388, 0.067, 1.617, 0.015, 2.266, 0.447, 0.001, 0.001, 0.003, 0.002, 0.0001, 0.116, 0.007, 0.003, 0.001, 0.009, 0.005, 0.003, 0.003, 0.007, 0.002, 0.01, 0.001, 0.001, 0.0001, 0.003, 0.001, 0.002, 0.002, 0.001, 0.029, 0.002, 0.001, 0.0001, 0.094, 0.018, 0.242, 0.0001, 0.001, 0.01, 0.009, 0.001, 0.004, 0.02, 0.005, 0.002, 0.006, 0.0001, 0.001, 0.003, 0.015, 0.004, 0.013, 0.004, 0.002, 0.002, 0.004, 0.002, 0.003, 0.004, 0.011, 0.001, 0.005, 0.011, 0.003, 0.002, 0.003, 0.002, 0.004, 0.002, 0.001, 0.003, 0.003, 0.0001, 0.002, 0.0001, 0.0001, 0.03, 0.04, 0.008, 0.004, 0.18, 0.0001, 0.0001, 0.118, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.011, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.044, 0.043, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hak": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.757, 0.001, 0.06, 0.0001, 0.0001, 0.014, 0.0001, 0.007, 0.281, 0.281, 0.0001, 0.001, 0.836, 6.558, 0.681, 0.018, 0.337, 0.407, 0.278, 0.148, 0.134, 0.137, 0.13, 0.123, 0.136, 0.173, 0.065, 0.014, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.079, 0.057, 0.378, 0.035, 0.025, 0.133, 0.042, 0.182, 0.024, 0.017, 0.335, 0.169, 0.185, 0.174, 0.026, 0.169, 0.016, 0.027, 0.334, 0.366, 0.012, 0.069, 0.025, 0.002, 0.166, 0.009, 0.007, 0.0001, 0.007, 0.0001, 0.003, 0.0001, 1.796, 0.086, 1.609, 0.16, 2.657, 0.577, 2.978, 5.312, 4.077, 0.022, 2.986, 0.978, 0.836, 6.046, 1.214, 0.924, 0.006, 0.355, 1.925, 2.85, 1.719, 0.417, 0.063, 0.011, 1.033, 0.05, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.624, 0.347, 0.489, 0.127, 0.115, 0.217, 0.079, 0.128, 0.198, 0.185, 0.153, 0.188, 0.325, 0.981, 0.111, 0.161, 0.125, 0.071, 0.062, 0.072, 0.143, 0.099, 0.164, 0.124, 0.154, 0.164, 0.132, 0.118, 0.284, 0.116, 0.086, 0.138, 0.587, 0.284, 0.798, 0.114, 0.117, 0.11, 0.089, 0.096, 0.66, 0.449, 0.294, 0.11, 0.804, 0.308, 1.169, 0.118, 0.192, 0.187, 0.596, 1.486, 0.608, 0.076, 0.115, 0.115, 0.317, 1.436, 0.679, 1.022, 0.36, 0.128, 0.129, 0.134, 0.0001, 0.0001, 0.018, 7.409, 0.013, 0.036, 0.003, 0.005, 0.0001, 0.003, 0.001, 0.002, 1.194, 0.0001, 0.01, 0.005, 0.045, 0.02, 0.001, 0.001, 0.0001, 0.0001, 0.003, 0.013, 0.006, 0.004, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 1.011, 0.064, 0.254, 0.448, 1.333, 0.785, 0.602, 0.451, 0.439, 0.002, 0.004, 0.008, 0.003, 0.0001, 0.269, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "haw": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.221, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.294, 0.012, 0.203, 0.0001, 0.0001, 0.0001, 0.001, 0.132, 0.34, 0.352, 0.0001, 0.001, 1.505, 0.111, 0.979, 0.007, 0.17, 0.218, 0.129, 0.06, 0.059, 0.065, 0.059, 0.085, 0.093, 0.096, 0.074, 0.017, 0.01, 0.0001, 0.01, 0.007, 0.0001, 0.393, 0.447, 0.582, 0.062, 0.097, 0.065, 0.079, 0.798, 0.153, 0.05, 0.341, 0.594, 0.369, 0.112, 0.254, 0.296, 0.019, 0.112, 0.703, 0.122, 0.065, 0.176, 0.058, 0.005, 0.01, 0.09, 0.005, 0.0001, 0.006, 0.0001, 0.003, 0.006, 12.798, 0.268, 0.355, 0.813, 5.652, 0.089, 0.569, 1.324, 6.125, 0.081, 4.131, 4.145, 2.483, 4.121, 5.223, 1.895, 0.028, 1.627, 1.407, 0.928, 3.376, 0.134, 0.71, 0.014, 0.137, 0.178, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 1.411, 1.393, 0.012, 0.01, 0.008, 0.004, 0.003, 0.003, 0.01, 0.001, 0.006, 0.004, 0.027, 0.239, 0.001, 0.004, 0.011, 0.006, 0.002, 0.111, 0.01, 0.006, 0.002, 0.004, 1.323, 0.019, 0.006, 0.004, 0.007, 0.006, 0.005, 0.004, 0.006, 0.059, 0.005, 0.006, 0.006, 0.004, 0.001, 0.013, 0.01, 0.035, 0.014, 0.268, 0.004, 0.047, 0.003, 0.004, 0.012, 0.061, 0.008, 0.113, 0.006, 0.007, 0.004, 0.005, 0.011, 0.005, 0.014, 1.288, 0.011, 0.01, 0.006, 0.004, 0.0001, 0.0001, 0.011, 0.331, 1.585, 0.461, 0.0001, 0.008, 0.0001, 0.011, 1.285, 0.01, 0.001, 0.0001, 0.031, 0.013, 0.031, 0.011, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.043, 0.02, 0.017, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.013, 1.362, 0.0001, 0.001, 0.006, 0.003, 0.002, 0.001, 0.001, 0.002, 0.007, 0.008, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hif": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.441, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.1, 0.004, 0.114, 0.0001, 0.001, 0.009, 0.004, 0.035, 0.174, 0.173, 0.001, 0.001, 0.931, 0.131, 1.205, 0.021, 0.405, 0.564, 0.33, 0.156, 0.134, 0.134, 0.137, 0.132, 0.161, 0.312, 0.075, 0.009, 0.003, 0.005, 0.003, 0.001, 0.0001, 0.456, 0.322, 0.355, 0.197, 0.18, 0.293, 0.19, 0.17, 0.372, 0.16, 0.181, 0.207, 0.307, 0.247, 0.078, 0.33, 0.012, 0.201, 0.529, 0.239, 0.168, 0.085, 0.095, 0.004, 0.174, 0.017, 0.016, 0.0001, 0.016, 0.0001, 0.019, 0.0001, 12.241, 1.338, 1.486, 1.704, 7.791, 0.593, 1.202, 3.829, 6.515, 0.754, 3.146, 2.684, 2.468, 4.596, 2.829, 0.958, 0.04, 4.362, 3.289, 3.315, 2.328, 0.443, 0.421, 0.04, 0.804, 0.089, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.026, 0.089, 0.009, 0.002, 0.003, 0.005, 0.002, 0.014, 0.008, 0.001, 0.001, 0.004, 0.002, 0.02, 0.003, 0.003, 0.003, 0.002, 0.001, 0.042, 0.003, 0.007, 0.001, 0.003, 0.002, 0.005, 0.002, 0.011, 0.004, 0.001, 0.001, 0.013, 0.018, 0.009, 0.001, 0.005, 0.072, 0.024, 0.007, 0.009, 0.007, 0.012, 0.004, 0.029, 0.003, 0.013, 0.009, 0.007, 0.017, 0.022, 0.012, 0.006, 0.004, 0.005, 0.014, 0.002, 0.01, 0.032, 0.005, 0.004, 0.012, 0.003, 0.011, 0.006, 0.0001, 0.0001, 0.028, 0.074, 0.148, 0.035, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.005, 0.003, 0.0001, 0.004, 0.001, 0.016, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.105, 0.033, 0.022, 0.002, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ho": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.445, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.244, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.681, 0.84, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.042, 0.0001, 0.0001, 0.0001, 0.84, 1.681, 0.0001, 0.84, 0.0001, 0.0001, 1.681, 1.681, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.966, 0.84, 0.0001, 0.0001, 7.563, 0.0001, 0.84, 0.0001, 5.042, 0.0001, 0.0001, 2.521, 1.681, 5.882, 12.605, 1.681, 0.0001, 3.361, 1.681, 1.681, 0.0001, 1.681, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hsb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.885, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.708, 0.001, 0.633, 0.0001, 0.0001, 0.02, 0.001, 0.006, 0.349, 0.351, 0.019, 0.001, 0.617, 0.09, 1.156, 0.027, 0.335, 0.549, 0.233, 0.161, 0.153, 0.173, 0.141, 0.134, 0.184, 0.278, 0.061, 0.039, 0.002, 0.004, 0.002, 0.001, 0.0001, 0.124, 0.184, 0.091, 0.139, 0.058, 0.04, 0.059, 0.112, 0.043, 0.103, 0.189, 0.142, 0.204, 0.143, 0.038, 0.227, 0.002, 0.151, 0.281, 0.088, 0.037, 0.024, 0.263, 0.004, 0.003, 0.079, 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.0001, 6.697, 1.107, 1.636, 2.081, 6.467, 0.188, 0.301, 1.756, 3.527, 3.654, 2.787, 1.99, 1.872, 3.895, 5.864, 1.456, 0.004, 3.313, 3.645, 2.804, 2.176, 0.063, 3.44, 0.018, 1.507, 1.152, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.124, 0.059, 0.706, 0.009, 0.065, 0.003, 0.009, 0.741, 0.003, 0.001, 0.002, 0.003, 0.046, 0.476, 0.001, 0.004, 0.004, 0.003, 0.003, 0.038, 0.003, 0.003, 0.002, 0.005, 0.005, 0.336, 0.005, 1.33, 0.03, 0.004, 0.03, 0.009, 0.055, 0.752, 0.003, 0.003, 0.008, 0.003, 0.002, 0.003, 0.003, 0.008, 0.001, 0.003, 0.001, 0.011, 0.001, 0.003, 0.025, 0.008, 0.015, 0.5, 0.006, 0.013, 0.014, 0.003, 0.014, 0.005, 0.495, 0.011, 0.018, 0.033, 0.697, 0.004, 0.0001, 0.0001, 0.023, 0.573, 2.597, 3.085, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.01, 0.005, 0.144, 0.055, 0.001, 0.001, 0.001, 0.011, 0.004, 0.015, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.112, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ht": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.728, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.82, 0.005, 0.108, 0.0001, 0.0001, 0.002, 0.001, 0.044, 0.203, 0.204, 0.004, 0.0001, 1.177, 0.16, 1.277, 0.006, 1.128, 0.316, 0.385, 0.25, 0.229, 0.141, 0.146, 0.14, 0.135, 0.218, 0.285, 0.009, 0.002, 0.002, 0.002, 0.073, 0.0001, 0.308, 0.114, 0.31, 0.14, 0.272, 0.082, 0.233, 0.111, 0.459, 0.083, 0.546, 0.457, 0.33, 0.177, 0.124, 0.284, 0.004, 0.107, 0.215, 0.201, 0.017, 0.07, 0.083, 0.002, 0.054, 0.009, 0.003, 0.0001, 0.009, 0.003, 0.007, 0.0001, 8.338, 0.713, 0.405, 1.058, 6.922, 0.493, 1.121, 0.484, 5.37, 0.359, 1.684, 3.389, 1.726, 9.14, 4.981, 1.524, 0.032, 2.005, 4.201, 3.104, 1.485, 1.12, 1.14, 0.06, 3.565, 0.552, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.036, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.007, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.023, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.04, 0.015, 0.008, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.815, 0.088, 0.005, 0.004, 0.0001, 0.019, 0.002, 0.004, 0.0001, 0.005, 0.398, 0.011, 0.003, 0.0001, 0.001, 0.0001, 0.001, 0.002, 0.004, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.04, 1.397, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.036, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.597, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.8, 0.0001, 0.032, 0.0001, 0.0001, 0.007, 0.0001, 0.004, 0.144, 0.144, 0.0001, 0.001, 0.586, 0.166, 0.08, 0.013, 0.201, 0.284, 0.165, 0.087, 0.08, 0.086, 0.077, 0.075, 0.09, 0.155, 0.113, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.01, 0.007, 0.01, 0.005, 0.005, 0.004, 0.004, 0.004, 0.018, 0.002, 0.002, 0.005, 0.008, 0.005, 0.004, 0.006, 0.001, 0.005, 0.011, 0.008, 0.002, 0.006, 0.004, 0.006, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.003, 0.016, 0.046, 0.006, 0.015, 0.015, 0.053, 0.008, 0.009, 0.013, 0.038, 0.001, 0.005, 0.027, 0.014, 0.034, 0.04, 0.008, 0.001, 0.036, 0.026, 0.029, 0.018, 0.005, 0.004, 0.002, 0.008, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.414, 0.639, 1.93, 0.109, 0.557, 0.081, 0.132, 0.316, 0.027, 0.402, 0.05, 0.015, 0.042, 0.09, 0.048, 0.034, 0.002, 0.004, 0.002, 0.02, 0.024, 0.021, 0.028, 0.001, 0.0001, 0.001, 0.001, 0.003, 0.001, 0.123, 0.001, 0.0001, 0.042, 6.697, 0.434, 0.595, 0.616, 2.608, 0.304, 0.502, 0.621, 0.7, 0.114, 2.81, 0.856, 0.261, 0.333, 1.634, 0.66, 0.29, 0.576, 0.139, 1.799, 1.257, 4.145, 0.346, 3.356, 0.233, 0.437, 0.354, 0.321, 1.025, 1.123, 1.395, 0.0001, 0.0001, 0.223, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.029, 0.01, 0.0001, 0.0001, 0.652, 36.534, 7.186, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.026, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hz": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 25.0, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.667, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ia": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.646, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.141, 0.002, 0.329, 0.0001, 0.0001, 0.008, 0.001, 0.021, 0.18, 0.18, 0.001, 0.003, 1.016, 0.166, 0.808, 0.013, 0.184, 0.275, 0.136, 0.08, 0.078, 0.085, 0.074, 0.075, 0.088, 0.135, 0.073, 0.032, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.226, 0.141, 0.296, 0.096, 0.165, 0.073, 0.096, 0.067, 0.304, 0.056, 0.03, 0.329, 0.174, 0.087, 0.056, 0.186, 0.016, 0.106, 0.253, 0.115, 0.079, 0.078, 0.031, 0.017, 0.009, 0.016, 0.018, 0.0001, 0.018, 0.0001, 0.006, 0.0001, 7.783, 0.726, 2.95, 2.701, 11.264, 0.558, 0.916, 0.687, 6.773, 0.133, 0.102, 4.659, 2.226, 5.924, 5.837, 2.221, 0.5, 4.607, 4.777, 5.188, 3.143, 1.186, 0.054, 0.19, 0.205, 0.091, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.033, 0.014, 0.005, 0.003, 0.003, 0.002, 0.001, 0.002, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.01, 0.005, 0.001, 0.001, 0.002, 0.003, 0.007, 0.001, 0.002, 0.005, 0.005, 0.001, 0.001, 0.01, 0.02, 0.003, 0.006, 0.005, 0.003, 0.002, 0.005, 0.004, 0.021, 0.003, 0.011, 0.003, 0.018, 0.002, 0.002, 0.005, 0.011, 0.005, 0.019, 0.002, 0.002, 0.005, 0.002, 0.004, 0.005, 0.009, 0.012, 0.006, 0.004, 0.003, 0.005, 0.0001, 0.0001, 0.026, 0.115, 0.014, 0.006, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.019, 0.01, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.009, 0.031, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ie": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.521, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.809, 0.001, 0.247, 0.0001, 0.0001, 0.004, 0.006, 0.019, 0.181, 0.18, 0.001, 0.0001, 0.349, 1.199, 1.232, 0.019, 0.563, 0.838, 0.612, 0.225, 0.226, 0.24, 0.207, 0.206, 0.219, 0.382, 0.048, 0.005, 0.006, 0.001, 0.006, 0.0001, 0.0001, 0.309, 0.238, 0.27, 0.166, 0.167, 0.136, 0.184, 0.184, 0.432, 0.068, 0.108, 0.44, 0.245, 0.141, 0.106, 0.224, 0.013, 0.149, 0.37, 0.155, 0.122, 0.083, 0.052, 0.007, 0.021, 0.046, 0.016, 0.0001, 0.017, 0.0001, 0.0001, 0.0001, 6.871, 0.75, 2.348, 2.768, 8.937, 0.584, 0.855, 0.832, 7.829, 0.174, 0.338, 4.504, 1.934, 5.948, 3.473, 1.445, 0.281, 4.186, 4.435, 5.077, 2.881, 0.926, 0.103, 0.2, 0.235, 0.149, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.011, 0.008, 0.006, 0.012, 0.004, 0.002, 0.001, 0.038, 0.001, 0.002, 0.0001, 0.001, 0.004, 0.016, 0.001, 0.001, 0.004, 0.003, 0.001, 0.004, 0.002, 0.001, 0.002, 0.003, 0.002, 0.005, 0.002, 0.003, 0.002, 0.002, 0.002, 0.01, 0.018, 0.107, 0.002, 0.003, 0.013, 0.003, 0.002, 0.004, 0.007, 0.34, 0.002, 0.007, 0.001, 0.079, 0.001, 0.001, 0.011, 0.009, 0.004, 0.067, 0.003, 0.005, 0.02, 0.001, 0.012, 0.001, 0.025, 0.006, 0.034, 0.009, 0.011, 0.002, 0.0001, 0.0001, 0.012, 0.714, 0.064, 0.047, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.007, 0.004, 0.047, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.01, 0.006, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ig": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.656, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.908, 0.0001, 0.773, 0.0001, 0.001, 0.002, 0.004, 0.323, 0.322, 0.321, 0.001, 0.0001, 0.801, 0.348, 0.989, 0.009, 0.349, 0.514, 0.434, 0.211, 0.141, 0.149, 0.14, 0.138, 0.136, 0.236, 0.05, 0.04, 0.002, 0.002, 0.002, 0.002, 0.001, 0.437, 0.139, 0.167, 0.124, 0.161, 0.093, 0.162, 0.08, 0.189, 0.162, 0.069, 0.102, 0.246, 0.453, 0.257, 0.111, 0.006, 0.081, 0.231, 0.102, 0.09, 0.023, 0.104, 0.006, 0.033, 0.007, 0.018, 0.0001, 0.018, 0.0001, 0.003, 0.003, 8.644, 2.249, 1.219, 1.734, 6.313, 0.761, 1.664, 1.979, 4.558, 0.257, 2.436, 1.453, 1.97, 6.1, 4.008, 0.966, 0.02, 3.332, 1.739, 2.408, 2.889, 0.225, 1.517, 0.034, 1.16, 0.258, 0.0001, 0.007, 0.001, 0.0001, 0.0001, 0.13, 0.024, 0.004, 0.004, 0.007, 0.006, 0.001, 0.002, 0.001, 0.004, 0.004, 0.623, 0.118, 0.962, 0.001, 0.0001, 0.002, 0.001, 0.004, 0.022, 0.005, 0.001, 0.031, 0.002, 0.001, 0.082, 0.001, 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.34, 0.233, 0.001, 0.001, 0.012, 1.142, 0.001, 0.003, 0.105, 0.2, 0.002, 0.014, 0.036, 0.183, 0.028, 0.019, 0.004, 0.004, 0.029, 0.095, 0.002, 0.001, 0.009, 0.001, 0.003, 0.143, 0.201, 2.836, 0.03, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.146, 1.356, 0.009, 0.021, 0.0001, 0.014, 0.039, 0.003, 0.0001, 0.001, 0.029, 0.0001, 0.005, 0.001, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 2.927, 0.109, 0.003, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ii": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.208, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.146, 0.0001, 1.029, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.343, 0.343, 0.0001, 0.0001, 0.0001, 0.0001, 0.686, 0.0001, 4.803, 0.172, 2.401, 0.0001, 0.0001, 0.172, 0.343, 0.686, 0.686, 0.343, 0.0001, 0.0001, 0.0001, 0.0001, 0.515, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.172, 0.0001, 0.0001, 0.0001, 0.172, 0.858, 0.0001, 0.343, 0.343, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.0001, 0.0001, 0.343, 0.343, 0.343, 0.172, 0.0001, 0.172, 0.343, 0.0001, 0.515, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.172, 0.0001, 0.0001, 2.573, 1.887, 1.544, 0.858, 2.058, 0.343, 1.715, 0.343, 0.343, 0.0001, 0.172, 1.201, 1.887, 1.029, 1.372, 0.172, 0.343, 1.029, 0.686, 0.172, 0.172, 0.172, 0.686, 0.858, 0.686, 0.172, 0.343, 0.0001, 0.515, 0.172, 0.343, 0.686, 0.343, 0.172, 0.0001, 0.0001, 0.343, 0.0001, 0.172, 1.544, 0.172, 0.343, 0.686, 0.858, 0.686, 0.858, 0.343, 0.686, 0.172, 0.343, 0.343, 0.515, 2.744, 0.172, 0.0001, 0.343, 0.858, 2.916, 0.343, 0.686, 0.343, 0.0001, 0.343, 0.172, 0.0001, 0.0001, 1.372, 0.0001, 0.172, 0.172, 0.0001, 0.0001, 0.0001, 0.172, 0.172, 0.0001, 0.515, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.515, 1.029, 4.631, 1.029, 0.686, 0.0001, 0.858, 10.635, 0.0001, 0.0001, 0.0001, 0.0001, 0.343, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ik": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.203, 0.0001, 1.053, 0.0001, 0.0001, 0.002, 0.004, 0.019, 1.043, 1.038, 0.0001, 0.004, 0.489, 0.212, 1.246, 0.04, 0.17, 0.264, 0.162, 0.084, 0.065, 0.055, 0.132, 0.065, 0.076, 0.124, 0.136, 0.025, 0.013, 0.002, 0.002, 0.0001, 0.0001, 0.824, 0.109, 0.155, 0.065, 0.052, 0.025, 0.048, 0.076, 0.634, 0.073, 0.409, 0.111, 0.352, 0.545, 0.069, 0.285, 0.321, 0.155, 0.436, 0.755, 0.409, 0.076, 0.046, 0.008, 0.044, 0.002, 0.01, 0.0001, 0.015, 0.0001, 0.008, 0.0001, 9.867, 0.308, 1.051, 0.799, 2.404, 0.327, 1.605, 1.011, 7.743, 0.063, 2.113, 2.725, 1.552, 3.495, 1.668, 1.101, 3.682, 2.526, 3.015, 4.496, 6.747, 0.801, 0.229, 0.065, 0.707, 0.103, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.097, 0.073, 0.183, 0.023, 0.006, 0.031, 0.013, 0.103, 0.05, 0.008, 0.004, 0.952, 0.019, 0.055, 0.002, 0.023, 0.013, 0.008, 0.0001, 0.002, 0.008, 0.067, 0.013, 0.015, 0.004, 0.002, 0.04, 0.01, 0.017, 0.01, 0.002, 0.019, 0.013, 0.843, 0.013, 0.029, 1.206, 0.281, 0.025, 0.006, 0.067, 0.006, 0.055, 0.004, 0.038, 0.017, 0.078, 0.034, 0.172, 0.862, 0.059, 0.01, 0.01, 0.067, 0.008, 0.187, 0.269, 0.134, 0.055, 0.021, 0.038, 0.019, 0.189, 0.046, 0.0001, 0.0001, 0.008, 0.944, 0.835, 1.051, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.006, 0.008, 0.0001, 0.025, 0.023, 0.42, 0.185, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.408, 0.191, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ilo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.301, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.793, 0.111, 0.271, 0.0001, 0.001, 0.008, 0.001, 0.018, 0.172, 0.172, 0.003, 0.003, 0.83, 0.304, 0.649, 0.008, 0.21, 0.325, 0.155, 0.097, 0.09, 0.094, 0.083, 0.085, 0.1, 0.166, 0.048, 0.03, 0.005, 0.001, 0.005, 0.001, 0.0001, 0.349, 0.225, 0.111, 0.217, 0.099, 0.09, 0.118, 0.1, 0.241, 0.035, 0.175, 0.118, 0.232, 0.163, 0.054, 0.279, 0.009, 0.088, 0.233, 0.461, 0.072, 0.035, 0.029, 0.006, 0.014, 0.012, 0.036, 0.0001, 0.036, 0.0001, 0.001, 0.0001, 16.461, 1.586, 0.189, 2.856, 3.734, 0.046, 3.664, 0.306, 10.008, 0.024, 3.303, 2.245, 1.909, 7.066, 3.393, 2.095, 0.012, 2.409, 3.066, 6.078, 2.307, 0.067, 0.549, 0.014, 1.361, 0.048, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.043, 0.006, 0.003, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.033, 0.004, 0.001, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.015, 0.007, 0.001, 0.001, 0.003, 0.002, 0.001, 0.003, 0.002, 0.009, 0.002, 0.004, 0.001, 0.006, 0.002, 0.001, 0.013, 0.007, 0.003, 0.007, 0.004, 0.001, 0.003, 0.001, 0.004, 0.002, 0.004, 0.002, 0.003, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.027, 0.049, 0.008, 0.009, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.007, 0.004, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.043, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "io": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.24, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.878, 0.001, 0.226, 0.0001, 0.145, 0.683, 0.001, 0.155, 0.19, 0.19, 0.002, 0.001, 1.502, 0.399, 2.049, 0.127, 1.123, 1.116, 0.845, 0.565, 0.593, 0.586, 0.516, 0.395, 0.578, 0.496, 0.056, 0.039, 0.008, 0.001, 0.008, 0.001, 0.0001, 0.262, 0.119, 0.082, 0.063, 0.203, 0.065, 0.07, 0.089, 0.077, 0.042, 0.131, 0.387, 0.144, 0.086, 0.052, 0.185, 0.006, 0.067, 0.238, 0.064, 0.127, 0.06, 0.027, 0.002, 0.018, 0.007, 0.008, 0.0001, 0.008, 0.0001, 0.001, 0.0001, 8.848, 0.82, 0.665, 2.487, 7.044, 0.592, 0.8, 0.82, 7.741, 0.211, 1.575, 3.65, 2.435, 4.587, 5.58, 1.431, 0.273, 4.484, 4.553, 2.971, 2.4, 1.482, 0.052, 0.098, 0.514, 0.499, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.011, 0.008, 0.004, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.003, 0.002, 0.001, 0.0001, 0.002, 0.001, 0.004, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.096, 0.01, 0.001, 0.003, 0.003, 0.001, 0.001, 0.003, 0.002, 0.015, 0.001, 0.004, 0.001, 0.008, 0.001, 0.001, 0.005, 0.003, 0.253, 0.006, 0.002, 0.002, 0.003, 0.001, 0.003, 0.002, 0.004, 0.005, 0.003, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.356, 0.056, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.01, 0.006, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "is": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.97, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.586, 0.001, 0.206, 0.0001, 0.0001, 0.008, 0.002, 0.007, 0.124, 0.124, 0.0001, 0.001, 0.499, 0.123, 1.026, 0.011, 0.247, 0.371, 0.182, 0.092, 0.087, 0.097, 0.09, 0.091, 0.11, 0.206, 0.046, 0.01, 0.008, 0.003, 0.008, 0.001, 0.0001, 0.15, 0.156, 0.07, 0.071, 0.123, 0.128, 0.099, 0.219, 0.049, 0.069, 0.114, 0.102, 0.145, 0.086, 0.033, 0.076, 0.003, 0.091, 0.275, 0.089, 0.03, 0.081, 0.029, 0.009, 0.012, 0.006, 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 6.834, 0.671, 0.132, 1.35, 4.383, 2.01, 2.575, 1.208, 5.351, 0.788, 2.14, 3.293, 2.549, 5.87, 1.807, 0.609, 0.005, 6.508, 4.164, 3.597, 3.384, 1.444, 0.036, 0.05, 0.678, 0.023, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.079, 0.071, 0.003, 0.002, 0.002, 0.001, 0.004, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.093, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.031, 0.002, 0.001, 0.01, 0.001, 0.001, 0.001, 0.008, 0.001, 0.029, 0.003, 0.162, 0.001, 0.007, 1.147, 0.001, 0.001, 0.003, 0.001, 0.559, 0.002, 0.002, 0.221, 0.001, 0.001, 0.001, 1.194, 0.001, 0.001, 2.653, 0.002, 0.003, 0.801, 0.002, 0.002, 0.588, 0.001, 0.004, 0.002, 0.419, 0.002, 0.005, 0.183, 0.658, 0.001, 0.0001, 0.0001, 0.014, 8.751, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.079, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "iu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.678, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.59, 0.002, 0.2, 0.001, 0.003, 0.002, 0.003, 0.015, 0.174, 0.173, 0.0001, 0.002, 0.361, 0.227, 0.729, 0.057, 0.148, 0.113, 0.088, 0.041, 0.055, 0.057, 0.038, 0.037, 0.041, 0.075, 0.086, 0.012, 0.034, 0.007, 0.037, 0.002, 0.001, 0.071, 0.015, 0.028, 0.016, 0.027, 0.021, 0.01, 0.09, 0.106, 0.011, 0.032, 0.025, 0.039, 0.045, 0.015, 0.038, 0.016, 0.009, 0.047, 0.052, 0.031, 0.008, 0.018, 0.002, 0.004, 0.0001, 0.042, 0.001, 0.038, 0.0001, 0.005, 0.0001, 3.23, 0.132, 0.269, 0.325, 0.963, 0.137, 0.72, 0.796, 3.179, 0.121, 0.846, 1.083, 0.73, 1.94, 0.65, 0.417, 0.773, 0.909, 0.645, 2.138, 2.24, 0.378, 0.125, 0.018, 0.352, 0.009, 0.063, 0.016, 0.064, 0.0001, 0.0001, 0.195, 0.104, 0.722, 2.277, 0.527, 2.845, 0.283, 0.577, 0.292, 0.16, 1.105, 0.322, 0.08, 0.107, 0.751, 0.183, 5.797, 4.461, 2.284, 5.133, 1.078, 2.99, 2.939, 0.631, 0.063, 0.2, 0.245, 0.066, 0.007, 0.045, 0.004, 0.005, 0.011, 0.073, 0.039, 0.009, 0.018, 0.411, 1.389, 0.092, 0.103, 0.04, 1.113, 0.086, 0.008, 0.439, 0.043, 0.681, 0.098, 0.475, 0.284, 0.202, 0.231, 0.064, 0.012, 0.003, 0.129, 0.126, 0.009, 0.223, 0.007, 0.015, 0.041, 0.125, 0.0001, 0.0001, 0.1, 0.024, 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.131, 0.044, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.009, 0.014, 0.007, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 21.14, 0.181, 0.003, 0.004, 0.004, 0.004, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "jam": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.114, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.204, 0.0001, 0.437, 0.0001, 0.002, 0.015, 0.001, 0.02, 0.246, 0.245, 0.0001, 0.001, 1.286, 0.238, 0.848, 0.011, 0.225, 0.262, 0.144, 0.074, 0.072, 0.083, 0.075, 0.089, 0.083, 0.132, 0.047, 0.038, 0.014, 0.002, 0.014, 0.002, 0.0001, 0.33, 0.18, 0.107, 0.273, 0.095, 0.097, 0.106, 0.027, 0.375, 0.206, 0.243, 0.122, 0.218, 0.135, 0.052, 0.177, 0.004, 0.132, 0.376, 0.091, 0.038, 0.042, 0.116, 0.003, 0.09, 0.009, 0.033, 0.0001, 0.032, 0.0001, 0.0001, 0.0001, 11.751, 1.124, 0.777, 3.113, 4.403, 1.279, 0.882, 3.07, 11.71, 0.554, 2.318, 3.164, 2.271, 5.696, 3.101, 1.655, 0.006, 3.113, 3.636, 3.486, 2.985, 0.575, 1.126, 0.207, 0.616, 0.737, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.054, 0.013, 0.006, 0.006, 0.011, 0.005, 0.006, 0.002, 0.011, 0.004, 0.003, 0.002, 0.005, 0.004, 0.004, 0.001, 0.005, 0.003, 0.003, 0.026, 0.009, 0.002, 0.001, 0.003, 0.001, 0.005, 0.001, 0.003, 0.008, 0.008, 0.001, 0.0001, 0.066, 0.009, 0.001, 0.004, 0.01, 0.005, 0.003, 0.008, 0.009, 0.009, 0.007, 0.005, 0.005, 0.009, 0.003, 0.008, 0.005, 0.014, 0.004, 0.031, 0.002, 0.005, 0.002, 0.003, 0.006, 0.009, 0.008, 0.006, 0.007, 0.007, 0.004, 0.009, 0.0001, 0.0001, 0.069, 0.057, 0.012, 0.006, 0.0001, 0.001, 0.0001, 0.011, 0.004, 0.01, 0.001, 0.0001, 0.049, 0.024, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.007, 0.002, 0.004, 0.025, 0.021, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.017, 0.008, 0.051, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "jbo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.83, 0.0001, 0.137, 0.0001, 0.0001, 0.001, 0.0001, 3.634, 0.016, 0.016, 0.0001, 0.0001, 0.047, 0.014, 2.419, 0.008, 0.161, 0.318, 0.2, 0.098, 0.09, 0.087, 0.087, 0.089, 0.108, 0.172, 0.004, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.035, 0.022, 0.028, 0.013, 0.017, 0.01, 0.012, 0.013, 0.015, 0.011, 0.012, 0.019, 0.022, 0.019, 0.015, 0.017, 0.001, 0.021, 0.029, 0.019, 0.006, 0.006, 0.008, 0.002, 0.002, 0.004, 0.002, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 7.616, 1.669, 2.73, 1.665, 6.288, 0.906, 1.481, 0.055, 8.607, 1.326, 2.153, 5.868, 2.296, 4.062, 6.049, 1.389, 0.004, 2.945, 3.13, 2.492, 4.934, 0.679, 0.018, 0.589, 0.829, 0.701, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.01, 0.006, 0.006, 0.011, 0.005, 0.003, 0.004, 0.008, 0.003, 0.008, 0.003, 0.003, 0.002, 0.002, 0.002, 0.003, 0.002, 0.001, 0.003, 0.004, 0.004, 0.001, 0.002, 0.001, 0.006, 0.001, 0.002, 0.002, 0.002, 0.001, 0.002, 0.003, 0.006, 0.002, 0.003, 0.005, 0.003, 0.006, 0.013, 0.006, 0.012, 0.005, 0.003, 0.005, 0.008, 0.003, 0.005, 0.01, 0.01, 0.007, 0.008, 0.003, 0.008, 0.002, 0.003, 0.01, 0.005, 0.017, 0.007, 0.005, 0.005, 0.004, 0.003, 0.0001, 0.0001, 0.004, 0.032, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.006, 0.004, 0.004, 0.002, 0.0001, 0.016, 0.008, 0.046, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.007, 0.035, 0.026, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.006, 0.007, 0.005, 0.001, 0.004, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "jv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.393, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.972, 0.002, 0.376, 0.0001, 0.001, 0.006, 0.002, 0.021, 0.174, 0.174, 0.0001, 0.002, 1.038, 0.248, 0.884, 0.027, 0.242, 0.269, 0.17, 0.077, 0.072, 0.083, 0.071, 0.073, 0.084, 0.157, 0.063, 0.014, 0.005, 0.004, 0.005, 0.001, 0.0001, 0.298, 0.282, 0.139, 0.175, 0.052, 0.071, 0.122, 0.1, 0.279, 0.193, 0.491, 0.137, 0.261, 0.155, 0.054, 0.404, 0.008, 0.134, 0.426, 0.252, 0.063, 0.039, 0.13, 0.007, 0.04, 0.014, 0.024, 0.0001, 0.024, 0.0001, 0.001, 0.0001, 13.56, 1.271, 0.49, 2.178, 3.499, 0.191, 4.675, 1.646, 6.887, 0.617, 3.65, 2.625, 2.089, 9.349, 2.312, 1.888, 0.011, 3.362, 3.296, 3.086, 3.992, 0.185, 1.217, 0.022, 0.792, 0.054, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.032, 0.007, 0.005, 0.003, 0.005, 0.004, 0.003, 0.003, 0.005, 0.012, 0.002, 0.001, 0.001, 0.004, 0.005, 0.002, 0.003, 0.002, 0.003, 0.01, 0.003, 0.002, 0.001, 0.001, 0.003, 0.007, 0.001, 0.003, 0.006, 0.006, 0.001, 0.001, 0.039, 0.004, 0.002, 0.003, 0.006, 0.005, 0.004, 0.006, 0.531, 1.186, 0.005, 0.003, 0.002, 0.005, 0.002, 0.002, 0.007, 0.006, 0.005, 0.006, 0.002, 0.002, 0.002, 0.001, 0.008, 0.005, 0.003, 0.002, 0.004, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.048, 1.757, 0.01, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.007, 0.003, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.015, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.005, 0.031, 0.001, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ka": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.399, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.467, 0.006, 0.05, 0.004, 0.0001, 0.005, 0.0001, 0.002, 0.08, 0.08, 0.0001, 0.001, 0.389, 0.146, 0.411, 0.004, 0.126, 0.165, 0.095, 0.049, 0.046, 0.05, 0.043, 0.044, 0.053, 0.091, 0.022, 0.014, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.009, 0.008, 0.011, 0.006, 0.004, 0.005, 0.005, 0.004, 0.036, 0.001, 0.002, 0.005, 0.008, 0.005, 0.004, 0.007, 0.001, 0.005, 0.01, 0.01, 0.002, 0.01, 0.003, 0.012, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.058, 0.009, 0.021, 0.031, 0.066, 0.012, 0.013, 0.018, 0.047, 0.001, 0.009, 0.032, 0.017, 0.042, 0.05, 0.013, 0.001, 0.044, 0.039, 0.037, 0.025, 0.006, 0.004, 0.003, 0.014, 0.002, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.133, 0.001, 0.001, 30.616, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.203, 1.072, 0.617, 1.27, 2.811, 0.901, 0.251, 0.727, 3.846, 0.492, 1.468, 1.522, 1.35, 1.641, 0.3, 0.022, 1.853, 2.198, 0.578, 0.828, 0.251, 0.28, 0.142, 0.172, 0.523, 0.1, 0.36, 0.118, 0.305, 0.039, 0.412, 0.073, 0.048, 0.001, 0.009, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.023, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.013, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 30.616, 0.133, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kaa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.138, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.976, 0.002, 0.25, 0.0001, 0.0001, 0.021, 0.001, 3.483, 0.188, 0.189, 0.0001, 0.005, 0.857, 0.333, 1.07, 0.015, 0.261, 0.313, 0.191, 0.105, 0.096, 0.102, 0.088, 0.083, 0.102, 0.171, 0.072, 0.024, 0.027, 0.002, 0.027, 0.004, 0.0001, 0.278, 0.237, 0.043, 0.064, 0.083, 0.059, 0.068, 0.047, 0.074, 0.082, 0.125, 0.051, 0.155, 0.064, 0.155, 0.081, 0.145, 0.091, 0.217, 0.129, 0.07, 0.048, 0.02, 0.093, 0.029, 0.015, 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.174, 10.672, 1.536, 0.082, 2.608, 4.846, 0.175, 1.712, 1.492, 6.03, 0.848, 1.882, 4.983, 2.176, 5.612, 2.458, 1.187, 1.824, 4.354, 3.602, 3.336, 1.517, 0.264, 0.926, 0.28, 1.912, 0.845, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.223, 0.008, 0.008, 0.008, 0.005, 0.003, 0.002, 0.003, 0.003, 0.001, 0.002, 0.004, 0.002, 0.002, 0.002, 0.003, 0.008, 0.001, 0.002, 0.024, 0.089, 0.003, 0.024, 0.001, 0.007, 0.086, 0.002, 0.002, 0.011, 0.008, 0.005, 0.018, 0.016, 0.006, 0.003, 0.007, 0.007, 0.002, 0.001, 0.006, 0.003, 0.004, 0.002, 0.012, 0.002, 0.006, 0.001, 0.009, 0.142, 4.113, 0.008, 0.007, 0.005, 0.049, 0.005, 0.002, 0.01, 0.003, 0.009, 0.024, 0.009, 0.012, 0.029, 0.003, 0.0001, 0.0001, 0.053, 0.053, 4.15, 0.014, 0.0001, 0.002, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.009, 0.003, 0.235, 0.052, 0.004, 0.001, 0.001, 0.003, 0.0001, 0.002, 0.013, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.006, 0.216, 0.0001, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kab": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.63, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.911, 0.026, 0.321, 0.0001, 0.0001, 0.004, 0.001, 0.063, 0.372, 0.372, 0.003, 0.002, 1.155, 1.35, 0.936, 0.038, 0.266, 0.305, 0.202, 0.119, 0.101, 0.107, 0.102, 0.091, 0.121, 0.181, 0.18, 0.035, 0.01, 0.019, 0.017, 0.012, 0.0001, 0.467, 0.145, 0.091, 0.191, 0.038, 0.078, 0.046, 0.038, 0.257, 0.025, 0.056, 0.211, 0.226, 0.079, 0.026, 0.046, 0.014, 0.063, 0.175, 0.468, 0.109, 0.016, 0.087, 0.018, 0.161, 0.062, 0.014, 0.0001, 0.014, 0.0001, 0.076, 0.0001, 9.2, 0.865, 0.672, 3.845, 7.769, 0.911, 1.711, 0.292, 5.622, 0.162, 1.372, 2.877, 2.842, 6.403, 0.445, 0.148, 0.603, 3.37, 3.532, 4.882, 2.937, 0.09, 1.486, 0.181, 2.148, 0.956, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.079, 0.004, 0.004, 0.003, 0.012, 0.007, 0.008, 0.003, 0.006, 0.01, 0.01, 0.0001, 0.003, 0.341, 0.007, 0.006, 0.04, 0.002, 0.003, 0.156, 0.017, 0.001, 0.002, 0.001, 0.004, 0.031, 0.007, 0.42, 0.023, 0.016, 0.002, 0.009, 0.025, 0.004, 0.015, 1.13, 0.027, 0.269, 0.019, 0.099, 0.024, 0.093, 0.007, 0.018, 0.013, 0.276, 0.002, 0.011, 0.014, 0.01, 0.006, 0.129, 0.025, 0.113, 0.001, 0.005, 0.586, 0.529, 0.15, 0.021, 0.004, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.056, 0.149, 0.056, 0.01, 0.05, 0.088, 0.0001, 1.3, 0.001, 0.001, 0.003, 0.0001, 0.203, 0.001, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.008, 0.063, 0.048, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 1.257, 0.143, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kbd": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.877, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.792, 0.0001, 0.075, 0.0001, 0.001, 0.011, 0.0001, 0.003, 0.141, 0.14, 0.0001, 0.003, 0.771, 0.205, 0.683, 0.004, 0.136, 0.165, 0.088, 0.057, 0.049, 0.062, 0.042, 0.043, 0.05, 0.078, 0.043, 0.017, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.304, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.008, 0.001, 0.014, 0.0001, 0.0001, 0.008, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 0.03, 0.003, 0.008, 0.007, 0.025, 0.002, 0.005, 0.007, 0.023, 0.001, 0.003, 0.195, 0.01, 0.018, 0.016, 0.007, 0.001, 0.016, 0.015, 0.015, 0.012, 0.002, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.555, 0.735, 0.993, 2.937, 0.251, 2.403, 0.222, 0.078, 0.401, 1.056, 2.895, 2.991, 0.659, 6.305, 0.005, 0.318, 0.209, 0.078, 0.019, 0.048, 0.196, 0.035, 0.012, 0.035, 0.104, 0.003, 0.214, 0.042, 0.072, 0.044, 0.009, 0.068, 0.044, 0.057, 0.06, 0.06, 0.029, 0.076, 0.012, 0.013, 0.04, 0.033, 0.001, 0.031, 0.001, 0.015, 0.002, 0.026, 2.293, 0.626, 0.124, 1.164, 0.956, 0.819, 0.63, 0.861, 1.412, 0.263, 1.894, 1.024, 2.202, 1.111, 0.541, 0.996, 0.0001, 0.0001, 0.089, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.007, 0.001, 0.005, 0.002, 18.347, 24.31, 0.001, 1.322, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.144, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kbp": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.616, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.57, 0.002, 0.071, 0.0001, 0.0001, 0.002, 0.0001, 0.006, 0.116, 0.115, 0.0001, 0.002, 0.667, 0.749, 0.841, 0.003, 0.17, 0.215, 0.112, 0.059, 0.061, 0.065, 0.059, 0.058, 0.083, 0.103, 0.043, 0.02, 0.0001, 0.014, 0.0001, 0.002, 0.0001, 0.165, 0.045, 0.077, 0.029, 0.079, 0.067, 0.032, 0.069, 0.044, 0.029, 0.18, 0.072, 0.11, 0.068, 0.032, 0.297, 0.002, 0.044, 0.127, 0.122, 0.017, 0.016, 0.035, 0.003, 0.036, 0.006, 0.025, 0.0001, 0.025, 0.0001, 0.0001, 0.0001, 8.914, 0.693, 0.409, 0.775, 2.26, 0.236, 0.534, 0.509, 1.986, 0.346, 2.598, 2.297, 1.559, 3.608, 1.061, 1.995, 0.02, 0.616, 1.735, 2.888, 0.861, 0.082, 0.914, 0.015, 2.587, 0.783, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.019, 0.022, 0.002, 0.003, 0.114, 0.001, 0.002, 0.001, 0.002, 0.067, 2.039, 2.33, 0.002, 0.002, 0.001, 0.0001, 0.179, 0.013, 0.001, 0.001, 2.735, 0.001, 1.381, 0.0001, 0.001, 0.007, 0.0001, 5.08, 0.004, 0.003, 0.0001, 0.0001, 0.004, 0.008, 0.005, 1.151, 0.003, 0.001, 0.001, 0.004, 0.013, 4.529, 0.002, 0.019, 0.001, 0.004, 0.003, 0.007, 0.003, 0.207, 0.003, 0.002, 0.003, 0.002, 0.003, 0.001, 0.006, 0.003, 0.002, 0.02, 0.003, 0.002, 0.002, 0.006, 0.0001, 0.0001, 0.035, 0.33, 0.004, 1.069, 0.247, 0.001, 0.0001, 14.815, 3.312, 0.001, 0.128, 0.0001, 0.011, 0.006, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.007, 0.013, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.239, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.886, 0.007, 0.336, 0.0001, 0.0001, 0.012, 0.002, 0.078, 0.324, 0.324, 0.001, 0.002, 0.656, 0.558, 1.416, 0.029, 0.129, 0.236, 0.138, 0.114, 0.084, 0.072, 0.081, 0.089, 0.086, 0.136, 0.151, 0.002, 0.018, 0.006, 0.018, 0.004, 0.0001, 0.545, 0.514, 0.255, 0.205, 0.262, 0.18, 0.131, 0.1, 0.152, 0.059, 0.708, 0.293, 0.752, 0.533, 0.094, 0.176, 0.01, 0.241, 0.354, 0.199, 0.108, 0.106, 0.05, 0.006, 0.156, 0.054, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.001, 12.562, 2.277, 0.331, 1.547, 5.722, 0.691, 1.741, 0.399, 6.386, 0.118, 3.863, 3.599, 2.582, 6.478, 2.883, 0.88, 0.049, 1.355, 2.305, 2.139, 4.827, 0.445, 0.58, 0.051, 3.145, 1.337, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.071, 0.012, 0.003, 0.002, 0.01, 0.004, 0.003, 0.001, 0.004, 0.005, 0.003, 0.002, 0.002, 0.003, 0.001, 0.001, 0.006, 0.001, 0.001, 0.062, 0.006, 0.002, 0.0001, 0.001, 0.001, 0.009, 0.002, 0.004, 0.002, 0.001, 0.001, 0.001, 0.037, 0.129, 0.127, 0.006, 0.006, 0.002, 0.017, 0.018, 0.037, 0.077, 0.018, 0.027, 0.002, 0.034, 0.066, 0.007, 0.011, 0.023, 0.005, 0.025, 0.156, 0.002, 0.001, 0.003, 0.003, 0.002, 0.014, 0.066, 0.013, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.038, 0.798, 0.007, 0.01, 0.0001, 0.0001, 0.0001, 0.013, 0.006, 0.004, 0.0001, 0.001, 0.012, 0.004, 0.009, 0.006, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.021, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.016, 0.007, 0.069, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ki": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.157, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.033, 0.001, 0.1, 0.001, 0.0001, 0.002, 0.005, 0.051, 0.116, 0.115, 0.0001, 0.0001, 0.384, 0.122, 1.505, 0.04, 0.182, 0.215, 0.151, 0.09, 0.071, 0.091, 0.067, 0.064, 0.059, 0.089, 0.065, 0.003, 0.006, 0.002, 0.008, 0.01, 0.0001, 0.273, 0.233, 0.763, 0.125, 0.089, 0.072, 0.168, 0.139, 0.145, 0.105, 0.364, 0.123, 0.376, 0.291, 0.066, 0.138, 0.046, 0.111, 0.252, 0.278, 0.132, 0.045, 0.093, 0.048, 0.079, 0.058, 0.02, 0.0001, 0.02, 0.0001, 0.015, 0.0001, 10.33, 0.786, 1.541, 0.901, 3.961, 0.163, 2.604, 2.426, 8.641, 0.326, 1.916, 0.633, 2.867, 6.576, 3.627, 0.309, 0.068, 4.492, 0.79, 3.938, 2.525, 0.104, 1.397, 0.085, 2.472, 0.26, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.05, 0.003, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.037, 0.01, 0.0001, 0.001, 0.003, 0.0001, 0.001, 0.001, 0.013, 0.005, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.06, 4.809, 0.0001, 0.069, 0.002, 0.006, 0.001, 0.004, 0.016, 0.25, 0.0001, 0.009, 0.003, 0.002, 0.0001, 0.009, 0.003, 0.001, 0.003, 0.026, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.021, 0.032, 2.884, 2.321, 0.0001, 0.002, 0.0001, 0.002, 0.021, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.048, 0.0001, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kj": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.677, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.71, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.323, 0.323, 0.0001, 0.0001, 0.645, 0.0001, 0.323, 0.0001, 1.613, 0.0001, 0.323, 0.323, 0.0001, 0.0001, 0.645, 0.323, 0.0001, 0.0001, 0.968, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.323, 0.0001, 2.903, 0.323, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.097, 3.226, 0.0001, 6.774, 6.774, 1.935, 1.29, 2.903, 10.645, 0.0001, 3.226, 3.226, 6.129, 2.581, 8.065, 0.323, 0.0001, 0.0001, 0.968, 0.323, 1.935, 0.645, 2.581, 0.0001, 0.323, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.706, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.721, 0.001, 0.107, 0.001, 0.0001, 0.006, 0.0001, 0.002, 0.151, 0.153, 0.001, 0.003, 0.51, 0.246, 0.686, 0.019, 0.221, 0.251, 0.17, 0.104, 0.092, 0.099, 0.09, 0.082, 0.09, 0.149, 0.04, 0.015, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.007, 0.006, 0.025, 0.003, 0.016, 0.005, 0.021, 0.002, 0.024, 0.001, 0.002, 0.003, 0.008, 0.018, 0.004, 0.01, 0.0001, 0.004, 0.021, 0.003, 0.003, 0.004, 0.004, 0.005, 0.001, 0.003, 0.003, 0.0001, 0.003, 0.0001, 0.002, 0.0001, 0.029, 0.005, 0.01, 0.008, 0.028, 0.004, 0.005, 0.007, 0.042, 0.0001, 0.004, 0.014, 0.009, 0.02, 0.023, 0.007, 0.0001, 0.021, 0.015, 0.017, 0.01, 0.003, 0.003, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.667, 1.698, 2.42, 0.825, 0.088, 0.097, 0.101, 0.026, 0.573, 0.004, 0.008, 3.51, 0.092, 0.043, 0.029, 0.226, 0.151, 0.105, 0.034, 0.789, 0.175, 0.042, 2.128, 0.009, 0.046, 0.288, 0.211, 1.223, 0.099, 0.041, 0.082, 0.052, 0.093, 0.104, 0.084, 0.646, 0.032, 0.032, 0.003, 0.007, 0.066, 0.363, 0.0001, 0.047, 0.001, 0.014, 0.013, 0.268, 5.447, 1.26, 0.188, 0.541, 1.919, 3.092, 0.668, 0.583, 0.903, 0.603, 1.169, 2.242, 1.309, 3.102, 1.26, 0.548, 0.0001, 0.0001, 0.145, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 25.612, 14.266, 3.356, 0.697, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.197, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.635, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.811, 0.001, 0.341, 0.0001, 0.0001, 0.006, 0.002, 0.029, 0.34, 0.34, 0.002, 0.001, 0.7, 0.575, 1.063, 0.02, 0.29, 0.457, 0.333, 0.207, 0.125, 0.141, 0.14, 0.129, 0.134, 0.187, 0.161, 0.026, 0.008, 0.005, 0.008, 0.0001, 0.0001, 0.28, 0.09, 0.107, 0.095, 0.075, 0.086, 0.052, 0.078, 0.183, 0.108, 0.243, 0.074, 0.184, 0.254, 0.06, 0.118, 0.079, 0.062, 0.257, 0.166, 0.177, 0.059, 0.032, 0.002, 0.012, 0.015, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 12.711, 0.276, 0.184, 0.432, 3.419, 0.731, 1.669, 0.268, 10.409, 0.217, 2.335, 4.586, 2.81, 6.778, 2.817, 1.735, 2.883, 5.126, 5.68, 6.217, 6.675, 0.652, 0.054, 0.023, 0.144, 0.055, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.031, 0.035, 0.014, 0.011, 0.03, 0.017, 0.013, 0.007, 0.019, 0.003, 0.015, 0.002, 0.011, 0.008, 0.02, 0.004, 0.014, 0.011, 0.007, 0.013, 0.007, 0.01, 0.01, 0.01, 0.008, 0.016, 0.005, 0.005, 0.009, 0.004, 0.004, 0.006, 0.015, 0.021, 0.01, 0.011, 0.03, 0.03, 0.045, 0.038, 0.021, 0.031, 0.02, 0.014, 0.007, 0.018, 0.005, 0.016, 0.035, 0.027, 0.022, 0.024, 0.011, 0.015, 0.016, 0.009, 0.078, 0.018, 0.016, 0.011, 0.01, 0.011, 0.018, 0.012, 0.0001, 0.0001, 0.012, 0.201, 0.031, 0.017, 0.001, 0.001, 0.0001, 0.004, 0.004, 0.004, 0.004, 0.0001, 0.016, 0.008, 0.085, 0.031, 0.0001, 0.001, 0.0001, 0.0001, 0.024, 0.053, 0.13, 0.094, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.065, 0.039, 0.022, 0.0001, 0.001, 0.011, 0.007, 0.001, 0.001, 0.003, 0.001, 0.002, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "km": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.234, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.565, 0.004, 0.038, 0.0001, 0.0001, 0.004, 0.0001, 0.009, 0.049, 0.049, 0.0001, 0.001, 0.07, 0.028, 0.072, 0.003, 0.02, 0.022, 0.013, 0.008, 0.007, 0.007, 0.006, 0.006, 0.007, 0.012, 0.008, 0.003, 0.007, 0.012, 0.008, 0.004, 0.0001, 0.018, 0.012, 0.02, 0.008, 0.012, 0.009, 0.007, 0.009, 0.013, 0.004, 0.006, 0.012, 0.012, 0.009, 0.006, 0.011, 0.001, 0.009, 0.018, 0.02, 0.004, 0.004, 0.006, 0.002, 0.002, 0.001, 0.022, 0.0001, 0.022, 0.0001, 0.004, 0.0001, 0.403, 0.068, 0.154, 0.173, 0.554, 0.096, 0.093, 0.2, 0.358, 0.005, 0.025, 0.201, 0.122, 0.348, 0.339, 0.093, 0.005, 0.306, 0.292, 0.378, 0.132, 0.051, 0.059, 0.012, 0.073, 0.006, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.652, 0.801, 0.696, 0.139, 1.351, 0.735, 0.591, 0.836, 0.083, 0.299, 0.563, 1.859, 0.05, 0.041, 0.223, 1.134, 0.273, 0.671, 2.897, 1.707, 1.359, 0.097, 0.57, 0.24, 1.039, 0.72, 1.493, 0.708, 0.482, 0.006, 22.614, 7.802, 0.292, 0.16, 0.416, 0.027, 0.02, 0.041, 0.016, 0.053, 0.015, 0.021, 0.003, 0.006, 0.019, 0.002, 0.004, 0.041, 0.002, 0.021, 0.047, 0.001, 0.001, 0.001, 2.388, 0.829, 0.388, 0.131, 0.053, 0.602, 0.318, 0.199, 0.385, 0.021, 0.0001, 0.0001, 0.017, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 29.306, 1.288, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.22, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.193, 0.001, 0.077, 0.0001, 0.001, 0.006, 0.001, 0.024, 0.05, 0.05, 0.001, 0.001, 0.263, 0.039, 0.387, 0.008, 0.055, 0.048, 0.031, 0.015, 0.013, 0.017, 0.014, 0.014, 0.016, 0.027, 0.012, 0.01, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.007, 0.004, 0.007, 0.004, 0.004, 0.003, 0.002, 0.002, 0.007, 0.001, 0.001, 0.002, 0.005, 0.003, 0.003, 0.004, 0.0001, 0.003, 0.008, 0.004, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.001, 0.001, 0.019, 0.003, 0.007, 0.007, 0.022, 0.004, 0.004, 0.008, 0.016, 0.001, 0.002, 0.009, 0.007, 0.014, 0.015, 0.005, 0.0001, 0.014, 0.012, 0.015, 0.006, 0.002, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.377, 1.744, 1.056, 0.052, 0.0001, 0.294, 1.302, 0.476, 0.14, 0.07, 0.25, 0.184, 0.18, 3.237, 0.115, 0.016, 0.01, 0.0001, 0.076, 0.009, 0.004, 1.075, 0.058, 1.134, 0.019, 0.006, 0.205, 0.005, 0.214, 0.004, 0.012, 0.397, 0.02, 0.439, 0.004, 0.214, 1.341, 0.105, 1.57, 0.184, 1.477, 0.01, 0.553, 0.067, 0.408, 0.14, 0.772, 0.936, 1.909, 0.0001, 24.738, 8.223, 0.0001, 1.147, 0.212, 0.182, 0.975, 0.409, 0.0001, 0.0001, 0.001, 0.0001, 1.605, 2.364, 0.0001, 0.0001, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.178, 0.0001, 0.177, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "koi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.5, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.538, 0.003, 0.105, 0.0001, 0.0001, 0.012, 0.0001, 0.066, 0.298, 0.299, 0.001, 0.003, 0.665, 0.135, 0.828, 0.022, 0.193, 0.238, 0.151, 0.096, 0.069, 0.095, 0.069, 0.062, 0.067, 0.14, 0.09, 0.011, 0.011, 0.003, 0.011, 0.012, 0.0001, 0.012, 0.004, 0.007, 0.003, 0.004, 0.002, 0.002, 0.009, 0.016, 0.003, 0.015, 0.007, 0.012, 0.004, 0.018, 0.015, 0.0001, 0.004, 0.016, 0.008, 0.003, 0.011, 0.001, 0.01, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.204, 0.031, 0.062, 0.036, 0.122, 0.007, 0.019, 0.037, 0.201, 0.009, 0.035, 0.077, 0.03, 0.109, 0.075, 0.025, 0.001, 0.099, 0.08, 0.059, 0.07, 0.013, 0.004, 0.003, 0.013, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.529, 2.707, 1.977, 1.216, 0.076, 0.086, 0.043, 0.37, 0.314, 0.008, 0.015, 2.496, 1.151, 0.356, 0.143, 0.67, 0.146, 0.176, 0.113, 0.201, 0.173, 0.031, 0.44, 0.017, 0.071, 0.03, 0.345, 0.07, 0.14, 0.058, 0.096, 0.178, 0.09, 0.17, 0.07, 0.048, 0.048, 0.034, 0.04, 1.604, 0.03, 0.001, 0.001, 0.041, 0.0001, 0.038, 0.042, 0.02, 3.314, 0.375, 1.556, 0.398, 1.638, 1.43, 1.24, 0.859, 1.906, 0.527, 1.802, 1.787, 1.504, 2.903, 2.273, 0.718, 0.0001, 0.0001, 0.079, 0.905, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.021, 0.0001, 0.001, 0.001, 25.357, 14.367, 0.001, 1.602, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.0001, 0.293, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 25.0, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.667, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "krc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.633, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.611, 0.001, 0.078, 0.0001, 0.002, 0.011, 0.0001, 0.002, 0.139, 0.14, 0.0001, 0.001, 0.591, 0.21, 0.542, 0.004, 0.138, 0.24, 0.114, 0.076, 0.067, 0.073, 0.058, 0.056, 0.073, 0.12, 0.04, 0.013, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.004, 0.004, 0.006, 0.003, 0.003, 0.002, 0.003, 0.002, 0.03, 0.001, 0.002, 0.003, 0.004, 0.002, 0.002, 0.002, 0.001, 0.002, 0.005, 0.004, 0.001, 0.01, 0.002, 0.017, 0.0001, 0.001, 0.014, 0.0001, 0.014, 0.0001, 0.001, 0.0001, 0.038, 0.009, 0.012, 0.014, 0.044, 0.006, 0.01, 0.013, 0.029, 0.002, 0.006, 0.019, 0.015, 0.026, 0.027, 0.008, 0.001, 0.031, 0.024, 0.024, 0.014, 0.007, 0.003, 0.002, 0.005, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.564, 1.141, 1.579, 1.633, 0.148, 0.303, 0.164, 0.503, 0.456, 0.003, 1.306, 2.454, 0.134, 0.294, 0.686, 0.418, 0.168, 0.334, 0.032, 0.057, 0.2, 0.019, 0.006, 0.011, 0.056, 0.006, 0.17, 0.03, 0.076, 0.03, 0.044, 0.051, 0.143, 0.104, 0.049, 0.03, 0.04, 0.03, 0.005, 0.024, 0.052, 0.001, 0.001, 0.061, 0.001, 0.035, 0.01, 0.009, 6.121, 1.252, 0.294, 1.328, 2.359, 2.412, 0.507, 0.442, 2.779, 0.471, 1.691, 3.418, 1.039, 3.402, 1.301, 0.302, 0.0001, 0.0001, 0.209, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.0001, 0.006, 0.002, 30.423, 13.816, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.14, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ks": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.09, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.116, 0.0001, 0.395, 0.007, 0.0001, 0.0001, 0.004, 0.023, 0.126, 0.124, 0.0001, 0.001, 0.08, 0.153, 0.257, 0.005, 0.042, 0.08, 0.041, 0.04, 0.021, 0.031, 0.018, 0.019, 0.02, 0.048, 0.059, 0.003, 0.053, 0.167, 0.053, 0.0001, 0.0001, 0.005, 0.003, 0.008, 0.007, 0.01, 0.007, 0.001, 0.002, 0.016, 0.003, 0.003, 0.003, 0.004, 0.019, 0.008, 0.002, 0.0001, 0.005, 0.01, 0.013, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.198, 0.016, 0.127, 0.13, 0.17, 0.01, 0.074, 0.033, 0.171, 0.002, 0.016, 0.235, 0.092, 0.256, 0.101, 0.014, 0.0001, 0.218, 0.145, 0.254, 0.031, 0.065, 0.054, 0.0001, 0.012, 0.0001, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.451, 1.562, 0.534, 0.248, 1.154, 1.571, 2.211, 0.263, 1.281, 0.132, 0.341, 0.16, 1.683, 0.702, 0.993, 0.637, 0.623, 0.052, 0.37, 0.043, 0.331, 0.813, 0.313, 0.319, 0.042, 0.007, 0.092, 0.282, 0.326, 0.013, 0.006, 0.065, 0.245, 0.114, 0.179, 0.083, 8.684, 2.577, 0.461, 2.698, 1.217, 0.995, 1.306, 0.114, 0.545, 0.242, 0.666, 1.253, 0.811, 1.543, 0.848, 0.915, 0.434, 0.417, 0.188, 0.11, 0.481, 0.73, 0.156, 0.08, 0.312, 0.004, 2.104, 0.512, 0.0001, 0.0001, 0.188, 0.0001, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.031, 0.0001, 0.008, 0.002, 0.028, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.045, 10.482, 2.72, 3.264, 0.0001, 0.0001, 0.0001, 0.0001, 10.717, 0.001, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ksh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.3, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.544, 0.007, 0.195, 0.001, 0.0001, 0.006, 0.002, 0.064, 0.077, 0.076, 0.018, 0.0001, 0.951, 0.126, 1.237, 0.01, 0.258, 0.351, 0.176, 0.091, 0.09, 0.099, 0.083, 0.083, 0.116, 0.206, 0.046, 0.013, 0.003, 0.002, 0.003, 0.004, 0.0001, 0.29, 0.361, 0.086, 0.549, 0.218, 0.205, 0.059, 0.258, 0.102, 0.404, 0.343, 0.228, 0.359, 0.191, 0.138, 0.226, 0.009, 0.194, 0.601, 0.11, 0.081, 0.179, 0.232, 0.004, 0.009, 0.121, 0.015, 0.0001, 0.017, 0.0001, 0.132, 0.0001, 4.203, 0.771, 2.07, 4.046, 9.612, 0.707, 0.863, 3.367, 3.374, 1.363, 1.028, 2.762, 2.009, 5.309, 3.906, 0.798, 0.006, 4.302, 3.629, 3.86, 2.108, 1.453, 1.005, 0.049, 0.079, 0.749, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.123, 0.002, 0.002, 0.001, 0.082, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.005, 0.0001, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.005, 0.011, 0.0001, 0.082, 0.036, 0.001, 0.009, 0.0001, 0.001, 0.047, 0.002, 0.044, 0.413, 0.03, 0.004, 0.001, 0.001, 1.721, 0.001, 0.004, 0.002, 0.003, 0.013, 0.001, 0.084, 0.001, 0.002, 0.0001, 0.008, 0.003, 0.001, 0.005, 0.025, 0.002, 0.001, 1.538, 0.002, 0.001, 0.001, 0.002, 0.003, 0.531, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.029, 4.494, 0.051, 0.013, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.124, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ku": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.393, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.949, 0.005, 0.256, 0.0001, 0.0001, 0.006, 0.001, 0.113, 0.21, 0.21, 0.006, 0.003, 0.803, 0.095, 1.083, 0.023, 0.197, 0.26, 0.139, 0.073, 0.067, 0.078, 0.071, 0.068, 0.08, 0.162, 0.084, 0.022, 0.008, 0.003, 0.008, 0.006, 0.0001, 0.192, 0.235, 0.084, 0.253, 0.208, 0.064, 0.107, 0.175, 0.032, 0.081, 0.247, 0.144, 0.22, 0.115, 0.035, 0.144, 0.05, 0.104, 0.203, 0.123, 0.017, 0.026, 0.063, 0.071, 0.053, 0.061, 0.009, 0.0001, 0.009, 0.0001, 0.003, 0.002, 7.122, 1.894, 0.369, 2.998, 7.334, 0.296, 0.895, 1.263, 5.92, 0.932, 2.612, 1.973, 1.601, 5.257, 1.434, 0.604, 0.177, 4.384, 1.643, 2.193, 1.071, 1.195, 1.296, 0.608, 2.23, 0.722, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.075, 0.006, 0.004, 0.007, 0.009, 0.007, 0.012, 0.062, 0.012, 0.002, 0.018, 0.001, 0.015, 0.003, 0.068, 0.002, 0.001, 0.001, 0.002, 0.006, 0.001, 0.004, 0.003, 0.001, 0.007, 0.019, 0.001, 0.009, 0.013, 0.012, 0.074, 0.658, 0.013, 0.005, 0.004, 0.002, 0.003, 0.002, 0.004, 0.335, 0.008, 0.015, 3.587, 0.004, 0.003, 0.008, 2.776, 0.007, 0.009, 0.038, 0.007, 0.007, 0.016, 0.003, 0.007, 0.002, 0.005, 0.004, 0.005, 1.203, 0.019, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.03, 8.061, 0.042, 0.73, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.01, 0.005, 0.017, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.063, 0.061, 0.005, 0.012, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.006, 0.073, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.403, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.572, 0.002, 0.112, 0.0001, 0.0001, 0.004, 0.0001, 0.006, 0.253, 0.254, 0.001, 0.001, 0.652, 0.237, 0.796, 0.019, 0.199, 0.362, 0.176, 0.114, 0.094, 0.095, 0.085, 0.09, 0.105, 0.228, 0.059, 0.022, 0.003, 0.001, 0.004, 0.001, 0.0001, 0.008, 0.005, 0.011, 0.005, 0.005, 0.004, 0.005, 0.005, 0.02, 0.004, 0.011, 0.006, 0.006, 0.007, 0.004, 0.005, 0.002, 0.005, 0.011, 0.006, 0.004, 0.008, 0.003, 0.013, 0.003, 0.002, 0.039, 0.0001, 0.039, 0.0001, 0.0001, 0.0001, 0.115, 0.019, 0.016, 0.027, 0.069, 0.009, 0.022, 0.03, 0.155, 0.012, 0.027, 0.043, 0.035, 0.068, 0.048, 0.017, 0.005, 0.048, 0.041, 0.048, 0.044, 0.012, 0.013, 0.005, 0.014, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.292, 3.131, 1.711, 1.163, 0.094, 0.093, 0.068, 0.394, 0.316, 0.013, 0.283, 2.417, 0.996, 0.157, 0.138, 0.933, 0.185, 0.144, 0.161, 0.163, 0.266, 0.043, 0.288, 0.024, 0.072, 0.036, 0.257, 0.079, 0.116, 0.07, 0.051, 0.125, 0.115, 0.273, 0.082, 0.056, 0.037, 0.021, 0.028, 2.085, 0.052, 0.007, 0.009, 0.112, 0.005, 0.032, 0.025, 0.019, 3.353, 0.487, 1.618, 0.507, 1.803, 1.293, 0.994, 0.555, 1.916, 0.692, 1.739, 1.936, 1.41, 2.819, 2.119, 0.641, 0.0001, 0.0001, 0.211, 0.665, 0.015, 0.015, 0.006, 0.004, 0.002, 0.021, 0.019, 0.013, 0.017, 0.003, 0.013, 0.006, 25.09, 14.142, 0.006, 2.075, 0.003, 0.001, 0.001, 0.003, 0.01, 0.008, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.016, 0.023, 0.303, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kw": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.271, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.698, 0.003, 0.428, 0.0001, 0.0001, 0.066, 0.001, 0.379, 0.501, 0.501, 0.001, 0.001, 1.043, 0.466, 1.444, 0.019, 0.602, 0.995, 0.55, 0.31, 0.288, 0.284, 0.283, 0.29, 0.333, 0.472, 0.076, 0.113, 0.013, 0.003, 0.013, 0.002, 0.0001, 0.413, 0.261, 0.217, 0.211, 0.211, 0.117, 0.24, 0.182, 0.089, 0.078, 0.627, 0.279, 0.264, 0.166, 0.089, 0.271, 0.018, 0.16, 0.497, 0.182, 0.13, 0.12, 0.167, 0.003, 0.325, 0.009, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 7.247, 1.102, 0.333, 2.599, 6.963, 0.397, 1.527, 3.863, 2.585, 0.151, 1.745, 2.596, 1.638, 6.936, 4.292, 0.693, 0.011, 4.812, 4.449, 2.907, 1.185, 1.044, 2.706, 0.022, 4.495, 0.043, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.063, 0.013, 0.005, 0.007, 0.005, 0.004, 0.003, 0.003, 0.006, 0.002, 0.002, 0.001, 0.003, 0.005, 0.002, 0.002, 0.003, 0.003, 0.001, 0.033, 0.004, 0.002, 0.002, 0.004, 0.004, 0.02, 0.001, 0.001, 0.003, 0.002, 0.001, 0.002, 0.025, 0.014, 0.004, 0.005, 0.015, 0.004, 0.003, 0.007, 0.004, 0.018, 0.007, 0.005, 0.002, 0.009, 0.005, 0.004, 0.012, 0.007, 0.012, 0.009, 0.008, 0.009, 0.007, 0.003, 0.012, 0.008, 0.009, 0.008, 0.006, 0.007, 0.012, 0.004, 0.0001, 0.0001, 0.028, 0.1, 0.011, 0.012, 0.0001, 0.001, 0.0001, 0.007, 0.003, 0.004, 0.004, 0.0001, 0.012, 0.004, 0.062, 0.02, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.004, 0.013, 0.011, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.013, 0.007, 0.058, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ky": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.608, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.786, 0.001, 0.076, 0.0001, 0.0001, 0.007, 0.001, 0.001, 0.181, 0.185, 0.0001, 0.003, 0.592, 0.375, 0.793, 0.011, 0.212, 0.26, 0.154, 0.095, 0.087, 0.095, 0.083, 0.081, 0.088, 0.165, 0.05, 0.023, 0.024, 0.003, 0.024, 0.002, 0.0001, 0.006, 0.009, 0.006, 0.003, 0.002, 0.01, 0.002, 0.004, 0.023, 0.001, 0.001, 0.003, 0.004, 0.009, 0.004, 0.011, 0.0001, 0.003, 0.019, 0.005, 0.001, 0.003, 0.002, 0.004, 0.001, 0.0001, 0.007, 0.0001, 0.008, 0.0001, 0.002, 0.0001, 0.034, 0.028, 0.011, 0.01, 0.036, 0.004, 0.007, 0.01, 0.029, 0.001, 0.005, 0.017, 0.009, 0.023, 0.028, 0.008, 0.001, 0.047, 0.02, 0.022, 0.013, 0.003, 0.003, 0.002, 0.006, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 2.775, 1.184, 2.443, 1.907, 0.113, 0.08, 0.128, 0.561, 0.622, 0.004, 0.005, 2.414, 0.086, 0.264, 0.107, 0.368, 0.184, 0.149, 0.029, 0.1, 0.146, 0.009, 0.06, 0.008, 0.039, 0.003, 0.233, 0.023, 0.133, 0.051, 0.082, 0.045, 0.072, 0.109, 0.101, 0.162, 0.039, 0.017, 0.003, 0.031, 0.045, 0.843, 0.0001, 0.06, 0.001, 0.049, 0.011, 1.059, 5.238, 0.934, 0.249, 1.237, 1.665, 2.222, 0.662, 0.522, 2.314, 0.665, 2.431, 2.219, 1.157, 3.498, 1.756, 0.567, 0.0001, 0.0001, 0.135, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 28.842, 12.881, 1.192, 0.856, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.186, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "la": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.703, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.582, 0.002, 0.557, 0.0001, 0.0001, 0.004, 0.001, 0.038, 0.296, 0.296, 0.016, 0.002, 1.029, 0.127, 0.917, 0.01, 0.288, 0.518, 0.368, 0.158, 0.135, 0.172, 0.155, 0.139, 0.169, 0.292, 0.103, 0.058, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.441, 0.179, 0.385, 0.16, 0.131, 0.176, 0.158, 0.144, 0.363, 0.023, 0.04, 0.184, 0.266, 0.121, 0.103, 0.293, 0.049, 0.202, 0.319, 0.152, 0.063, 0.122, 0.033, 0.022, 0.01, 0.013, 0.004, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 7.718, 1.137, 2.983, 1.877, 7.832, 0.566, 0.934, 0.721, 8.862, 0.018, 0.079, 2.703, 3.638, 5.533, 4.661, 1.753, 0.47, 5.095, 5.379, 5.968, 5.347, 0.814, 0.036, 0.291, 0.205, 0.069, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.045, 0.018, 0.011, 0.014, 0.009, 0.005, 0.004, 0.005, 0.004, 0.018, 0.002, 0.002, 0.005, 0.007, 0.002, 0.002, 0.004, 0.003, 0.002, 0.014, 0.007, 0.002, 0.002, 0.002, 0.003, 0.004, 0.003, 0.002, 0.004, 0.003, 0.003, 0.004, 0.013, 0.011, 0.004, 0.003, 0.009, 0.004, 0.004, 0.006, 0.01, 0.02, 0.004, 0.013, 0.003, 0.007, 0.003, 0.005, 0.044, 0.013, 0.009, 0.008, 0.006, 0.012, 0.008, 0.005, 0.014, 0.01, 0.011, 0.011, 0.013, 0.014, 0.01, 0.01, 0.0001, 0.0001, 0.047, 0.083, 0.019, 0.012, 0.0001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.062, 0.03, 0.07, 0.024, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.005, 0.012, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.015, 0.037, 0.003, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lad": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.233, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.114, 0.001, 0.334, 0.0001, 0.0001, 0.009, 0.001, 0.032, 0.169, 0.169, 0.0001, 0.0001, 1.028, 0.087, 0.763, 0.008, 0.237, 0.25, 0.147, 0.074, 0.074, 0.086, 0.072, 0.065, 0.078, 0.138, 0.053, 0.043, 0.005, 0.001, 0.005, 0.001, 0.0001, 0.303, 0.15, 0.122, 0.124, 0.422, 0.07, 0.094, 0.073, 0.145, 0.052, 0.173, 0.269, 0.273, 0.076, 0.097, 0.169, 0.01, 0.114, 0.279, 0.178, 0.068, 0.08, 0.015, 0.026, 0.054, 0.024, 0.01, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 10.092, 0.654, 0.428, 4.329, 9.389, 0.52, 0.701, 0.524, 5.468, 0.466, 2.315, 4.475, 1.912, 5.533, 6.266, 1.56, 0.038, 4.367, 5.784, 3.223, 2.47, 1.069, 0.027, 0.043, 1.039, 0.561, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.02, 0.012, 0.005, 0.005, 0.009, 0.006, 0.004, 0.004, 0.005, 0.003, 0.006, 0.002, 0.002, 0.003, 0.003, 0.001, 0.015, 0.012, 0.004, 0.011, 0.018, 0.019, 0.004, 0.004, 0.007, 0.031, 0.002, 0.006, 0.016, 0.006, 0.01, 0.011, 0.017, 0.14, 0.008, 0.005, 0.006, 0.003, 0.003, 0.02, 0.02, 0.11, 0.013, 0.01, 0.003, 0.09, 0.002, 0.005, 0.012, 0.024, 0.019, 0.137, 0.008, 0.006, 0.005, 0.006, 0.008, 0.006, 0.03, 0.011, 0.011, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.044, 0.511, 0.018, 0.013, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.017, 0.007, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.005, 0.02, 0.199, 0.037, 0.028, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.006, 0.018, 0.0001, 0.001, 0.003, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.412, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.95, 0.002, 0.355, 0.0001, 0.0001, 0.008, 0.002, 0.417, 0.145, 0.146, 0.001, 0.003, 0.802, 0.307, 1.03, 0.016, 0.348, 0.52, 0.266, 0.139, 0.134, 0.143, 0.128, 0.134, 0.162, 0.294, 0.059, 0.012, 0.015, 0.003, 0.015, 0.001, 0.0001, 0.428, 0.324, 0.254, 0.594, 0.233, 0.259, 0.289, 0.233, 0.12, 0.196, 0.27, 0.284, 0.379, 0.192, 0.132, 0.314, 0.012, 0.243, 0.585, 0.165, 0.101, 0.142, 0.167, 0.006, 0.01, 0.098, 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 4.931, 0.886, 1.95, 2.841, 11.151, 0.974, 2.202, 2.438, 4.449, 0.072, 0.85, 2.736, 2.142, 6.511, 2.976, 0.873, 0.044, 5.369, 4.192, 4.448, 3.418, 0.952, 0.815, 0.087, 0.179, 0.783, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.039, 0.004, 0.003, 0.002, 0.022, 0.001, 0.001, 0.002, 0.001, 0.016, 0.001, 0.02, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.012, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.01, 0.002, 0.008, 0.002, 0.053, 0.005, 0.005, 0.001, 0.485, 0.001, 0.003, 0.007, 0.029, 0.959, 0.004, 0.541, 0.001, 0.003, 0.002, 0.002, 0.009, 0.004, 0.006, 0.005, 0.01, 0.003, 0.01, 0.001, 0.004, 0.002, 0.003, 0.005, 0.046, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.061, 2.169, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.004, 0.024, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.037, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lbe": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.255, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.9, 0.001, 0.252, 0.0001, 0.0001, 0.001, 0.0001, 0.011, 0.416, 0.416, 0.0001, 0.003, 0.481, 0.136, 0.815, 0.07, 0.265, 0.236, 0.199, 0.107, 0.105, 0.116, 0.098, 0.098, 0.121, 0.12, 0.136, 0.067, 0.071, 0.002, 0.067, 0.006, 0.0001, 0.016, 0.004, 0.021, 0.002, 0.004, 0.005, 0.004, 0.003, 0.485, 0.0001, 0.002, 0.006, 0.012, 0.003, 0.003, 0.014, 0.001, 0.005, 0.011, 0.004, 0.002, 0.006, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.216, 0.084, 0.071, 0.045, 0.128, 0.01, 0.022, 0.031, 0.155, 0.002, 0.014, 0.09, 0.049, 0.088, 0.086, 0.051, 0.003, 0.174, 0.114, 0.069, 0.102, 0.012, 0.003, 0.009, 0.024, 0.006, 0.001, 0.001, 0.001, 0.001, 0.0001, 3.391, 1.985, 1.311, 3.41, 0.076, 1.237, 0.309, 0.579, 0.377, 0.095, 0.645, 0.087, 1.158, 0.044, 0.125, 0.671, 0.313, 0.089, 0.058, 0.221, 0.212, 0.014, 0.015, 0.044, 0.077, 0.005, 0.185, 0.069, 0.144, 0.054, 0.029, 0.04, 0.037, 0.075, 0.123, 0.038, 0.018, 0.116, 0.052, 0.091, 0.05, 0.027, 0.003, 0.033, 0.004, 0.04, 0.009, 0.029, 7.018, 0.742, 1.169, 0.714, 1.012, 0.485, 0.137, 0.404, 2.976, 0.818, 1.445, 2.805, 1.012, 2.921, 0.476, 0.297, 0.0001, 0.0001, 0.062, 0.008, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 26.245, 14.532, 0.0001, 0.534, 0.0001, 0.001, 0.0001, 0.009, 0.088, 0.067, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.019, 0.318, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lez": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.788, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.917, 0.001, 0.11, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.118, 0.119, 0.0001, 0.001, 0.531, 0.18, 0.599, 0.004, 0.16, 0.227, 0.133, 0.076, 0.063, 0.071, 0.067, 0.062, 0.08, 0.115, 0.048, 0.01, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.003, 0.002, 0.005, 0.001, 0.002, 0.001, 0.001, 0.001, 0.351, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.01, 0.001, 0.037, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.023, 0.003, 0.006, 0.005, 0.017, 0.002, 0.004, 0.004, 0.014, 0.001, 0.003, 0.017, 0.004, 0.011, 0.011, 0.005, 0.0001, 0.013, 0.01, 0.009, 0.009, 0.002, 0.001, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.387, 1.088, 1.449, 2.206, 0.197, 0.805, 0.228, 0.469, 0.264, 0.003, 0.696, 0.03, 1.797, 0.123, 0.075, 0.643, 0.214, 0.062, 0.057, 0.099, 0.243, 0.013, 0.01, 0.016, 0.072, 0.013, 0.197, 0.034, 0.095, 0.027, 0.015, 0.041, 0.182, 0.109, 0.046, 0.053, 0.025, 0.087, 0.024, 0.038, 0.035, 0.001, 0.001, 0.075, 0.001, 0.022, 0.007, 0.017, 6.908, 0.463, 1.591, 1.254, 1.853, 1.815, 0.195, 0.884, 4.344, 1.376, 1.744, 1.947, 0.879, 2.868, 0.597, 0.413, 0.0001, 0.0001, 0.264, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.007, 0.0001, 0.004, 0.002, 30.62, 13.045, 0.0001, 0.248, 0.0001, 0.001, 0.0001, 0.001, 0.004, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.149, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.42, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.857, 0.039, 0.098, 0.0001, 0.0001, 0.008, 0.0001, 0.193, 0.619, 0.652, 0.006, 0.013, 0.576, 0.063, 0.759, 0.031, 0.142, 0.149, 0.106, 0.065, 0.048, 0.064, 0.043, 0.046, 0.035, 0.039, 0.112, 0.029, 0.002, 0.038, 0.003, 0.025, 0.0001, 0.202, 0.147, 0.077, 0.032, 0.406, 0.021, 0.082, 0.019, 0.071, 0.01, 0.184, 0.083, 0.172, 0.138, 0.35, 0.039, 0.002, 0.027, 0.089, 0.063, 0.041, 0.016, 0.06, 0.001, 0.036, 0.019, 0.012, 0.0001, 0.012, 0.0001, 0.01, 0.001, 11.513, 4.158, 0.451, 1.382, 6.569, 0.546, 2.789, 0.349, 6.274, 0.363, 4.548, 2.809, 3.269, 5.614, 5.854, 0.404, 0.013, 2.198, 2.205, 2.706, 6.16, 0.367, 2.254, 0.045, 2.427, 1.395, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 1.181, 0.001, 0.015, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 0.006, 0.008, 0.842, 0.001, 0.0001, 0.092, 0.085, 0.0001, 0.0001, 0.001, 0.001, 0.113, 0.0001, 0.0001, 0.0001, 0.017, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.006, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.181, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "li": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.944, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.135, 0.002, 0.418, 0.0001, 0.0001, 0.017, 0.001, 1.033, 0.22, 0.22, 0.002, 0.001, 0.717, 0.245, 0.974, 0.02, 0.269, 0.322, 0.176, 0.093, 0.094, 0.096, 0.096, 0.091, 0.103, 0.161, 0.092, 0.054, 0.018, 0.002, 0.018, 0.001, 0.0001, 0.18, 0.177, 0.097, 0.347, 0.099, 0.066, 0.119, 0.148, 0.188, 0.05, 0.105, 0.134, 0.157, 0.158, 0.108, 0.098, 0.003, 0.104, 0.185, 0.093, 0.028, 0.141, 0.105, 0.003, 0.004, 0.083, 0.008, 0.001, 0.008, 0.0001, 0.0001, 0.001, 5.507, 1.139, 0.937, 3.64, 13.741, 0.575, 2.233, 1.264, 5.103, 1.163, 1.751, 2.989, 1.798, 6.008, 4.376, 1.144, 0.011, 4.793, 3.527, 4.666, 1.997, 1.767, 1.153, 0.045, 0.112, 0.704, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.031, 0.005, 0.002, 0.002, 0.002, 0.002, 0.001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.01, 0.001, 0.0001, 0.002, 0.0001, 0.007, 0.018, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.002, 0.004, 0.007, 0.003, 0.002, 0.113, 0.003, 0.001, 0.003, 0.424, 0.024, 0.004, 0.246, 0.001, 0.004, 0.001, 0.014, 0.003, 0.003, 0.027, 0.238, 0.005, 0.002, 0.354, 0.001, 0.005, 0.003, 0.003, 0.002, 0.014, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.028, 1.471, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.01, 0.004, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.031, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lij": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.653, 0.006, 0.425, 0.0001, 0.0001, 0.003, 0.001, 1.006, 0.211, 0.212, 0.0001, 0.0001, 1.079, 0.522, 0.689, 0.013, 0.183, 0.34, 0.145, 0.099, 0.1, 0.107, 0.089, 0.101, 0.099, 0.127, 0.107, 0.071, 0.08, 0.003, 0.08, 0.006, 0.0001, 0.288, 0.108, 0.216, 0.12, 0.091, 0.089, 0.116, 0.025, 0.235, 0.016, 0.018, 0.145, 0.148, 0.083, 0.128, 0.166, 0.021, 0.11, 0.224, 0.097, 0.053, 0.082, 0.012, 0.025, 0.004, 0.066, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 7.807, 0.66, 2.955, 3.041, 7.727, 0.79, 1.509, 0.643, 7.15, 0.033, 0.062, 2.465, 2.057, 5.516, 6.662, 1.83, 0.232, 3.742, 3.269, 4.498, 2.078, 1.097, 0.032, 0.327, 0.052, 0.447, 0.0001, 0.015, 0.0001, 0.0001, 0.0001, 0.126, 0.011, 0.006, 0.006, 0.007, 0.003, 0.005, 0.015, 0.003, 0.004, 0.003, 0.001, 0.004, 0.006, 0.001, 0.002, 0.001, 0.002, 0.007, 0.108, 0.002, 0.001, 0.003, 0.001, 0.007, 0.097, 0.001, 0.002, 0.005, 0.004, 0.001, 0.001, 0.105, 0.013, 0.443, 0.002, 0.076, 0.002, 0.52, 0.668, 0.246, 0.118, 0.122, 0.032, 0.129, 0.012, 0.108, 0.033, 0.028, 0.081, 0.222, 0.058, 0.152, 0.005, 0.088, 0.002, 0.006, 0.059, 0.022, 0.1, 0.117, 0.007, 0.005, 0.013, 0.0001, 0.0001, 0.059, 3.444, 0.014, 0.118, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.026, 0.013, 0.031, 0.013, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.016, 0.012, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.009, 0.005, 0.121, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lmo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.694, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.003, 0.007, 0.496, 0.0001, 0.002, 0.011, 0.001, 1.536, 0.286, 0.286, 0.0001, 0.001, 1.048, 0.242, 0.905, 0.061, 0.214, 0.291, 0.19, 0.13, 0.124, 0.121, 0.109, 0.107, 0.118, 0.137, 0.12, 0.041, 0.23, 0.036, 0.23, 0.004, 0.0001, 0.256, 0.222, 0.29, 0.092, 0.333, 0.125, 0.138, 0.035, 0.151, 0.022, 0.022, 0.325, 0.213, 0.07, 0.062, 0.237, 0.013, 0.158, 0.284, 0.115, 0.042, 0.131, 0.03, 0.012, 0.005, 0.017, 0.008, 0.0001, 0.008, 0.0001, 0.008, 0.0001, 8.462, 0.843, 2.691, 3.762, 7.44, 0.686, 1.303, 1.109, 4.912, 0.086, 0.225, 4.93, 2.005, 5.17, 2.753, 1.529, 0.12, 4.31, 3.255, 3.626, 1.912, 0.803, 0.038, 0.028, 0.061, 0.501, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.065, 0.004, 0.005, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.003, 0.001, 0.002, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, 0.002, 0.011, 0.002, 0.0001, 0.002, 0.001, 0.012, 0.042, 0.001, 0.001, 0.018, 0.002, 0.001, 0.003, 0.883, 0.012, 0.006, 0.001, 0.021, 0.001, 0.002, 0.005, 0.978, 0.311, 0.003, 0.015, 0.376, 0.025, 0.002, 0.002, 0.004, 0.005, 0.393, 0.184, 0.028, 0.003, 0.199, 0.002, 0.003, 0.227, 0.023, 0.007, 0.722, 0.004, 0.002, 0.004, 0.0001, 0.0001, 0.146, 4.287, 0.005, 0.015, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.019, 0.008, 0.013, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.061, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ln": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.397, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.893, 0.03, 0.25, 0.011, 0.001, 0.018, 0.001, 0.058, 0.196, 0.195, 0.019, 0.0001, 0.627, 0.278, 0.997, 0.017, 0.237, 0.316, 0.167, 0.077, 0.074, 0.095, 0.09, 0.07, 0.092, 0.208, 0.084, 0.022, 0.031, 0.028, 0.031, 0.008, 0.0001, 0.272, 0.381, 0.139, 0.08, 0.273, 0.07, 0.073, 0.036, 0.085, 0.047, 0.397, 0.244, 0.485, 0.279, 0.076, 0.136, 0.004, 0.069, 0.216, 0.116, 0.035, 0.048, 0.05, 0.005, 0.052, 0.034, 0.014, 0.018, 0.014, 0.0001, 0.004, 0.0001, 10.636, 2.915, 0.49, 0.988, 4.562, 0.3, 1.532, 0.289, 5.022, 0.059, 3.253, 3.932, 3.872, 5.27, 5.607, 1.218, 0.071, 1.319, 2.651, 2.571, 1.582, 0.27, 0.506, 0.061, 2.255, 1.262, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.045, 0.425, 0.034, 0.001, 0.004, 0.002, 0.016, 0.0001, 0.002, 0.009, 0.003, 0.0001, 0.047, 0.002, 0.03, 0.0001, 0.012, 0.0001, 0.122, 0.011, 0.585, 0.0001, 0.0001, 0.0001, 0.001, 0.025, 0.001, 0.584, 0.003, 0.002, 0.001, 0.0001, 0.21, 1.199, 0.019, 0.009, 0.001, 0.001, 0.002, 0.013, 0.036, 1.009, 0.021, 0.019, 0.002, 0.983, 0.006, 0.015, 0.003, 0.003, 0.005, 0.692, 0.016, 0.003, 0.001, 0.001, 0.001, 0.002, 0.332, 0.02, 0.002, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.228, 4.372, 0.034, 0.004, 0.008, 0.141, 0.0001, 1.137, 0.001, 0.001, 0.5, 0.0001, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.014, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.057, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.442, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.079, 0.001, 0.049, 0.0001, 0.0001, 0.006, 0.0001, 0.004, 0.071, 0.071, 0.001, 0.001, 0.152, 0.034, 0.234, 0.012, 0.09, 0.111, 0.08, 0.044, 0.039, 0.045, 0.029, 0.03, 0.029, 0.051, 0.034, 0.006, 0.003, 0.002, 0.003, 0.001, 0.0001, 0.013, 0.008, 0.01, 0.008, 0.006, 0.005, 0.004, 0.005, 0.01, 0.003, 0.004, 0.008, 0.008, 0.007, 0.003, 0.012, 0.0001, 0.005, 0.013, 0.013, 0.003, 0.004, 0.004, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.157, 0.027, 0.063, 0.059, 0.202, 0.033, 0.037, 0.067, 0.14, 0.003, 0.015, 0.078, 0.05, 0.13, 0.139, 0.039, 0.002, 0.117, 0.112, 0.142, 0.055, 0.018, 0.023, 0.006, 0.028, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.694, 1.8, 0.562, 0.336, 0.72, 0.0001, 0.034, 1.352, 1.675, 1.044, 0.455, 0.525, 0.031, 0.727, 0.002, 0.001, 0.005, 0.004, 0.004, 0.01, 1.254, 0.484, 0.162, 0.734, 0.009, 2.294, 0.653, 0.586, 0.209, 0.092, 0.491, 0.038, 0.022, 1.013, 0.148, 0.224, 0.003, 0.796, 0.001, 0.85, 0.016, 0.008, 0.816, 0.509, 0.001, 1.145, 0.216, 0.004, 1.227, 1.202, 2.293, 0.24, 0.573, 0.78, 0.113, 0.39, 1.673, 0.52, 24.114, 5.723, 0.116, 0.133, 0.001, 0.0001, 0.0001, 0.0001, 0.085, 0.006, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.829, 0.002, 0.538, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lrc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.503, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.494, 0.003, 0.04, 0.0001, 0.0001, 0.008, 0.0001, 0.002, 0.084, 0.084, 0.002, 0.001, 0.009, 0.028, 0.484, 0.015, 0.026, 0.035, 0.019, 0.017, 0.01, 0.011, 0.009, 0.009, 0.015, 0.017, 0.04, 0.001, 0.009, 0.002, 0.009, 0.0001, 0.0001, 0.006, 0.003, 0.003, 0.006, 0.003, 0.002, 0.001, 0.002, 0.005, 0.001, 0.002, 0.002, 0.003, 0.002, 0.001, 0.003, 0.0001, 0.002, 0.003, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.003, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.043, 0.006, 0.016, 0.023, 0.041, 0.004, 0.008, 0.011, 0.044, 0.001, 0.008, 0.022, 0.01, 0.037, 0.028, 0.011, 0.001, 0.026, 0.016, 0.024, 0.015, 0.007, 0.006, 0.002, 0.007, 0.003, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.141, 0.397, 0.205, 0.02, 1.605, 1.614, 3.115, 2.266, 3.47, 0.018, 0.099, 0.005, 5.078, 0.005, 0.021, 0.008, 0.02, 0.003, 0.001, 0.004, 0.007, 0.374, 0.0001, 0.001, 0.02, 0.38, 0.001, 0.042, 0.001, 0.001, 0.001, 0.003, 0.001, 0.003, 0.35, 0.86, 0.5, 0.014, 1.898, 5.042, 0.917, 1.365, 1.804, 0.048, 0.445, 0.131, 0.29, 3.021, 0.146, 3.091, 0.704, 1.565, 1.062, 0.145, 0.062, 0.1, 0.06, 0.212, 0.059, 0.025, 0.002, 0.001, 0.485, 0.001, 0.0001, 0.0001, 0.044, 0.006, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.017, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.007, 20.669, 13.379, 3.076, 5.814, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.002, 0.138, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ltg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.505, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.915, 0.002, 0.48, 0.0001, 0.0001, 0.03, 0.001, 0.011, 0.307, 0.306, 0.001, 0.001, 1.036, 0.186, 1.128, 0.03, 0.246, 0.429, 0.198, 0.13, 0.123, 0.148, 0.107, 0.108, 0.116, 0.317, 0.161, 0.072, 0.029, 0.005, 0.029, 0.004, 0.0001, 0.199, 0.123, 0.06, 0.183, 0.07, 0.028, 0.064, 0.021, 0.12, 0.092, 0.204, 0.323, 0.133, 0.101, 0.065, 0.288, 0.001, 0.16, 0.239, 0.103, 0.036, 0.21, 0.007, 0.022, 0.001, 0.052, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 7.469, 0.962, 0.824, 2.269, 4.253, 0.17, 1.648, 0.088, 6.306, 1.422, 2.423, 2.524, 1.996, 2.559, 4.514, 1.853, 0.001, 3.554, 6.061, 4.103, 4.999, 1.941, 0.013, 0.006, 1.629, 1.118, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.287, 1.24, 0.018, 0.009, 0.002, 0.008, 0.371, 0.004, 0.003, 0.001, 0.001, 0.004, 0.014, 0.08, 0.001, 0.011, 0.003, 0.002, 0.002, 0.271, 0.142, 0.001, 0.001, 0.003, 0.003, 0.007, 0.001, 0.001, 0.003, 0.032, 0.034, 0.002, 0.043, 0.709, 0.001, 0.005, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.001, 0.015, 2.24, 0.001, 0.001, 0.0001, 0.001, 0.04, 0.01, 0.024, 0.01, 0.013, 0.028, 0.003, 0.011, 0.033, 0.006, 0.014, 0.026, 0.687, 0.026, 0.226, 0.009, 0.0001, 0.0001, 0.023, 0.015, 3.578, 2.215, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.003, 0.001, 0.252, 0.098, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.265, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mai": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.888, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.023, 0.001, 0.03, 0.0001, 0.0001, 0.003, 0.001, 0.013, 0.071, 0.074, 0.0001, 0.001, 0.267, 0.061, 0.074, 0.006, 0.01, 0.016, 0.009, 0.005, 0.004, 0.005, 0.004, 0.004, 0.005, 0.012, 0.021, 0.006, 0.004, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.018, 0.005, 0.005, 0.005, 0.017, 0.003, 0.004, 0.008, 0.015, 0.001, 0.002, 0.009, 0.005, 0.013, 0.013, 0.004, 0.001, 0.014, 0.017, 0.012, 0.006, 0.002, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.792, 0.705, 0.351, 0.05, 0.0001, 0.548, 0.202, 1.331, 0.277, 0.165, 0.004, 0.356, 0.051, 2.185, 0.0001, 0.286, 0.005, 0.001, 0.0001, 0.066, 0.006, 1.874, 0.183, 0.514, 0.043, 0.102, 0.293, 0.463, 0.567, 0.024, 0.087, 0.255, 0.05, 0.178, 0.022, 0.166, 25.43, 6.866, 0.581, 0.373, 1.476, 0.06, 0.857, 0.137, 0.417, 0.41, 1.258, 0.71, 1.883, 0.001, 1.344, 0.001, 0.001, 0.686, 0.286, 0.227, 1.223, 0.469, 0.0001, 0.0001, 0.026, 0.025, 2.747, 1.736, 0.0001, 0.0001, 0.009, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.668, 0.0001, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mdf": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.974, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.901, 0.002, 0.147, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.239, 0.241, 0.0001, 0.001, 0.661, 0.233, 0.828, 0.004, 0.16, 0.227, 0.113, 0.065, 0.054, 0.071, 0.072, 0.058, 0.067, 0.13, 0.047, 0.019, 0.002, 0.0001, 0.002, 0.001, 0.0001, 0.006, 0.002, 0.008, 0.002, 0.002, 0.003, 0.002, 0.002, 0.025, 0.001, 0.002, 0.002, 0.005, 0.002, 0.002, 0.006, 0.001, 0.003, 0.005, 0.003, 0.001, 0.008, 0.001, 0.014, 0.0001, 0.0001, 0.004, 0.0001, 0.005, 0.0001, 0.002, 0.0001, 0.07, 0.006, 0.018, 0.016, 0.05, 0.004, 0.011, 0.014, 0.042, 0.003, 0.009, 0.03, 0.013, 0.041, 0.036, 0.013, 0.001, 0.037, 0.035, 0.028, 0.024, 0.005, 0.003, 0.003, 0.006, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.013, 2.98, 2.587, 0.748, 0.583, 0.414, 0.428, 0.203, 0.631, 0.045, 0.095, 0.17, 2.818, 0.257, 0.113, 1.375, 0.157, 0.181, 0.113, 0.066, 0.125, 0.013, 0.006, 0.022, 0.063, 0.005, 0.16, 0.068, 0.186, 0.053, 0.097, 0.114, 0.073, 0.188, 0.099, 0.03, 0.023, 0.016, 0.014, 0.014, 0.049, 0.003, 0.001, 0.054, 0.002, 0.05, 0.007, 0.022, 4.7, 0.292, 1.108, 0.449, 1.264, 2.755, 0.106, 0.711, 2.236, 0.41, 2.142, 1.743, 1.474, 3.418, 3.1, 0.637, 0.0001, 0.0001, 0.118, 0.006, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.003, 0.002, 0.0001, 0.004, 0.002, 28.205, 15.445, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.006, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.0001, 0.122, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.132, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.344, 0.0001, 0.051, 0.0001, 0.0001, 0.003, 0.0001, 1.722, 0.134, 0.134, 0.0001, 0.062, 0.6, 1.054, 1.426, 0.011, 0.88, 0.969, 0.776, 0.547, 0.574, 0.473, 0.464, 0.436, 0.531, 0.535, 0.029, 0.033, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.281, 0.132, 0.16, 0.072, 0.212, 0.148, 0.178, 0.056, 0.346, 0.102, 0.053, 0.101, 0.354, 0.788, 0.05, 0.139, 0.008, 0.098, 0.209, 0.172, 0.049, 0.057, 0.038, 0.005, 0.021, 0.009, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 15.071, 0.568, 0.216, 2.816, 2.902, 0.81, 0.249, 1.395, 7.562, 0.225, 1.469, 1.52, 3.108, 9.36, 4.666, 0.931, 0.023, 4.686, 1.843, 3.288, 0.414, 0.748, 0.044, 0.043, 4.297, 0.559, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.076, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.008, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.052, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.017, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.15, 0.01, 0.007, 0.008, 0.001, 0.0001, 0.001, 0.006, 0.026, 0.088, 0.003, 0.004, 0.001, 0.005, 0.002, 0.002, 0.137, 0.002, 0.001, 0.004, 0.086, 0.001, 0.002, 0.001, 0.003, 0.001, 0.002, 0.01, 0.003, 0.001, 0.001, 0.008, 0.0001, 0.0001, 0.143, 0.408, 0.006, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.069, 0.004, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.376, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.504, 0.0001, 0.156, 0.0001, 0.0001, 0.0001, 0.039, 0.039, 0.039, 0.039, 0.0001, 0.0001, 1.325, 0.078, 1.247, 0.039, 0.156, 0.039, 0.078, 0.0001, 0.0001, 0.039, 0.0001, 0.0001, 0.039, 0.0001, 0.039, 0.078, 0.078, 0.039, 0.078, 0.0001, 0.0001, 0.701, 0.273, 0.156, 0.078, 0.312, 0.039, 0.156, 0.078, 0.351, 0.779, 0.779, 0.234, 0.779, 0.0001, 0.039, 0.156, 0.0001, 0.312, 0.195, 0.156, 0.195, 0.039, 0.078, 0.0001, 0.195, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.103, 1.558, 0.312, 0.818, 6.584, 0.078, 0.351, 1.013, 7.402, 4.675, 3.584, 3.039, 2.766, 5.804, 6.389, 0.779, 0.078, 4.753, 1.48, 2.337, 1.441, 0.117, 1.597, 0.0001, 1.558, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.351, 0.0001, 0.0001, 0.156, 0.0001, 0.039, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.039, 0.545, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.467, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.078, 0.0001, 0.117, 0.0001, 0.0001, 0.0001, 1.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.208, 0.429, 0.584, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.662, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mhr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.247, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.433, 0.01, 0.105, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.242, 0.243, 0.0001, 0.004, 0.563, 0.341, 0.763, 0.006, 0.23, 0.307, 0.193, 0.103, 0.088, 0.092, 0.076, 0.077, 0.081, 0.164, 0.099, 0.012, 0.003, 0.005, 0.003, 0.006, 0.0001, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.001, 0.001, 0.045, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.016, 0.001, 0.019, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.02, 0.004, 0.007, 0.008, 0.02, 0.002, 0.003, 0.004, 0.014, 0.0001, 0.002, 0.01, 0.005, 0.01, 0.012, 0.004, 0.0001, 0.013, 0.009, 0.01, 0.005, 0.002, 0.002, 0.0001, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.161, 0.998, 2.463, 1.262, 0.079, 0.06, 0.073, 0.732, 2.145, 0.012, 0.024, 3.429, 0.167, 0.157, 0.039, 0.3, 0.114, 0.051, 0.084, 0.076, 0.173, 0.021, 0.005, 0.012, 0.07, 0.035, 0.245, 0.039, 0.204, 0.055, 0.073, 0.108, 0.142, 0.124, 0.167, 0.046, 0.023, 0.257, 0.01, 0.146, 0.069, 0.001, 0.001, 0.099, 0.002, 0.093, 0.02, 0.031, 3.766, 0.43, 0.916, 0.689, 1.067, 3.621, 0.573, 0.276, 1.798, 1.177, 2.133, 2.766, 1.884, 2.711, 2.445, 0.765, 0.0001, 0.0001, 0.222, 0.109, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.008, 0.004, 28.363, 13.911, 0.249, 0.424, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.203, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.242, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.048, 0.002, 0.114, 0.0001, 0.0001, 0.007, 0.0001, 0.316, 0.24, 0.24, 0.0001, 0.0001, 0.815, 0.729, 1.027, 0.003, 0.15, 0.245, 0.11, 0.069, 0.067, 0.071, 0.069, 0.066, 0.083, 0.097, 0.029, 0.194, 0.002, 0.0001, 0.002, 0.002, 0.0001, 0.243, 0.042, 0.09, 0.013, 0.207, 0.019, 0.023, 0.227, 0.154, 0.011, 0.858, 0.022, 0.414, 0.264, 0.035, 0.344, 0.001, 0.143, 0.039, 1.088, 0.016, 0.015, 0.518, 0.001, 0.002, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 10.57, 0.047, 0.232, 0.102, 7.727, 0.029, 1.763, 3.618, 6.701, 0.008, 3.514, 0.582, 0.854, 4.652, 6.133, 0.788, 0.003, 3.052, 0.255, 6.464, 3.231, 0.037, 1.326, 0.008, 0.217, 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.025, 2.749, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.072, 0.357, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.284, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.004, 0.001, 0.003, 0.004, 0.003, 0.003, 0.013, 0.525, 0.001, 0.002, 0.001, 0.002, 0.003, 0.004, 0.018, 0.005, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.019, 0.015, 3.257, 0.759, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.008, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.002, 0.004, 0.001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "min": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.172, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.612, 0.0001, 0.04, 0.005, 0.0001, 0.002, 0.004, 0.018, 0.155, 0.155, 0.0001, 0.0001, 1.063, 0.022, 1.041, 0.001, 0.404, 0.298, 0.265, 0.112, 0.103, 0.128, 0.132, 0.113, 0.114, 0.233, 0.009, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.635, 0.069, 0.223, 0.216, 0.107, 0.023, 0.035, 0.059, 0.25, 0.026, 0.062, 0.356, 0.142, 0.089, 0.046, 0.143, 0.014, 0.06, 0.402, 0.123, 0.018, 0.017, 0.016, 0.015, 0.037, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.754, 1.953, 0.961, 4.093, 4.246, 0.532, 1.865, 1.575, 6.705, 0.46, 3.68, 3.421, 3.054, 5.905, 5.613, 2.448, 0.009, 4.152, 3.536, 3.358, 3.758, 0.175, 0.156, 0.045, 0.909, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, 0.016, 0.004, 0.004, 0.011, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.0001, 0.0001, 0.014, 0.007, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.029, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.442, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.507, 0.001, 0.094, 0.0001, 0.0001, 0.006, 0.001, 0.012, 0.086, 0.086, 0.001, 0.004, 0.588, 0.074, 0.535, 0.01, 0.197, 0.23, 0.143, 0.089, 0.082, 0.088, 0.076, 0.074, 0.08, 0.116, 0.032, 0.012, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.015, 0.008, 0.047, 0.006, 0.006, 0.005, 0.034, 0.005, 0.026, 0.002, 0.003, 0.006, 0.012, 0.023, 0.006, 0.014, 0.001, 0.007, 0.019, 0.01, 0.006, 0.006, 0.004, 0.004, 0.001, 0.001, 0.008, 0.0001, 0.008, 0.0001, 0.002, 0.0001, 0.08, 0.013, 0.03, 0.022, 0.08, 0.011, 0.022, 0.023, 0.061, 0.003, 0.011, 0.035, 0.039, 0.054, 0.06, 0.012, 0.001, 0.056, 0.049, 0.047, 0.027, 0.008, 0.006, 0.003, 0.012, 0.004, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.279, 1.922, 3.072, 0.896, 0.157, 0.085, 0.296, 0.344, 0.32, 0.001, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.012, 0.067, 0.066, 0.1, 0.11, 0.062, 0.046, 0.008, 0.029, 0.825, 0.009, 0.229, 0.032, 0.208, 0.077, 0.103, 0.118, 0.054, 0.125, 0.063, 0.016, 0.028, 0.03, 0.013, 0.01, 0.018, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 5.692, 0.585, 1.752, 0.746, 1.619, 3.647, 0.195, 0.665, 3.964, 0.001, 1.64, 1.494, 0.888, 3.068, 4.767, 1.117, 0.0001, 0.0001, 0.015, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 33.101, 10.345, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.096, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ml": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.283, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.554, 0.001, 0.034, 0.0001, 0.0001, 0.002, 0.0001, 0.013, 0.046, 0.046, 0.0001, 0.001, 0.155, 0.051, 0.434, 0.004, 0.069, 0.096, 0.051, 0.026, 0.025, 0.029, 0.025, 0.024, 0.03, 0.054, 0.011, 0.004, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.005, 0.003, 0.005, 0.002, 0.002, 0.002, 0.002, 0.002, 0.004, 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.004, 0.0001, 0.002, 0.005, 0.004, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.044, 0.007, 0.016, 0.014, 0.045, 0.007, 0.009, 0.015, 0.036, 0.001, 0.004, 0.022, 0.013, 0.031, 0.031, 0.01, 0.001, 0.031, 0.025, 0.029, 0.015, 0.004, 0.005, 0.002, 0.008, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.284, 1.637, 0.889, 0.045, 0.0001, 0.237, 0.843, 0.478, 0.108, 0.077, 0.086, 0.336, 0.062, 4.599, 0.152, 0.029, 0.008, 0.0001, 0.075, 0.022, 0.003, 1.759, 0.042, 0.219, 0.023, 0.382, 0.512, 0.004, 0.161, 0.001, 0.086, 0.887, 0.025, 0.094, 0.002, 0.484, 1.618, 0.083, 0.303, 0.146, 1.873, 0.0001, 0.931, 0.058, 0.143, 0.126, 0.78, 1.209, 1.122, 0.589, 0.667, 0.458, 22.229, 10.029, 0.199, 0.193, 0.652, 0.135, 0.025, 0.171, 0.328, 0.323, 1.631, 2.28, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.391, 0.001, 0.071, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.502, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.684, 0.002, 0.094, 0.001, 0.001, 0.006, 0.001, 0.003, 0.078, 0.078, 0.001, 0.002, 0.423, 0.192, 0.522, 0.019, 0.207, 0.249, 0.16, 0.075, 0.065, 0.07, 0.06, 0.055, 0.066, 0.128, 0.025, 0.008, 0.003, 0.005, 0.004, 0.002, 0.0001, 0.018, 0.012, 0.019, 0.013, 0.012, 0.008, 0.007, 0.009, 0.026, 0.003, 0.004, 0.011, 0.017, 0.01, 0.009, 0.02, 0.002, 0.012, 0.024, 0.016, 0.006, 0.007, 0.006, 0.007, 0.003, 0.001, 0.006, 0.001, 0.006, 0.0001, 0.005, 0.0001, 0.097, 0.016, 0.039, 0.037, 0.119, 0.017, 0.023, 0.03, 0.088, 0.002, 0.012, 0.052, 0.031, 0.08, 0.086, 0.026, 0.002, 0.079, 0.064, 0.078, 0.038, 0.025, 0.012, 0.008, 0.018, 0.003, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 2.438, 1.425, 1.576, 1.589, 0.047, 1.639, 0.295, 0.416, 0.311, 0.001, 0.008, 0.672, 0.369, 2.886, 0.106, 0.163, 0.114, 0.151, 0.023, 0.067, 0.081, 0.017, 0.027, 0.033, 0.044, 0.004, 0.046, 0.028, 0.128, 0.083, 0.044, 0.031, 0.048, 0.074, 0.102, 0.063, 0.021, 0.125, 0.02, 0.022, 0.053, 1.026, 0.001, 0.019, 0.001, 0.067, 0.028, 1.192, 4.733, 1.04, 0.537, 2.615, 2.04, 0.399, 0.621, 0.396, 2.01, 1.723, 0.207, 2.589, 0.943, 3.889, 2.383, 0.107, 0.0001, 0.0001, 0.065, 0.012, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 27.532, 13.908, 1.199, 1.049, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.072, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.77, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.47, 0.002, 0.214, 0.0001, 0.0001, 0.017, 0.001, 0.035, 0.128, 0.128, 0.002, 0.001, 0.656, 0.155, 0.49, 0.006, 0.172, 0.19, 0.096, 0.052, 0.062, 0.054, 0.034, 0.043, 0.06, 0.129, 0.06, 0.015, 0.017, 0.012, 0.017, 0.0001, 0.0001, 0.018, 0.009, 0.023, 0.009, 0.011, 0.002, 0.006, 0.004, 0.035, 0.002, 0.005, 0.007, 0.014, 0.008, 0.008, 0.009, 0.001, 0.009, 0.019, 0.008, 0.005, 0.004, 0.007, 0.007, 0.001, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.381, 0.035, 0.167, 0.122, 0.44, 0.045, 0.036, 0.034, 0.432, 0.005, 0.016, 0.206, 0.12, 0.248, 0.177, 0.096, 0.003, 0.253, 0.183, 0.236, 0.214, 0.038, 0.01, 0.011, 0.011, 0.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.01, 1.642, 2.712, 2.46, 0.4, 0.066, 0.487, 0.515, 0.507, 0.001, 0.001, 0.622, 0.372, 0.933, 0.029, 0.581, 0.134, 0.087, 0.042, 0.032, 0.081, 0.073, 0.022, 0.008, 0.061, 0.004, 0.139, 0.063, 0.145, 0.05, 0.043, 0.149, 0.144, 0.143, 0.069, 0.113, 0.038, 0.031, 0.007, 0.03, 0.013, 0.002, 0.001, 0.064, 0.002, 0.001, 0.029, 0.007, 3.78, 0.37, 0.558, 0.274, 1.316, 4.346, 0.072, 0.319, 3.558, 0.657, 1.356, 2.204, 1.073, 2.802, 2.13, 1.099, 0.0001, 0.0001, 0.025, 0.051, 0.091, 0.068, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.005, 0.0001, 0.008, 0.004, 27.537, 14.047, 0.001, 0.161, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.022, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.525, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.348, 0.002, 0.043, 0.0001, 0.0001, 0.004, 0.0001, 0.024, 0.061, 0.064, 0.0001, 0.001, 0.221, 0.063, 0.539, 0.009, 0.009, 0.009, 0.006, 0.003, 0.003, 0.003, 0.003, 0.003, 0.003, 0.005, 0.03, 0.01, 0.003, 0.004, 0.003, 0.003, 0.0001, 0.008, 0.004, 0.006, 0.004, 0.003, 0.003, 0.003, 0.003, 0.007, 0.002, 0.002, 0.003, 0.006, 0.003, 0.002, 0.005, 0.0001, 0.004, 0.008, 0.009, 0.001, 0.002, 0.002, 0.0001, 0.001, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.001, 0.0001, 0.138, 0.021, 0.046, 0.053, 0.162, 0.029, 0.028, 0.063, 0.114, 0.003, 0.011, 0.062, 0.038, 0.106, 0.103, 0.03, 0.002, 0.096, 0.09, 0.116, 0.04, 0.015, 0.019, 0.003, 0.023, 0.002, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 1.224, 0.397, 1.061, 0.056, 0.001, 0.297, 0.351, 1.664, 0.084, 0.127, 0.02, 0.461, 0.026, 2.286, 0.0001, 0.096, 0.005, 0.018, 0.001, 0.019, 0.005, 1.098, 0.145, 0.403, 0.083, 0.015, 0.659, 0.012, 0.404, 0.067, 0.014, 0.287, 0.125, 0.236, 0.039, 0.415, 24.995, 7.065, 0.585, 0.404, 1.081, 0.036, 0.727, 0.118, 0.317, 0.211, 0.844, 1.342, 1.809, 0.018, 1.056, 0.198, 0.001, 0.975, 0.327, 0.194, 1.035, 0.79, 0.001, 0.001, 0.003, 0.001, 3.71, 0.926, 0.0001, 0.0001, 0.015, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.418, 0.001, 0.048, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mrj": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.556, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.792, 0.004, 0.111, 0.0001, 0.0001, 0.008, 0.001, 0.036, 0.371, 0.372, 0.0001, 0.001, 0.508, 0.256, 0.9, 0.015, 0.334, 0.401, 0.27, 0.169, 0.152, 0.17, 0.137, 0.141, 0.168, 0.185, 0.1, 0.046, 0.009, 0.005, 0.008, 0.012, 0.0001, 0.017, 0.012, 0.012, 0.011, 0.006, 0.006, 0.008, 0.006, 0.083, 0.004, 0.011, 0.006, 0.014, 0.007, 0.024, 0.016, 0.001, 0.008, 0.014, 0.009, 0.003, 0.03, 0.002, 0.042, 0.002, 0.001, 0.008, 0.0001, 0.009, 0.0001, 0.003, 0.0001, 0.281, 0.025, 0.082, 0.065, 0.202, 0.013, 0.027, 0.052, 0.157, 0.003, 0.032, 0.08, 0.041, 0.09, 0.092, 0.03, 0.005, 0.117, 0.072, 0.076, 0.073, 0.015, 0.012, 0.004, 0.024, 0.01, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.356, 0.846, 2.179, 0.887, 0.116, 0.285, 0.312, 0.236, 2.316, 0.007, 0.004, 2.565, 0.266, 0.252, 0.05, 0.215, 0.187, 0.062, 0.078, 1.679, 0.285, 0.024, 0.005, 0.016, 0.067, 0.046, 0.237, 0.053, 0.116, 0.054, 0.059, 0.117, 0.058, 0.115, 0.145, 0.033, 0.102, 0.049, 0.064, 0.062, 0.066, 0.006, 0.001, 0.056, 0.003, 0.041, 0.007, 0.023, 2.651, 0.259, 1.194, 0.797, 1.113, 1.956, 0.572, 0.253, 2.277, 2.969, 1.78, 2.755, 1.532, 2.591, 1.704, 0.818, 0.0001, 0.0001, 0.138, 0.095, 0.012, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.011, 0.0001, 0.008, 0.006, 24.363, 12.5, 0.002, 4.142, 0.0001, 0.0001, 0.0001, 0.001, 0.015, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.004, 0.341, 0.005, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ms": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.423, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.116, 0.004, 0.276, 0.001, 0.003, 0.028, 0.005, 0.04, 0.153, 0.154, 0.011, 0.002, 0.825, 0.313, 0.841, 0.02, 0.335, 0.324, 0.225, 0.11, 0.099, 0.112, 0.094, 0.087, 0.096, 0.171, 0.041, 0.019, 0.01, 0.005, 0.01, 0.002, 0.001, 0.327, 0.313, 0.169, 0.197, 0.08, 0.09, 0.097, 0.122, 0.22, 0.145, 0.326, 0.158, 0.369, 0.143, 0.065, 0.427, 0.013, 0.147, 0.487, 0.268, 0.071, 0.05, 0.063, 0.007, 0.038, 0.022, 0.015, 0.0001, 0.015, 0.0001, 0.002, 0.0001, 15.253, 2.008, 0.502, 3.234, 6.807, 0.209, 2.704, 2.141, 5.701, 0.605, 3.195, 3.049, 3.025, 7.562, 1.688, 2.054, 0.019, 4.172, 2.861, 3.513, 3.855, 0.159, 0.407, 0.024, 1.19, 0.123, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.025, 0.005, 0.003, 0.004, 0.003, 0.002, 0.002, 0.004, 0.003, 0.002, 0.002, 0.001, 0.002, 0.007, 0.004, 0.002, 0.001, 0.002, 0.001, 0.009, 0.003, 0.001, 0.001, 0.001, 0.002, 0.01, 0.001, 0.003, 0.004, 0.004, 0.001, 0.007, 0.031, 0.013, 0.003, 0.003, 0.003, 0.002, 0.001, 0.006, 0.007, 0.017, 0.002, 0.003, 0.001, 0.007, 0.002, 0.002, 0.004, 0.011, 0.003, 0.006, 0.005, 0.001, 0.006, 0.001, 0.004, 0.002, 0.003, 0.002, 0.008, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.034, 0.074, 0.022, 0.02, 0.0001, 0.0001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.012, 0.015, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.024, 0.004, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mt": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.717, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.569, 0.003, 0.319, 0.001, 0.001, 0.009, 0.001, 0.699, 0.116, 0.117, 0.001, 0.002, 0.868, 2.789, 0.736, 0.014, 0.299, 0.341, 0.218, 0.093, 0.081, 0.087, 0.085, 0.082, 0.1, 0.201, 0.053, 0.022, 0.013, 0.012, 0.013, 0.002, 0.0001, 0.223, 0.171, 0.118, 0.162, 0.107, 0.236, 0.127, 0.076, 0.3, 0.048, 0.158, 0.199, 0.315, 0.08, 0.056, 0.187, 0.018, 0.103, 0.221, 0.127, 0.065, 0.054, 0.053, 0.02, 0.007, 0.009, 0.022, 0.0001, 0.023, 0.0001, 0.008, 0.002, 9.087, 1.533, 0.244, 1.812, 5.201, 1.498, 1.212, 0.809, 8.439, 2.13, 1.92, 5.784, 2.557, 4.221, 2.69, 1.16, 0.488, 3.837, 2.631, 5.521, 3.106, 0.451, 1.062, 0.484, 0.085, 0.753, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.211, 0.004, 0.004, 0.002, 0.003, 0.001, 0.001, 0.004, 0.002, 0.001, 0.016, 0.407, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.042, 0.003, 0.001, 0.001, 0.001, 0.005, 0.141, 0.001, 0.001, 0.01, 0.01, 0.001, 0.002, 0.13, 0.527, 0.002, 0.004, 0.002, 0.001, 0.025, 1.521, 0.007, 0.014, 0.001, 0.004, 0.005, 0.008, 0.001, 0.001, 0.004, 0.005, 0.009, 0.004, 0.002, 0.002, 0.003, 0.001, 0.003, 0.01, 0.003, 0.015, 0.566, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.015, 0.129, 2.554, 0.578, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.011, 0.005, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.004, 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.212, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mus": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.612, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 19.388, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 1.02, 0.0001, 1.02, 1.02, 0.0001, 2.041, 1.02, 0.0001, 1.02, 1.02, 4.082, 1.02, 1.02, 2.041, 0.0001, 1.02, 1.02, 1.02, 1.02, 1.02, 1.02, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.061, 0.0001, 0.0001, 0.0001, 5.102, 0.0001, 1.02, 0.0001, 1.02, 0.0001, 5.102, 0.0001, 1.02, 1.02, 2.041, 0.0001, 0.0001, 0.0001, 2.041, 0.0001, 0.0001, 2.041, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "my": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.476, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.676, 0.0001, 0.018, 0.0001, 0.0001, 0.001, 0.0001, 0.009, 0.072, 0.072, 0.0001, 0.001, 0.013, 0.027, 0.014, 0.004, 0.007, 0.006, 0.005, 0.003, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.001, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.009, 0.007, 0.011, 0.006, 0.004, 0.004, 0.005, 0.004, 0.006, 0.002, 0.003, 0.004, 0.008, 0.005, 0.004, 0.007, 0.0001, 0.005, 0.011, 0.008, 0.003, 0.002, 0.003, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.087, 0.015, 0.033, 0.032, 0.11, 0.015, 0.02, 0.035, 0.072, 0.001, 0.01, 0.046, 0.027, 0.071, 0.073, 0.021, 0.001, 0.069, 0.054, 0.072, 0.03, 0.01, 0.011, 0.003, 0.016, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 32.171, 1.737, 0.141, 0.03, 1.382, 0.783, 0.273, 0.069, 0.03, 0.083, 0.874, 0.307, 0.061, 0.061, 0.009, 0.119, 1.037, 0.261, 0.115, 0.031, 0.966, 0.888, 0.304, 0.058, 0.131, 1.12, 0.266, 0.843, 0.619, 0.172, 1.057, 0.095, 0.006, 0.703, 0.001, 0.001, 0.009, 0.019, 0.041, 0.006, 0.0001, 0.005, 0.0001, 0.239, 1.811, 1.255, 0.357, 1.497, 0.246, 1.317, 0.249, 0.0001, 0.0001, 0.0001, 0.294, 0.751, 1.889, 0.152, 3.975, 0.6, 0.881, 0.616, 0.651, 0.004, 0.0001, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.801, 0.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "myv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.363, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.917, 0.015, 0.248, 0.0001, 0.0001, 0.022, 0.0001, 0.001, 0.283, 0.286, 0.002, 0.004, 0.691, 0.215, 0.812, 0.009, 0.174, 0.262, 0.16, 0.093, 0.073, 0.077, 0.073, 0.069, 0.078, 0.133, 0.142, 0.014, 0.011, 0.005, 0.01, 0.008, 0.0001, 0.003, 0.002, 0.005, 0.001, 0.001, 0.002, 0.001, 0.001, 0.012, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.004, 0.0001, 0.002, 0.003, 0.002, 0.001, 0.004, 0.001, 0.007, 0.0001, 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.003, 0.048, 0.012, 0.02, 0.007, 0.038, 0.002, 0.005, 0.006, 0.024, 0.002, 0.008, 0.023, 0.008, 0.017, 0.019, 0.008, 0.0001, 0.032, 0.018, 0.013, 0.014, 0.004, 0.001, 0.001, 0.004, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 2.092, 2.863, 2.802, 0.895, 0.06, 0.084, 0.303, 0.361, 0.574, 0.012, 0.006, 0.456, 2.653, 0.734, 0.106, 1.014, 0.129, 0.284, 0.186, 0.058, 0.27, 0.019, 0.007, 0.024, 0.083, 0.006, 0.182, 0.079, 0.175, 0.059, 0.072, 0.148, 0.231, 0.176, 0.101, 0.047, 0.012, 0.013, 0.018, 0.046, 0.024, 0.001, 0.0001, 0.091, 0.002, 0.065, 0.014, 0.024, 3.393, 0.354, 1.588, 0.391, 1.0, 3.63, 0.2, 0.667, 2.033, 0.447, 2.062, 1.616, 1.324, 3.27, 3.572, 0.635, 0.0001, 0.0001, 0.332, 0.006, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.0001, 0.001, 0.001, 27.959, 14.855, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.281, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.032, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mzn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.201, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.629, 0.002, 0.049, 0.0001, 0.0001, 0.001, 0.004, 0.002, 0.134, 0.134, 0.0001, 0.0001, 0.026, 0.054, 0.593, 0.02, 0.019, 0.017, 0.017, 0.008, 0.004, 0.006, 0.012, 0.005, 0.01, 0.015, 0.042, 0.0001, 0.001, 0.014, 0.001, 0.004, 0.0001, 0.004, 0.003, 0.005, 0.003, 0.006, 0.016, 0.002, 0.002, 0.003, 0.001, 0.001, 0.009, 0.006, 0.002, 0.001, 0.004, 0.0001, 0.003, 0.005, 0.007, 0.001, 0.001, 0.01, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.009, 0.0001, 0.072, 0.016, 0.031, 0.045, 0.106, 0.011, 0.011, 0.023, 0.094, 0.004, 0.019, 0.044, 0.012, 0.044, 0.054, 0.042, 0.001, 0.056, 0.056, 0.055, 0.021, 0.007, 0.011, 0.005, 0.015, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.44, 0.427, 0.449, 0.013, 1.516, 2.042, 3.291, 3.912, 3.162, 0.001, 0.032, 0.014, 4.412, 0.002, 0.195, 0.007, 0.446, 0.17, 0.001, 0.002, 0.012, 0.004, 0.0001, 0.001, 0.045, 0.005, 0.0001, 0.006, 0.001, 0.0001, 0.0001, 0.003, 0.003, 0.013, 0.18, 0.011, 0.008, 0.001, 0.211, 5.124, 1.425, 1.013, 2.263, 0.078, 0.559, 0.214, 0.344, 2.205, 0.318, 3.605, 0.725, 1.866, 1.033, 0.295, 0.164, 0.271, 0.156, 0.676, 0.058, 0.031, 0.001, 0.001, 0.258, 0.0001, 0.0001, 0.0001, 0.056, 0.008, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.009, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.001, 0.002, 19.953, 15.923, 1.548, 5.327, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.427, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "na": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.998, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.709, 0.015, 0.646, 0.0001, 0.002, 0.0001, 0.004, 0.021, 0.659, 0.659, 0.017, 0.002, 0.883, 0.333, 1.719, 0.03, 1.451, 2.231, 1.063, 0.565, 0.61, 0.611, 0.586, 0.586, 0.597, 1.829, 0.199, 0.094, 0.009, 0.006, 0.009, 0.002, 0.0001, 0.49, 0.423, 0.263, 0.348, 0.486, 0.143, 0.225, 0.131, 0.617, 0.095, 0.263, 0.178, 0.552, 0.272, 0.136, 0.483, 0.013, 0.313, 0.36, 0.336, 0.074, 0.114, 0.249, 0.018, 0.046, 0.052, 0.006, 0.0001, 0.007, 0.0001, 0.006, 0.0001, 7.914, 1.267, 0.542, 1.393, 6.136, 0.161, 1.565, 0.525, 5.317, 0.298, 1.632, 1.173, 1.479, 6.133, 5.204, 0.602, 0.04, 3.812, 1.491, 2.75, 1.848, 0.267, 2.105, 0.037, 0.79, 0.308, 0.0001, 0.0001, 0.0001, 0.013, 0.0001, 0.299, 0.053, 0.064, 0.017, 0.038, 0.029, 0.014, 0.008, 0.026, 0.003, 0.007, 0.007, 0.016, 0.016, 0.006, 0.008, 0.013, 0.032, 0.004, 0.043, 0.108, 0.002, 0.004, 0.01, 0.017, 0.017, 0.017, 0.015, 0.011, 0.008, 0.009, 0.017, 0.085, 0.124, 0.117, 0.04, 0.025, 0.023, 0.025, 0.032, 0.017, 0.097, 0.007, 0.031, 0.013, 0.031, 0.009, 0.016, 0.079, 0.095, 0.056, 0.083, 0.021, 0.063, 0.052, 0.013, 0.046, 0.015, 0.047, 0.045, 0.034, 0.035, 0.045, 0.013, 0.0001, 0.0001, 0.04, 0.466, 0.079, 0.167, 0.001, 0.002, 0.0001, 0.023, 0.01, 0.013, 0.002, 0.001, 0.027, 0.006, 0.292, 0.12, 0.0001, 0.0001, 0.009, 0.199, 0.04, 0.007, 0.055, 0.037, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.021, 0.074, 0.244, 0.0001, 0.005, 0.01, 0.006, 0.001, 0.002, 0.006, 0.003, 0.003, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nah": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.08, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.795, 0.004, 0.316, 0.0001, 0.0001, 0.001, 0.0001, 0.011, 0.502, 0.505, 0.006, 0.329, 1.148, 0.317, 0.599, 1.663, 0.178, 0.339, 0.18, 0.099, 0.094, 0.088, 0.135, 0.085, 0.092, 0.204, 0.686, 0.012, 0.001, 0.002, 0.002, 0.012, 0.0001, 0.583, 0.136, 0.486, 0.282, 0.369, 0.108, 0.135, 0.149, 0.382, 0.043, 0.01, 0.153, 0.41, 0.267, 0.154, 0.356, 0.041, 0.209, 0.348, 0.531, 0.077, 0.099, 0.006, 0.046, 0.078, 0.021, 0.306, 0.0001, 0.304, 0.0001, 0.018, 0.0001, 8.12, 0.52, 3.826, 1.716, 6.024, 0.239, 0.598, 2.703, 7.016, 0.169, 0.062, 5.071, 1.759, 4.856, 5.013, 1.61, 0.66, 3.183, 2.38, 4.798, 3.279, 0.368, 0.013, 0.578, 0.571, 0.892, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.023, 0.52, 0.003, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.007, 0.001, 0.001, 0.005, 0.446, 0.001, 0.001, 0.001, 0.002, 0.001, 0.26, 0.002, 0.003, 0.001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.002, 0.001, 0.001, 0.001, 0.003, 0.117, 0.005, 0.001, 0.004, 0.001, 0.001, 0.002, 0.003, 0.168, 0.013, 0.475, 0.001, 0.136, 0.018, 0.008, 0.004, 0.071, 0.003, 0.269, 0.002, 0.003, 0.001, 0.001, 0.003, 0.002, 0.068, 0.005, 0.005, 0.002, 0.003, 0.016, 0.0001, 0.0001, 0.033, 0.838, 1.259, 0.446, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.009, 0.004, 0.012, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.027, 0.002, 0.008, 0.004, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nap": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.664, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.609, 0.012, 0.443, 0.0001, 0.0001, 0.005, 0.002, 3.603, 0.188, 0.187, 0.001, 0.001, 0.851, 0.111, 0.916, 0.025, 0.289, 0.464, 0.288, 0.212, 0.187, 0.195, 0.184, 0.177, 0.191, 0.229, 0.063, 0.027, 0.064, 0.004, 0.064, 0.004, 0.0001, 0.359, 0.17, 0.431, 0.088, 0.101, 0.128, 0.139, 0.019, 0.153, 0.024, 0.014, 0.18, 0.269, 0.172, 0.129, 0.252, 0.015, 0.136, 0.331, 0.141, 0.042, 0.154, 0.012, 0.021, 0.004, 0.014, 0.007, 0.0001, 0.007, 0.0001, 0.001, 0.0001, 8.472, 0.677, 3.575, 1.818, 8.836, 0.628, 1.161, 0.605, 5.326, 0.294, 0.072, 2.854, 1.959, 5.855, 5.118, 1.978, 0.107, 4.154, 2.774, 4.302, 3.256, 1.068, 0.047, 0.011, 0.049, 0.778, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.167, 0.005, 0.004, 0.005, 0.003, 0.002, 0.001, 0.001, 0.017, 0.002, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.003, 0.001, 0.001, 0.008, 0.005, 0.001, 0.001, 0.001, 0.033, 0.118, 0.001, 0.001, 0.005, 0.005, 0.001, 0.002, 0.266, 0.085, 0.051, 0.002, 0.003, 0.001, 0.003, 0.003, 0.62, 0.161, 0.023, 0.139, 0.069, 0.03, 0.001, 0.002, 0.025, 0.004, 0.164, 0.026, 0.08, 0.002, 0.003, 0.002, 0.002, 0.107, 0.016, 0.007, 0.005, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.057, 1.779, 0.007, 0.055, 0.0001, 0.001, 0.0001, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.013, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.165, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nds": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.919, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.282, 0.001, 0.235, 0.0001, 0.0001, 0.09, 0.002, 0.046, 0.155, 0.155, 0.017, 0.001, 0.777, 0.214, 1.137, 0.014, 0.414, 0.571, 0.279, 0.157, 0.152, 0.165, 0.151, 0.162, 0.212, 0.299, 0.042, 0.019, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.383, 0.397, 0.141, 0.527, 0.184, 0.228, 0.238, 0.278, 0.228, 0.153, 0.317, 0.238, 0.331, 0.224, 0.164, 0.212, 0.007, 0.201, 0.654, 0.206, 0.119, 0.194, 0.231, 0.003, 0.008, 0.039, 0.011, 0.0001, 0.011, 0.0001, 0.001, 0.0001, 4.393, 1.051, 1.267, 3.394, 10.917, 0.767, 1.396, 2.581, 3.914, 0.085, 1.325, 2.618, 1.593, 8.321, 3.314, 0.889, 0.009, 5.125, 3.768, 5.421, 2.363, 1.177, 0.929, 0.056, 0.171, 0.239, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.454, 0.002, 0.002, 0.001, 0.006, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.023, 0.001, 0.0001, 0.022, 0.001, 0.009, 0.334, 0.001, 0.001, 0.057, 0.001, 0.038, 0.018, 0.048, 0.004, 0.001, 0.001, 0.208, 0.002, 0.001, 0.001, 0.002, 0.009, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.005, 0.002, 0.014, 0.003, 0.002, 0.002, 0.82, 0.001, 0.004, 0.001, 0.001, 0.001, 0.763, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.055, 1.884, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.007, 0.003, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.454, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ne": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.49, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.629, 0.002, 0.033, 0.0001, 0.0001, 0.006, 0.0001, 0.018, 0.053, 0.057, 0.0001, 0.001, 0.2, 0.042, 0.073, 0.008, 0.003, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.015, 0.002, 0.005, 0.002, 0.006, 0.002, 0.0001, 0.004, 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.002, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.056, 0.012, 0.021, 0.02, 0.066, 0.011, 0.012, 0.023, 0.048, 0.001, 0.005, 0.027, 0.017, 0.042, 0.043, 0.015, 0.001, 0.044, 0.036, 0.045, 0.017, 0.005, 0.008, 0.001, 0.01, 0.001, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.608, 0.76, 0.405, 0.065, 0.0001, 0.231, 0.124, 1.05, 0.333, 0.225, 0.003, 1.089, 0.054, 2.553, 0.0001, 0.268, 0.005, 0.0001, 0.0001, 0.016, 0.009, 1.681, 0.188, 0.574, 0.05, 0.059, 0.235, 0.302, 0.411, 0.024, 0.038, 0.296, 0.063, 0.16, 0.029, 0.16, 24.986, 7.481, 0.637, 0.298, 1.766, 0.034, 0.895, 0.142, 0.406, 0.37, 1.169, 0.857, 2.172, 0.0001, 1.023, 0.0001, 0.0001, 0.652, 0.263, 0.209, 1.099, 0.646, 0.0001, 0.0001, 0.001, 0.001, 3.096, 1.51, 0.0001, 0.0001, 0.006, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.857, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "new": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.658, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.736, 0.0001, 0.005, 0.0001, 0.0001, 0.016, 0.0001, 0.016, 0.053, 0.053, 0.0001, 0.0001, 0.168, 0.064, 0.05, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.014, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.045, 0.006, 0.015, 0.015, 0.048, 0.008, 0.009, 0.021, 0.034, 0.001, 0.003, 0.019, 0.011, 0.032, 0.03, 0.01, 0.0001, 0.03, 0.026, 0.034, 0.014, 0.004, 0.005, 0.001, 0.007, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.748, 1.473, 1.078, 0.313, 0.0001, 0.165, 0.087, 0.934, 0.049, 0.145, 0.004, 0.213, 0.295, 3.035, 0.001, 0.021, 0.01, 0.0001, 0.001, 0.003, 0.002, 0.891, 0.378, 1.026, 0.007, 0.007, 0.145, 0.227, 0.557, 0.002, 0.008, 0.138, 0.03, 0.275, 0.076, 0.203, 24.519, 8.651, 0.655, 0.317, 1.238, 0.066, 0.765, 0.114, 0.288, 0.474, 0.695, 2.038, 1.25, 0.006, 0.967, 0.005, 0.016, 1.209, 0.15, 0.223, 0.893, 0.295, 0.0001, 0.001, 0.016, 0.0001, 3.268, 1.125, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.648, 0.0001, 0.246, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ng": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.332, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.852, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.028, 0.0001, 0.0001, 0.569, 0.014, 0.833, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.042, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.291, 0.028, 0.014, 0.069, 0.125, 0.0001, 0.194, 0.153, 0.5, 0.042, 0.069, 0.0001, 0.056, 0.153, 0.402, 0.083, 0.0001, 0.0001, 0.014, 0.18, 0.222, 0.0001, 0.222, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.728, 1.221, 0.236, 1.443, 7.106, 0.347, 2.859, 3.65, 4.136, 0.125, 4.316, 3.539, 3.983, 7.412, 7.883, 1.596, 0.0001, 1.138, 1.901, 3.511, 6.62, 0.402, 2.776, 0.0001, 2.11, 0.194, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.056, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.056, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nov": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.223, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.739, 0.005, 0.371, 0.0001, 0.0001, 0.004, 0.0001, 0.014, 0.258, 0.258, 0.003, 0.008, 0.827, 0.256, 1.132, 0.016, 0.643, 0.521, 0.435, 0.122, 0.19, 0.117, 0.125, 0.112, 0.14, 0.247, 0.122, 0.023, 0.02, 0.012, 0.021, 0.004, 0.0001, 0.495, 0.126, 0.101, 0.11, 0.205, 0.084, 0.113, 0.079, 0.113, 0.072, 0.274, 0.517, 0.205, 0.19, 0.072, 0.148, 0.01, 0.107, 0.475, 0.124, 0.103, 0.078, 0.049, 0.006, 0.028, 0.032, 0.002, 0.0001, 0.003, 0.0001, 0.002, 0.0001, 6.407, 1.088, 0.275, 3.233, 10.596, 0.875, 0.958, 0.605, 7.974, 0.212, 2.738, 4.237, 2.737, 5.182, 4.585, 1.557, 0.08, 4.568, 4.834, 4.299, 2.875, 0.823, 0.156, 0.296, 0.238, 0.085, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.026, 0.009, 0.01, 0.005, 0.006, 0.003, 0.001, 0.003, 0.003, 0.003, 0.001, 0.001, 0.003, 0.004, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.016, 0.003, 0.003, 0.001, 0.001, 0.001, 0.007, 0.002, 0.003, 0.003, 0.007, 0.001, 0.0001, 0.012, 0.008, 0.002, 0.005, 0.005, 0.002, 0.003, 0.003, 0.008, 0.015, 0.002, 0.001, 0.004, 0.007, 0.004, 0.004, 0.003, 0.005, 0.01, 0.013, 0.003, 0.002, 0.006, 0.004, 0.012, 0.004, 0.008, 0.008, 0.012, 0.008, 0.004, 0.006, 0.0001, 0.0001, 0.013, 0.071, 0.012, 0.013, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.04, 0.019, 0.02, 0.007, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.008, 0.025, 0.004, 0.0001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nrm": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.521, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.376, 0.004, 0.467, 0.0001, 0.0001, 0.003, 0.0001, 1.947, 0.163, 0.162, 0.0001, 0.0001, 0.761, 0.157, 0.914, 0.012, 1.102, 1.934, 0.564, 0.483, 0.476, 0.487, 0.557, 0.61, 0.644, 0.66, 0.069, 0.027, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.78, 0.094, 0.435, 0.253, 0.108, 0.06, 0.094, 0.042, 0.231, 0.101, 0.009, 0.332, 0.216, 0.104, 0.043, 0.114, 0.015, 0.096, 0.165, 0.06, 0.048, 0.107, 0.012, 0.147, 0.029, 0.002, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 4.848, 0.485, 1.639, 2.302, 7.56, 0.544, 0.696, 1.469, 3.879, 0.15, 0.04, 3.065, 1.372, 5.618, 3.164, 1.345, 0.499, 2.846, 4.958, 4.48, 3.809, 0.712, 0.015, 0.135, 0.467, 0.062, 0.0001, 1.427, 0.0001, 0.0001, 0.0001, 0.085, 0.003, 0.016, 0.002, 0.004, 0.002, 0.001, 0.0001, 0.002, 0.014, 0.026, 0.0001, 0.001, 0.001, 0.016, 0.0001, 0.001, 0.001, 0.001, 0.016, 0.002, 0.001, 0.0001, 0.0001, 0.002, 0.06, 0.0001, 0.023, 0.002, 0.001, 0.0001, 0.001, 0.219, 0.004, 0.233, 0.004, 0.005, 0.011, 0.0001, 0.016, 0.454, 2.065, 0.259, 0.013, 0.002, 0.004, 0.368, 0.008, 0.001, 0.008, 0.002, 0.004, 0.081, 0.004, 0.002, 0.012, 0.002, 0.151, 0.004, 0.112, 0.003, 0.005, 0.001, 0.003, 0.0001, 0.0001, 0.015, 4.079, 0.017, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.029, 0.013, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.077, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nso": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.78, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.755, 0.002, 0.038, 0.001, 0.0001, 0.004, 0.0001, 0.009, 0.457, 0.457, 0.0001, 0.0001, 0.676, 0.052, 0.694, 0.005, 0.466, 0.863, 0.377, 0.269, 0.237, 0.244, 0.243, 0.245, 0.241, 0.264, 0.019, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.278, 0.349, 0.291, 0.135, 0.079, 0.05, 0.105, 0.055, 0.212, 0.029, 0.164, 0.314, 0.912, 0.402, 0.025, 0.107, 0.005, 0.046, 0.407, 0.145, 0.02, 0.095, 0.034, 0.21, 0.005, 0.034, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 11.556, 1.304, 0.158, 0.76, 9.745, 0.742, 5.815, 1.511, 2.097, 0.062, 3.221, 3.795, 3.273, 4.341, 8.239, 1.391, 0.015, 2.291, 2.998, 2.898, 0.946, 0.091, 3.286, 0.014, 0.713, 0.058, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.019, 0.718, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.045, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.083, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.134, 0.0001, 0.733, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.509, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.471, 0.0001, 0.553, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.132, 0.131, 0.0001, 0.0001, 0.333, 0.05, 0.853, 0.008, 0.262, 0.198, 0.155, 0.093, 0.082, 0.107, 0.089, 0.066, 0.073, 0.069, 0.012, 0.267, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.105, 0.358, 0.12, 0.313, 0.022, 0.005, 0.023, 0.24, 0.014, 0.023, 0.045, 0.016, 0.036, 0.298, 0.014, 0.019, 0.001, 0.01, 0.1, 0.28, 0.004, 0.005, 0.04, 0.001, 0.048, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 5.817, 1.241, 0.605, 3.905, 1.9, 0.016, 1.415, 4.266, 6.018, 0.364, 1.038, 1.394, 0.149, 2.559, 2.764, 0.063, 0.003, 0.149, 2.248, 2.042, 0.092, 0.019, 0.145, 0.037, 1.033, 1.245, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.08, 1.403, 1.567, 0.013, 0.082, 1.105, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.067, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.294, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 2.758, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 2.445, 0.0001, 0.311, 0.0001, 4.591, 0.0001, 0.504, 0.001, 0.001, 0.001, 2.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.013, 4.172, 0.001, 0.0001, 0.013, 0.0001, 0.0001, 0.002, 11.893, 1.899, 1.744, 0.0001, 0.311, 0.0001, 0.0001, 4.171, 0.0001, 1.234, 0.0001, 0.002, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.08, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ny": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.625, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.431, 0.001, 0.161, 0.0001, 0.001, 0.013, 0.004, 0.199, 0.151, 0.149, 0.001, 0.0001, 0.726, 0.052, 1.005, 0.011, 0.425, 0.321, 0.242, 0.114, 0.121, 0.146, 0.109, 0.097, 0.1, 0.188, 0.119, 0.008, 0.003, 0.006, 0.003, 0.001, 0.0001, 0.324, 0.194, 0.362, 0.113, 0.083, 0.06, 0.055, 0.057, 0.099, 0.059, 0.134, 0.101, 0.607, 0.172, 0.041, 0.204, 0.005, 0.064, 0.151, 0.1, 0.088, 0.025, 0.048, 0.003, 0.047, 0.083, 0.018, 0.0001, 0.019, 0.0001, 0.0001, 0.003, 13.746, 1.132, 1.623, 2.856, 4.347, 0.427, 1.15, 2.997, 7.993, 0.223, 3.837, 3.15, 3.985, 6.204, 4.4, 1.606, 0.018, 2.007, 1.898, 3.156, 4.108, 0.173, 2.53, 0.014, 1.184, 1.868, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.066, 0.003, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.004, 0.05, 0.0001, 0.0001, 0.006, 0.005, 0.001, 0.001, 0.013, 0.003, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.013, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.004, 0.001, 0.006, 0.001, 0.06, 0.0001, 0.011, 0.002, 0.003, 0.003, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.023, 0.029, 0.004, 0.064, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.009, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.066, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "oc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.196, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.065, 0.002, 0.316, 0.046, 0.0001, 0.007, 0.001, 0.708, 0.193, 0.193, 0.002, 0.001, 0.913, 0.337, 0.785, 0.01, 0.177, 0.339, 0.143, 0.091, 0.092, 0.097, 0.087, 0.093, 0.11, 0.155, 0.065, 0.02, 0.037, 0.032, 0.038, 0.002, 0.0001, 0.316, 0.163, 0.28, 0.118, 0.18, 0.101, 0.108, 0.046, 0.126, 0.059, 0.019, 0.366, 0.206, 0.087, 0.061, 0.2, 0.02, 0.116, 0.247, 0.092, 0.045, 0.108, 0.016, 0.03, 0.009, 0.007, 0.013, 0.0001, 0.013, 0.0001, 0.002, 0.0001, 9.22, 0.793, 2.634, 3.53, 8.653, 0.714, 1.084, 0.594, 5.176, 0.154, 0.069, 4.196, 2.017, 5.599, 4.023, 1.809, 0.517, 4.973, 5.482, 4.438, 3.287, 0.768, 0.022, 0.148, 0.146, 0.139, 0.0001, 0.011, 0.002, 0.002, 0.0001, 0.071, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.007, 0.009, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.001, 0.006, 0.007, 0.005, 0.001, 0.0001, 0.0001, 0.001, 0.051, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.145, 0.074, 0.024, 0.002, 0.002, 0.001, 0.002, 0.134, 0.929, 0.452, 0.016, 0.026, 0.001, 0.096, 0.005, 0.03, 0.005, 0.004, 0.448, 0.027, 0.01, 0.002, 0.002, 0.002, 0.002, 0.004, 0.011, 0.027, 0.011, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.068, 2.417, 0.003, 0.007, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.008, 0.004, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.067, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "olo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.555, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.165, 0.001, 0.091, 0.0001, 0.0001, 0.009, 0.001, 0.061, 0.221, 0.221, 0.0001, 0.001, 0.891, 0.306, 1.442, 0.031, 0.305, 0.513, 0.256, 0.174, 0.154, 0.153, 0.124, 0.134, 0.157, 0.296, 0.102, 0.011, 0.01, 0.003, 0.01, 0.002, 0.001, 0.151, 0.077, 0.024, 0.041, 0.069, 0.036, 0.06, 0.101, 0.085, 0.112, 0.389, 0.128, 0.177, 0.115, 0.068, 0.258, 0.001, 0.092, 0.352, 0.141, 0.032, 0.27, 0.012, 0.021, 0.024, 0.01, 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.005, 7.441, 0.351, 0.076, 1.841, 5.414, 0.122, 0.914, 2.187, 8.145, 1.143, 3.3, 4.3, 1.89, 6.075, 4.589, 1.29, 0.001, 2.71, 3.519, 3.872, 5.598, 2.436, 0.016, 0.008, 1.054, 0.985, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.389, 0.086, 0.073, 0.032, 0.01, 0.011, 0.006, 0.01, 0.008, 0.001, 0.002, 0.006, 0.036, 0.349, 0.005, 0.017, 0.009, 0.004, 0.01, 0.105, 0.013, 0.002, 0.002, 0.002, 0.005, 0.148, 0.017, 0.006, 0.011, 0.056, 0.001, 0.018, 0.051, 0.118, 0.003, 0.002, 1.86, 0.003, 0.001, 0.007, 0.003, 0.003, 0.001, 0.01, 0.001, 0.003, 0.001, 0.002, 0.143, 0.012, 0.077, 0.019, 0.054, 0.096, 0.298, 0.031, 0.077, 0.038, 0.064, 0.07, 0.021, 0.096, 0.259, 0.018, 0.0001, 0.0001, 0.075, 2.173, 0.359, 0.275, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.01, 0.006, 0.977, 0.34, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.008, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.004, 0.001, 0.32, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "om": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.856, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.47, 0.007, 0.135, 0.001, 0.001, 0.02, 0.001, 0.415, 0.149, 0.148, 0.003, 0.001, 0.598, 0.088, 0.774, 0.024, 0.177, 0.196, 0.107, 0.055, 0.058, 0.069, 0.055, 0.055, 0.062, 0.111, 0.03, 0.031, 0.014, 0.003, 0.015, 0.004, 0.0001, 0.377, 0.227, 0.059, 0.14, 0.066, 0.078, 0.179, 0.124, 0.131, 0.063, 0.149, 0.064, 0.172, 0.076, 0.188, 0.061, 0.049, 0.057, 0.159, 0.099, 0.042, 0.016, 0.108, 0.015, 0.076, 0.01, 0.011, 0.0001, 0.011, 0.0001, 0.003, 0.13, 18.959, 2.318, 0.672, 2.536, 5.221, 1.607, 1.449, 2.234, 8.071, 0.935, 2.586, 2.201, 2.811, 5.266, 4.391, 0.29, 0.68, 3.658, 3.072, 4.065, 4.017, 0.087, 0.574, 0.143, 1.425, 0.099, 0.01, 0.001, 0.01, 0.0001, 0.0001, 0.186, 0.003, 0.002, 0.003, 0.006, 0.002, 0.002, 0.001, 0.004, 0.002, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.007, 0.12, 0.0001, 0.0001, 0.011, 0.011, 0.005, 0.0001, 0.099, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.03, 0.008, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.001, 0.002, 0.003, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.105, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.002, 0.0001, 0.0001, 0.007, 0.004, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.191, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "or": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.414, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.789, 0.001, 0.049, 0.0001, 0.0001, 0.027, 0.0001, 0.016, 0.066, 0.066, 0.001, 0.0001, 0.194, 0.029, 0.065, 0.008, 0.012, 0.014, 0.009, 0.005, 0.004, 0.005, 0.004, 0.004, 0.004, 0.006, 0.014, 0.004, 0.003, 0.001, 0.003, 0.0001, 0.0001, 0.006, 0.004, 0.006, 0.004, 0.003, 0.002, 0.002, 0.003, 0.007, 0.001, 0.002, 0.003, 0.005, 0.003, 0.003, 0.005, 0.0001, 0.003, 0.007, 0.006, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.081, 0.011, 0.027, 0.026, 0.08, 0.013, 0.015, 0.029, 0.067, 0.002, 0.006, 0.037, 0.021, 0.058, 0.062, 0.019, 0.001, 0.059, 0.056, 0.058, 0.033, 0.007, 0.008, 0.003, 0.014, 0.002, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.461, 0.87, 0.209, 0.086, 0.0001, 0.314, 0.231, 1.688, 0.023, 0.138, 0.001, 0.379, 0.073, 2.56, 0.0001, 0.427, 0.002, 0.0001, 0.0001, 0.16, 0.011, 1.385, 0.13, 0.389, 0.041, 0.233, 0.239, 0.105, 0.371, 0.014, 0.058, 0.871, 0.144, 0.225, 0.017, 0.346, 1.495, 0.883, 0.609, 0.353, 1.21, 0.043, 0.827, 0.113, 24.372, 7.183, 0.945, 0.296, 2.678, 0.059, 0.571, 0.283, 0.0001, 0.05, 0.328, 0.264, 0.929, 0.701, 0.0001, 0.0001, 0.094, 0.0001, 2.794, 2.229, 0.0001, 0.0001, 0.045, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.66, 0.0001, 0.069, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "os": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.314, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.198, 0.001, 0.075, 0.0001, 0.0001, 0.009, 0.0001, 0.003, 0.221, 0.221, 0.0001, 0.001, 0.656, 0.268, 0.647, 0.003, 0.149, 0.239, 0.119, 0.07, 0.068, 0.074, 0.065, 0.065, 0.08, 0.138, 0.043, 0.023, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.003, 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.001, 0.024, 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.005, 0.002, 0.001, 0.007, 0.001, 0.014, 0.001, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.032, 0.005, 0.009, 0.008, 0.024, 0.004, 0.005, 0.006, 0.02, 0.001, 0.005, 0.014, 0.008, 0.019, 0.019, 0.004, 0.0001, 0.021, 0.013, 0.014, 0.012, 0.003, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.723, 1.959, 2.433, 1.742, 0.485, 1.045, 0.733, 0.104, 0.039, 0.003, 0.515, 3.703, 0.088, 0.047, 0.033, 0.054, 0.152, 0.11, 0.038, 0.09, 0.183, 0.021, 0.005, 0.03, 0.137, 0.06, 0.132, 0.043, 0.092, 0.063, 0.026, 0.055, 0.062, 0.15, 0.074, 0.109, 0.063, 0.115, 4.882, 0.027, 0.022, 0.001, 0.001, 0.076, 0.0001, 0.018, 0.005, 0.007, 3.663, 0.542, 0.469, 1.346, 2.223, 0.835, 0.243, 0.949, 1.778, 1.262, 0.952, 1.134, 1.447, 2.532, 1.739, 0.347, 0.0001, 0.0001, 0.16, 4.829, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.0001, 0.002, 0.001, 23.204, 15.519, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.01, 0.127, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.424, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.354, 0.003, 0.052, 0.0001, 0.0001, 0.005, 0.0001, 0.026, 0.07, 0.07, 0.0001, 0.001, 0.252, 0.083, 0.057, 0.008, 0.09, 0.134, 0.073, 0.034, 0.034, 0.037, 0.032, 0.033, 0.039, 0.073, 0.023, 0.007, 0.005, 0.003, 0.005, 0.001, 0.0001, 0.004, 0.002, 0.004, 0.002, 0.003, 0.002, 0.002, 0.002, 0.006, 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.005, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.002, 0.003, 0.035, 0.006, 0.011, 0.011, 0.037, 0.006, 0.008, 0.011, 0.028, 0.001, 0.004, 0.018, 0.013, 0.026, 0.027, 0.009, 0.001, 0.025, 0.019, 0.024, 0.012, 0.004, 0.004, 0.001, 0.005, 0.001, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 1.534, 0.423, 1.17, 0.001, 0.001, 0.437, 0.548, 1.695, 0.606, 0.237, 0.024, 0.573, 0.09, 0.23, 0.001, 0.065, 0.035, 0.0001, 0.001, 0.028, 0.011, 1.172, 0.229, 0.428, 0.077, 0.013, 0.442, 0.041, 0.755, 0.032, 0.001, 0.286, 0.066, 0.192, 0.017, 0.267, 1.499, 0.487, 1.308, 0.154, 24.532, 6.371, 0.647, 0.143, 0.447, 0.172, 0.696, 0.068, 2.373, 0.727, 0.943, 0.005, 0.001, 0.891, 0.001, 0.001, 1.461, 1.12, 0.001, 0.001, 0.465, 0.001, 2.611, 1.487, 0.0001, 0.0001, 0.039, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.006, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 30.092, 0.001, 0.038, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pag": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.592, 0.019, 0.241, 0.0001, 0.0001, 0.002, 0.0001, 0.022, 0.579, 0.579, 0.001, 0.002, 1.012, 0.179, 1.28, 0.004, 0.607, 0.517, 0.439, 0.246, 0.233, 0.22, 0.206, 0.189, 0.188, 0.203, 0.287, 0.029, 0.2, 0.003, 0.2, 0.007, 0.0001, 0.514, 0.233, 0.299, 0.377, 0.293, 0.091, 0.061, 0.039, 0.141, 0.067, 0.298, 0.143, 0.228, 0.153, 0.107, 0.323, 0.017, 0.066, 0.835, 0.144, 0.158, 0.036, 0.141, 0.001, 0.016, 0.024, 0.044, 0.0001, 0.045, 0.0001, 0.001, 0.0001, 14.553, 2.155, 0.612, 2.213, 4.092, 0.158, 2.144, 0.652, 5.448, 0.026, 2.943, 4.371, 1.62, 6.468, 4.169, 1.489, 0.134, 1.92, 4.171, 4.111, 1.822, 0.133, 0.774, 0.019, 2.966, 0.181, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.082, 0.003, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.005, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.048, 0.0001, 0.001, 0.01, 0.009, 0.0001, 0.0001, 0.004, 0.017, 0.0001, 0.001, 0.002, 0.001, 0.004, 0.002, 0.001, 0.008, 0.001, 0.001, 0.001, 0.005, 0.0001, 0.001, 0.003, 0.012, 0.002, 0.005, 0.002, 0.001, 0.001, 0.001, 0.004, 0.001, 0.005, 0.001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.004, 0.049, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.075, 0.004, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pam": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.69, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.089, 0.008, 0.379, 0.001, 0.002, 0.006, 0.002, 0.032, 0.278, 0.278, 0.002, 0.002, 1.032, 0.272, 0.824, 0.024, 0.328, 0.294, 0.247, 0.119, 0.115, 0.114, 0.097, 0.092, 0.106, 0.173, 0.084, 0.034, 0.037, 0.005, 0.037, 0.004, 0.0001, 0.446, 0.258, 0.283, 0.225, 0.147, 0.167, 0.119, 0.095, 0.427, 0.078, 0.159, 0.17, 0.339, 0.137, 0.085, 0.26, 0.014, 0.119, 0.316, 0.173, 0.073, 0.129, 0.078, 0.01, 0.038, 0.027, 0.056, 0.0001, 0.058, 0.0001, 0.003, 0.0001, 11.717, 1.42, 1.079, 1.934, 5.65, 0.412, 5.535, 0.984, 6.498, 0.051, 2.215, 3.499, 2.546, 9.826, 2.443, 1.882, 0.041, 3.326, 2.846, 3.809, 3.421, 0.311, 0.524, 0.064, 1.429, 0.196, 0.0001, 0.012, 0.001, 0.0001, 0.0001, 0.064, 0.007, 0.004, 0.005, 0.004, 0.002, 0.003, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.006, 0.001, 0.001, 0.002, 0.001, 0.002, 0.019, 0.004, 0.002, 0.002, 0.002, 0.003, 0.009, 0.002, 0.002, 0.017, 0.008, 0.009, 0.013, 0.012, 0.022, 0.007, 0.002, 0.067, 0.005, 0.005, 0.005, 0.009, 0.033, 0.004, 0.003, 0.003, 0.006, 0.006, 0.004, 0.01, 0.012, 0.01, 0.01, 0.006, 0.003, 0.032, 0.002, 0.004, 0.003, 0.008, 0.007, 0.067, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.014, 0.263, 0.005, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.008, 0.006, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.04, 0.011, 0.063, 0.0001, 0.001, 0.004, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pap": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.577, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.041, 0.006, 0.256, 0.002, 0.001, 0.008, 0.005, 0.088, 0.145, 0.144, 0.001, 0.001, 0.829, 0.082, 0.948, 0.014, 0.296, 0.379, 0.247, 0.133, 0.132, 0.125, 0.108, 0.098, 0.111, 0.184, 0.198, 0.046, 0.009, 0.003, 0.009, 0.012, 0.0001, 0.325, 0.157, 0.17, 0.173, 0.346, 0.09, 0.081, 0.124, 0.155, 0.09, 0.129, 0.105, 0.233, 0.162, 0.14, 0.176, 0.005, 0.132, 0.285, 0.134, 0.07, 0.056, 0.051, 0.003, 0.069, 0.012, 0.014, 0.0001, 0.014, 0.0001, 0.003, 0.0001, 10.584, 1.755, 0.96, 3.481, 6.611, 0.57, 0.793, 1.086, 6.922, 0.094, 2.168, 2.197, 2.209, 6.462, 5.124, 1.889, 0.017, 4.387, 3.838, 4.459, 3.468, 0.348, 0.249, 0.043, 0.415, 0.112, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.051, 0.006, 0.003, 0.006, 0.004, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.012, 0.002, 0.005, 0.003, 0.001, 0.001, 0.001, 0.006, 0.016, 0.001, 0.001, 0.01, 0.01, 0.001, 0.001, 0.023, 0.288, 0.003, 0.003, 0.003, 0.001, 0.002, 0.007, 0.143, 0.171, 0.002, 0.003, 0.001, 0.133, 0.0001, 0.002, 0.003, 0.162, 0.171, 0.076, 0.001, 0.002, 0.002, 0.001, 0.004, 0.053, 0.027, 0.003, 0.086, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.023, 1.326, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.007, 0.004, 0.023, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.007, 0.048, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pcd": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.27, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.657, 0.008, 0.673, 0.0001, 0.0001, 0.003, 0.004, 1.579, 0.485, 0.482, 0.004, 0.002, 0.764, 0.743, 0.844, 0.029, 0.205, 0.439, 0.185, 0.104, 0.105, 0.099, 0.112, 0.109, 0.159, 0.228, 0.141, 0.017, 0.014, 0.103, 0.015, 0.005, 0.0001, 0.322, 0.315, 0.578, 0.163, 0.158, 0.188, 0.128, 0.139, 0.259, 0.095, 0.035, 0.293, 0.23, 0.148, 0.082, 0.416, 0.024, 0.141, 0.362, 0.132, 0.056, 0.121, 0.049, 0.026, 0.011, 0.008, 0.008, 0.0001, 0.009, 0.0001, 0.004, 0.004, 4.164, 0.548, 3.109, 2.876, 7.669, 0.633, 0.742, 2.062, 6.133, 0.168, 0.261, 3.265, 1.584, 5.6, 3.825, 1.718, 0.299, 3.984, 4.345, 3.994, 3.516, 0.729, 0.062, 0.099, 0.331, 0.121, 0.0001, 0.008, 0.001, 0.001, 0.0001, 0.34, 0.006, 0.009, 0.004, 0.003, 0.002, 0.003, 0.003, 0.01, 0.086, 0.002, 0.001, 0.004, 0.005, 0.003, 0.002, 0.003, 0.002, 0.002, 0.018, 0.009, 0.001, 0.001, 0.002, 0.003, 0.283, 0.001, 0.003, 0.003, 0.002, 0.001, 0.001, 0.283, 0.006, 0.038, 0.003, 0.005, 0.006, 0.003, 0.025, 0.548, 2.644, 0.014, 0.04, 0.002, 0.005, 0.009, 0.049, 0.019, 0.006, 0.015, 0.007, 0.051, 0.004, 0.002, 0.022, 0.007, 0.018, 0.005, 0.043, 0.008, 0.005, 0.004, 0.007, 0.0001, 0.0001, 0.109, 3.762, 0.007, 0.017, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.003, 0.0001, 0.0001, 0.018, 0.008, 0.022, 0.007, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.009, 0.005, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.006, 0.329, 0.001, 0.002, 0.009, 0.006, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pdc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.347, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.345, 0.014, 0.296, 0.0001, 0.002, 0.001, 0.004, 0.083, 0.252, 0.251, 0.004, 0.0001, 0.899, 0.34, 1.232, 0.016, 0.318, 0.569, 0.233, 0.139, 0.122, 0.133, 0.151, 0.187, 0.197, 0.319, 0.11, 0.028, 0.009, 0.001, 0.009, 0.014, 0.001, 0.435, 0.396, 0.269, 0.612, 0.446, 0.261, 0.34, 0.266, 0.158, 0.126, 0.345, 0.316, 0.408, 0.189, 0.112, 0.446, 0.018, 0.164, 0.922, 0.173, 0.1, 0.127, 0.257, 0.003, 0.091, 0.087, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.001, 5.822, 0.784, 2.856, 3.127, 10.434, 0.913, 1.544, 3.717, 6.407, 0.033, 0.633, 2.751, 1.821, 6.435, 2.483, 0.545, 0.012, 4.834, 4.912, 3.94, 2.397, 0.665, 1.309, 0.053, 0.442, 0.521, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.13, 0.003, 0.001, 0.002, 0.004, 0.002, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.012, 0.001, 0.0001, 0.001, 0.0001, 0.012, 0.052, 0.0001, 0.0001, 0.021, 0.02, 0.013, 0.012, 0.005, 0.005, 0.001, 0.002, 0.087, 0.001, 0.002, 0.004, 0.002, 0.014, 0.002, 0.001, 0.002, 0.005, 0.0001, 0.002, 0.002, 0.007, 0.005, 0.01, 0.013, 0.001, 0.014, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.03, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.019, 0.191, 0.004, 0.004, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.011, 0.007, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pfl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.263, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.706, 0.009, 0.364, 0.0001, 0.0001, 0.013, 0.001, 0.091, 0.195, 0.195, 0.003, 0.001, 0.686, 0.342, 1.046, 0.015, 0.201, 0.285, 0.126, 0.084, 0.075, 0.083, 0.073, 0.08, 0.09, 0.133, 0.057, 0.007, 0.004, 0.002, 0.005, 0.003, 0.0001, 0.282, 0.468, 0.129, 0.696, 0.183, 0.211, 0.353, 0.23, 0.145, 0.127, 0.364, 0.254, 0.349, 0.172, 0.165, 0.214, 0.007, 0.306, 0.587, 0.085, 0.112, 0.133, 0.253, 0.004, 0.004, 0.083, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.001, 5.458, 1.123, 3.147, 5.166, 9.364, 1.012, 2.021, 4.491, 5.715, 0.138, 0.564, 2.856, 2.578, 5.721, 2.982, 0.339, 0.016, 4.316, 5.155, 2.124, 2.997, 0.789, 1.349, 0.04, 0.119, 0.948, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.073, 0.001, 0.001, 0.001, 0.025, 0.007, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.014, 0.001, 0.005, 0.002, 0.0001, 0.001, 0.004, 0.001, 0.001, 0.027, 0.001, 0.026, 0.15, 0.041, 0.008, 0.01, 0.001, 1.309, 0.09, 0.0001, 0.002, 0.017, 0.105, 0.002, 0.002, 0.07, 0.023, 0.0001, 0.002, 0.004, 0.001, 0.016, 0.015, 0.003, 0.033, 0.029, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.044, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.024, 1.987, 0.001, 0.015, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.07, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.055, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.983, 0.003, 0.019, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.015, 0.015, 0.0001, 0.0001, 0.196, 0.05, 0.162, 0.001, 0.012, 0.032, 0.016, 0.014, 0.013, 0.015, 0.012, 0.01, 0.008, 0.011, 0.012, 0.002, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.014, 0.008, 0.005, 0.012, 0.009, 0.003, 0.003, 0.008, 0.003, 0.003, 0.005, 0.005, 0.006, 0.016, 0.004, 0.013, 0.0001, 0.005, 0.023, 0.015, 0.011, 0.002, 0.003, 0.0001, 0.036, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.761, 0.196, 0.276, 0.305, 0.454, 0.017, 0.165, 0.648, 0.799, 0.068, 0.545, 0.11, 0.265, 0.512, 0.167, 0.383, 0.0001, 0.263, 0.542, 0.555, 0.3, 0.254, 0.017, 0.002, 0.396, 0.01, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.585, 1.349, 0.631, 0.309, 0.001, 0.704, 0.099, 0.738, 0.496, 0.135, 0.002, 0.598, 0.015, 3.249, 0.0001, 0.471, 0.004, 0.001, 0.0001, 0.007, 0.008, 1.087, 0.017, 0.945, 0.067, 0.032, 0.055, 0.004, 0.076, 0.002, 0.011, 0.133, 0.012, 0.507, 0.001, 0.315, 18.309, 9.394, 0.355, 1.002, 0.59, 0.225, 0.335, 0.42, 0.344, 0.341, 0.537, 1.408, 2.487, 0.078, 0.724, 0.001, 0.0001, 0.527, 0.043, 0.432, 2.004, 0.558, 0.0001, 0.0001, 0.014, 0.0001, 1.176, 0.438, 0.0001, 0.0001, 0.0001, 0.095, 0.876, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 26.149, 0.497, 0.061, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pih": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.022, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.521, 0.009, 0.204, 0.0001, 0.0001, 0.004, 0.001, 2.454, 0.291, 0.293, 0.002, 0.001, 0.888, 0.295, 1.488, 0.018, 0.431, 0.479, 0.302, 0.13, 0.163, 0.176, 0.152, 0.154, 0.17, 0.228, 0.107, 0.024, 0.002, 0.004, 0.002, 0.0001, 0.0001, 0.58, 0.327, 0.222, 0.2, 0.438, 0.166, 0.153, 0.179, 0.225, 0.154, 0.281, 0.167, 0.407, 0.329, 0.234, 0.386, 0.004, 0.196, 0.528, 0.379, 0.134, 0.065, 0.116, 0.0001, 0.083, 0.034, 0.002, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 8.21, 0.769, 1.021, 1.638, 6.843, 0.747, 0.93, 1.82, 7.969, 0.261, 1.7, 3.13, 1.378, 5.431, 3.567, 1.341, 0.022, 3.668, 4.749, 4.715, 2.394, 0.289, 0.906, 0.045, 1.135, 0.094, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.092, 0.039, 0.046, 0.01, 0.019, 0.008, 0.006, 0.003, 0.009, 0.001, 0.001, 0.017, 0.011, 0.007, 0.006, 0.02, 0.015, 0.009, 0.001, 0.019, 0.012, 0.0001, 0.001, 0.006, 0.003, 0.028, 0.004, 0.009, 0.002, 0.007, 0.002, 0.006, 0.077, 0.019, 0.006, 0.004, 0.002, 0.001, 0.001, 0.004, 0.006, 0.035, 0.017, 0.004, 0.004, 0.012, 0.004, 0.0001, 0.082, 0.011, 0.044, 0.037, 0.018, 0.034, 0.007, 0.017, 0.057, 0.008, 0.047, 0.04, 0.021, 0.031, 0.077, 0.012, 0.0001, 0.0001, 0.098, 0.125, 0.02, 0.026, 0.002, 0.0001, 0.0001, 0.016, 0.007, 0.004, 0.0001, 0.001, 0.0001, 0.0001, 0.45, 0.193, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.026, 0.048, 0.0001, 0.0001, 0.003, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pms": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.299, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.832, 0.001, 0.162, 0.0001, 0.0001, 0.004, 0.001, 1.011, 0.156, 0.156, 0.0001, 0.0001, 1.253, 0.787, 0.992, 0.342, 0.318, 0.594, 0.327, 0.281, 0.214, 0.205, 0.231, 0.17, 0.187, 0.641, 0.121, 0.014, 0.149, 0.035, 0.149, 0.034, 0.0001, 0.513, 0.293, 0.3, 0.101, 0.054, 0.096, 0.128, 0.035, 0.079, 0.03, 0.029, 0.305, 0.216, 0.126, 0.053, 0.205, 0.008, 0.226, 0.291, 0.098, 0.028, 0.104, 0.023, 0.014, 0.012, 0.01, 0.002, 0.0001, 0.002, 0.0001, 0.011, 0.0001, 9.348, 0.753, 2.346, 3.335, 4.488, 0.731, 0.919, 0.76, 4.936, 0.31, 0.385, 3.85, 2.042, 6.393, 3.543, 1.375, 0.084, 3.728, 4.566, 4.041, 1.559, 0.688, 0.145, 0.036, 0.118, 0.134, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.165, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.001, 0.059, 0.002, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.02, 0.115, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.661, 0.007, 0.005, 0.001, 0.004, 0.0001, 0.001, 0.004, 0.295, 0.64, 0.002, 2.121, 0.312, 0.006, 0.001, 0.001, 0.002, 0.006, 0.658, 0.012, 0.019, 0.001, 0.003, 0.0001, 0.001, 0.07, 0.002, 0.002, 0.005, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.286, 4.639, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.137, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pnb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.056, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.3, 0.001, 0.061, 0.0001, 0.0001, 0.004, 0.0001, 0.019, 0.084, 0.084, 0.0001, 0.001, 0.02, 0.088, 0.041, 0.008, 0.132, 0.201, 0.102, 0.067, 0.062, 0.067, 0.058, 0.058, 0.067, 0.099, 0.044, 0.011, 0.014, 0.019, 0.014, 0.0001, 0.0001, 0.005, 0.015, 0.004, 0.007, 0.004, 0.002, 0.006, 0.002, 0.006, 0.004, 0.001, 0.002, 0.002, 0.003, 0.002, 0.003, 0.0001, 0.004, 0.004, 0.005, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.016, 0.0001, 0.016, 0.0001, 0.001, 0.001, 0.078, 0.007, 0.025, 0.032, 0.067, 0.025, 0.012, 0.031, 0.075, 0.001, 0.005, 0.047, 0.03, 0.057, 0.061, 0.011, 0.001, 0.056, 0.035, 0.078, 0.015, 0.016, 0.005, 0.001, 0.026, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.037, 1.78, 0.208, 0.002, 1.668, 1.155, 3.673, 0.01, 3.168, 0.001, 0.005, 0.003, 4.417, 0.001, 0.019, 0.031, 0.026, 0.339, 2.06, 0.022, 0.634, 0.001, 0.0001, 0.0001, 0.015, 0.009, 0.0001, 0.004, 0.002, 0.002, 0.0001, 0.002, 0.01, 0.033, 0.198, 0.001, 0.068, 0.002, 0.419, 5.965, 1.027, 1.695, 1.567, 0.022, 0.752, 0.178, 0.132, 2.73, 0.025, 2.399, 0.214, 1.507, 0.366, 0.211, 0.103, 0.103, 0.037, 0.788, 1.21, 0.001, 0.001, 0.002, 1.61, 0.001, 0.0001, 0.0001, 0.01, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.991, 10.598, 5.545, 8.408, 0.0001, 0.004, 0.0001, 0.0001, 0.008, 0.001, 0.037, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pnt": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.111, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.571, 0.001, 0.271, 0.0001, 0.0001, 0.001, 0.001, 0.535, 0.166, 0.167, 0.003, 0.001, 0.374, 0.066, 0.728, 0.006, 0.22, 0.256, 0.213, 0.123, 0.09, 0.093, 0.091, 0.105, 0.105, 0.136, 0.082, 0.003, 0.006, 0.005, 0.006, 0.0001, 0.0001, 0.027, 0.009, 0.018, 0.007, 0.008, 0.002, 0.007, 0.007, 0.011, 0.005, 0.01, 0.006, 0.014, 0.004, 0.003, 0.01, 0.001, 0.009, 0.009, 0.01, 0.001, 0.002, 0.009, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.102, 0.019, 0.03, 0.031, 0.116, 0.01, 0.025, 0.028, 0.096, 0.002, 0.026, 0.047, 0.026, 0.078, 0.081, 0.022, 0.002, 0.09, 0.05, 0.057, 0.045, 0.011, 0.005, 0.004, 0.012, 0.009, 0.0001, 0.182, 0.0001, 0.0001, 0.0001, 1.086, 2.28, 1.131, 1.649, 3.333, 0.911, 0.24, 0.496, 0.069, 0.319, 0.04, 0.001, 0.823, 0.357, 0.222, 0.002, 0.015, 0.24, 0.073, 0.124, 0.043, 0.159, 0.008, 0.102, 0.032, 0.07, 0.198, 0.037, 0.134, 0.044, 0.005, 0.136, 0.134, 0.042, 0.001, 0.198, 0.245, 0.005, 0.018, 0.079, 0.003, 0.008, 0.001, 0.042, 1.012, 0.786, 0.269, 1.272, 0.017, 4.369, 0.221, 0.746, 0.384, 2.578, 0.144, 1.385, 0.301, 1.937, 1.463, 1.533, 1.22, 4.421, 0.103, 3.268, 0.0001, 0.0001, 0.091, 0.022, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 29.379, 12.776, 0.049, 0.015, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.011, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.059, 0.041, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ps": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.579, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.932, 0.004, 0.044, 0.0001, 0.0001, 0.003, 0.0001, 0.002, 0.118, 0.118, 0.001, 0.001, 0.026, 0.037, 0.443, 0.009, 0.022, 0.03, 0.021, 0.014, 0.011, 0.012, 0.01, 0.009, 0.01, 0.013, 0.062, 0.001, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.015, 0.007, 0.011, 0.007, 0.006, 0.005, 0.004, 0.007, 0.009, 0.002, 0.003, 0.005, 0.01, 0.006, 0.004, 0.009, 0.001, 0.006, 0.013, 0.009, 0.003, 0.002, 0.003, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.003, 0.0001, 0.147, 0.023, 0.055, 0.054, 0.165, 0.027, 0.031, 0.061, 0.131, 0.002, 0.012, 0.073, 0.048, 0.109, 0.113, 0.034, 0.002, 0.103, 0.097, 0.116, 0.047, 0.015, 0.017, 0.005, 0.027, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.103, 0.528, 0.202, 0.231, 2.393, 1.822, 2.655, 3.163, 4.608, 0.307, 2.451, 0.006, 1.513, 0.136, 0.015, 0.009, 1.675, 0.004, 0.009, 0.507, 0.005, 0.0001, 0.154, 0.001, 0.093, 0.002, 0.229, 0.007, 0.005, 0.003, 0.0001, 0.006, 0.024, 0.025, 0.048, 0.014, 0.025, 0.008, 0.038, 4.145, 0.839, 1.375, 1.43, 0.077, 0.25, 0.229, 0.647, 2.983, 0.085, 2.528, 0.449, 1.14, 0.525, 0.146, 0.073, 0.106, 0.064, 0.333, 0.407, 0.02, 0.265, 0.005, 1.278, 0.002, 0.0001, 0.0001, 0.016, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.028, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 16.081, 19.012, 3.763, 3.368, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.026, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.038, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "qu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.204, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.108, 0.002, 0.638, 0.0001, 0.0001, 0.004, 0.002, 0.39, 0.494, 0.494, 0.05, 0.002, 1.04, 0.188, 0.977, 0.036, 0.261, 0.409, 0.214, 0.137, 0.12, 0.137, 0.117, 0.112, 0.136, 0.208, 0.401, 0.061, 0.041, 0.006, 0.041, 0.004, 0.0001, 0.371, 0.173, 0.36, 0.119, 0.076, 0.064, 0.097, 0.189, 0.192, 0.096, 0.255, 0.187, 0.305, 0.078, 0.042, 0.428, 0.148, 0.146, 0.31, 0.198, 0.198, 0.061, 0.174, 0.014, 0.102, 0.014, 0.014, 0.0001, 0.015, 0.0001, 0.002, 0.0001, 14.813, 0.229, 1.579, 0.795, 1.296, 0.084, 0.286, 2.331, 7.773, 0.067, 3.004, 4.09, 3.086, 5.006, 1.165, 2.96, 3.746, 3.293, 3.447, 3.494, 5.678, 0.135, 1.682, 0.024, 2.244, 0.111, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.055, 0.016, 0.009, 0.013, 0.008, 0.006, 0.004, 0.006, 0.004, 0.004, 0.003, 0.002, 0.006, 0.007, 0.003, 0.002, 0.012, 0.023, 0.002, 0.011, 0.004, 0.004, 0.003, 0.002, 0.004, 0.015, 0.003, 0.003, 0.005, 0.003, 0.002, 0.003, 0.038, 0.068, 0.004, 0.005, 0.014, 0.005, 0.006, 0.009, 0.007, 0.056, 0.005, 0.005, 0.005, 0.075, 0.004, 0.006, 0.014, 0.34, 0.013, 0.069, 0.007, 0.008, 0.006, 0.005, 0.016, 0.009, 0.022, 0.008, 0.011, 0.009, 0.01, 0.01, 0.0001, 0.0001, 0.026, 0.649, 0.01, 0.009, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.008, 0.002, 0.0001, 0.042, 0.02, 0.051, 0.016, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.006, 0.016, 0.012, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.031, 0.016, 0.047, 0.001, 0.001, 0.006, 0.005, 0.002, 0.002, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "rm": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.612, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.511, 0.003, 0.167, 0.0001, 0.0001, 0.015, 0.0001, 0.104, 0.151, 0.151, 0.003, 0.0001, 0.439, 0.065, 0.823, 0.012, 0.199, 0.275, 0.114, 0.07, 0.072, 0.078, 0.067, 0.073, 0.099, 0.138, 0.045, 0.054, 0.005, 0.002, 0.005, 0.002, 0.0001, 0.139, 0.111, 0.151, 0.1, 0.17, 0.069, 0.113, 0.045, 0.217, 0.028, 0.029, 0.208, 0.121, 0.055, 0.036, 0.132, 0.042, 0.086, 0.226, 0.106, 0.051, 0.07, 0.023, 0.003, 0.003, 0.008, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.001, 11.404, 0.601, 3.031, 3.677, 6.353, 0.757, 1.578, 1.412, 6.549, 0.076, 0.068, 4.778, 1.866, 6.046, 2.159, 1.856, 0.265, 4.97, 5.963, 4.375, 3.712, 1.407, 0.03, 0.131, 0.049, 0.802, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.828, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.043, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.675, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.294, 0.003, 0.002, 0.0001, 0.006, 0.001, 0.001, 0.002, 0.333, 0.017, 0.002, 0.02, 0.128, 0.003, 0.0001, 0.001, 0.004, 0.002, 0.027, 0.004, 0.001, 0.001, 0.012, 0.0001, 0.001, 0.054, 0.054, 0.02, 0.042, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.079, 0.841, 0.004, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.828, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "rmy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.439, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.022, 0.009, 0.624, 0.001, 0.0001, 0.014, 0.003, 0.015, 0.443, 0.441, 0.003, 0.003, 1.038, 0.232, 0.983, 0.037, 0.243, 0.24, 0.172, 0.071, 0.075, 0.081, 0.064, 0.056, 0.058, 0.153, 0.179, 0.028, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.429, 0.231, 0.183, 0.167, 0.219, 0.086, 0.091, 0.078, 0.193, 0.094, 0.424, 0.255, 0.23, 0.124, 0.22, 0.316, 0.009, 0.404, 0.577, 0.193, 0.066, 0.142, 0.014, 0.008, 0.107, 0.022, 0.003, 0.0001, 0.004, 0.0001, 0.001, 0.001, 10.986, 1.012, 0.769, 2.129, 6.975, 0.334, 0.958, 2.547, 6.287, 0.364, 2.952, 3.16, 1.944, 5.241, 5.031, 1.512, 0.108, 4.343, 3.649, 3.301, 2.127, 1.805, 0.051, 0.119, 2.702, 0.234, 0.0001, 0.003, 0.001, 0.001, 0.0001, 0.065, 0.024, 0.024, 0.136, 0.011, 0.006, 0.01, 0.023, 0.009, 0.001, 0.005, 0.016, 0.01, 0.054, 0.02, 0.004, 0.003, 0.007, 0.001, 0.025, 0.008, 0.009, 0.004, 0.007, 0.004, 0.054, 0.005, 0.044, 0.006, 0.002, 0.003, 0.008, 0.038, 0.056, 0.061, 0.004, 0.069, 0.023, 0.011, 0.016, 0.012, 0.016, 0.02, 0.006, 0.003, 0.014, 0.084, 0.01, 0.051, 0.028, 0.039, 0.03, 0.013, 0.014, 0.009, 0.007, 0.027, 0.007, 0.021, 0.023, 0.024, 0.034, 0.062, 0.014, 0.0001, 0.0001, 0.036, 0.28, 0.165, 0.061, 0.0001, 0.011, 0.089, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.007, 0.003, 0.242, 0.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.026, 0.02, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.128, 0.005, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.004, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "rn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.466, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.984, 0.029, 0.062, 0.0001, 0.0001, 0.003, 0.0001, 0.574, 0.079, 0.089, 0.011, 0.0001, 1.075, 0.049, 1.054, 0.052, 0.102, 0.296, 0.219, 0.136, 0.097, 0.085, 0.071, 0.069, 0.063, 0.086, 0.222, 0.076, 0.048, 0.0001, 0.048, 0.055, 0.0001, 0.35, 0.153, 0.043, 0.033, 0.087, 0.042, 0.05, 0.106, 0.336, 0.016, 0.136, 0.035, 0.208, 0.24, 0.02, 0.055, 0.001, 0.138, 0.132, 0.082, 0.29, 0.029, 0.019, 0.0001, 0.195, 0.032, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 10.973, 3.104, 0.817, 1.265, 5.117, 0.295, 2.193, 1.806, 7.318, 0.542, 2.677, 0.668, 3.393, 5.179, 4.081, 0.677, 0.004, 4.518, 2.135, 2.161, 5.935, 1.185, 2.07, 0.007, 2.3, 1.432, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.174, 0.023, 0.002, 0.005, 0.007, 0.004, 0.003, 0.003, 0.006, 0.0001, 0.004, 0.0001, 0.015, 0.271, 0.012, 0.002, 0.008, 0.004, 0.004, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.284, 0.0001, 0.196, 0.005, 0.002, 0.004, 0.014, 0.082, 0.437, 0.009, 0.0001, 0.0001, 0.006, 0.001, 0.018, 0.002, 0.13, 0.002, 0.17, 0.0001, 0.586, 0.007, 0.108, 0.004, 0.019, 0.001, 0.014, 0.007, 0.001, 0.01, 0.001, 0.001, 0.002, 0.049, 0.153, 0.015, 0.123, 0.121, 0.0001, 0.0001, 0.0001, 0.386, 1.335, 0.539, 0.45, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.167, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "rue": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.059, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.931, 0.003, 0.134, 0.004, 0.0001, 0.006, 0.0001, 0.004, 0.175, 0.175, 0.004, 0.001, 0.601, 0.077, 0.708, 0.007, 0.16, 0.303, 0.147, 0.097, 0.093, 0.095, 0.084, 0.09, 0.099, 0.137, 0.031, 0.011, 0.003, 0.006, 0.002, 0.001, 0.0001, 0.009, 0.006, 0.011, 0.005, 0.005, 0.004, 0.005, 0.007, 0.017, 0.002, 0.003, 0.006, 0.008, 0.01, 0.004, 0.008, 0.0001, 0.006, 0.012, 0.008, 0.004, 0.005, 0.003, 0.005, 0.001, 0.001, 0.002, 0.011, 0.003, 0.0001, 0.004, 0.0001, 0.091, 0.013, 0.033, 0.032, 0.099, 0.015, 0.014, 0.02, 0.081, 0.006, 0.012, 0.045, 0.028, 0.055, 0.071, 0.018, 0.002, 0.069, 0.058, 0.052, 0.039, 0.016, 0.006, 0.004, 0.014, 0.011, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 2.51, 1.935, 2.11, 1.119, 0.168, 0.507, 0.468, 0.486, 0.356, 0.046, 0.009, 1.422, 0.678, 0.003, 0.239, 0.784, 0.089, 0.301, 0.121, 0.074, 0.371, 0.035, 1.647, 0.529, 0.012, 0.009, 0.09, 0.04, 0.101, 0.07, 0.061, 0.137, 0.108, 0.152, 0.055, 0.234, 0.024, 0.016, 0.017, 0.032, 0.025, 0.005, 0.001, 0.015, 0.002, 0.004, 0.009, 0.015, 3.672, 0.621, 2.19, 0.526, 1.267, 2.143, 0.348, 0.764, 1.53, 0.62, 1.849, 1.595, 1.255, 2.617, 4.166, 1.0, 0.0001, 0.0001, 0.065, 0.026, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.006, 0.0001, 0.02, 0.009, 27.547, 15.28, 0.159, 0.0001, 0.0001, 0.001, 0.001, 0.004, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.115, 0.004, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "rw": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.278, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.768, 0.007, 0.605, 0.0001, 0.0001, 0.01, 0.005, 0.156, 0.48, 0.479, 0.0001, 0.001, 0.554, 0.104, 0.846, 0.03, 0.199, 0.216, 0.155, 0.113, 0.085, 0.082, 0.092, 0.069, 0.073, 0.138, 0.279, 0.158, 0.014, 0.006, 0.014, 0.022, 0.0001, 0.463, 0.203, 0.115, 0.093, 0.067, 0.068, 0.134, 0.078, 0.521, 0.056, 0.247, 0.076, 0.283, 0.278, 0.063, 0.134, 0.006, 0.219, 0.18, 0.135, 0.469, 0.053, 0.038, 0.003, 0.047, 0.033, 0.002, 0.005, 0.003, 0.0001, 0.005, 0.003, 10.187, 2.795, 0.85, 1.072, 4.678, 0.399, 2.704, 1.553, 8.747, 0.332, 2.605, 0.938, 3.443, 4.833, 3.164, 0.42, 0.036, 4.477, 2.07, 2.396, 6.084, 0.329, 1.941, 0.023, 2.813, 1.358, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.976, 0.03, 0.025, 0.03, 0.043, 0.049, 0.025, 0.021, 0.028, 0.009, 0.036, 0.011, 0.018, 0.014, 0.026, 0.013, 0.02, 0.015, 0.01, 0.15, 0.008, 0.015, 0.009, 0.008, 0.011, 0.787, 0.007, 0.008, 0.021, 0.011, 0.011, 0.034, 0.016, 0.016, 0.009, 0.011, 0.025, 0.012, 0.025, 0.083, 0.028, 0.057, 0.013, 0.014, 0.038, 0.019, 0.024, 0.039, 0.055, 0.067, 0.03, 0.036, 0.018, 0.034, 0.017, 0.013, 0.045, 0.024, 0.03, 0.026, 0.034, 0.02, 0.028, 0.012, 0.0001, 0.0001, 0.03, 0.13, 0.052, 0.028, 0.001, 0.001, 0.001, 0.009, 0.002, 0.001, 0.003, 0.0001, 0.02, 0.007, 0.21, 0.107, 0.008, 0.005, 0.001, 0.006, 0.005, 0.025, 0.234, 0.162, 0.005, 0.009, 0.0001, 0.0001, 0.009, 0.0001, 0.108, 0.055, 0.961, 0.001, 0.002, 0.013, 0.008, 0.004, 0.003, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.358, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.441, 0.003, 0.019, 0.0001, 0.0001, 0.003, 0.0001, 0.034, 0.04, 0.042, 0.0001, 0.001, 0.189, 0.124, 0.061, 0.009, 0.003, 0.004, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.002, 0.022, 0.001, 0.005, 0.003, 0.005, 0.005, 0.0001, 0.002, 0.001, 0.007, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.036, 0.006, 0.009, 0.018, 0.033, 0.003, 0.005, 0.01, 0.026, 0.001, 0.003, 0.015, 0.009, 0.022, 0.022, 0.013, 0.0001, 0.02, 0.014, 0.02, 0.007, 0.002, 0.005, 0.001, 0.004, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.485, 0.531, 0.737, 0.892, 0.001, 0.437, 0.14, 1.014, 0.103, 0.083, 0.003, 0.31, 0.053, 4.186, 0.001, 0.123, 0.004, 0.001, 0.0001, 0.016, 0.005, 0.929, 0.077, 0.397, 0.036, 0.098, 0.308, 0.026, 0.311, 0.017, 0.076, 0.146, 0.037, 0.11, 0.008, 0.362, 26.378, 7.803, 0.723, 0.32, 1.5, 0.025, 0.84, 0.05, 0.176, 0.36, 1.148, 1.481, 1.847, 0.0001, 0.431, 0.017, 0.001, 1.168, 0.412, 0.409, 1.347, 0.264, 0.0001, 0.0001, 0.002, 0.029, 2.443, 1.602, 0.0001, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.344, 0.0001, 0.071, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sah": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.686, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.508, 0.002, 0.063, 0.0001, 0.0001, 0.006, 0.0001, 0.001, 0.091, 0.092, 0.0001, 0.001, 0.559, 0.22, 0.713, 0.008, 0.141, 0.211, 0.115, 0.061, 0.06, 0.065, 0.051, 0.05, 0.056, 0.124, 0.035, 0.013, 0.006, 0.002, 0.006, 0.002, 0.0001, 0.005, 0.004, 0.005, 0.003, 0.002, 0.002, 0.002, 0.002, 0.017, 0.001, 0.002, 0.002, 0.004, 0.003, 0.002, 0.003, 0.0001, 0.002, 0.006, 0.004, 0.001, 0.004, 0.001, 0.007, 0.002, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 0.029, 0.008, 0.012, 0.008, 0.028, 0.005, 0.006, 0.038, 0.023, 0.001, 0.004, 0.015, 0.01, 0.02, 0.025, 0.007, 0.0001, 0.024, 0.015, 0.017, 0.012, 0.003, 0.003, 0.001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.31, 1.601, 3.034, 2.129, 0.054, 0.947, 0.056, 0.303, 0.028, 0.008, 0.002, 2.384, 0.325, 2.811, 0.018, 0.129, 0.129, 0.118, 0.035, 0.051, 0.111, 0.426, 0.011, 0.007, 0.063, 0.002, 0.123, 0.02, 0.075, 0.059, 0.083, 0.041, 0.09, 0.172, 0.066, 0.042, 0.018, 0.342, 0.005, 0.017, 0.028, 0.688, 0.0001, 0.065, 0.003, 0.027, 0.027, 0.911, 6.03, 1.253, 0.256, 0.681, 0.862, 0.464, 0.024, 0.065, 2.76, 0.764, 1.431, 3.082, 0.589, 3.175, 2.114, 0.327, 0.0001, 0.0001, 0.173, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.001, 24.486, 17.038, 2.234, 0.706, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.102, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.057, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.585, 0.005, 0.337, 0.0001, 0.0001, 0.01, 0.001, 0.519, 0.179, 0.179, 0.0001, 0.001, 0.997, 0.097, 0.746, 0.025, 0.237, 0.292, 0.15, 0.087, 0.082, 0.09, 0.079, 0.083, 0.093, 0.166, 0.067, 0.032, 0.007, 0.002, 0.008, 0.003, 0.0001, 0.224, 0.132, 0.261, 0.092, 0.103, 0.086, 0.108, 0.028, 0.255, 0.028, 0.024, 0.103, 0.181, 0.091, 0.054, 0.171, 0.006, 0.093, 0.455, 0.116, 0.064, 0.058, 0.024, 0.025, 0.008, 0.012, 0.012, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 9.363, 0.921, 2.394, 4.179, 7.513, 0.745, 1.075, 0.764, 6.94, 0.075, 0.096, 1.956, 1.851, 5.606, 4.069, 1.688, 0.018, 4.534, 7.393, 5.178, 5.316, 0.445, 0.037, 0.029, 0.067, 0.854, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.107, 0.01, 0.006, 0.008, 0.004, 0.002, 0.002, 0.003, 0.006, 0.002, 0.002, 0.002, 0.006, 0.004, 0.002, 0.001, 0.003, 0.002, 0.003, 0.008, 0.004, 0.001, 0.002, 0.001, 0.003, 0.058, 0.001, 0.002, 0.016, 0.017, 0.001, 0.001, 0.306, 0.009, 0.002, 0.003, 0.003, 0.002, 0.001, 0.004, 0.232, 0.016, 0.003, 0.007, 0.252, 0.007, 0.001, 0.002, 0.008, 0.007, 0.176, 0.008, 0.002, 0.004, 0.003, 0.006, 0.005, 0.096, 0.007, 0.007, 0.006, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.032, 1.097, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.011, 0.003, 0.007, 0.001, 0.0001, 0.018, 0.009, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.006, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.096, 0.007, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "scn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.769, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.859, 0.005, 0.376, 0.001, 0.0001, 0.006, 0.001, 0.62, 0.187, 0.189, 0.001, 0.001, 0.862, 0.093, 0.813, 0.026, 0.237, 0.31, 0.158, 0.093, 0.09, 0.099, 0.092, 0.087, 0.104, 0.161, 0.085, 0.032, 0.027, 0.008, 0.034, 0.003, 0.0001, 0.211, 0.12, 0.299, 0.095, 0.077, 0.106, 0.122, 0.053, 0.143, 0.031, 0.023, 0.333, 0.207, 0.158, 0.044, 0.198, 0.02, 0.123, 0.32, 0.125, 0.061, 0.101, 0.022, 0.022, 0.008, 0.012, 0.019, 0.0001, 0.019, 0.0001, 0.007, 0.001, 8.698, 0.715, 3.649, 2.751, 2.764, 0.729, 1.223, 0.71, 11.435, 0.098, 0.087, 3.105, 2.009, 5.881, 1.955, 1.977, 0.125, 4.751, 3.262, 4.998, 7.156, 1.012, 0.04, 0.022, 0.077, 0.978, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.123, 0.005, 0.005, 0.005, 0.003, 0.001, 0.002, 0.001, 0.009, 0.002, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.001, 0.002, 0.002, 0.01, 0.003, 0.001, 0.002, 0.001, 0.012, 0.059, 0.001, 0.002, 0.014, 0.013, 0.001, 0.001, 0.271, 0.006, 0.312, 0.002, 0.001, 0.001, 0.001, 0.004, 0.478, 0.013, 0.046, 0.017, 0.359, 0.007, 0.096, 0.002, 0.008, 0.004, 0.23, 0.006, 0.189, 0.003, 0.002, 0.003, 0.004, 0.145, 0.006, 0.184, 0.003, 0.004, 0.002, 0.003, 0.0001, 0.0001, 0.038, 2.342, 0.007, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.018, 0.008, 0.018, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.107, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sco": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.424, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.792, 0.003, 0.394, 0.001, 0.002, 0.018, 0.003, 0.122, 0.265, 0.265, 0.001, 0.001, 1.079, 0.194, 0.878, 0.014, 0.365, 0.437, 0.262, 0.125, 0.119, 0.131, 0.116, 0.116, 0.135, 0.238, 0.065, 0.052, 0.004, 0.002, 0.004, 0.001, 0.0001, 0.38, 0.213, 0.323, 0.162, 0.132, 0.149, 0.164, 0.147, 0.281, 0.103, 0.117, 0.162, 0.281, 0.134, 0.098, 0.228, 0.015, 0.18, 0.416, 0.389, 0.071, 0.084, 0.096, 0.009, 0.031, 0.022, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 7.525, 0.973, 2.32, 1.915, 9.145, 0.867, 0.966, 3.175, 6.858, 0.086, 0.556, 2.986, 1.72, 5.779, 4.854, 1.317, 0.066, 4.925, 4.607, 6.432, 2.109, 0.676, 1.003, 0.125, 1.018, 0.144, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.052, 0.009, 0.005, 0.004, 0.004, 0.003, 0.002, 0.004, 0.002, 0.003, 0.002, 0.001, 0.002, 0.005, 0.001, 0.002, 0.001, 0.002, 0.001, 0.033, 0.006, 0.001, 0.002, 0.002, 0.002, 0.009, 0.001, 0.002, 0.003, 0.003, 0.001, 0.005, 0.039, 0.026, 0.003, 0.006, 0.015, 0.004, 0.002, 0.007, 0.005, 0.025, 0.002, 0.006, 0.002, 0.019, 0.001, 0.002, 0.01, 0.012, 0.013, 0.016, 0.004, 0.005, 0.011, 0.002, 0.007, 0.003, 0.007, 0.003, 0.009, 0.004, 0.004, 0.002, 0.0001, 0.0001, 0.051, 0.152, 0.018, 0.014, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.011, 0.005, 0.019, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.005, 0.05, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sd": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.527, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.452, 0.004, 0.026, 0.001, 0.0001, 0.002, 0.0001, 0.004, 0.108, 0.108, 0.004, 0.001, 0.009, 0.252, 0.565, 0.015, 0.09, 0.18, 0.083, 0.051, 0.047, 0.052, 0.047, 0.048, 0.055, 0.112, 0.038, 0.003, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.01, 0.007, 0.009, 0.005, 0.004, 0.003, 0.004, 0.004, 0.005, 0.002, 0.003, 0.004, 0.007, 0.004, 0.003, 0.007, 0.001, 0.004, 0.011, 0.007, 0.002, 0.002, 0.003, 0.0001, 0.001, 0.0001, 0.005, 0.0001, 0.005, 0.001, 0.003, 0.0001, 0.093, 0.018, 0.025, 0.03, 0.086, 0.014, 0.018, 0.031, 0.075, 0.002, 0.009, 0.041, 0.026, 0.061, 0.064, 0.018, 0.001, 0.061, 0.048, 0.062, 0.025, 0.01, 0.009, 0.005, 0.016, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.358, 0.355, 0.367, 0.044, 1.492, 1.56, 3.771, 2.24, 3.043, 0.003, 5.411, 0.006, 0.747, 0.045, 0.229, 0.346, 0.139, 0.006, 0.013, 0.002, 0.041, 0.001, 0.001, 0.003, 0.036, 0.237, 0.0001, 0.007, 0.063, 0.063, 0.001, 0.009, 0.066, 0.346, 0.511, 0.005, 0.013, 0.004, 0.6, 4.552, 0.858, 0.458, 2.417, 0.053, 1.486, 0.357, 0.248, 1.426, 0.07, 2.412, 0.238, 1.475, 0.403, 0.209, 0.078, 0.141, 0.068, 0.553, 0.222, 0.578, 0.001, 0.647, 1.291, 0.291, 0.0001, 0.0001, 0.065, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 17.302, 19.772, 4.118, 0.84, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.198, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.104, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "se": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.476, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.534, 0.002, 0.233, 0.001, 0.001, 0.008, 0.001, 0.011, 0.255, 0.258, 0.0001, 0.001, 1.05, 0.297, 1.247, 0.015, 0.373, 0.513, 0.317, 0.174, 0.148, 0.157, 0.145, 0.145, 0.159, 0.258, 0.106, 0.008, 0.018, 0.002, 0.018, 0.002, 0.0001, 0.188, 0.166, 0.071, 0.251, 0.09, 0.093, 0.235, 0.162, 0.082, 0.134, 0.245, 0.18, 0.186, 0.183, 0.112, 0.147, 0.004, 0.206, 0.487, 0.123, 0.053, 0.171, 0.019, 0.003, 0.015, 0.006, 0.005, 0.0001, 0.005, 0.0001, 0.001, 0.0001, 10.038, 0.915, 0.217, 3.327, 5.602, 0.262, 2.678, 1.589, 6.671, 1.512, 2.136, 5.043, 2.364, 3.492, 4.102, 0.745, 0.01, 2.956, 3.613, 3.601, 3.337, 2.349, 0.035, 0.018, 0.282, 0.057, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.058, 0.044, 0.003, 0.004, 0.008, 0.009, 0.002, 0.003, 0.002, 0.002, 0.001, 0.119, 0.035, 0.369, 0.001, 0.002, 0.002, 0.302, 0.004, 0.024, 0.002, 0.002, 0.006, 0.001, 0.007, 0.006, 0.003, 0.005, 0.009, 0.024, 0.001, 0.003, 0.073, 3.336, 0.013, 0.002, 0.299, 0.044, 0.019, 0.052, 0.004, 0.017, 0.001, 0.011, 0.001, 0.006, 0.001, 0.004, 0.019, 0.004, 0.042, 0.006, 0.01, 0.008, 0.063, 0.001, 0.053, 0.001, 0.006, 0.009, 0.008, 0.006, 0.098, 0.001, 0.0001, 0.0001, 0.118, 3.226, 0.711, 1.0, 0.0001, 0.004, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.008, 0.003, 0.027, 0.008, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.008, 0.055, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.098, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.879, 0.044, 0.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.198, 0.211, 0.0001, 0.0001, 0.85, 0.464, 1.499, 0.007, 0.524, 0.5, 0.381, 0.203, 0.246, 0.244, 0.244, 0.191, 0.262, 0.229, 0.082, 0.038, 0.0001, 0.0001, 0.0001, 0.029, 0.0001, 0.282, 0.315, 0.126, 0.106, 0.101, 0.06, 0.092, 0.086, 0.092, 0.093, 0.251, 0.348, 0.227, 0.266, 0.057, 0.128, 0.0001, 0.081, 0.346, 0.343, 0.013, 0.053, 0.416, 0.005, 0.029, 0.062, 0.002, 0.0001, 0.002, 0.0001, 0.015, 0.0001, 5.706, 1.515, 0.218, 1.433, 4.537, 0.262, 2.208, 0.762, 2.069, 0.092, 2.86, 1.7, 1.242, 5.365, 3.328, 0.599, 0.022, 1.81, 1.981, 3.619, 0.984, 0.189, 0.434, 0.086, 1.565, 0.929, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.004, 0.029, 0.0001, 0.015, 0.0001, 0.0001, 0.007, 0.004, 0.002, 0.007, 0.016, 0.004, 0.004, 0.022, 0.015, 0.018, 0.0001, 0.004, 0.007, 0.022, 0.0001, 0.009, 0.004, 0.0001, 0.005, 0.0001, 0.016, 0.002, 0.0001, 0.002, 0.059, 0.007, 0.009, 1.785, 0.013, 1.12, 0.007, 0.002, 0.044, 0.027, 0.112, 1.609, 0.647, 0.002, 0.026, 3.804, 0.577, 0.007, 0.004, 0.0001, 0.022, 0.564, 0.0001, 1.689, 0.002, 0.005, 0.046, 0.002, 0.403, 0.176, 0.0001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 12.759, 0.005, 0.07, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.011, 0.007, 0.0001, 0.0001, 0.015, 0.004, 0.002, 0.0001, 0.002, 0.002, 0.004, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.387, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.061, 0.002, 0.275, 0.0001, 0.001, 0.015, 0.001, 0.014, 0.187, 0.187, 0.0001, 0.002, 0.95, 0.147, 1.223, 0.02, 0.376, 0.495, 0.321, 0.161, 0.177, 0.142, 0.127, 0.123, 0.133, 0.217, 0.047, 0.016, 0.003, 0.003, 0.003, 0.002, 0.0001, 0.169, 0.152, 0.152, 0.124, 0.074, 0.068, 0.115, 0.09, 0.132, 0.082, 0.135, 0.104, 0.207, 0.208, 0.116, 0.297, 0.005, 0.117, 0.252, 0.137, 0.082, 0.102, 0.023, 0.008, 0.009, 0.058, 0.012, 0.0001, 0.012, 0.0001, 0.003, 0.0001, 8.404, 0.811, 0.782, 2.282, 6.596, 0.226, 1.221, 0.511, 7.186, 3.593, 2.512, 2.698, 2.143, 5.119, 6.434, 1.798, 0.011, 3.759, 3.618, 2.964, 3.066, 2.297, 0.032, 0.02, 0.068, 1.245, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.106, 0.072, 0.05, 0.059, 0.003, 0.006, 0.013, 0.266, 0.014, 0.001, 0.001, 0.001, 0.012, 0.537, 0.001, 0.001, 0.005, 0.13, 0.005, 0.01, 0.006, 0.001, 0.001, 0.002, 0.039, 0.019, 0.011, 0.012, 0.016, 0.006, 0.015, 0.006, 0.037, 0.532, 0.005, 0.005, 0.003, 0.001, 0.001, 0.002, 0.003, 0.013, 0.001, 0.004, 0.001, 0.013, 0.001, 0.001, 0.155, 0.023, 0.063, 0.029, 0.039, 0.108, 0.009, 0.019, 0.119, 0.002, 0.045, 0.036, 0.04, 0.092, 0.525, 0.041, 0.0001, 0.0001, 0.038, 0.074, 0.943, 0.945, 0.0001, 0.0001, 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.013, 0.006, 0.916, 0.332, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.045, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "si": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.314, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.928, 0.001, 0.061, 0.001, 0.001, 0.005, 0.0001, 0.009, 0.059, 0.059, 0.0001, 0.001, 0.185, 0.034, 0.404, 0.009, 0.086, 0.094, 0.056, 0.028, 0.026, 0.03, 0.026, 0.025, 0.029, 0.049, 0.012, 0.004, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.015, 0.008, 0.015, 0.008, 0.007, 0.006, 0.005, 0.007, 0.015, 0.002, 0.003, 0.006, 0.01, 0.006, 0.006, 0.01, 0.001, 0.006, 0.015, 0.013, 0.004, 0.004, 0.005, 0.001, 0.001, 0.001, 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 0.173, 0.028, 0.067, 0.071, 0.23, 0.039, 0.038, 0.081, 0.157, 0.003, 0.016, 0.086, 0.051, 0.142, 0.142, 0.042, 0.002, 0.132, 0.124, 0.159, 0.054, 0.019, 0.027, 0.007, 0.032, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.252, 0.201, 0.275, 1.149, 0.707, 0.497, 0.106, 0.13, 0.003, 0.08, 2.719, 0.062, 0.013, 0.472, 0.0001, 1.466, 0.446, 0.166, 2.231, 0.489, 1.129, 0.007, 0.144, 0.0001, 0.039, 0.612, 2.039, 0.034, 0.759, 0.19, 0.015, 0.026, 0.094, 0.008, 0.192, 0.001, 0.005, 0.01, 0.001, 0.537, 0.012, 0.162, 0.001, 0.275, 0.003, 1.26, 0.067, 0.843, 0.165, 1.921, 0.001, 0.089, 0.809, 0.008, 15.577, 14.437, 1.305, 0.017, 1.681, 1.481, 0.0001, 0.796, 0.0001, 0.001, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 29.588, 0.0001, 0.504, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sm": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.213, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 19.463, 0.008, 0.168, 0.0001, 0.003, 0.014, 0.002, 0.885, 0.148, 0.148, 0.0001, 0.001, 1.0, 0.173, 0.914, 0.009, 0.254, 0.312, 0.179, 0.14, 0.095, 0.115, 0.095, 0.086, 0.112, 0.168, 0.033, 0.027, 0.006, 0.002, 0.006, 0.005, 0.0001, 0.462, 0.087, 0.119, 0.039, 0.23, 0.233, 0.074, 0.06, 0.345, 0.031, 0.147, 0.149, 0.348, 0.135, 0.431, 0.236, 0.003, 0.115, 0.459, 0.28, 0.072, 0.088, 0.128, 0.02, 0.007, 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 15.436, 0.147, 0.251, 0.268, 7.552, 1.798, 1.939, 0.261, 7.65, 0.014, 0.507, 6.117, 2.84, 3.141, 6.14, 1.094, 0.011, 1.189, 2.656, 4.384, 4.707, 0.608, 0.084, 0.018, 0.145, 0.038, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.05, 0.151, 0.0001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.003, 0.002, 0.017, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.02, 0.001, 0.001, 0.0001, 0.001, 0.039, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.011, 0.001, 0.001, 0.001, 0.001, 0.001, 0.006, 0.001, 0.028, 0.001, 0.004, 0.001, 0.001, 0.003, 0.003, 0.001, 0.003, 0.002, 0.002, 0.0001, 0.001, 0.002, 0.001, 0.002, 0.086, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.033, 0.176, 0.042, 0.0001, 0.0001, 0.0001, 0.001, 0.085, 0.001, 0.0001, 0.0001, 0.007, 0.0001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.046, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.427, 0.001, 0.194, 0.0001, 0.001, 0.007, 0.003, 0.024, 0.281, 0.281, 0.0001, 0.005, 0.597, 0.124, 0.956, 0.038, 0.114, 0.113, 0.073, 0.04, 0.036, 0.036, 0.026, 0.025, 0.034, 0.053, 0.08, 0.124, 0.002, 0.009, 0.002, 0.006, 0.0001, 0.169, 0.097, 0.234, 0.083, 0.107, 0.043, 0.1, 0.097, 0.095, 0.037, 0.196, 0.037, 0.454, 0.178, 0.024, 0.119, 0.003, 0.094, 0.231, 0.097, 0.036, 0.089, 0.031, 0.003, 0.009, 0.113, 0.039, 0.0001, 0.038, 0.0001, 0.002, 0.0001, 12.237, 1.335, 1.505, 2.374, 5.54, 0.412, 1.524, 3.199, 8.126, 0.115, 3.86, 0.667, 3.205, 6.578, 4.667, 1.202, 0.019, 4.537, 2.41, 2.721, 5.562, 2.325, 2.211, 0.043, 1.41, 2.325, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.012, 0.003, 0.001, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.017, 0.001, 0.004, 0.001, 0.004, 0.0001, 0.001, 0.001, 0.01, 0.005, 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.016, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.009, 0.004, 0.001, 0.001, 0.001, 0.001, 0.003, 0.003, 0.003, 0.004, 0.008, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.004, 0.002, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.011, 0.016, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.037, 0.008, 0.027, 0.001, 0.001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "so": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.235, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.454, 0.003, 0.106, 0.0001, 0.001, 0.01, 0.006, 0.044, 0.175, 0.179, 0.001, 0.006, 0.698, 0.181, 0.663, 0.023, 0.173, 0.237, 0.118, 0.074, 0.068, 0.076, 0.069, 0.062, 0.061, 0.116, 0.103, 0.039, 0.006, 0.095, 0.008, 0.006, 0.001, 0.277, 0.176, 0.197, 0.21, 0.058, 0.067, 0.135, 0.123, 0.156, 0.069, 0.122, 0.08, 0.279, 0.092, 0.046, 0.025, 0.078, 0.077, 0.341, 0.096, 0.053, 0.009, 0.145, 0.085, 0.037, 0.009, 0.058, 0.001, 0.058, 0.0001, 0.009, 0.001, 20.28, 1.752, 0.781, 4.408, 3.807, 0.467, 1.801, 2.804, 6.156, 0.344, 2.692, 2.981, 1.937, 3.517, 5.007, 0.065, 0.666, 2.59, 2.645, 1.488, 3.47, 0.033, 1.517, 1.277, 3.257, 0.024, 0.006, 0.007, 0.006, 0.0001, 0.0001, 0.044, 0.021, 0.016, 0.015, 0.092, 0.046, 0.041, 0.026, 0.037, 0.007, 0.048, 0.005, 0.002, 0.004, 0.027, 0.011, 0.01, 0.009, 0.012, 0.004, 0.002, 0.001, 0.001, 0.002, 0.003, 0.016, 0.0001, 0.0001, 0.009, 0.011, 0.002, 0.005, 0.026, 0.005, 0.004, 0.02, 0.008, 0.009, 0.004, 0.102, 0.029, 0.015, 0.023, 0.008, 0.009, 0.018, 0.009, 0.021, 0.011, 0.034, 0.006, 0.02, 0.009, 0.011, 0.006, 0.006, 0.005, 0.024, 0.019, 0.018, 0.004, 0.003, 0.001, 0.004, 0.0001, 0.0001, 0.03, 0.015, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.36, 0.404, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.045, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.034, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sq": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.871, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.83, 0.005, 0.212, 0.0001, 0.001, 0.008, 0.002, 0.025, 0.142, 0.143, 0.001, 0.002, 0.876, 0.197, 0.817, 0.021, 0.247, 0.322, 0.187, 0.096, 0.094, 0.095, 0.084, 0.083, 0.096, 0.185, 0.067, 0.019, 0.003, 0.004, 0.003, 0.004, 0.0001, 0.232, 0.164, 0.084, 0.121, 0.088, 0.104, 0.113, 0.084, 0.118, 0.051, 0.274, 0.113, 0.216, 0.178, 0.042, 0.229, 0.027, 0.103, 0.291, 0.126, 0.044, 0.092, 0.017, 0.024, 0.009, 0.037, 0.024, 0.0001, 0.024, 0.0001, 0.005, 0.001, 5.42, 0.732, 0.432, 2.174, 7.144, 0.635, 1.01, 2.972, 6.09, 2.066, 2.05, 2.101, 2.386, 4.875, 2.895, 1.724, 0.557, 5.177, 3.826, 5.956, 2.462, 1.012, 0.037, 0.057, 0.423, 0.487, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.107, 0.006, 0.004, 0.005, 0.003, 0.002, 0.002, 0.017, 0.002, 0.002, 0.001, 0.01, 0.001, 0.002, 0.002, 0.001, 0.001, 0.008, 0.001, 0.019, 0.002, 0.001, 0.001, 0.001, 0.003, 0.015, 0.001, 0.001, 0.032, 0.031, 0.002, 0.003, 0.048, 0.005, 0.005, 0.002, 0.005, 0.002, 0.002, 0.098, 0.005, 0.011, 0.001, 5.762, 0.002, 0.004, 0.002, 0.002, 0.006, 0.006, 0.012, 0.004, 0.005, 0.003, 0.003, 0.002, 0.003, 0.003, 0.003, 0.004, 0.006, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.063, 5.926, 0.008, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.023, 0.009, 0.015, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.007, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.106, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "srn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.777, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.537, 0.004, 0.236, 0.0001, 0.0001, 0.009, 0.0001, 0.081, 0.222, 0.175, 0.0001, 0.0001, 0.673, 0.268, 1.397, 0.005, 0.412, 0.368, 0.15, 0.085, 0.102, 0.103, 0.102, 0.071, 0.07, 0.14, 0.041, 0.016, 0.015, 0.002, 0.015, 0.0001, 0.0001, 0.384, 0.184, 0.068, 0.478, 0.061, 0.057, 0.098, 0.039, 0.172, 0.08, 0.05, 0.052, 0.288, 0.1, 0.075, 0.116, 0.004, 0.117, 0.271, 0.146, 0.008, 0.023, 0.047, 0.004, 0.014, 0.007, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 8.95, 2.176, 0.221, 2.431, 7.818, 1.651, 1.874, 0.226, 8.782, 0.064, 2.479, 1.698, 2.095, 8.318, 4.117, 1.376, 0.003, 4.52, 3.577, 2.919, 3.347, 0.156, 1.329, 0.018, 1.038, 0.054, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.042, 0.007, 0.007, 0.002, 0.003, 0.002, 0.003, 0.006, 0.003, 0.001, 0.002, 0.001, 0.006, 0.003, 0.002, 0.005, 0.004, 0.002, 0.001, 0.035, 0.002, 0.002, 0.002, 0.006, 0.002, 0.002, 0.002, 0.002, 0.002, 0.007, 0.002, 0.002, 0.024, 0.012, 0.002, 0.005, 0.004, 0.007, 0.002, 0.002, 0.012, 0.012, 0.006, 0.009, 0.002, 0.021, 0.005, 0.003, 0.003, 0.003, 0.034, 0.007, 0.002, 0.002, 0.002, 0.0001, 0.005, 0.007, 0.019, 0.009, 0.005, 0.003, 0.004, 0.012, 0.0001, 0.0001, 0.029, 0.098, 0.021, 0.025, 0.002, 0.002, 0.002, 0.005, 0.001, 0.003, 0.0001, 0.0001, 0.01, 0.004, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.053, 0.0001, 0.0001, 0.016, 0.016, 0.0001, 0.01, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ss": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.873, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.454, 0.015, 0.301, 0.001, 0.003, 0.01, 0.003, 0.035, 0.203, 0.202, 0.001, 0.0001, 0.685, 0.328, 0.962, 0.019, 0.22, 0.221, 0.137, 0.048, 0.066, 0.07, 0.054, 0.061, 0.082, 0.144, 0.105, 0.052, 0.007, 0.003, 0.008, 0.003, 0.0001, 0.231, 0.18, 0.097, 0.094, 0.111, 0.055, 0.072, 0.058, 0.259, 0.082, 0.196, 0.342, 0.348, 0.356, 0.028, 0.088, 0.003, 0.097, 0.319, 0.164, 0.113, 0.024, 0.061, 0.025, 0.043, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 10.793, 2.656, 0.706, 1.31, 8.505, 1.004, 2.081, 2.919, 7.091, 0.258, 4.271, 5.701, 2.568, 6.606, 3.595, 0.825, 0.028, 0.782, 3.437, 3.569, 4.546, 0.696, 2.323, 0.017, 1.567, 0.734, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.037, 0.016, 0.007, 0.01, 0.014, 0.008, 0.007, 0.004, 0.009, 0.007, 0.013, 0.004, 0.003, 0.014, 0.015, 0.004, 0.003, 0.006, 0.003, 0.008, 0.006, 0.002, 0.007, 0.004, 0.002, 0.004, 0.007, 0.002, 0.01, 0.003, 0.007, 0.003, 0.09, 0.039, 0.013, 0.006, 0.01, 0.005, 0.005, 0.023, 0.007, 0.024, 0.007, 0.009, 0.005, 0.109, 0.006, 0.007, 0.018, 0.014, 0.009, 0.035, 0.024, 0.01, 0.007, 0.005, 0.015, 0.006, 0.031, 0.01, 0.005, 0.01, 0.008, 0.005, 0.0001, 0.0001, 0.085, 0.273, 0.013, 0.008, 0.0001, 0.0001, 0.0001, 0.005, 0.001, 0.002, 0.002, 0.0001, 0.003, 0.002, 0.061, 0.022, 0.001, 0.0001, 0.0001, 0.003, 0.002, 0.003, 0.059, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.042, 0.021, 0.034, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "st": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.411, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.42, 0.002, 0.079, 0.0001, 0.001, 0.016, 0.003, 0.083, 0.165, 0.167, 0.001, 0.001, 0.789, 0.143, 0.973, 0.021, 0.355, 0.325, 0.221, 0.104, 0.116, 0.113, 0.108, 0.098, 0.108, 0.15, 0.061, 0.016, 0.007, 0.005, 0.006, 0.001, 0.0001, 0.408, 0.587, 0.149, 0.148, 0.115, 0.088, 0.067, 0.172, 0.071, 0.055, 0.339, 0.212, 0.509, 0.175, 0.046, 0.141, 0.01, 0.115, 0.317, 0.165, 0.126, 0.071, 0.047, 0.0001, 0.019, 0.026, 0.011, 0.0001, 0.01, 0.0001, 0.005, 0.0001, 12.26, 2.144, 0.403, 1.165, 9.234, 0.827, 1.837, 3.801, 3.704, 0.349, 2.878, 4.66, 2.188, 4.177, 7.024, 1.54, 0.085, 2.344, 4.067, 4.22, 1.114, 0.282, 1.372, 0.049, 0.996, 0.173, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.013, 0.01, 0.009, 0.0001, 0.005, 0.007, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.013, 0.003, 0.001, 0.009, 0.001, 0.001, 0.004, 0.005, 0.0001, 0.0001, 0.002, 0.001, 0.01, 0.006, 0.004, 0.004, 0.003, 0.0001, 0.0001, 0.049, 0.052, 0.003, 0.003, 0.006, 0.002, 0.001, 0.006, 0.002, 0.022, 0.037, 0.001, 0.003, 0.01, 0.0001, 0.001, 0.004, 0.002, 0.001, 0.03, 0.056, 0.001, 0.001, 0.001, 0.004, 0.001, 0.002, 0.007, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.046, 0.167, 0.019, 0.086, 0.0001, 0.003, 0.001, 0.01, 0.001, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.008, 0.013, 0.0001, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "stq": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.516, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.229, 0.003, 0.416, 0.007, 0.001, 0.015, 0.001, 0.047, 0.208, 0.207, 0.008, 0.003, 0.814, 0.425, 1.065, 0.021, 0.376, 0.623, 0.234, 0.148, 0.183, 0.183, 0.241, 0.167, 0.231, 0.214, 0.089, 0.019, 0.072, 0.007, 0.069, 0.006, 0.0001, 0.293, 0.408, 0.089, 0.454, 0.155, 0.334, 0.214, 0.273, 0.205, 0.248, 0.241, 0.264, 0.372, 0.199, 0.14, 0.214, 0.005, 0.245, 0.798, 0.226, 0.158, 0.049, 0.246, 0.003, 0.006, 0.016, 0.02, 0.0001, 0.02, 0.0001, 0.001, 0.0001, 3.929, 0.935, 0.799, 3.858, 10.176, 1.298, 1.131, 1.308, 4.615, 0.883, 2.156, 2.674, 1.358, 6.685, 4.841, 0.816, 0.012, 4.246, 3.53, 4.621, 4.666, 0.159, 1.055, 0.042, 0.141, 0.124, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.049, 0.004, 0.003, 0.001, 0.07, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.004, 0.002, 0.001, 0.003, 0.001, 0.009, 0.014, 0.001, 0.002, 0.008, 0.004, 0.005, 0.004, 0.021, 0.009, 0.015, 0.001, 2.394, 0.001, 0.001, 0.002, 0.004, 0.014, 0.003, 0.002, 0.001, 0.007, 0.002, 0.002, 0.004, 0.002, 0.026, 0.006, 0.003, 0.001, 0.134, 0.001, 0.003, 0.002, 0.004, 0.004, 0.245, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.038, 2.918, 0.006, 0.011, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.002, 0.001, 0.0001, 0.013, 0.006, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.048, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "su": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.293, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.195, 0.001, 0.272, 0.0001, 0.001, 0.006, 0.001, 0.02, 0.129, 0.129, 0.0001, 0.002, 1.05, 0.168, 1.046, 0.037, 0.48, 0.412, 0.411, 0.202, 0.173, 0.175, 0.161, 0.145, 0.144, 0.197, 0.036, 0.015, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.394, 0.22, 0.151, 0.149, 0.042, 0.047, 0.094, 0.073, 0.227, 0.16, 0.402, 0.071, 0.278, 0.12, 0.097, 0.305, 0.014, 0.09, 0.368, 0.175, 0.05, 0.031, 0.057, 0.016, 0.027, 0.009, 0.008, 0.0001, 0.008, 0.0001, 0.005, 0.0001, 13.373, 1.612, 0.819, 2.725, 4.093, 0.314, 2.685, 1.583, 5.788, 0.997, 2.729, 2.341, 2.09, 7.706, 2.801, 1.889, 0.016, 3.889, 3.272, 4.14, 4.781, 0.134, 0.635, 0.029, 0.708, 0.032, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.025, 0.005, 0.003, 0.004, 0.006, 0.004, 0.004, 0.002, 0.004, 0.073, 0.003, 0.001, 0.001, 0.004, 0.007, 0.003, 0.003, 0.002, 0.003, 0.007, 0.008, 0.001, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.004, 0.004, 0.001, 0.001, 0.047, 0.002, 0.001, 0.002, 0.004, 0.002, 0.002, 0.006, 0.003, 2.276, 0.003, 0.002, 0.001, 0.002, 0.007, 0.002, 0.004, 0.005, 0.002, 0.002, 0.001, 0.001, 0.002, 0.001, 0.002, 0.003, 0.002, 0.001, 0.002, 0.033, 0.001, 0.033, 0.0001, 0.0001, 0.051, 2.355, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.007, 0.025, 0.004, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.032, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sw": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.454, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.93, 0.002, 0.217, 0.002, 0.001, 0.01, 0.003, 0.027, 0.171, 0.171, 0.001, 0.001, 0.703, 0.109, 0.942, 0.015, 0.41, 0.383, 0.266, 0.126, 0.108, 0.126, 0.108, 0.107, 0.119, 0.201, 0.062, 0.024, 0.003, 0.004, 0.003, 0.003, 0.0001, 0.226, 0.167, 0.122, 0.086, 0.058, 0.057, 0.065, 0.116, 0.13, 0.09, 0.638, 0.08, 0.504, 0.137, 0.044, 0.113, 0.006, 0.074, 0.173, 0.147, 0.165, 0.059, 0.218, 0.013, 0.04, 0.023, 0.04, 0.0001, 0.04, 0.001, 0.001, 0.001, 16.478, 1.326, 0.611, 1.343, 3.374, 0.678, 1.131, 2.383, 9.629, 0.827, 4.598, 2.609, 3.253, 5.284, 3.187, 0.805, 0.008, 1.616, 2.094, 2.468, 4.443, 0.427, 3.161, 0.026, 2.095, 1.273, 0.001, 0.006, 0.001, 0.0001, 0.0001, 0.04, 0.005, 0.004, 0.002, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.013, 0.002, 0.001, 0.001, 0.001, 0.002, 0.006, 0.001, 0.001, 0.009, 0.008, 0.001, 0.004, 0.009, 0.003, 0.002, 0.002, 0.003, 0.001, 0.001, 0.005, 0.003, 0.009, 0.001, 0.002, 0.001, 0.002, 0.001, 0.002, 0.005, 0.009, 0.009, 0.004, 0.002, 0.003, 0.004, 0.001, 0.004, 0.003, 0.003, 0.003, 0.006, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.018, 0.029, 0.009, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.014, 0.007, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.005, 0.012, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.038, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "szl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.884, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.63, 0.002, 0.452, 0.0001, 0.0001, 0.012, 0.001, 0.026, 0.296, 0.296, 0.001, 0.001, 1.094, 0.318, 1.181, 0.015, 0.332, 0.469, 0.289, 0.138, 0.131, 0.151, 0.118, 0.131, 0.157, 0.273, 0.087, 0.014, 0.006, 0.003, 0.006, 0.0001, 0.0001, 0.207, 0.209, 0.155, 0.118, 0.048, 0.111, 0.139, 0.08, 0.122, 0.125, 0.213, 0.123, 0.287, 0.122, 0.062, 0.309, 0.005, 0.156, 0.329, 0.126, 0.154, 0.05, 0.233, 0.034, 0.017, 0.083, 0.004, 0.0001, 0.004, 0.0001, 0.006, 0.001, 5.741, 0.894, 2.016, 2.128, 5.35, 0.327, 1.279, 0.968, 3.438, 2.841, 2.633, 2.099, 2.293, 3.364, 5.857, 1.423, 0.012, 3.389, 2.85, 2.58, 2.277, 0.102, 3.144, 0.017, 3.623, 2.205, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.191, 0.035, 0.624, 0.044, 0.945, 0.014, 0.009, 0.333, 0.008, 0.003, 0.006, 0.005, 0.012, 0.221, 0.005, 0.196, 0.006, 0.005, 0.003, 0.168, 0.01, 0.003, 0.005, 0.005, 0.005, 0.109, 0.059, 0.562, 0.005, 0.005, 0.004, 0.006, 0.062, 0.111, 0.006, 0.016, 0.01, 0.004, 0.004, 0.012, 0.011, 0.03, 0.005, 0.012, 0.003, 0.012, 0.008, 1.67, 0.032, 0.015, 0.058, 0.035, 0.048, 0.018, 0.012, 0.004, 0.02, 0.013, 0.335, 0.026, 0.282, 0.022, 0.098, 0.006, 0.0001, 0.0001, 0.109, 0.208, 0.455, 5.073, 0.0001, 0.001, 0.0001, 0.008, 0.003, 0.003, 0.004, 0.0001, 0.015, 0.008, 0.161, 0.06, 0.003, 0.002, 0.0001, 0.003, 0.001, 0.009, 0.025, 0.019, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.011, 0.01, 0.176, 0.006, 0.001, 0.005, 0.003, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ta": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.357, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.862, 0.001, 0.077, 0.0001, 0.001, 0.006, 0.001, 0.007, 0.055, 0.056, 0.0001, 0.001, 0.234, 0.03, 0.384, 0.005, 0.084, 0.106, 0.063, 0.029, 0.028, 0.034, 0.027, 0.032, 0.031, 0.052, 0.017, 0.006, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.008, 0.004, 0.008, 0.004, 0.004, 0.003, 0.005, 0.004, 0.006, 0.002, 0.003, 0.003, 0.005, 0.004, 0.003, 0.008, 0.0001, 0.004, 0.008, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.006, 0.0001, 0.006, 0.0001, 0.002, 0.0001, 0.062, 0.006, 0.017, 0.014, 0.042, 0.007, 0.009, 0.018, 0.038, 0.001, 0.006, 0.024, 0.018, 0.035, 0.032, 0.011, 0.001, 0.036, 0.022, 0.032, 0.017, 0.005, 0.004, 0.002, 0.01, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.122, 2.149, 0.144, 0.01, 0.0001, 0.297, 0.436, 0.597, 0.764, 0.136, 0.24, 0.226, 0.005, 5.298, 0.158, 0.027, 0.013, 0.0001, 0.078, 0.014, 0.0001, 2.36, 0.0001, 0.0001, 0.001, 0.171, 0.627, 0.0001, 0.037, 0.002, 0.021, 1.319, 0.014, 0.0001, 0.001, 0.32, 2.012, 0.001, 0.001, 0.0001, 0.539, 0.989, 1.521, 0.0001, 0.0001, 0.001, 23.215, 10.185, 1.322, 0.801, 1.028, 0.757, 0.189, 0.942, 0.0001, 0.015, 0.06, 0.015, 0.0001, 0.0001, 0.0001, 0.0001, 1.18, 2.177, 0.0001, 0.0001, 0.016, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.245, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tcy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.391, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.751, 0.001, 0.026, 0.0001, 0.0001, 0.002, 0.0001, 0.028, 0.048, 0.047, 0.0001, 0.001, 0.244, 0.028, 0.533, 0.012, 0.014, 0.02, 0.01, 0.005, 0.005, 0.007, 0.006, 0.004, 0.008, 0.009, 0.009, 0.003, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 0.001, 0.001, 0.02, 0.002, 0.008, 0.006, 0.018, 0.002, 0.005, 0.006, 0.017, 0.0001, 0.003, 0.009, 0.008, 0.014, 0.015, 0.008, 0.0001, 0.013, 0.012, 0.015, 0.006, 0.002, 0.005, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.354, 1.789, 1.221, 0.031, 0.0001, 0.268, 1.686, 0.484, 0.152, 0.21, 0.745, 0.196, 0.087, 4.125, 0.064, 0.014, 0.014, 0.0001, 0.109, 0.011, 0.001, 1.28, 0.033, 0.613, 0.012, 0.007, 0.23, 0.003, 0.404, 0.002, 0.011, 0.433, 0.058, 1.007, 0.002, 0.198, 1.312, 0.064, 1.397, 0.124, 1.439, 0.012, 1.248, 0.035, 0.624, 0.105, 0.769, 0.62, 1.755, 0.0001, 22.872, 9.408, 0.0001, 0.629, 0.164, 0.121, 0.665, 0.124, 0.0001, 0.0001, 0.003, 0.0001, 1.377, 1.63, 0.0001, 0.0001, 0.05, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.955, 0.0001, 0.194, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "te": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.34, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.746, 0.003, 0.051, 0.0001, 0.001, 0.003, 0.002, 0.007, 0.042, 0.043, 0.0001, 0.001, 0.336, 0.028, 0.611, 0.018, 0.129, 0.152, 0.069, 0.038, 0.034, 0.073, 0.03, 0.032, 0.034, 0.047, 0.02, 0.007, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.008, 0.004, 0.006, 0.005, 0.003, 0.003, 0.002, 0.002, 0.006, 0.001, 0.002, 0.003, 0.005, 0.003, 0.002, 0.005, 0.0001, 0.003, 0.008, 0.005, 0.003, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.006, 0.0001, 0.007, 0.0001, 0.005, 0.0001, 0.053, 0.008, 0.019, 0.022, 0.056, 0.009, 0.01, 0.021, 0.046, 0.001, 0.004, 0.022, 0.015, 0.038, 0.038, 0.014, 0.0001, 0.036, 0.036, 0.045, 0.017, 0.006, 0.006, 0.002, 0.007, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.485, 1.801, 1.898, 0.051, 0.0001, 0.236, 0.427, 0.575, 0.238, 0.222, 0.152, 0.685, 0.105, 2.799, 0.055, 0.027, 0.006, 0.0001, 0.047, 0.007, 0.005, 1.329, 0.049, 0.668, 0.014, 0.002, 0.428, 0.004, 0.25, 0.001, 0.004, 0.537, 0.039, 0.598, 0.002, 0.137, 0.864, 0.099, 0.843, 0.149, 1.628, 0.0001, 0.909, 0.085, 0.267, 0.128, 0.942, 0.804, 25.531, 7.165, 1.487, 0.074, 0.0001, 0.877, 0.211, 0.153, 0.855, 0.145, 0.0001, 0.001, 0.0001, 0.0001, 2.169, 2.359, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.736, 0.0001, 0.069, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tet": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.506, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.056, 0.014, 0.345, 0.0001, 0.004, 0.018, 0.001, 0.455, 0.383, 0.382, 0.001, 0.004, 1.067, 0.53, 0.968, 0.029, 0.443, 0.39, 0.316, 0.132, 0.112, 0.137, 0.105, 0.106, 0.119, 0.181, 0.186, 0.018, 0.015, 0.005, 0.015, 0.003, 0.0001, 0.338, 0.226, 0.145, 0.169, 0.132, 0.156, 0.098, 0.111, 0.215, 0.061, 0.136, 0.43, 0.301, 0.181, 0.101, 0.266, 0.01, 0.137, 0.345, 0.37, 0.107, 0.065, 0.041, 0.021, 0.008, 0.014, 0.01, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 11.569, 1.502, 0.408, 2.068, 6.067, 0.587, 0.66, 2.225, 7.509, 0.16, 2.246, 2.814, 2.311, 6.307, 4.401, 1.282, 0.035, 4.022, 4.063, 3.545, 4.826, 0.518, 0.1, 0.064, 0.126, 0.341, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.318, 0.081, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.015, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.275, 0.001, 0.0001, 0.014, 0.013, 0.001, 0.002, 0.021, 0.254, 0.002, 0.025, 0.0001, 0.0001, 0.003, 0.02, 0.002, 0.389, 0.006, 0.001, 0.001, 0.167, 0.001, 0.001, 0.002, 0.048, 0.071, 0.284, 0.01, 0.003, 0.001, 0.0001, 0.001, 0.001, 0.076, 0.003, 0.014, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.1, 1.362, 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.009, 0.011, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.316, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.272, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.893, 0.001, 0.026, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.324, 0.326, 0.0001, 0.001, 0.765, 0.105, 0.581, 0.006, 0.139, 0.257, 0.13, 0.073, 0.063, 0.072, 0.065, 0.068, 0.082, 0.185, 0.026, 0.048, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.026, 0.01, 0.018, 0.007, 0.005, 0.01, 0.006, 0.007, 0.018, 0.002, 0.005, 0.008, 0.009, 0.006, 0.004, 0.009, 0.001, 0.007, 0.015, 0.007, 0.003, 0.006, 0.004, 0.006, 0.002, 0.002, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.081, 0.01, 0.03, 0.023, 0.086, 0.012, 0.015, 0.021, 0.065, 0.002, 0.009, 0.037, 0.017, 0.055, 0.061, 0.017, 0.001, 0.07, 0.039, 0.054, 0.023, 0.01, 0.007, 0.003, 0.013, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.968, 1.483, 1.764, 1.455, 0.398, 0.384, 0.008, 0.116, 0.704, 0.002, 0.17, 0.01, 0.024, 0.035, 0.045, 0.663, 0.178, 0.263, 0.119, 0.126, 0.303, 0.007, 0.009, 0.022, 0.136, 0.003, 0.143, 0.343, 0.148, 0.063, 0.071, 0.071, 0.134, 0.159, 0.101, 0.347, 0.121, 0.05, 0.002, 0.026, 0.059, 0.003, 0.003, 0.057, 0.003, 0.035, 0.012, 0.164, 5.899, 1.075, 1.071, 1.816, 2.336, 1.339, 0.082, 0.882, 4.885, 0.258, 1.014, 1.438, 1.445, 2.22, 3.885, 0.208, 0.0001, 0.0001, 0.132, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.001, 30.166, 10.131, 1.965, 0.481, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.016, 0.001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.209, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ti": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.164, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.862, 0.026, 0.05, 0.0001, 0.0001, 0.012, 0.0001, 0.044, 0.1, 0.1, 0.0001, 0.0001, 0.075, 0.114, 0.14, 0.02, 0.098, 0.121, 0.073, 0.033, 0.026, 0.04, 0.027, 0.03, 0.029, 0.042, 0.024, 0.004, 0.001, 0.013, 0.001, 0.007, 0.0001, 0.018, 0.013, 0.015, 0.007, 0.006, 0.007, 0.011, 0.013, 0.022, 0.004, 0.004, 0.024, 0.018, 0.012, 0.005, 0.015, 0.004, 0.01, 0.013, 0.022, 0.007, 0.009, 0.006, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.329, 0.063, 0.099, 0.16, 0.451, 0.14, 0.111, 0.211, 0.297, 0.027, 0.053, 0.155, 0.097, 0.283, 0.275, 0.071, 0.007, 0.228, 0.261, 0.255, 0.122, 0.059, 0.08, 0.007, 0.069, 0.014, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.358, 0.069, 0.074, 0.236, 0.007, 0.331, 0.023, 0.001, 9.303, 5.576, 6.47, 5.805, 1.549, 3.066, 0.251, 0.003, 0.505, 0.172, 0.135, 1.034, 0.015, 2.293, 0.054, 0.001, 0.75, 0.233, 0.32, 0.51, 0.12, 1.725, 0.08, 0.002, 0.83, 0.546, 0.753, 1.425, 0.111, 2.053, 0.138, 0.011, 0.764, 0.373, 0.244, 0.731, 0.034, 1.854, 0.258, 0.004, 1.053, 0.166, 0.551, 0.69, 0.031, 2.007, 0.179, 0.005, 0.189, 0.048, 0.045, 0.156, 0.011, 0.447, 0.067, 0.002, 0.0001, 0.0001, 0.386, 0.04, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.027, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.008, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 27.967, 0.209, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.842, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.847, 0.005, 0.052, 0.0001, 0.001, 0.008, 0.001, 0.006, 0.121, 0.125, 0.004, 0.002, 0.691, 0.455, 1.024, 0.011, 0.191, 0.306, 0.153, 0.096, 0.091, 0.095, 0.077, 0.079, 0.095, 0.155, 0.055, 0.012, 0.028, 0.003, 0.028, 0.005, 0.0001, 0.227, 0.204, 0.012, 0.086, 0.083, 0.04, 0.177, 0.112, 0.174, 0.027, 0.109, 0.037, 0.173, 0.054, 0.141, 0.071, 0.001, 0.074, 0.173, 0.153, 0.029, 0.028, 0.04, 0.045, 0.029, 0.016, 0.01, 0.0001, 0.01, 0.001, 0.003, 0.0001, 8.711, 1.574, 0.069, 3.499, 5.666, 0.119, 2.22, 0.895, 5.266, 0.476, 2.165, 5.087, 2.1, 4.83, 1.754, 1.161, 0.002, 5.326, 1.953, 2.216, 1.612, 0.014, 0.863, 0.003, 4.905, 0.889, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.208, 0.022, 0.019, 0.011, 0.017, 0.007, 0.003, 0.027, 1.247, 0.001, 0.0001, 0.008, 0.005, 0.003, 0.002, 0.006, 0.003, 0.005, 0.002, 0.04, 0.02, 0.001, 0.017, 0.002, 0.001, 0.002, 0.001, 0.001, 0.068, 0.139, 0.083, 1.114, 0.015, 0.004, 0.009, 0.002, 0.694, 0.003, 0.003, 0.67, 0.001, 0.002, 0.0001, 0.027, 0.0001, 0.192, 0.001, 0.002, 0.056, 0.114, 0.02, 0.061, 0.013, 0.043, 0.813, 0.006, 0.038, 0.007, 0.016, 0.096, 0.984, 2.385, 0.053, 0.019, 0.0001, 0.0001, 0.268, 5.753, 0.012, 2.464, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.324, 0.111, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.054, 0.182, 0.0001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.527, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.015, 0.006, 0.416, 0.001, 0.001, 0.006, 0.002, 0.043, 0.2, 0.202, 0.001, 0.002, 0.702, 0.264, 0.789, 0.017, 0.219, 0.272, 0.17, 0.08, 0.075, 0.082, 0.072, 0.075, 0.087, 0.155, 0.061, 0.022, 0.066, 0.004, 0.066, 0.002, 0.0001, 0.555, 0.199, 0.186, 0.134, 0.118, 0.059, 0.112, 0.181, 0.214, 0.066, 0.204, 0.127, 0.268, 0.176, 0.063, 0.292, 0.011, 0.11, 0.398, 0.188, 0.06, 0.045, 0.055, 0.008, 0.035, 0.014, 0.016, 0.0001, 0.015, 0.001, 0.003, 0.0001, 16.44, 1.457, 0.382, 1.246, 2.379, 0.123, 6.741, 1.192, 6.121, 0.033, 2.118, 3.173, 2.569, 9.845, 3.868, 2.142, 0.019, 2.313, 4.125, 3.402, 2.226, 0.121, 0.559, 0.032, 2.131, 0.078, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.038, 0.008, 0.005, 0.004, 0.004, 0.003, 0.002, 0.002, 0.004, 0.002, 0.002, 0.002, 0.003, 0.007, 0.003, 0.002, 0.004, 0.004, 0.002, 0.014, 0.006, 0.001, 0.002, 0.001, 0.002, 0.008, 0.001, 0.002, 0.013, 0.007, 0.002, 0.002, 0.028, 0.01, 0.003, 0.002, 0.004, 0.002, 0.002, 0.004, 0.003, 0.01, 0.002, 0.004, 0.002, 0.008, 0.002, 0.002, 0.005, 0.01, 0.003, 0.007, 0.003, 0.003, 0.002, 0.002, 0.006, 0.003, 0.004, 0.003, 0.005, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.029, 0.045, 0.007, 0.011, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.012, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.008, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.012, 0.037, 0.005, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.716, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.981, 0.003, 0.08, 0.013, 0.001, 0.009, 0.002, 0.01, 0.075, 0.075, 0.0001, 0.0001, 0.66, 0.106, 0.757, 0.034, 0.2, 0.226, 0.113, 0.036, 0.039, 0.039, 0.04, 0.035, 0.043, 0.09, 0.021, 0.015, 0.01, 0.005, 0.011, 0.004, 0.0001, 0.148, 0.357, 0.071, 0.097, 0.07, 0.054, 0.125, 0.028, 0.051, 0.019, 0.166, 0.104, 0.374, 0.087, 0.085, 0.102, 0.001, 0.088, 0.173, 0.113, 0.019, 0.017, 0.023, 0.006, 0.007, 0.021, 0.023, 0.0001, 0.022, 0.0001, 0.004, 0.0001, 12.488, 2.445, 0.191, 1.643, 9.389, 0.795, 4.171, 1.899, 3.702, 0.312, 2.67, 5.097, 2.631, 4.499, 8.158, 1.075, 0.008, 1.917, 4.118, 4.684, 0.837, 0.048, 2.161, 0.014, 0.955, 0.029, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.034, 0.011, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.036, 0.008, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "to": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.293, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.821, 0.001, 0.44, 0.0001, 0.0001, 0.001, 0.005, 0.111, 0.238, 0.237, 0.002, 0.0001, 0.847, 0.076, 1.066, 0.045, 0.084, 0.141, 0.063, 0.039, 0.037, 0.032, 0.036, 0.05, 0.065, 0.067, 0.09, 0.023, 0.003, 0.011, 0.005, 0.027, 0.0001, 0.126, 0.034, 0.039, 0.011, 0.049, 0.193, 0.01, 0.178, 0.123, 0.01, 0.599, 0.145, 0.204, 0.188, 0.245, 0.136, 0.001, 0.012, 0.185, 0.547, 0.059, 0.124, 0.026, 0.001, 0.005, 0.001, 0.004, 0.0001, 0.005, 0.0001, 0.002, 0.001, 10.579, 0.223, 0.423, 0.627, 6.707, 1.724, 1.525, 3.199, 6.545, 0.014, 3.573, 2.547, 1.814, 3.859, 6.712, 1.277, 0.01, 0.909, 1.504, 3.555, 4.441, 0.529, 0.312, 0.02, 0.255, 0.009, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.028, 0.432, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.082, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.183, 0.003, 0.0001, 0.0001, 0.001, 0.011, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.057, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.002, 0.001, 0.078, 0.0001, 0.015, 0.0001, 0.0001, 0.013, 0.0001, 0.001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 4.517, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.022, 0.094, 0.659, 0.119, 0.0001, 0.0001, 0.0001, 0.0001, 4.513, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tpi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.506, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.422, 0.004, 0.225, 0.0001, 0.0001, 0.006, 0.0001, 0.033, 0.226, 0.227, 0.001, 0.0001, 0.976, 0.07, 1.357, 0.011, 0.339, 0.409, 0.202, 0.102, 0.113, 0.106, 0.09, 0.101, 0.134, 0.258, 0.112, 0.01, 0.016, 0.001, 0.016, 0.001, 0.0001, 0.28, 0.281, 0.358, 0.108, 0.184, 0.096, 0.132, 0.102, 0.251, 0.103, 0.247, 0.515, 0.27, 0.273, 0.17, 0.405, 0.016, 0.129, 0.696, 0.311, 0.02, 0.133, 0.076, 0.006, 0.097, 0.011, 0.006, 0.0001, 0.006, 0.0001, 0.003, 0.0001, 9.267, 1.534, 0.295, 1.028, 5.418, 0.186, 3.091, 0.44, 8.286, 0.1, 1.968, 5.697, 3.075, 7.815, 5.428, 2.623, 0.013, 2.618, 3.22, 3.51, 1.911, 0.537, 0.798, 0.013, 0.388, 0.104, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.026, 0.016, 0.007, 0.003, 0.007, 0.001, 0.002, 0.003, 0.001, 0.001, 0.001, 0.002, 0.006, 0.002, 0.001, 0.001, 0.004, 0.002, 0.001, 0.01, 0.002, 0.002, 0.002, 0.003, 0.001, 0.004, 0.001, 0.005, 0.009, 0.009, 0.003, 0.002, 0.021, 0.037, 0.001, 0.006, 0.0001, 0.001, 0.001, 0.002, 0.002, 0.013, 0.005, 0.003, 0.004, 0.024, 0.002, 0.002, 0.006, 0.026, 0.007, 0.298, 0.002, 0.005, 0.003, 0.003, 0.01, 0.004, 0.011, 0.015, 0.005, 0.005, 0.003, 0.004, 0.0001, 0.0001, 0.019, 0.408, 0.007, 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.02, 0.011, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.012, 0.021, 0.009, 0.003, 0.009, 0.003, 0.001, 0.001, 0.002, 0.004, 0.003, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ts": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.117, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.445, 0.004, 0.183, 0.0001, 0.0001, 0.006, 0.001, 0.136, 0.107, 0.107, 0.0001, 0.0001, 0.868, 0.158, 0.838, 0.021, 0.152, 0.161, 0.081, 0.037, 0.038, 0.052, 0.045, 0.043, 0.056, 0.092, 0.041, 0.025, 0.03, 0.001, 0.03, 0.006, 0.0001, 0.18, 0.088, 0.068, 0.084, 0.075, 0.029, 0.061, 0.137, 0.055, 0.032, 0.132, 0.116, 0.387, 0.232, 0.02, 0.062, 0.002, 0.075, 0.171, 0.121, 0.04, 0.219, 0.021, 0.119, 0.045, 0.021, 0.003, 0.0001, 0.003, 0.0001, 0.002, 0.005, 13.463, 1.384, 0.275, 1.092, 4.958, 0.572, 1.347, 3.614, 7.958, 0.047, 4.285, 4.291, 2.768, 5.921, 3.615, 0.489, 0.025, 2.056, 2.585, 2.874, 4.929, 1.994, 3.082, 0.68, 2.172, 0.64, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.055, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.005, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.031, 0.0001, 0.001, 0.008, 0.008, 0.0001, 0.0001, 0.05, 0.004, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.001, 0.003, 0.0001, 0.002, 0.001, 0.005, 0.002, 0.011, 0.002, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.002, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.051, 0.023, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.018, 0.006, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.054, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tt": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.086, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.219, 0.001, 0.085, 0.0001, 0.0001, 0.04, 0.0001, 0.002, 0.22, 0.221, 0.0001, 0.008, 0.529, 0.164, 0.713, 0.007, 0.223, 0.276, 0.185, 0.093, 0.09, 0.084, 0.067, 0.069, 0.089, 0.159, 0.097, 0.008, 0.002, 0.001, 0.002, 0.003, 0.0001, 0.01, 0.009, 0.017, 0.009, 0.006, 0.003, 0.002, 0.003, 0.017, 0.001, 0.009, 0.003, 0.013, 0.003, 0.003, 0.004, 0.005, 0.005, 0.013, 0.017, 0.009, 0.006, 0.002, 0.01, 0.003, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.245, 0.051, 0.015, 0.059, 0.152, 0.017, 0.027, 0.019, 0.108, 0.002, 0.051, 0.14, 0.059, 0.158, 0.057, 0.025, 0.035, 0.149, 0.073, 0.108, 0.056, 0.01, 0.015, 0.014, 0.048, 0.025, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.852, 1.726, 1.824, 1.398, 0.151, 0.194, 0.076, 0.605, 0.638, 0.004, 0.1, 2.623, 0.236, 0.061, 0.057, 0.479, 0.123, 0.129, 0.053, 0.062, 0.279, 0.075, 0.02, 0.174, 0.096, 1.916, 0.222, 0.025, 0.1, 0.049, 0.069, 0.128, 0.159, 0.146, 0.119, 0.43, 0.164, 0.055, 0.003, 0.065, 0.036, 0.325, 0.0001, 0.038, 0.001, 0.013, 0.042, 0.429, 4.958, 1.044, 0.394, 1.429, 0.959, 3.011, 0.048, 0.384, 1.557, 0.433, 1.901, 3.01, 1.056, 3.108, 1.043, 0.407, 0.0001, 0.0001, 0.106, 0.225, 0.139, 0.034, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.004, 0.0001, 0.003, 0.001, 26.093, 12.748, 1.127, 2.265, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.275, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tum": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.34, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.852, 0.004, 0.573, 0.003, 0.004, 0.004, 0.017, 0.083, 0.308, 0.306, 0.001, 0.0001, 1.303, 0.412, 1.2, 0.024, 0.557, 0.476, 0.366, 0.176, 0.172, 0.213, 0.206, 0.176, 0.165, 0.191, 0.118, 0.025, 0.012, 0.007, 0.012, 0.0001, 0.001, 0.268, 0.377, 0.217, 0.158, 0.11, 0.095, 0.125, 0.123, 0.134, 0.277, 0.29, 0.111, 0.727, 0.21, 0.076, 0.143, 0.01, 0.116, 0.269, 0.294, 0.069, 0.067, 0.069, 0.003, 0.068, 0.042, 0.008, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 10.116, 1.728, 1.817, 1.937, 5.125, 1.225, 1.488, 3.251, 6.548, 0.159, 2.454, 2.854, 2.514, 5.282, 4.292, 2.074, 0.028, 2.715, 2.7, 3.62, 4.127, 0.602, 1.862, 0.051, 1.299, 0.758, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.102, 0.017, 0.014, 0.014, 0.01, 0.006, 0.008, 0.005, 0.003, 0.001, 0.007, 0.006, 0.02, 0.058, 0.017, 0.003, 0.008, 0.005, 0.001, 0.016, 0.005, 0.005, 0.003, 0.004, 0.009, 0.043, 0.004, 0.001, 0.008, 0.005, 0.006, 0.002, 0.103, 0.006, 0.008, 0.007, 0.001, 0.005, 0.009, 0.025, 0.006, 0.01, 0.003, 0.011, 0.006, 0.004, 0.0001, 0.003, 0.016, 0.015, 0.003, 0.014, 0.008, 0.112, 0.003, 0.014, 0.012, 0.008, 0.012, 0.012, 0.008, 0.009, 0.01, 0.003, 0.0001, 0.0001, 0.101, 0.045, 0.006, 0.195, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.063, 0.038, 0.001, 0.001, 0.001, 0.006, 0.003, 0.007, 0.053, 0.034, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.016, 0.022, 0.093, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.012, 0.008, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tw": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.984, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.303, 0.001, 0.389, 0.0001, 0.001, 0.0001, 0.004, 0.077, 0.488, 0.486, 0.0001, 0.0001, 0.756, 0.118, 1.791, 0.025, 0.73, 0.614, 0.579, 0.248, 0.221, 0.18, 0.206, 0.176, 0.192, 0.286, 0.065, 0.035, 0.004, 0.0001, 0.004, 0.01, 0.0001, 0.602, 0.283, 0.296, 0.116, 0.311, 0.173, 0.2, 0.1, 0.303, 0.048, 0.367, 0.187, 0.399, 0.306, 0.149, 0.189, 0.019, 0.18, 0.508, 0.305, 0.203, 0.099, 0.096, 0.049, 0.077, 0.01, 0.003, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 8.315, 0.995, 0.605, 1.602, 5.365, 0.628, 0.659, 0.955, 4.58, 0.091, 2.249, 1.426, 1.892, 5.378, 5.608, 0.884, 0.03, 3.156, 2.583, 1.888, 2.004, 0.328, 1.708, 0.075, 2.441, 0.168, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.083, 0.035, 0.035, 0.017, 0.032, 0.015, 0.093, 0.059, 0.023, 0.016, 0.025, 0.022, 0.019, 0.022, 0.029, 0.012, 0.046, 0.013, 0.009, 0.017, 0.855, 0.004, 0.017, 0.017, 0.006, 0.004, 0.012, 1.236, 0.017, 0.012, 0.01, 0.004, 0.081, 0.046, 0.012, 0.012, 0.086, 0.028, 0.017, 0.054, 0.03, 0.075, 0.019, 0.012, 0.016, 0.036, 0.009, 0.019, 0.074, 0.048, 0.057, 0.049, 0.013, 2.039, 0.016, 0.03, 0.109, 0.023, 0.064, 0.039, 0.051, 0.048, 0.068, 0.015, 0.0001, 0.0001, 0.075, 0.196, 0.058, 0.036, 0.106, 0.0001, 0.001, 1.812, 0.004, 0.0001, 0.001, 0.0001, 2.053, 0.006, 0.306, 0.086, 0.0001, 0.0001, 0.0001, 0.012, 0.003, 0.267, 0.158, 0.09, 0.007, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.209, 0.016, 0.044, 0.0001, 0.016, 0.052, 0.016, 0.023, 0.012, 0.003, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ty": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.596, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.482, 0.002, 0.148, 0.0001, 0.0001, 0.0001, 0.001, 0.103, 0.185, 0.187, 0.0001, 0.0001, 0.459, 0.229, 1.457, 0.013, 0.217, 0.354, 0.181, 0.099, 0.109, 0.09, 0.093, 0.094, 0.097, 0.295, 0.032, 0.014, 0.002, 0.001, 0.023, 0.0001, 0.0001, 0.336, 0.259, 0.191, 0.056, 0.549, 0.206, 0.061, 0.142, 0.109, 0.062, 0.031, 0.131, 0.411, 0.099, 0.644, 0.477, 0.008, 0.194, 0.401, 0.951, 0.146, 0.18, 0.019, 0.004, 0.015, 0.007, 0.008, 0.0001, 0.01, 0.0001, 0.003, 0.0001, 9.536, 0.253, 0.42, 0.705, 6.452, 0.803, 0.335, 1.722, 7.016, 0.092, 0.277, 1.311, 1.613, 3.693, 4.012, 0.994, 0.04, 4.455, 1.038, 5.804, 2.543, 0.371, 0.019, 0.027, 0.146, 0.201, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.052, 0.908, 0.007, 0.002, 0.007, 0.001, 0.0001, 0.003, 0.006, 0.001, 0.003, 0.002, 0.002, 1.282, 0.0001, 0.001, 0.007, 0.0001, 0.043, 0.549, 0.01, 0.0001, 0.0001, 0.003, 0.114, 1.916, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.19, 0.144, 0.074, 0.002, 0.002, 0.003, 0.003, 0.022, 0.06, 0.039, 0.051, 0.598, 0.116, 0.035, 0.003, 0.018, 0.003, 0.029, 0.506, 0.059, 0.005, 0.003, 0.0001, 0.001, 0.002, 0.008, 0.013, 0.037, 0.005, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.033, 1.417, 1.711, 1.627, 0.0001, 0.0001, 0.0001, 0.008, 0.01, 0.005, 0.002, 0.001, 0.0001, 0.0001, 0.009, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 2.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tyv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.67, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.942, 0.005, 0.141, 0.0001, 0.0001, 0.004, 0.001, 0.003, 0.097, 0.1, 0.0001, 0.001, 0.649, 0.583, 0.64, 0.009, 0.087, 0.151, 0.08, 0.042, 0.04, 0.04, 0.033, 0.032, 0.035, 0.099, 0.046, 0.011, 0.008, 0.002, 0.008, 0.008, 0.0001, 0.007, 0.002, 0.003, 0.002, 0.002, 0.002, 0.001, 0.002, 0.022, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.003, 0.003, 0.001, 0.006, 0.002, 0.011, 0.001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.081, 0.005, 0.006, 0.008, 0.025, 0.002, 0.005, 0.006, 0.02, 0.002, 0.007, 0.012, 0.016, 0.015, 0.021, 0.013, 0.003, 0.017, 0.01, 0.014, 0.01, 0.002, 0.004, 0.007, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.263, 0.883, 1.755, 1.893, 0.056, 0.377, 0.045, 1.004, 0.604, 0.005, 0.051, 2.643, 0.086, 0.75, 0.036, 0.173, 0.125, 0.135, 0.03, 0.065, 0.108, 0.011, 0.018, 0.005, 0.038, 0.005, 0.129, 0.036, 0.079, 0.041, 0.11, 0.022, 0.066, 0.107, 0.147, 0.782, 0.015, 0.082, 0.008, 0.088, 0.054, 0.476, 0.001, 0.089, 0.001, 0.039, 0.018, 0.892, 5.51, 0.98, 0.415, 1.888, 1.904, 2.436, 0.478, 0.679, 2.249, 0.486, 1.593, 2.459, 0.684, 3.034, 1.582, 0.744, 0.0001, 0.0001, 0.143, 0.011, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.003, 0.01, 0.001, 0.011, 0.002, 28.453, 13.514, 1.663, 0.515, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.001, 0.094, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "udm": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.306, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.09, 0.004, 0.114, 0.0001, 0.0001, 0.008, 0.0001, 0.002, 0.237, 0.238, 0.002, 0.001, 0.557, 0.317, 0.775, 0.018, 0.183, 0.302, 0.16, 0.086, 0.075, 0.092, 0.071, 0.074, 0.085, 0.189, 0.048, 0.012, 0.017, 0.014, 0.016, 0.001, 0.0001, 0.018, 0.008, 0.012, 0.004, 0.003, 0.003, 0.003, 0.003, 0.016, 0.004, 0.004, 0.006, 0.014, 0.003, 0.019, 0.021, 0.0001, 0.006, 0.011, 0.006, 0.003, 0.006, 0.001, 0.009, 0.001, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.242, 0.027, 0.103, 0.053, 0.195, 0.007, 0.026, 0.039, 0.148, 0.005, 0.015, 0.074, 0.03, 0.111, 0.083, 0.028, 0.002, 0.108, 0.083, 0.059, 0.078, 0.015, 0.004, 0.004, 0.02, 0.008, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 2.622, 2.823, 2.068, 1.727, 0.105, 0.092, 0.121, 0.28, 0.404, 0.054, 0.451, 2.424, 1.272, 0.932, 0.131, 0.626, 0.166, 0.634, 0.123, 0.164, 0.252, 0.027, 0.006, 0.023, 0.083, 0.009, 0.22, 0.069, 0.124, 0.088, 0.082, 0.223, 0.15, 0.209, 0.107, 0.132, 0.033, 0.405, 0.01, 0.179, 0.05, 0.004, 0.001, 0.088, 0.001, 0.03, 0.018, 0.022, 2.886, 0.44, 0.8, 0.564, 1.075, 2.236, 0.315, 1.165, 1.904, 0.34, 1.795, 2.214, 1.337, 2.854, 2.759, 0.664, 0.0001, 0.0001, 0.24, 0.028, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.023, 0.0001, 0.001, 0.0001, 25.262, 16.34, 0.005, 0.714, 0.0001, 0.005, 0.001, 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.006, 0.277, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ug": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.4, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.843, 0.005, 0.045, 0.0001, 0.0001, 0.006, 0.0001, 0.05, 0.059, 0.061, 0.001, 0.001, 0.064, 0.182, 0.431, 0.006, 0.116, 0.137, 0.086, 0.058, 0.051, 0.055, 0.044, 0.042, 0.045, 0.072, 0.055, 0.007, 0.018, 0.009, 0.017, 0.0001, 0.0001, 0.014, 0.005, 0.004, 0.003, 0.002, 0.001, 0.002, 0.002, 0.011, 0.008, 0.009, 0.003, 0.013, 0.002, 0.002, 0.005, 0.001, 0.002, 0.015, 0.014, 0.019, 0.001, 0.002, 0.002, 0.003, 0.0001, 0.003, 0.001, 0.003, 0.0001, 0.008, 0.0001, 0.198, 0.04, 0.041, 0.081, 0.144, 0.022, 0.07, 0.096, 0.317, 0.009, 0.06, 0.138, 0.069, 0.164, 0.09, 0.038, 0.044, 0.138, 0.091, 0.118, 0.088, 0.011, 0.018, 0.015, 0.072, 0.022, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.146, 0.075, 1.421, 1.142, 2.553, 1.322, 3.07, 1.622, 1.224, 6.252, 1.181, 0.454, 0.501, 0.027, 0.124, 0.02, 0.545, 0.041, 0.008, 0.046, 0.025, 2.705, 0.02, 0.099, 0.121, 0.09, 0.015, 0.082, 0.041, 0.012, 0.015, 0.06, 0.068, 0.006, 0.005, 0.06, 0.019, 0.028, 1.456, 3.601, 1.011, 0.28, 1.856, 0.056, 0.228, 0.623, 0.346, 2.099, 0.163, 2.119, 0.524, 1.075, 0.873, 0.045, 0.014, 0.035, 0.226, 0.052, 1.208, 0.825, 0.077, 0.089, 1.1, 0.024, 0.0001, 0.0001, 0.118, 0.051, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.765, 0.262, 0.112, 0.09, 0.0001, 0.0001, 0.0001, 0.001, 14.938, 17.649, 1.694, 5.905, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.067, 0.002, 0.002, 0.006, 0.003, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 1.731, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ur": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.979, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.161, 0.002, 0.04, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.157, 0.157, 0.0001, 0.001, 0.081, 0.085, 0.055, 0.007, 0.121, 0.179, 0.119, 0.082, 0.072, 0.073, 0.068, 0.065, 0.07, 0.096, 0.098, 0.002, 0.004, 0.003, 0.004, 0.0001, 0.0001, 0.02, 0.016, 0.035, 0.016, 0.006, 0.007, 0.013, 0.009, 0.011, 0.009, 0.012, 0.015, 0.025, 0.011, 0.007, 0.016, 0.003, 0.012, 0.029, 0.016, 0.005, 0.006, 0.007, 0.001, 0.005, 0.003, 0.004, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.265, 0.03, 0.059, 0.059, 0.181, 0.032, 0.039, 0.075, 0.194, 0.006, 0.027, 0.102, 0.048, 0.197, 0.175, 0.037, 0.004, 0.142, 0.109, 0.147, 0.083, 0.021, 0.026, 0.005, 0.049, 0.011, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.055, 2.387, 0.534, 0.013, 1.581, 2.193, 2.297, 0.009, 2.712, 0.004, 0.024, 0.012, 4.725, 0.004, 0.025, 0.025, 0.036, 0.091, 1.735, 0.008, 0.507, 0.001, 0.001, 0.002, 0.02, 0.012, 0.0001, 0.005, 0.005, 0.004, 0.001, 0.005, 0.009, 0.069, 0.224, 0.005, 0.08, 0.002, 0.401, 5.353, 1.186, 2.395, 1.412, 0.054, 0.699, 0.376, 0.232, 1.576, 0.068, 2.734, 0.325, 1.531, 0.466, 0.218, 0.1, 0.222, 0.073, 1.112, 0.88, 0.012, 0.002, 0.002, 1.074, 0.003, 0.0001, 0.0001, 0.008, 0.011, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 18.028, 10.547, 4.494, 8.618, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.001, 0.049, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.043, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "uz": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.321, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.468, 0.001, 0.189, 0.0001, 0.0001, 0.012, 0.0001, 0.019, 0.383, 0.392, 0.002, 0.002, 1.018, 0.346, 1.56, 0.012, 0.451, 0.539, 0.363, 0.217, 0.199, 0.207, 0.182, 0.168, 0.187, 0.31, 0.029, 0.042, 0.003, 0.005, 0.003, 0.002, 0.0001, 0.288, 0.177, 0.127, 0.096, 0.051, 0.092, 0.103, 0.072, 0.123, 0.042, 0.115, 0.075, 0.277, 0.092, 0.158, 0.088, 0.099, 0.095, 0.293, 0.135, 0.08, 0.063, 0.021, 0.043, 0.077, 0.019, 0.006, 0.0001, 0.006, 0.001, 0.001, 0.005, 11.395, 1.621, 0.663, 2.97, 1.946, 0.469, 2.488, 2.791, 9.732, 0.446, 2.32, 4.562, 2.354, 4.897, 4.652, 0.487, 1.34, 4.598, 3.575, 3.341, 2.208, 1.083, 0.027, 0.322, 2.128, 0.799, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.456, 0.006, 0.008, 0.004, 0.002, 0.001, 0.001, 0.001, 0.003, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.165, 0.164, 0.0001, 0.001, 0.001, 0.064, 0.017, 0.001, 0.002, 0.019, 0.002, 0.019, 0.002, 0.169, 0.003, 0.003, 0.0001, 0.002, 0.0001, 0.0001, 0.002, 0.007, 0.014, 0.0001, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.04, 0.006, 0.006, 0.01, 0.015, 0.009, 0.006, 0.002, 0.016, 0.002, 0.006, 0.916, 0.127, 0.009, 0.012, 0.002, 0.0001, 0.0001, 0.192, 0.06, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 1.018, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.124, 0.036, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.449, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ve": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.731, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.522, 0.012, 0.078, 0.0001, 0.0001, 0.001, 0.0001, 0.009, 0.159, 0.16, 0.0001, 0.001, 0.539, 0.225, 1.016, 0.019, 0.145, 0.2, 0.126, 0.043, 0.046, 0.05, 0.05, 0.043, 0.035, 0.051, 0.043, 0.011, 0.01, 0.003, 0.01, 0.007, 0.001, 0.246, 0.066, 0.041, 0.13, 0.054, 0.04, 0.046, 0.163, 0.081, 0.023, 0.129, 0.141, 0.422, 0.243, 0.021, 0.074, 0.002, 0.073, 0.154, 0.414, 0.061, 0.436, 0.032, 0.007, 0.055, 0.059, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 13.088, 1.237, 0.128, 2.934, 4.075, 0.966, 1.256, 7.989, 6.478, 0.01, 1.611, 2.964, 2.428, 5.855, 4.328, 0.793, 0.003, 1.372, 2.898, 2.532, 4.835, 2.93, 2.215, 0.021, 0.876, 1.698, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.04, 0.003, 0.001, 0.0001, 0.002, 0.021, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.005, 0.137, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.006, 0.001, 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.002, 0.001, 0.008, 0.001, 0.0001, 0.0001, 0.007, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.008, 0.049, 0.003, 0.004, 0.0001, 0.0001, 0.001, 0.0001, 0.157, 0.074, 0.001, 0.002, 0.0001, 0.026, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.017, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.002, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.231, 0.039, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "vec": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.253, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.683, 0.003, 0.435, 0.0001, 0.0001, 0.011, 0.001, 0.612, 0.188, 0.187, 0.0001, 0.002, 0.962, 0.099, 0.799, 0.015, 0.255, 0.324, 0.176, 0.103, 0.099, 0.11, 0.096, 0.095, 0.113, 0.179, 0.07, 0.031, 0.016, 0.004, 0.016, 0.001, 0.0001, 0.22, 0.135, 0.257, 0.11, 0.212, 0.092, 0.123, 0.029, 0.211, 0.028, 0.03, 0.164, 0.197, 0.115, 0.055, 0.192, 0.012, 0.112, 0.28, 0.113, 0.043, 0.127, 0.024, 0.034, 0.008, 0.022, 0.006, 0.0001, 0.006, 0.0001, 0.006, 0.0001, 9.014, 0.584, 2.527, 3.084, 9.08, 0.695, 1.267, 0.67, 6.478, 0.14, 0.121, 3.361, 1.486, 5.29, 5.96, 1.776, 0.156, 4.436, 3.403, 4.054, 1.601, 1.042, 0.044, 0.834, 0.071, 0.222, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.081, 0.084, 1.282, 0.004, 0.002, 0.002, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.003, 0.004, 0.001, 0.001, 0.002, 0.013, 0.001, 0.01, 0.002, 0.001, 0.001, 0.008, 0.004, 0.058, 0.055, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.74, 0.012, 0.002, 0.002, 0.005, 0.001, 0.002, 0.041, 0.204, 0.163, 0.002, 0.004, 0.188, 0.007, 0.001, 0.002, 0.019, 0.005, 0.113, 0.084, 0.004, 0.003, 0.003, 0.001, 0.003, 0.085, 0.013, 0.006, 0.006, 0.01, 0.027, 0.003, 0.0001, 0.0001, 0.074, 1.6, 0.013, 1.389, 0.061, 0.0001, 0.005, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.014, 0.007, 0.012, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.013, 0.075, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "vep": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.78, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.379, 0.003, 0.471, 0.0001, 0.001, 0.103, 0.0001, 0.568, 0.495, 0.495, 0.0001, 0.017, 1.052, 0.379, 1.489, 0.012, 0.568, 0.707, 0.478, 0.223, 0.214, 0.232, 0.198, 0.192, 0.203, 0.325, 0.211, 0.045, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.203, 0.112, 0.053, 0.077, 0.109, 0.05, 0.072, 0.067, 0.085, 0.066, 0.318, 0.157, 0.187, 0.127, 0.087, 0.197, 0.001, 0.106, 0.305, 0.17, 0.046, 0.359, 0.008, 0.005, 0.004, 0.023, 0.011, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 7.907, 0.771, 0.299, 4.189, 5.699, 0.182, 1.123, 1.305, 7.031, 1.198, 2.907, 3.562, 2.965, 5.97, 3.852, 1.33, 0.003, 2.724, 3.29, 3.069, 2.779, 1.746, 0.01, 0.004, 0.024, 0.95, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.243, 0.042, 0.031, 0.026, 0.016, 0.009, 0.007, 0.007, 0.018, 0.003, 0.008, 0.014, 0.04, 0.228, 0.004, 0.014, 0.011, 0.008, 0.007, 0.006, 0.198, 0.004, 0.004, 0.004, 0.004, 0.01, 0.011, 0.006, 0.059, 0.006, 0.007, 0.007, 0.049, 0.512, 0.005, 0.004, 1.459, 0.005, 0.005, 0.012, 0.007, 0.009, 0.006, 0.076, 0.003, 0.005, 0.006, 0.008, 0.087, 0.02, 0.049, 0.021, 0.019, 0.048, 0.155, 0.011, 0.041, 0.019, 0.037, 0.102, 0.539, 0.049, 0.808, 0.016, 0.0001, 0.0001, 0.208, 2.197, 0.255, 1.283, 0.0001, 0.0001, 0.0001, 0.018, 0.007, 0.013, 0.002, 0.001, 0.025, 0.012, 0.469, 0.173, 0.003, 0.003, 0.001, 0.006, 0.006, 0.011, 0.026, 0.019, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.026, 0.012, 0.203, 0.002, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "vls": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.228, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.739, 0.003, 0.38, 0.0001, 0.0001, 0.005, 0.003, 0.744, 0.196, 0.195, 0.001, 0.001, 0.727, 0.325, 0.943, 0.009, 0.279, 0.491, 0.2, 0.128, 0.127, 0.144, 0.128, 0.137, 0.161, 0.217, 0.083, 0.01, 0.008, 0.003, 0.008, 0.002, 0.0001, 0.184, 0.236, 0.118, 0.332, 0.112, 0.115, 0.126, 0.103, 0.261, 0.107, 0.122, 0.141, 0.163, 0.108, 0.113, 0.118, 0.004, 0.127, 0.191, 0.088, 0.03, 0.223, 0.122, 0.006, 0.022, 0.104, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 4.751, 0.962, 1.1, 3.988, 12.635, 0.533, 2.162, 1.118, 4.159, 0.386, 1.909, 2.864, 1.62, 7.645, 4.865, 1.022, 0.013, 4.762, 3.511, 4.63, 2.292, 1.812, 1.033, 0.041, 0.74, 0.83, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.13, 0.003, 0.003, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.008, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.015, 0.0001, 0.0001, 0.0001, 0.025, 0.093, 0.0001, 0.0001, 0.002, 0.002, 0.001, 0.001, 0.016, 0.003, 0.001, 0.001, 0.002, 0.001, 0.001, 0.004, 0.09, 0.034, 0.493, 0.075, 0.001, 0.002, 0.001, 0.006, 0.006, 0.003, 0.004, 0.004, 0.299, 0.002, 0.003, 0.001, 0.002, 0.001, 0.002, 0.002, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.02, 1.045, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.007, 0.004, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.13, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "vo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.865, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.101, 0.0001, 0.089, 0.0001, 0.177, 0.768, 0.0001, 0.013, 0.471, 0.471, 0.0001, 0.0001, 1.958, 0.301, 1.263, 0.002, 1.009, 1.484, 1.145, 0.885, 0.977, 0.988, 0.827, 0.571, 0.867, 0.731, 0.368, 0.112, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.099, 0.202, 0.186, 0.179, 0.034, 0.122, 0.068, 0.069, 0.028, 0.029, 0.035, 0.486, 0.223, 0.193, 0.038, 0.198, 0.004, 0.074, 0.506, 0.089, 0.221, 0.126, 0.048, 0.001, 0.008, 0.039, 0.004, 0.001, 0.005, 0.0001, 0.0001, 0.0001, 5.558, 2.077, 0.284, 2.834, 4.622, 1.332, 0.379, 0.28, 4.679, 0.128, 1.147, 4.377, 2.51, 5.854, 4.077, 1.175, 0.015, 1.237, 3.788, 2.427, 1.276, 0.657, 0.06, 0.029, 0.621, 0.304, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.73, 0.001, 0.0001, 0.005, 0.073, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.033, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.623, 0.0001, 0.0001, 0.045, 0.0001, 0.038, 0.009, 0.001, 0.006, 0.006, 0.01, 2.184, 0.0001, 0.0001, 0.003, 0.022, 0.052, 0.002, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.27, 0.001, 0.247, 0.003, 0.014, 0.006, 1.503, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 1.216, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.516, 5.121, 0.006, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.73, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "wa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.065, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.234, 0.018, 0.387, 0.0001, 0.0001, 0.001, 0.005, 1.403, 0.391, 0.397, 0.0001, 0.006, 1.323, 0.328, 1.748, 0.02, 0.212, 0.344, 0.172, 0.086, 0.07, 0.086, 0.076, 0.078, 0.098, 0.148, 0.393, 0.059, 0.003, 0.003, 0.006, 0.012, 0.0001, 0.126, 0.117, 0.176, 0.177, 0.152, 0.211, 0.071, 0.055, 0.154, 0.041, 0.016, 0.325, 0.219, 0.065, 0.097, 0.121, 0.003, 0.069, 0.125, 0.076, 0.016, 0.053, 0.079, 0.005, 0.007, 0.005, 0.103, 0.0001, 0.103, 0.0001, 0.0001, 0.0001, 4.343, 0.71, 2.121, 3.465, 9.326, 0.692, 0.491, 0.929, 5.047, 0.968, 0.844, 3.108, 1.647, 4.913, 4.614, 1.529, 0.028, 3.303, 5.504, 4.286, 1.947, 1.135, 0.682, 0.179, 1.059, 0.366, 0.0001, 0.075, 0.0001, 0.0001, 0.0001, 0.076, 0.002, 0.002, 0.001, 0.001, 0.022, 0.001, 0.008, 0.005, 0.003, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.065, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.001, 0.371, 0.002, 0.017, 0.001, 0.001, 0.706, 0.003, 0.089, 0.451, 0.662, 0.205, 0.03, 0.001, 0.001, 0.639, 0.002, 0.006, 0.002, 0.002, 0.001, 0.243, 0.004, 0.001, 0.001, 0.001, 0.001, 0.002, 0.257, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.478, 3.239, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.08, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "war": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.118, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.933, 0.0001, 1.377, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.008, 0.008, 0.0001, 0.0001, 0.432, 0.073, 1.214, 0.001, 0.079, 0.266, 0.062, 0.046, 0.041, 0.046, 0.05, 0.055, 0.111, 0.217, 0.037, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 1.082, 0.154, 0.38, 0.175, 0.141, 0.098, 0.127, 0.173, 0.102, 0.057, 0.046, 0.208, 0.316, 0.091, 0.096, 0.293, 0.004, 0.105, 0.232, 0.146, 0.033, 0.038, 0.367, 0.012, 0.008, 0.019, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.129, 0.835, 2.123, 1.488, 5.092, 0.584, 3.71, 3.47, 8.491, 0.033, 1.376, 3.841, 1.504, 9.228, 3.14, 2.313, 0.025, 2.807, 5.239, 2.428, 2.957, 0.216, 0.413, 0.116, 1.506, 0.106, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.002, 0.004, 0.019, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.004, 0.003, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.006, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.06, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "wo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.906, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.371, 0.007, 0.083, 0.0001, 0.0001, 0.002, 0.0001, 0.048, 0.243, 0.244, 0.0001, 0.001, 1.526, 0.299, 0.6, 0.011, 0.077, 0.162, 0.075, 0.048, 0.048, 0.043, 0.038, 0.041, 0.05, 0.065, 0.149, 0.021, 0.001, 0.005, 0.001, 0.009, 0.0001, 0.248, 0.196, 0.082, 0.079, 0.037, 0.083, 0.06, 0.026, 0.08, 0.079, 0.082, 0.102, 0.179, 0.109, 0.049, 0.052, 0.005, 0.054, 0.208, 0.113, 0.015, 0.012, 0.059, 0.037, 0.106, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 10.502, 2.142, 1.408, 2.296, 5.004, 0.815, 2.647, 0.171, 6.017, 1.265, 2.73, 3.516, 3.296, 5.064, 5.377, 0.616, 0.08, 2.151, 1.518, 2.39, 4.356, 0.021, 1.494, 1.066, 2.37, 0.019, 0.002, 0.0001, 0.004, 0.0001, 0.0001, 0.102, 0.006, 0.003, 0.003, 0.01, 0.005, 0.004, 0.003, 0.005, 0.001, 0.005, 0.02, 0.001, 0.001, 0.008, 0.002, 0.005, 0.039, 0.003, 0.026, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.041, 0.001, 0.0001, 0.016, 0.015, 0.0001, 0.0001, 0.641, 0.001, 0.002, 0.004, 0.002, 0.001, 0.001, 0.012, 0.011, 0.402, 0.004, 0.775, 0.001, 0.002, 0.001, 0.002, 0.004, 0.912, 0.013, 0.056, 0.002, 0.002, 0.001, 0.002, 0.003, 0.003, 0.002, 0.013, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.028, 2.826, 0.002, 0.019, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.004, 0.002, 0.016, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.007, 0.033, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.096, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "wuu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.208, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.344, 0.001, 0.064, 0.0001, 0.0001, 0.012, 0.001, 0.005, 0.037, 0.032, 0.001, 0.002, 0.029, 0.05, 0.042, 0.019, 0.267, 0.364, 0.21, 0.108, 0.106, 0.12, 0.107, 0.1, 0.123, 0.181, 0.013, 0.001, 0.013, 0.002, 0.013, 0.001, 0.0001, 0.027, 0.021, 0.029, 0.015, 0.013, 0.01, 0.014, 0.013, 0.018, 0.007, 0.011, 0.017, 0.022, 0.016, 0.01, 0.023, 0.002, 0.017, 0.03, 0.019, 0.009, 0.006, 0.008, 0.002, 0.003, 0.002, 0.03, 0.0001, 0.03, 0.0001, 0.003, 0.0001, 0.184, 0.024, 0.041, 0.051, 0.161, 0.019, 0.037, 0.056, 0.143, 0.005, 0.024, 0.082, 0.047, 0.138, 0.118, 0.028, 0.006, 0.111, 0.081, 0.088, 0.07, 0.016, 0.015, 0.01, 0.024, 0.008, 0.001, 0.002, 0.001, 0.001, 0.0001, 2.843, 1.238, 1.324, 0.655, 0.418, 1.022, 0.586, 0.937, 1.267, 1.305, 0.731, 1.421, 2.335, 0.988, 0.859, 1.016, 1.143, 0.568, 0.436, 0.439, 0.836, 0.673, 0.873, 1.003, 0.932, 0.655, 0.691, 1.033, 1.591, 0.82, 0.469, 0.875, 0.536, 0.577, 0.431, 0.453, 0.911, 0.859, 0.578, 0.722, 0.777, 0.496, 1.371, 0.496, 0.553, 1.219, 0.891, 1.125, 1.185, 0.888, 0.563, 0.66, 0.876, 0.472, 0.61, 0.726, 3.021, 1.231, 1.855, 1.189, 2.708, 1.052, 0.869, 1.001, 0.0001, 0.0001, 0.059, 0.019, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.005, 0.002, 0.002, 0.002, 0.0001, 0.011, 0.004, 0.02, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.011, 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.068, 0.005, 0.208, 1.565, 4.388, 9.361, 5.679, 3.099, 2.882, 2.131, 0.002, 0.004, 0.008, 0.002, 0.0001, 1.953, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "xal": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.801, 0.002, 0.076, 0.0001, 0.0001, 0.005, 0.0001, 0.002, 0.134, 0.134, 0.001, 0.003, 0.529, 0.574, 0.918, 0.006, 0.214, 0.423, 0.268, 0.17, 0.177, 0.128, 0.129, 0.128, 0.121, 0.185, 0.028, 0.007, 0.006, 0.001, 0.006, 0.006, 0.0001, 0.005, 0.004, 0.004, 0.001, 0.002, 0.002, 0.002, 0.002, 0.006, 0.001, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.005, 0.003, 0.001, 0.002, 0.003, 0.004, 0.001, 0.001, 0.005, 0.0001, 0.006, 0.0001, 0.005, 0.0001, 0.064, 0.016, 0.035, 0.026, 0.079, 0.017, 0.024, 0.144, 0.059, 0.003, 0.012, 0.04, 0.028, 0.059, 0.05, 0.015, 0.002, 0.048, 0.045, 0.048, 0.035, 0.008, 0.009, 0.006, 0.012, 0.006, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 2.512, 1.678, 1.585, 1.178, 0.036, 0.859, 0.336, 0.487, 0.211, 0.008, 0.012, 0.272, 0.319, 0.492, 0.054, 0.135, 0.09, 0.152, 0.041, 0.073, 0.19, 0.017, 0.022, 0.69, 0.054, 1.446, 0.115, 0.043, 0.168, 0.153, 0.159, 0.053, 0.055, 0.105, 0.151, 0.242, 0.028, 0.118, 0.031, 0.02, 0.093, 0.554, 0.004, 0.02, 0.002, 0.072, 0.031, 0.849, 3.75, 1.252, 0.825, 1.816, 2.139, 1.256, 0.115, 0.387, 2.666, 0.446, 0.987, 3.364, 1.079, 4.101, 2.147, 0.166, 0.0001, 0.0001, 0.041, 0.006, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.038, 0.0001, 0.0001, 0.004, 0.0001, 0.007, 0.004, 27.749, 10.017, 2.264, 1.98, 0.0001, 0.003, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.035, 0.127, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "xh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.827, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.133, 0.013, 0.259, 0.004, 0.001, 0.009, 0.002, 0.046, 0.125, 0.123, 0.001, 0.005, 0.846, 0.831, 0.912, 0.026, 0.163, 0.218, 0.112, 0.059, 0.052, 0.058, 0.048, 0.051, 0.067, 0.118, 0.048, 0.023, 0.018, 0.006, 0.018, 0.006, 0.0001, 0.218, 0.122, 0.114, 0.05, 0.111, 0.054, 0.063, 0.043, 0.32, 0.057, 0.15, 0.086, 0.186, 0.216, 0.074, 0.101, 0.011, 0.057, 0.136, 0.094, 0.198, 0.022, 0.071, 0.041, 0.042, 0.046, 0.076, 0.001, 0.076, 0.0001, 0.013, 0.0001, 10.703, 2.404, 0.805, 1.231, 8.068, 0.529, 2.029, 3.142, 7.484, 0.244, 4.325, 4.529, 2.518, 6.863, 5.226, 0.943, 0.434, 1.064, 2.867, 2.574, 4.687, 0.307, 2.513, 0.353, 2.341, 2.213, 0.002, 0.028, 0.002, 0.0001, 0.0001, 0.043, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.004, 0.012, 0.003, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.004, 0.01, 0.003, 0.0001, 0.0001, 0.001, 0.003, 0.018, 0.0001, 0.0001, 0.005, 0.005, 0.0001, 0.001, 0.1, 0.005, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.003, 0.001, 0.007, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.101, 0.03, 0.014, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.049, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "xmf": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.601, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.701, 0.001, 0.058, 0.0001, 0.0001, 0.01, 0.0001, 0.002, 0.121, 0.121, 0.0001, 0.001, 0.458, 0.166, 0.464, 0.005, 0.164, 0.192, 0.121, 0.06, 0.056, 0.064, 0.055, 0.055, 0.065, 0.102, 0.028, 0.018, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.008, 0.006, 0.008, 0.007, 0.003, 0.004, 0.003, 0.003, 0.027, 0.001, 0.002, 0.006, 0.007, 0.003, 0.003, 0.005, 0.0001, 0.004, 0.007, 0.009, 0.002, 0.008, 0.003, 0.01, 0.001, 0.0001, 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.0001, 0.041, 0.006, 0.016, 0.012, 0.042, 0.004, 0.007, 0.012, 0.032, 0.001, 0.006, 0.021, 0.011, 0.029, 0.03, 0.007, 0.001, 0.029, 0.023, 0.023, 0.015, 0.005, 0.003, 0.002, 0.006, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.172, 0.003, 0.002, 30.333, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 4.083, 0.506, 0.555, 0.957, 2.283, 0.421, 0.156, 0.803, 3.59, 0.653, 1.19, 1.236, 1.788, 2.02, 0.312, 0.098, 2.097, 1.217, 0.638, 1.469, 0.698, 0.389, 0.172, 0.093, 1.339, 0.152, 0.183, 0.083, 0.259, 0.102, 0.41, 0.184, 0.054, 0.009, 0.013, 0.002, 0.001, 0.003, 0.001, 0.323, 0.062, 0.002, 0.002, 0.002, 0.002, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.043, 0.004, 0.001, 0.001, 0.007, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.011, 0.002, 0.023, 0.008, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 30.332, 0.17, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "yi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.709, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.298, 0.002, 0.186, 0.0001, 0.001, 0.004, 0.006, 0.121, 0.075, 0.076, 0.0001, 0.0001, 0.466, 0.059, 0.46, 0.006, 0.099, 0.114, 0.062, 0.037, 0.035, 0.037, 0.03, 0.03, 0.038, 0.064, 0.034, 0.015, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.003, 0.003, 0.004, 0.003, 0.002, 0.002, 0.002, 0.002, 0.002, 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.002, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.02, 0.003, 0.006, 0.007, 0.022, 0.003, 0.004, 0.006, 0.017, 0.0001, 0.003, 0.01, 0.006, 0.015, 0.021, 0.004, 0.006, 0.015, 0.011, 0.018, 0.013, 0.002, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.004, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 5.002, 1.068, 1.228, 1.611, 0.814, 3.904, 1.071, 0.178, 2.364, 5.673, 0.275, 0.347, 1.459, 0.389, 1.018, 2.472, 1.73, 1.057, 4.356, 0.098, 1.356, 0.06, 0.547, 0.832, 3.227, 0.975, 0.239, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.02, 0.006, 0.026, 0.005, 0.016, 0.005, 0.002, 0.163, 0.104, 0.003, 0.002, 0.002, 0.041, 0.002, 0.022, 0.034, 0.0001, 0.0001, 0.015, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.029, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.372, 43.367, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "yo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.162, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.013, 0.002, 0.102, 0.0001, 0.001, 0.004, 0.001, 0.025, 0.251, 0.249, 0.0001, 0.001, 0.499, 0.259, 1.047, 0.013, 0.386, 0.744, 0.471, 0.336, 0.305, 0.301, 0.323, 0.299, 0.314, 0.417, 0.09, 0.08, 0.008, 0.009, 0.008, 0.006, 0.0001, 0.462, 0.171, 0.128, 0.102, 0.134, 0.101, 0.156, 0.11, 0.251, 0.116, 0.194, 0.108, 0.188, 0.187, 0.263, 0.133, 0.007, 0.102, 0.27, 0.148, 0.037, 0.042, 0.07, 0.006, 0.044, 0.016, 0.007, 0.0001, 0.008, 0.0001, 0.001, 0.001, 4.068, 1.959, 0.507, 1.515, 3.958, 0.547, 1.326, 0.747, 4.508, 1.331, 1.562, 2.445, 1.011, 4.469, 3.265, 1.008, 0.02, 3.063, 1.958, 2.732, 1.408, 0.219, 0.852, 0.039, 0.732, 0.092, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.678, 1.441, 0.002, 0.002, 0.064, 0.002, 0.001, 0.002, 0.025, 0.003, 0.001, 0.001, 0.172, 1.046, 0.0001, 0.0001, 0.001, 0.001, 0.032, 0.052, 0.002, 0.0001, 0.0001, 0.0001, 0.018, 0.066, 0.002, 0.001, 0.007, 0.006, 0.0001, 0.001, 1.085, 1.316, 0.01, 0.17, 0.004, 0.001, 0.001, 0.003, 0.307, 0.812, 0.001, 0.003, 1.559, 1.199, 0.001, 0.002, 0.003, 0.004, 0.287, 0.374, 0.003, 0.002, 0.006, 0.001, 0.038, 1.787, 1.887, 1.09, 0.005, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.021, 7.862, 0.009, 0.075, 0.0001, 0.008, 0.0001, 0.001, 0.001, 0.001, 1.898, 0.0001, 0.005, 0.002, 0.012, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 2.718, 0.12, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "za": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.779, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.452, 0.003, 0.07, 0.0001, 0.001, 0.016, 0.002, 0.054, 0.186, 0.179, 0.001, 0.0001, 0.82, 0.089, 0.74, 0.012, 0.236, 0.344, 0.171, 0.097, 0.104, 0.109, 0.078, 0.094, 0.113, 0.172, 0.091, 0.029, 0.001, 0.001, 0.002, 0.003, 0.0001, 0.117, 0.253, 0.245, 0.236, 0.047, 0.096, 0.232, 0.128, 0.101, 0.031, 0.049, 0.109, 0.142, 0.114, 0.031, 0.114, 0.005, 0.051, 0.316, 0.07, 0.028, 0.136, 0.041, 0.012, 0.157, 0.02, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 4.452, 1.127, 1.557, 2.16, 5.66, 0.54, 3.525, 2.807, 4.357, 1.245, 0.519, 1.215, 1.057, 5.149, 2.46, 0.332, 0.75, 1.554, 1.842, 1.639, 2.859, 0.55, 1.169, 0.375, 1.034, 2.115, 0.002, 0.0001, 0.002, 0.001, 0.0001, 1.059, 0.53, 0.446, 0.215, 0.472, 0.297, 0.257, 0.268, 0.372, 0.375, 0.213, 0.338, 0.751, 0.361, 0.284, 0.332, 0.27, 0.144, 0.117, 0.272, 0.266, 0.278, 0.305, 0.293, 0.26, 0.335, 0.49, 0.247, 0.537, 0.19, 0.142, 0.27, 0.209, 0.19, 0.122, 0.13, 0.301, 0.259, 0.231, 0.235, 0.283, 0.134, 0.154, 0.156, 0.162, 0.375, 0.302, 0.377, 0.293, 0.227, 0.124, 0.201, 0.231, 0.092, 0.229, 0.184, 0.748, 0.296, 0.646, 0.455, 0.756, 0.262, 0.268, 0.277, 0.0001, 0.0001, 0.072, 0.167, 0.018, 0.011, 0.0001, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.006, 0.002, 0.014, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.01, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.022, 0.008, 0.114, 0.555, 1.309, 2.559, 1.698, 1.364, 0.916, 0.712, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.518, 0.001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "zea": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.532, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.056, 0.008, 0.162, 0.0001, 0.0001, 0.007, 0.001, 1.415, 0.162, 0.162, 0.0001, 0.0001, 1.0, 0.532, 1.127, 0.004, 0.395, 0.563, 0.389, 0.394, 0.405, 0.319, 0.329, 0.24, 0.265, 0.382, 0.062, 0.076, 0.002, 0.003, 0.001, 0.008, 0.0001, 0.28, 0.228, 0.122, 0.346, 0.208, 0.185, 0.11, 0.117, 0.317, 0.071, 0.084, 0.154, 0.152, 0.245, 0.188, 0.145, 0.004, 0.099, 0.307, 0.104, 0.026, 0.15, 0.089, 0.002, 0.005, 0.114, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 4.665, 0.916, 0.779, 3.731, 13.123, 0.39, 1.695, 1.202, 4.867, 0.455, 1.861, 2.604, 1.621, 7.033, 3.935, 1.063, 0.011, 4.601, 3.105, 3.908, 1.82, 1.832, 0.958, 0.04, 0.135, 0.573, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.482, 0.005, 0.003, 0.002, 0.003, 0.002, 0.001, 0.001, 0.002, 0.005, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.005, 0.003, 0.001, 0.0001, 0.001, 0.021, 0.432, 0.001, 0.001, 0.01, 0.009, 0.003, 0.005, 0.009, 0.008, 0.021, 0.001, 0.002, 0.001, 0.003, 0.005, 0.09, 0.052, 0.453, 0.056, 0.009, 0.006, 0.003, 0.006, 0.115, 0.002, 0.14, 0.027, 0.252, 0.001, 0.064, 0.0001, 0.002, 0.002, 0.002, 0.006, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.239, 1.084, 0.009, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.007, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.481, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "zu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.261, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.94, 0.004, 0.267, 0.001, 0.002, 0.016, 0.003, 0.041, 0.181, 0.181, 0.001, 0.001, 0.907, 0.49, 0.797, 0.099, 0.343, 0.379, 0.279, 0.134, 0.118, 0.116, 0.102, 0.097, 0.11, 0.223, 0.065, 0.035, 0.134, 0.003, 0.135, 0.005, 0.0001, 0.296, 0.147, 0.142, 0.093, 0.11, 0.08, 0.077, 0.065, 0.3, 0.114, 0.141, 0.151, 0.361, 0.387, 0.067, 0.128, 0.012, 0.082, 0.239, 0.152, 0.188, 0.039, 0.182, 0.012, 0.045, 0.07, 0.138, 0.0001, 0.139, 0.0001, 0.001, 0.0001, 10.325, 2.215, 0.829, 1.627, 7.521, 0.687, 2.042, 3.525, 7.719, 0.199, 3.874, 4.421, 2.406, 6.494, 4.881, 0.951, 0.342, 1.361, 3.011, 2.552, 4.691, 0.394, 2.227, 0.134, 1.688, 1.779, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.08, 0.007, 0.001, 0.001, 0.002, 0.0001, 0.014, 0.002, 0.002, 0.001, 0.0001, 0.001, 0.003, 0.005, 0.001, 0.002, 0.002, 0.014, 0.001, 0.01, 0.003, 0.0001, 0.001, 0.001, 0.002, 0.06, 0.0001, 0.001, 0.003, 0.003, 0.001, 0.0001, 0.084, 0.004, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.004, 0.002, 0.005, 0.003, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.004, 0.003, 0.003, 0.005, 0.002, 0.002, 0.001, 0.006, 0.005, 0.002, 0.003, 0.005, 0.002, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.089, 0.024, 0.004, 0.007, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.029, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.091, 0.001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], + "aa": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.161, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.548, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.452, + 0.645, 0.645, 2.581, 9.032, 0.0001, 5.161, 3.871, 5.806, 0.0001, 1.935, 2.581, 1.29, 5.161, 2.581, 1.29, 0.0001, + 4.516, 0.645, 3.226, 0.645, 0.0001, 1.29, 0.0001, 0.645, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 2.581, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.645, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.871, 0.645, 2.581, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "ab": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.925, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.477, 0.003, 0.06, 0.0001, 0.0001, 0.005, 0.0001, 0.013, 0.269, 0.273, 0.001, + 0.001, 0.518, 0.306, 0.76, 0.006, 0.291, 0.709, 0.42, 0.294, 0.242, 0.237, 0.242, 0.222, 0.25, 0.32, 0.04, + 0.028, 0.008, 0.0001, 0.008, 0.002, 0.0001, 0.004, 0.004, 0.004, 0.006, 0.001, 0.002, 0.001, 0.001, 0.033, + 0.012, 0.001, 0.001, 0.002, 0.001, 0.011, 0.003, 0.0001, 0.002, 0.009, 0.002, 0.002, 0.007, 0.006, 0.01, 0.0001, + 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.679, 0.013, 0.02, 0.028, 0.073, 0.002, 0.006, 0.01, + 0.057, 0.001, 0.005, 0.035, 0.039, 0.025, 0.031, 0.027, 0.011, 0.045, 0.036, 0.027, 0.037, 0.009, 0.002, 0.01, + 0.027, 0.004, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 3.029, 1.109, 1.569, 1.131, 0.085, 0.805, 0.262, 0.083, + 0.992, 0.002, 0.003, 2.495, 0.791, 0.003, 0.006, 0.03, 0.654, 0.059, 0.04, 0.137, 0.332, 0.075, 0.041, 0.012, + 0.142, 2.586, 0.087, 1.002, 0.086, 0.047, 0.045, 0.323, 0.073, 0.328, 0.016, 0.067, 0.011, 0.052, 0.054, 0.455, + 0.024, 0.199, 0.0001, 0.026, 0.015, 0.539, 0.001, 0.001, 7.771, 0.517, 0.209, 1.034, 0.683, 1.368, 0.238, 0.686, + 3.093, 0.042, 0.729, 1.305, 0.754, 1.868, 1.136, 0.676, 0.0001, 0.0001, 0.065, 0.019, 0.003, 0.002, 0.0001, + 0.0001, 0.0001, 0.002, 0.004, 0.001, 0.155, 0.0001, 0.005, 0.002, 22.83, 11.878, 3.39, 2.86, 0.019, 0.007, + 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.386, 0.0001, + 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ace": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.36, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.198, 0.0001, 0.137, 0.0001, 0.001, 0.007, 0.0001, 0.256, 0.125, 0.125, + 0.0001, 0.0001, 1.042, 0.179, 1.302, 0.01, 0.401, 0.568, 0.284, 0.118, 0.113, 0.112, 0.099, 0.093, 0.097, 0.13, + 0.041, 0.007, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.777, 0.587, 0.153, 0.133, 0.028, 0.036, 0.256, 0.095, 0.205, + 0.159, 0.483, 0.331, 0.444, 0.183, 0.028, 0.481, 0.019, 0.179, 0.473, 0.324, 0.101, 0.026, 0.042, 0.006, 0.021, + 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 11.224, 1.773, 0.851, 1.583, 5.304, 0.086, 3.693, 3.458, + 3.728, 0.528, 2.425, 2.037, 2.4, 8.165, 2.618, 1.607, 0.015, 2.485, 1.74, 2.806, 6.018, 0.112, 0.344, 0.01, + 1.486, 0.04, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.039, 0.008, 0.005, 0.009, 0.016, 0.007, 0.006, 0.006, + 0.01, 0.004, 0.008, 0.003, 0.002, 0.004, 0.012, 0.004, 0.007, 0.003, 0.004, 0.014, 0.002, 0.001, 0.001, 0.002, + 0.004, 0.016, 0.001, 0.001, 0.002, 0.002, 0.001, 0.007, 0.007, 0.006, 0.003, 0.008, 0.005, 0.002, 0.001, 0.019, + 1.193, 0.401, 0.007, 0.574, 0.003, 0.006, 0.002, 0.006, 0.025, 0.011, 0.006, 0.008, 0.873, 0.004, 0.151, 0.002, + 0.005, 0.005, 0.008, 0.007, 0.004, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.025, 3.205, 0.014, 0.012, 0.001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.001, 0.012, 0.005, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.061, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.011, 0.039, 0.001, + 0.001, 0.005, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ady": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.142, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.359, 0.001, 0.089, 0.0001, 0.0001, 0.003, 0.0001, 0.006, 0.111, 0.11, 0.001, + 0.001, 0.645, 0.309, 0.862, 0.007, 0.118, 0.279, 0.082, 0.059, 0.052, 0.055, 0.051, 0.045, 0.057, 0.071, 0.053, + 0.011, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.008, 0.007, 0.003, 0.003, 0.002, 0.003, 0.0001, 0.002, 1.228, + 0.004, 0.001, 0.003, 0.004, 0.002, 0.004, 0.005, 0.0001, 0.001, 0.006, 0.003, 0.002, 0.004, 0.002, 0.008, + 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.001, 0.0001, 0.05, 0.009, 0.016, 0.02, 0.067, 0.009, 0.011, + 0.022, 0.046, 0.001, 0.006, 0.031, 0.02, 0.036, 0.037, 0.013, 0.0001, 0.038, 0.031, 0.043, 0.016, 0.004, 0.008, + 0.003, 0.011, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.778, 0.778, 1.192, 2.098, 0.406, 1.886, 0.203, + 0.188, 0.585, 0.672, 2.887, 2.927, 0.717, 6.004, 0.019, 0.21, 0.317, 0.122, 0.019, 0.226, 0.145, 0.045, 0.02, + 0.041, 0.09, 0.005, 0.262, 0.059, 0.092, 0.079, 0.053, 0.07, 0.076, 0.092, 0.086, 0.055, 0.029, 0.124, 0.039, + 0.031, 0.045, 0.011, 0.0001, 0.031, 0.0001, 0.018, 0.005, 0.018, 2.762, 0.645, 0.171, 1.681, 0.855, 1.134, 0.39, + 0.89, 1.618, 0.147, 1.755, 1.169, 1.845, 1.192, 0.989, 0.792, 0.0001, 0.0001, 0.094, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.0001, 0.003, 0.004, 0.0001, 0.0001, 20.033, 23.044, 0.001, 0.227, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, + 0.229, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "af": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.732, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.494, 0.002, 0.361, 0.0001, 0.001, 0.008, 0.001, 0.297, 0.136, 0.136, 0.002, + 0.001, 0.651, 0.269, 0.893, 0.01, 0.25, 0.371, 0.17, 0.095, 0.09, 0.104, 0.09, 0.086, 0.122, 0.213, 0.049, + 0.019, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.241, 0.154, 0.103, 0.382, 0.093, 0.072, 0.119, 0.168, 0.14, 0.087, + 0.137, 0.088, 0.157, 0.131, 0.103, 0.129, 0.004, 0.104, 0.29, 0.11, 0.03, 0.115, 0.083, 0.006, 0.008, 0.015, + 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 6.202, 1.128, 0.17, 4.12, 13.284, 0.609, 2.484, 1.201, 6.602, 0.17, + 2.299, 2.976, 1.671, 6.221, 4.571, 1.147, 0.006, 5.197, 4.908, 4.263, 1.7, 1.691, 1.336, 0.018, 0.832, 0.043, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.182, 0.005, 0.004, 0.003, 0.002, 0.001, 0.001, 0.001, 0.003, 0.002, + 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.024, 0.002, 0.001, 0.001, 0.001, 0.003, 0.118, + 0.001, 0.001, 0.017, 0.016, 0.001, 0.001, 0.076, 0.018, 0.001, 0.005, 0.004, 0.002, 0.002, 0.003, 0.003, 0.032, + 0.053, 0.119, 0.001, 0.004, 0.001, 0.014, 0.007, 0.003, 0.004, 0.007, 0.002, 0.003, 0.005, 0.001, 0.005, 0.002, + 0.003, 0.003, 0.007, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.084, 0.264, 0.004, 0.005, 0.0001, 0.0001, 0.0001, + 0.003, 0.002, 0.003, 0.001, 0.0001, 0.009, 0.004, 0.022, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.181, 0.0001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ak": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.856, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 17.14, 0.001, 0.181, 0.0001, 0.002, 0.004, 0.001, 0.124, 0.134, 0.137, 0.001, + 0.0001, 0.719, 0.119, 1.218, 0.014, 0.179, 0.257, 0.137, 0.052, 0.061, 0.075, 0.065, 0.054, 0.059, 0.197, 0.031, + 0.029, 0.002, 0.015, 0.002, 0.018, 0.0001, 0.566, 0.167, 0.173, 0.118, 0.172, 0.085, 0.258, 0.093, 0.098, 0.056, + 0.193, 0.111, 0.204, 0.399, 0.102, 0.121, 0.012, 0.083, 0.271, 0.145, 0.084, 0.04, 0.206, 0.011, 0.078, 0.02, + 0.025, 0.0001, 0.025, 0.0001, 0.0001, 0.0001, 10.911, 1.752, 0.404, 1.704, 5.791, 1.18, 0.501, 1.542, 4.479, + 0.04, 1.975, 0.667, 3.211, 7.434, 5.302, 0.888, 0.03, 2.693, 2.695, 1.838, 2.674, 0.126, 2.695, 0.023, 2.4, + 0.077, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.046, 0.01, 0.002, 0.005, 0.002, 0.006, 0.095, 0.003, 0.01, + 0.003, 0.006, 0.011, 0.002, 0.017, 0.002, 0.004, 0.052, 0.011, 0.001, 0.002, 1.774, 0.002, 0.002, 0.001, 0.0001, + 0.02, 0.0001, 1.749, 0.01, 0.01, 0.0001, 0.0001, 0.151, 0.004, 0.001, 0.002, 0.006, 0.022, 0.001, 0.003, 0.005, + 0.01, 0.002, 0.003, 0.002, 0.005, 0.001, 0.003, 0.01, 0.006, 0.005, 0.012, 0.015, 0.552, 0.007, 0.003, 0.008, + 0.006, 0.006, 0.392, 0.013, 0.005, 0.007, 0.004, 0.0001, 0.0001, 0.146, 0.054, 0.004, 0.004, 0.139, 0.0001, + 0.0001, 3.532, 0.002, 0.008, 0.003, 0.34, 0.547, 0.0001, 0.045, 0.018, 0.0001, 0.0001, 0.018, 0.055, 0.008, + 0.002, 0.016, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.048, 0.037, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "als": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.981, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.805, 0.003, 0.368, 0.0001, 0.0001, 0.09, 0.001, 0.06, 0.177, 0.177, 0.009, + 0.001, 0.909, 0.215, 1.001, 0.022, 0.318, 0.46, 0.232, 0.128, 0.122, 0.132, 0.116, 0.119, 0.142, 0.206, 0.063, + 0.024, 0.004, 0.003, 0.004, 0.001, 0.0001, 0.315, 0.452, 0.163, 0.512, 0.205, 0.236, 0.319, 0.219, 0.188, 0.156, + 0.222, 0.212, 0.32, 0.172, 0.112, 0.199, 0.01, 0.225, 0.653, 0.132, 0.131, 0.173, 0.23, 0.004, 0.019, 0.129, + 0.009, 0.0001, 0.009, 0.0001, 0.003, 0.001, 3.964, 1.276, 2.626, 3.453, 8.363, 1.057, 2.308, 3.744, 6.377, + 0.069, 0.66, 2.78, 2.213, 4.452, 3.12, 0.516, 0.012, 5.572, 4.629, 4.341, 2.669, 0.935, 0.979, 0.046, 0.315, + 0.925, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.124, 0.003, 0.002, 0.002, 0.034, 0.001, 0.001, 0.001, 0.005, + 0.003, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.023, 0.002, 0.001, 0.01, 0.001, + 0.003, 0.02, 0.003, 0.002, 0.048, 0.001, 0.034, 0.042, 0.156, 0.005, 0.005, 0.003, 1.018, 0.003, 0.001, 0.003, + 0.354, 0.039, 0.002, 0.022, 0.079, 0.004, 0.001, 0.002, 0.004, 0.003, 0.015, 0.003, 0.029, 0.017, 0.333, 0.001, + 0.002, 0.045, 0.004, 0.015, 0.5, 0.004, 0.001, 0.002, 0.0001, 0.0001, 0.108, 2.635, 0.006, 0.005, 0.0001, 0.005, + 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.011, 0.005, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.12, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "am": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.067, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.441, 0.005, 0.08, 0.001, 0.0001, 0.003, 0.0001, 0.013, 0.12, 0.121, 0.002, + 0.001, 0.021, 0.111, 0.25, 0.041, 0.102, 0.167, 0.089, 0.049, 0.044, 0.048, 0.044, 0.043, 0.057, 0.081, 0.018, + 0.001, 0.048, 0.019, 0.048, 0.008, 0.0001, 0.009, 0.005, 0.007, 0.005, 0.005, 0.004, 0.003, 0.003, 0.004, 0.004, + 0.002, 0.003, 0.006, 0.003, 0.002, 0.004, 0.001, 0.003, 0.007, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, + 0.017, 0.0001, 0.02, 0.0001, 0.007, 0.0001, 0.059, 0.06, 0.021, 0.018, 0.066, 0.009, 0.014, 0.02, 0.05, 0.001, + 0.005, 0.029, 0.021, 0.042, 0.045, 0.014, 0.001, 0.09, 0.032, 0.04, 0.026, 0.005, 0.007, 0.003, 0.012, 0.002, + 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.402, 0.178, 0.052, 0.194, 0.053, 0.478, 0.259, 0.003, 10.51, 5.557, + 5.996, 6.414, 2.305, 3.741, 0.258, 0.015, 0.706, 0.091, 0.071, 0.613, 0.064, 1.598, 0.107, 0.008, 0.907, 0.126, + 0.312, 0.688, 0.12, 0.989, 0.129, 0.009, 2.006, 0.213, 0.679, 0.599, 0.206, 1.204, 0.134, 0.012, 1.72, 0.213, + 0.231, 1.059, 0.087, 1.793, 0.284, 0.013, 1.151, 0.255, 0.312, 0.726, 0.115, 2.127, 0.177, 0.025, 0.19, 0.059, + 0.032, 0.208, 0.015, 0.466, 0.016, 0.003, 0.0001, 0.0001, 0.096, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.005, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, + 0.017, 0.046, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 29.467, 0.047, 0.001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.001, 0.0001, 0.017, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "an": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.253, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.49, 0.005, 0.725, 0.0001, 0.0001, 0.005, 0.001, 0.998, 0.246, 0.246, 0.002, + 0.002, 1.083, 0.164, 0.685, 0.057, 0.291, 0.382, 0.213, 0.125, 0.12, 0.124, 0.115, 0.119, 0.131, 0.221, 0.057, + 0.029, 0.007, 0.01, 0.006, 0.001, 0.0001, 0.411, 0.169, 0.298, 0.091, 0.216, 0.095, 0.1, 0.059, 0.154, 0.037, + 0.024, 0.177, 0.199, 0.072, 0.146, 0.19, 0.011, 0.122, 0.227, 0.128, 0.065, 0.101, 0.021, 0.037, 0.032, 0.028, + 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 9.483, 1.074, 3.3, 3.436, 7.765, 0.618, 0.822, 0.72, 5.365, 0.027, + 0.17, 3.124, 1.916, 5.869, 6.23, 1.654, 0.435, 4.741, 4.813, 3.981, 2.96, 0.573, 0.028, 0.256, 1.248, 0.309, + 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.014, 0.007, 0.003, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.002, + 0.001, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, + 0.001, 0.001, 0.002, 0.001, 0.0001, 0.002, 0.028, 0.174, 0.002, 0.002, 0.003, 0.001, 0.001, 0.008, 0.012, 0.227, + 0.002, 0.014, 0.002, 0.209, 0.001, 0.002, 0.004, 0.013, 0.086, 0.54, 0.002, 0.002, 0.003, 0.002, 0.004, 0.002, + 0.027, 0.014, 0.019, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.127, 1.249, 0.007, 0.007, 0.0001, 0.0001, 0.001, + 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.009, 0.005, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, + 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.013, 0.0001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ang": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.542, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.629, 0.001, 0.406, 0.001, 0.001, 0.005, 0.001, 0.041, 0.166, 0.166, 0.001, + 0.001, 0.772, 0.085, 0.973, 0.007, 0.229, 0.292, 0.152, 0.081, 0.082, 0.095, 0.083, 0.089, 0.101, 0.139, 0.058, + 0.032, 0.011, 0.001, 0.011, 0.001, 0.0001, 0.204, 0.193, 0.317, 0.089, 0.179, 0.148, 0.229, 0.279, 0.189, 0.034, + 0.031, 0.128, 0.195, 0.168, 0.087, 0.103, 0.007, 0.125, 0.419, 0.122, 0.043, 0.034, 0.145, 0.006, 0.012, 0.007, + 0.02, 0.0001, 0.02, 0.0001, 0.0001, 0.0001, 5.666, 0.997, 2.318, 3.22, 8.139, 1.491, 2.061, 1.574, 3.89, 0.022, + 0.109, 2.731, 2.332, 6.4, 3.389, 0.62, 0.014, 4.435, 4.532, 3.015, 1.701, 0.127, 1.341, 0.09, 0.658, 0.04, + 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.032, 0.62, 0.006, 0.006, 0.004, 0.003, 0.052, 0.002, 0.001, 0.001, + 0.002, 0.033, 0.008, 0.478, 0.002, 0.002, 0.01, 0.003, 0.05, 1.069, 0.004, 0.001, 0.004, 0.002, 0.003, 0.003, + 0.011, 0.012, 0.009, 0.068, 0.141, 0.003, 0.009, 0.037, 0.013, 0.751, 0.006, 0.002, 1.085, 0.003, 0.002, 0.01, + 0.039, 0.996, 0.002, 0.008, 0.002, 0.002, 0.371, 0.007, 0.005, 0.069, 0.002, 0.003, 0.002, 0.008, 0.006, 0.003, + 0.005, 0.004, 0.005, 0.004, 2.003, 0.078, 0.0001, 0.0001, 0.009, 3.7, 2.566, 0.742, 0.075, 0.766, 0.127, 0.001, + 0.001, 0.0001, 0.001, 0.0001, 0.012, 0.006, 0.017, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.006, + 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.024, 0.022, 0.003, 0.001, 0.003, 0.002, 0.001, + 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "arc": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.038, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.39, 0.001, 0.055, 0.0001, 0.0001, 0.007, 0.0001, 0.005, 0.294, 0.294, 0.0001, + 0.0001, 0.039, 0.041, 0.295, 0.017, 0.207, 0.161, 0.078, 0.046, 0.044, 0.053, 0.042, 0.044, 0.043, 0.091, 0.189, + 0.006, 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.01, 0.01, 0.013, 0.007, 0.004, 0.004, 0.006, 0.005, 0.007, 0.003, + 0.005, 0.008, 0.011, 0.008, 0.004, 0.008, 0.001, 0.007, 0.013, 0.004, 0.003, 0.005, 0.004, 0.001, 0.001, 0.002, + 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.107, 0.013, 0.023, 0.039, 0.088, 0.011, 0.022, 0.025, 0.081, + 0.003, 0.021, 0.05, 0.023, 0.07, 0.066, 0.018, 0.002, 0.062, 0.042, 0.051, 0.032, 0.013, 0.011, 0.006, 0.012, + 0.006, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.359, 0.027, 0.139, 0.022, 0.095, 0.021, 0.095, 0.051, 0.776, + 0.005, 0.029, 0.002, 0.032, 0.003, 0.011, 0.005, 6.959, 0.008, 1.918, 0.561, 0.013, 2.47, 0.003, 1.261, 3.75, + 0.282, 0.787, 0.504, 0.018, 4.683, 0.009, 0.786, 1.796, 2.249, 2.761, 0.874, 0.009, 1.007, 0.747, 0.053, 0.199, + 0.858, 2.538, 1.15, 2.879, 0.016, 0.009, 0.021, 0.023, 0.056, 0.023, 0.019, 0.01, 0.046, 0.007, 0.011, 0.024, + 0.035, 0.015, 0.012, 0.048, 0.023, 0.008, 0.047, 0.0001, 0.0001, 0.004, 0.019, 0.003, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.832, 0.001, 0.126, 0.053, 0.042, 0.017, 0.001, 0.0001, 0.0001, 0.009, 0.024, + 0.108, 0.212, 0.141, 0.001, 0.004, 41.501, 0.031, 0.0001, 0.0001, 0.002, 0.019, 0.018, 0.0001, 0.001, 0.004, + 0.004, 0.0001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "arz": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.739, 0.003, 0.126, 0.0001, 0.0001, 0.004, 0.001, 0.003, 0.118, 0.124, 0.002, + 0.001, 0.064, 0.045, 0.405, 0.01, 0.141, 0.269, 0.129, 0.067, 0.063, 0.072, 0.064, 0.065, 0.08, 0.165, 0.039, + 0.002, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.012, 0.009, 0.011, 0.008, 0.005, 0.005, 0.005, 0.006, 0.006, + 0.005, 0.004, 0.009, 0.011, 0.005, 0.003, 0.007, 0.0001, 0.006, 0.013, 0.009, 0.001, 0.004, 0.004, 0.001, 0.001, + 0.001, 0.006, 0.001, 0.006, 0.0001, 0.002, 0.0001, 0.091, 0.01, 0.025, 0.026, 0.093, 0.01, 0.015, 0.024, 0.072, + 0.002, 0.01, 0.045, 0.023, 0.064, 0.06, 0.013, 0.001, 0.06, 0.046, 0.047, 0.027, 0.009, 0.007, 0.004, 0.017, + 0.005, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.111, 1.136, 0.763, 1.043, 4.458, 2.752, 2.413, 1.721, 2.708, + 1.077, 3.156, 0.021, 0.238, 0.002, 0.017, 0.028, 0.008, 0.018, 0.006, 0.004, 0.001, 0.001, 0.0001, 0.0001, + 0.001, 0.001, 0.0001, 0.003, 0.003, 0.004, 0.0001, 0.003, 0.019, 0.06, 0.018, 0.274, 0.041, 0.116, 0.08, 6.51, + 1.771, 0.79, 1.749, 0.151, 0.593, 0.743, 0.294, 1.313, 0.079, 2.202, 0.292, 1.274, 0.493, 0.453, 0.187, 0.361, + 0.078, 1.267, 0.19, 0.005, 0.002, 0.002, 0.011, 0.002, 0.0001, 0.0001, 0.025, 0.005, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.004, 0.01, 0.003, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.004, 21.565, 21.383, 0.022, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.029, 0.003, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "as": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.296, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.811, 0.001, 0.086, 0.0001, 0.0001, 0.005, 0.0001, 0.083, 0.075, 0.077, 0.0001, + 0.001, 0.203, 0.086, 0.044, 0.006, 0.008, 0.009, 0.006, 0.004, 0.003, 0.003, 0.002, 0.002, 0.003, 0.004, 0.022, + 0.007, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.015, 0.009, 0.013, 0.007, 0.006, 0.005, 0.005, 0.006, 0.011, 0.003, + 0.003, 0.005, 0.01, 0.007, 0.004, 0.011, 0.001, 0.008, 0.013, 0.013, 0.003, 0.002, 0.004, 0.0001, 0.001, 0.001, + 0.01, 0.0001, 0.01, 0.0001, 0.001, 0.0001, 0.213, 0.031, 0.074, 0.083, 0.255, 0.044, 0.045, 0.095, 0.18, 0.004, + 0.017, 0.099, 0.058, 0.166, 0.164, 0.046, 0.002, 0.151, 0.14, 0.179, 0.063, 0.023, 0.027, 0.005, 0.036, 0.003, + 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.537, 0.769, 0.261, 0.102, 0.001, 0.242, 0.382, 1.586, 0.215, 0.133, + 0.002, 0.429, 0.033, 1.928, 0.026, 0.213, 0.004, 0.0001, 0.0001, 0.14, 0.003, 1.299, 0.21, 0.401, 0.056, 0.073, + 0.394, 0.328, 0.382, 0.006, 0.051, 0.353, 0.081, 0.128, 0.02, 0.231, 1.75, 0.525, 21.552, 9.182, 1.32, 0.031, + 0.846, 0.112, 0.982, 0.29, 0.858, 1.027, 2.855, 0.297, 0.931, 0.0001, 0.0001, 0.0001, 0.293, 0.318, 0.674, + 0.559, 0.001, 0.0001, 0.584, 0.0001, 2.717, 1.766, 0.0001, 0.0001, 0.009, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.003, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.161, 0.0001, 0.072, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ast": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.724, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.007, 0.002, 0.424, 0.002, 0.001, 0.01, 0.003, 0.548, 0.156, 0.156, 0.002, + 0.003, 1.046, 0.096, 0.743, 0.015, 0.245, 0.288, 0.158, 0.086, 0.078, 0.093, 0.076, 0.077, 0.093, 0.166, 0.056, + 0.032, 0.002, 0.005, 0.002, 0.002, 0.0001, 0.218, 0.121, 0.236, 0.117, 0.257, 0.089, 0.088, 0.078, 0.115, 0.051, + 0.038, 0.23, 0.167, 0.117, 0.051, 0.161, 0.007, 0.094, 0.198, 0.134, 0.043, 0.06, 0.041, 0.061, 0.037, 0.011, + 0.014, 0.0001, 0.014, 0.0001, 0.001, 0.0001, 8.074, 0.835, 3.151, 3.345, 9.578, 0.701, 0.803, 0.452, 5.046, + 0.025, 0.11, 4.637, 2.087, 5.542, 5.253, 1.877, 0.488, 4.828, 5.384, 3.477, 3.909, 0.672, 0.055, 0.4, 0.967, + 0.259, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.04, 0.01, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, + 0.001, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.01, 0.01, 0.001, 0.0001, 0.001, 0.002, 0.009, + 0.001, 0.001, 0.005, 0.006, 0.0001, 0.001, 0.026, 0.531, 0.001, 0.001, 0.002, 0.001, 0.002, 0.002, 0.002, 0.291, + 0.001, 0.019, 0.001, 0.46, 0.001, 0.001, 0.005, 0.157, 0.004, 0.608, 0.002, 0.002, 0.003, 0.002, 0.004, 0.002, + 0.119, 0.021, 0.027, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.073, 2.207, 0.003, 0.004, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.012, 0.005, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.039, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "atj": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.34, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.835, 0.0001, 0.034, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.045, 0.047, + 0.0001, 0.0001, 0.548, 0.045, 1.11, 0.006, 0.039, 0.075, 0.033, 0.013, 0.017, 0.015, 0.02, 0.018, 0.017, 0.061, + 0.024, 0.003, 0.015, 0.0001, 0.015, 0.002, 0.0001, 0.175, 0.012, 0.062, 0.025, 0.193, 0.022, 0.01, 0.006, 0.035, + 0.021, 0.212, 0.019, 0.332, 0.208, 0.141, 0.099, 0.007, 0.017, 0.034, 0.12, 0.001, 0.003, 0.089, 0.002, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 11.805, 0.044, 6.264, 0.083, 5.028, 0.008, 0.026, 0.952, + 15.443, 0.004, 9.886, 0.134, 2.846, 5.167, 5.337, 2.131, 0.022, 2.079, 2.27, 7.277, 0.131, 0.025, 4.581, 0.005, + 0.015, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.009, 0.046, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.015, 0.069, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "av": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.031, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.23, 0.001, 0.083, 0.0001, 0.0001, 0.007, 0.001, 0.001, 0.166, 0.166, 0.001, + 0.001, 0.458, 0.25, 0.562, 0.01, 0.133, 0.234, 0.149, 0.084, 0.058, 0.065, 0.053, 0.053, 0.06, 0.094, 0.055, + 0.017, 0.001, 0.003, 0.001, 0.003, 0.0001, 0.011, 0.006, 0.01, 0.003, 0.003, 0.003, 0.003, 0.002, 0.777, 0.001, + 0.002, 0.002, 0.006, 0.003, 0.003, 0.002, 0.0001, 0.002, 0.007, 0.008, 0.003, 0.006, 0.001, 0.011, 0.001, + 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.009, 0.0001, 0.075, 0.008, 0.02, 0.025, 0.067, 0.007, 0.015, 0.018, + 0.067, 0.001, 0.008, 0.038, 0.014, 0.043, 0.038, 0.019, 0.001, 0.041, 0.043, 0.036, 0.031, 0.01, 0.006, 0.003, + 0.01, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.671, 1.227, 0.995, 2.675, 0.059, 0.905, 0.851, 0.335, + 0.128, 0.084, 1.771, 0.03, 0.884, 0.039, 0.044, 0.818, 0.134, 0.075, 0.027, 0.273, 0.227, 0.015, 0.029, 0.016, + 0.039, 0.006, 0.125, 0.043, 0.127, 0.032, 0.014, 0.032, 0.185, 0.089, 0.062, 0.016, 0.021, 0.082, 0.047, 0.033, + 0.042, 0.006, 0.002, 0.039, 0.002, 0.019, 0.005, 0.013, 7.089, 1.927, 0.825, 1.964, 1.317, 1.929, 0.263, 0.636, + 2.852, 0.187, 1.471, 3.734, 0.878, 1.983, 1.647, 0.208, 0.0001, 0.0001, 0.195, 0.006, 0.002, 0.001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.022, 0.0001, 0.001, 0.0001, 30.778, 12.343, 0.0001, 0.534, 0.0001, + 0.002, 0.0001, 0.001, 0.025, 0.022, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.177, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ay": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.037, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.588, 0.005, 0.247, 0.0001, 0.0001, 0.0001, 0.027, 1.72, 0.603, 0.602, 0.046, + 0.001, 1.21, 0.158, 1.031, 0.021, 0.387, 0.817, 0.515, 0.316, 0.306, 0.36, 0.273, 0.279, 0.341, 0.428, 0.504, + 0.129, 0.064, 0.005, 0.064, 0.147, 0.0001, 0.442, 0.126, 0.339, 0.185, 0.072, 0.071, 0.077, 0.1, 0.109, 0.302, + 0.254, 0.268, 0.282, 0.145, 0.064, 0.43, 0.127, 0.121, 0.288, 0.2, 0.25, 0.05, 0.191, 0.012, 0.11, 0.013, 0.007, + 0.0001, 0.008, 0.0001, 0.002, 0.004, 14.491, 0.243, 1.49, 0.745, 1.57, 0.085, 0.27, 2.104, 6.268, 1.613, 3.058, + 2.342, 2.397, 3.14, 1.316, 1.65, 1.821, 3.874, 4.07, 2.906, 5.224, 0.153, 1.248, 0.859, 2.145, 0.119, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.211, 0.009, 0.003, 0.004, 0.002, 0.001, 0.002, 0.002, 0.003, 0.002, 0.001, + 0.002, 0.002, 0.003, 0.002, 0.002, 0.004, 0.008, 0.001, 0.016, 0.006, 0.002, 0.001, 0.001, 0.005, 0.126, 0.002, + 0.002, 0.008, 0.019, 0.001, 0.001, 0.061, 0.068, 0.001, 0.003, 0.22, 0.002, 0.002, 0.004, 0.004, 0.062, 0.002, + 0.003, 0.001, 0.11, 0.003, 0.049, 0.044, 0.259, 0.029, 0.076, 0.026, 0.004, 0.004, 0.007, 0.009, 0.003, 0.038, + 0.01, 0.012, 0.003, 0.005, 0.006, 0.0001, 0.0001, 0.133, 0.88, 0.003, 0.004, 0.0001, 0.001, 0.0001, 0.002, + 0.001, 0.003, 0.002, 0.0001, 0.006, 0.002, 0.031, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.004, 0.004, + 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.01, 0.003, 0.207, 0.001, 0.004, 0.008, 0.005, 0.002, + 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "az": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.803, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 10.785, 0.003, 0.222, 0.0001, 0.001, 0.009, 0.001, 0.007, 0.139, 0.141, 0.001, + 0.002, 0.64, 0.404, 0.91, 0.014, 0.244, 0.339, 0.188, 0.096, 0.09, 0.102, 0.087, 0.087, 0.102, 0.202, 0.038, + 0.019, 0.004, 0.002, 0.004, 0.004, 0.0001, 0.276, 0.242, 0.068, 0.094, 0.057, 0.061, 0.057, 0.095, 0.062, 0.008, + 0.127, 0.055, 0.202, 0.081, 0.086, 0.077, 0.107, 0.098, 0.172, 0.115, 0.037, 0.055, 0.005, 0.062, 0.066, 0.023, + 0.006, 0.0001, 0.006, 0.0001, 0.004, 0.001, 7.007, 1.378, 0.673, 3.497, 1.722, 0.535, 0.389, 0.748, 6.853, + 0.041, 1.544, 4.525, 2.336, 5.203, 1.602, 0.396, 1.07, 4.974, 2.444, 2.338, 1.812, 1.06, 0.008, 0.478, 1.947, + 0.87, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.147, 0.01, 0.009, 0.005, 0.005, 0.009, 0.003, 0.033, 0.002, + 0.001, 0.001, 0.003, 0.002, 0.001, 0.002, 0.082, 0.004, 0.001, 0.002, 0.028, 0.04, 0.001, 0.012, 0.001, 0.002, + 6.259, 0.001, 0.001, 0.046, 0.034, 0.075, 1.454, 0.026, 0.003, 0.003, 0.001, 0.001, 0.001, 0.001, 0.485, 0.001, + 0.001, 0.001, 0.011, 0.002, 0.016, 0.001, 0.001, 0.187, 2.533, 0.009, 0.004, 0.005, 0.028, 0.457, 0.003, 0.014, + 0.003, 0.01, 0.017, 1.158, 0.011, 0.03, 0.004, 0.0001, 0.0001, 0.067, 2.145, 2.985, 1.196, 0.079, 0.0001, + 0.0001, 6.24, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.207, 0.052, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, + 0.001, 0.008, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.14, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "azb": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.225, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.112, 0.002, 0.032, 0.0001, 0.0001, 0.003, 0.0001, 0.002, 0.275, 0.275, 0.002, + 0.001, 0.028, 0.165, 0.744, 0.053, 0.037, 0.078, 0.041, 0.038, 0.027, 0.033, 0.024, 0.023, 0.03, 0.03, 0.059, + 0.003, 0.004, 0.001, 0.003, 0.0001, 0.0001, 0.005, 0.004, 0.007, 0.004, 0.002, 0.002, 0.002, 0.003, 0.008, + 0.002, 0.002, 0.004, 0.004, 0.003, 0.001, 0.007, 0.001, 0.004, 0.011, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, + 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.022, 0.0001, 0.096, 0.009, 0.017, 0.038, 0.09, 0.012, 0.02, 0.043, 0.1, + 0.0001, 0.026, 0.053, 0.017, 0.052, 0.064, 0.04, 0.001, 0.055, 0.055, 0.106, 0.015, 0.003, 0.052, 0.004, 0.018, + 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.77, 0.455, 0.528, 0.028, 2.648, 1.417, 3.922, 1.536, 3.205, + 0.004, 0.23, 0.004, 7.975, 0.001, 0.011, 0.01, 0.002, 0.06, 0.27, 0.013, 0.004, 0.001, 0.0001, 0.0001, 0.033, + 0.002, 0.0001, 0.023, 0.001, 0.001, 0.0001, 0.002, 0.02, 0.007, 0.378, 0.004, 0.281, 0.002, 0.413, 5.027, 1.244, + 0.85, 1.199, 0.132, 0.444, 0.158, 0.386, 2.668, 0.253, 3.47, 0.613, 1.73, 0.767, 0.17, 0.092, 0.269, 0.09, + 0.326, 0.153, 0.08, 0.001, 0.001, 0.271, 0.002, 0.0001, 0.0001, 0.181, 0.003, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.002, + 0.001, 0.001, 18.661, 14.13, 1.511, 8.604, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.763, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ba": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.692, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.933, 0.002, 0.044, 0.0001, 0.0001, 0.005, 0.0001, 0.001, 0.147, 0.147, 0.0001, + 0.004, 0.482, 0.143, 0.604, 0.015, 0.158, 0.244, 0.135, 0.077, 0.08, 0.076, 0.061, 0.06, 0.081, 0.125, 0.052, + 0.011, 0.008, 0.003, 0.008, 0.001, 0.0001, 0.003, 0.003, 0.006, 0.002, 0.002, 0.001, 0.002, 0.002, 0.025, 0.001, + 0.002, 0.002, 0.003, 0.002, 0.001, 0.002, 0.0001, 0.001, 0.004, 0.005, 0.004, 0.007, 0.001, 0.012, 0.0001, + 0.001, 0.006, 0.0001, 0.006, 0.0001, 0.002, 0.0001, 0.021, 0.003, 0.012, 0.011, 0.026, 0.004, 0.004, 0.006, + 0.021, 0.001, 0.003, 0.02, 0.007, 0.023, 0.02, 0.005, 0.0001, 0.016, 0.01, 0.014, 0.014, 0.002, 0.003, 0.001, + 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.739, 1.424, 2.096, 1.348, 0.183, 0.244, 0.115, 0.088, + 0.621, 0.006, 0.016, 3.259, 0.202, 0.093, 0.068, 0.404, 0.112, 0.175, 0.076, 1.0, 0.273, 0.018, 0.005, 0.012, + 0.081, 3.093, 0.13, 0.026, 0.084, 0.041, 0.082, 0.063, 0.299, 0.879, 0.098, 0.434, 0.038, 0.036, 0.005, 0.017, + 0.043, 0.504, 0.0001, 0.196, 0.001, 0.016, 0.036, 0.445, 4.844, 0.952, 0.303, 0.533, 0.952, 2.488, 0.102, 0.15, + 1.49, 1.18, 1.231, 3.558, 1.237, 2.847, 1.277, 0.365, 0.0001, 0.0001, 0.244, 0.002, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.004, 0.0001, 0.002, 0.001, 24.156, 12.667, 4.154, 3.011, 0.0001, + 0.0001, 0.0001, 0.0001, 0.005, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.235, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "bar": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.604, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.871, 0.004, 0.418, 0.0001, 0.0001, 0.008, 0.002, 0.216, 0.21, 0.21, 0.009, + 0.001, 0.803, 0.202, 1.146, 0.023, 0.266, 0.394, 0.199, 0.121, 0.109, 0.119, 0.109, 0.117, 0.138, 0.187, 0.117, + 0.02, 0.004, 0.005, 0.004, 0.003, 0.0001, 0.352, 0.447, 0.201, 0.532, 0.247, 0.245, 0.332, 0.228, 0.204, 0.156, + 0.293, 0.235, 0.338, 0.204, 0.224, 0.214, 0.034, 0.205, 0.697, 0.181, 0.119, 0.18, 0.276, 0.005, 0.01, 0.114, + 0.021, 0.0001, 0.021, 0.0001, 0.003, 0.003, 8.177, 1.169, 1.993, 4.065, 6.625, 1.095, 2.102, 3.003, 6.12, 0.162, + 0.941, 2.0, 2.327, 6.606, 4.578, 0.55, 0.014, 3.249, 4.677, 4.042, 3.018, 0.854, 1.171, 0.071, 0.239, 0.864, + 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.102, 0.003, 0.003, 0.002, 0.004, 0.004, 0.001, 0.001, 0.001, 0.002, + 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.014, 0.001, 0.001, 0.016, 0.001, 0.002, + 0.009, 0.001, 0.001, 0.039, 0.001, 0.036, 0.116, 0.061, 0.007, 0.003, 0.001, 0.274, 0.073, 0.002, 0.002, 0.004, + 0.027, 0.002, 0.002, 0.002, 0.004, 0.001, 0.001, 0.004, 0.002, 0.01, 0.016, 0.006, 0.001, 0.154, 0.002, 0.005, + 0.001, 0.002, 0.002, 0.176, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.07, 0.891, 0.007, 0.006, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.103, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "bcl": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.379, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.071, 0.002, 0.217, 0.001, 0.003, 0.005, 0.002, 0.116, 0.161, 0.16, 0.0001, + 0.001, 0.914, 0.25, 0.911, 0.022, 0.337, 0.439, 0.274, 0.132, 0.116, 0.128, 0.121, 0.133, 0.144, 0.229, 0.055, + 0.02, 0.017, 0.001, 0.017, 0.022, 0.0001, 0.585, 0.233, 0.246, 0.128, 0.11, 0.148, 0.111, 0.118, 0.238, 0.077, + 0.175, 0.149, 0.27, 0.198, 0.07, 0.296, 0.013, 0.12, 0.508, 0.14, 0.057, 0.048, 0.04, 0.004, 0.02, 0.015, 0.025, + 0.0001, 0.025, 0.0001, 0.0001, 0.0001, 15.454, 1.486, 0.494, 1.897, 2.968, 0.126, 4.169, 0.861, 6.432, 0.033, + 2.688, 2.392, 2.068, 10.392, 5.039, 1.872, 0.022, 3.21, 4.66, 2.796, 1.875, 0.174, 0.643, 0.021, 1.752, 0.121, + 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.039, 0.006, 0.003, 0.003, 0.005, 0.004, 0.002, 0.003, 0.009, 0.002, + 0.004, 0.002, 0.003, 0.004, 0.003, 0.002, 0.007, 0.003, 0.002, 0.009, 0.004, 0.002, 0.001, 0.002, 0.002, 0.008, + 0.004, 0.003, 0.013, 0.011, 0.003, 0.001, 0.027, 0.035, 0.013, 0.004, 0.005, 0.003, 0.003, 0.006, 0.004, 0.006, + 0.004, 0.003, 0.007, 0.019, 0.005, 0.003, 0.005, 0.018, 0.01, 0.022, 0.014, 0.003, 0.004, 0.003, 0.01, 0.004, + 0.006, 0.004, 0.005, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.019, 0.136, 0.005, 0.006, 0.0001, 0.0001, 0.0001, + 0.011, 0.004, 0.01, 0.002, 0.0001, 0.006, 0.003, 0.016, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, + 0.017, 0.012, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.007, 0.034, 0.001, 0.008, 0.01, 0.006, + 0.004, 0.002, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "be": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.607, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.35, 0.001, 0.055, 0.0001, 0.0001, 0.006, 0.0001, 0.05, 0.155, 0.156, 0.001, + 0.002, 0.628, 0.121, 0.612, 0.009, 0.188, 0.295, 0.148, 0.088, 0.085, 0.087, 0.076, 0.074, 0.089, 0.156, 0.032, + 0.017, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.009, 0.006, 0.026, 0.004, 0.005, 0.003, 0.019, 0.003, 0.047, 0.001, + 0.002, 0.004, 0.009, 0.01, 0.004, 0.01, 0.0001, 0.005, 0.013, 0.005, 0.003, 0.013, 0.004, 0.018, 0.001, 0.002, + 0.002, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 0.046, 0.006, 0.014, 0.013, 0.042, 0.007, 0.007, 0.01, 0.04, 0.001, + 0.006, 0.023, 0.014, 0.029, 0.035, 0.009, 0.001, 0.032, 0.024, 0.024, 0.019, 0.004, 0.003, 0.002, 0.006, 0.003, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.314, 1.922, 1.481, 1.13, 0.14, 0.481, 1.007, 0.569, 0.351, 0.001, + 0.001, 1.93, 0.479, 0.541, 0.221, 1.357, 0.128, 0.261, 0.085, 0.08, 0.203, 0.012, 2.438, 0.059, 0.001, 0.01, + 0.103, 0.048, 0.097, 0.076, 0.995, 0.141, 0.181, 0.137, 0.046, 0.12, 0.029, 0.02, 0.016, 0.019, 0.023, 0.001, + 0.0001, 0.081, 0.0001, 0.017, 0.007, 0.023, 7.12, 0.583, 1.325, 0.884, 1.382, 1.613, 0.241, 1.022, 0.011, 0.528, + 1.726, 1.757, 1.251, 2.924, 1.397, 1.062, 0.0001, 0.0001, 0.283, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.021, 0.0001, 0.002, 0.001, 26.294, 17.28, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.156, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "bh": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.941, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.272, 0.0001, 0.067, 0.0001, 0.001, 0.014, 0.0001, 0.006, 0.074, 0.074, 0.0001, + 0.001, 0.205, 0.047, 0.036, 0.005, 0.139, 0.215, 0.134, 0.072, 0.07, 0.074, 0.065, 0.069, 0.075, 0.087, 0.017, + 0.007, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.006, 0.004, 0.005, 0.002, 0.003, 0.002, 0.004, 0.002, 0.007, 0.001, + 0.002, 0.003, 0.003, 0.003, 0.002, 0.004, 0.0001, 0.002, 0.006, 0.006, 0.002, 0.001, 0.002, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.009, 0.0001, 0.1, 0.014, 0.029, 0.038, 0.115, 0.019, 0.024, 0.049, + 0.081, 0.001, 0.007, 0.043, 0.023, 0.079, 0.071, 0.019, 0.001, 0.072, 0.065, 0.081, 0.029, 0.011, 0.014, 0.002, + 0.014, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.902, 0.534, 1.035, 0.031, 0.0001, 0.22, 0.29, 2.243, + 0.258, 0.137, 0.021, 0.553, 0.066, 1.318, 0.0001, 0.336, 0.009, 0.009, 0.0001, 0.03, 0.023, 1.891, 0.248, 0.639, + 0.037, 0.011, 0.202, 0.05, 0.683, 0.024, 0.014, 0.375, 0.074, 0.252, 0.031, 0.13, 24.792, 6.19, 0.487, 0.175, + 1.097, 0.001, 0.677, 0.098, 0.808, 0.311, 0.975, 0.521, 2.028, 0.0001, 1.424, 0.0001, 0.0001, 0.605, 0.237, + 0.107, 1.177, 0.742, 0.0001, 0.0001, 0.117, 0.003, 3.031, 1.138, 0.0001, 0.0001, 0.016, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 29.692, 0.0001, + 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "bi": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.859, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.276, 0.003, 0.256, 0.0001, 0.0001, 0.003, 0.003, 0.016, 0.486, 0.484, 0.001, + 0.0001, 0.638, 0.156, 1.372, 0.022, 0.455, 0.969, 0.456, 0.237, 0.231, 0.247, 0.248, 0.25, 0.297, 0.612, 0.044, + 0.019, 0.005, 0.0001, 0.004, 0.004, 0.0001, 0.449, 0.264, 0.227, 0.165, 0.234, 0.192, 0.164, 0.234, 0.179, + 0.456, 0.316, 0.231, 0.458, 0.197, 0.135, 0.315, 0.005, 0.168, 0.606, 0.235, 0.049, 0.123, 0.109, 0.008, 0.231, + 0.017, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 8.019, 2.445, 0.575, 1.178, 6.318, 0.449, 2.782, 1.275, + 5.992, 0.203, 1.688, 4.658, 3.419, 6.494, 6.015, 1.447, 0.023, 2.565, 2.973, 3.583, 1.992, 0.459, 0.92, 0.044, + 0.557, 0.136, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.108, 0.019, 0.014, 0.005, 0.005, 0.004, 0.006, 0.01, 0.005, + 0.008, 0.002, 0.002, 0.012, 0.031, 0.002, 0.001, 0.002, 0.004, 0.003, 0.089, 0.007, 0.003, 0.003, 0.004, 0.004, + 0.002, 0.001, 0.001, 0.007, 0.004, 0.002, 0.004, 0.052, 0.019, 0.003, 0.005, 0.023, 0.009, 0.014, 0.014, 0.008, + 0.023, 0.003, 0.01, 0.005, 0.015, 0.003, 0.004, 0.019, 0.013, 0.011, 0.022, 0.006, 0.01, 0.007, 0.004, 0.018, + 0.01, 0.009, 0.009, 0.011, 0.009, 0.011, 0.009, 0.0001, 0.0001, 0.048, 0.113, 0.02, 0.046, 0.0001, 0.002, + 0.0001, 0.005, 0.001, 0.002, 0.0001, 0.001, 0.032, 0.011, 0.078, 0.027, 0.001, 0.0001, 0.001, 0.018, 0.002, + 0.0001, 0.017, 0.009, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.037, 0.005, 0.097, 0.0001, 0.0001, 0.007, + 0.003, 0.001, 0.003, 0.001, 0.002, 0.001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "bjn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.274, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.352, 0.002, 0.406, 0.0001, 0.001, 0.013, 0.001, 0.109, 0.199, 0.198, 0.002, + 0.001, 0.988, 0.406, 0.819, 0.036, 0.185, 0.196, 0.136, 0.076, 0.062, 0.071, 0.054, 0.058, 0.057, 0.091, 0.102, + 0.025, 0.002, 0.003, 0.002, 0.005, 0.0001, 0.244, 0.391, 0.098, 0.173, 0.034, 0.031, 0.106, 0.136, 0.207, 0.121, + 0.411, 0.116, 0.312, 0.12, 0.035, 0.341, 0.003, 0.133, 0.409, 0.258, 0.061, 0.026, 0.09, 0.002, 0.038, 0.007, + 0.012, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 19.717, 2.113, 0.418, 2.814, 2.089, 0.126, 3.097, 2.135, 6.446, + 0.654, 2.733, 2.879, 2.871, 8.542, 1.048, 1.844, 0.007, 3.384, 2.985, 3.613, 4.514, 0.083, 0.972, 0.009, 1.107, + 0.035, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.03, 0.008, 0.005, 0.007, 0.006, 0.006, 0.006, 0.004, 0.006, + 0.004, 0.008, 0.003, 0.003, 0.007, 0.001, 0.001, 0.002, 0.002, 0.002, 0.008, 0.003, 0.002, 0.002, 0.004, 0.002, + 0.014, 0.001, 0.002, 0.005, 0.005, 0.002, 0.002, 0.012, 0.002, 0.002, 0.004, 0.012, 0.005, 0.004, 0.011, 0.007, + 0.182, 0.006, 0.005, 0.004, 0.004, 0.003, 0.005, 0.009, 0.008, 0.005, 0.005, 0.003, 0.002, 0.001, 0.003, 0.006, + 0.004, 0.004, 0.003, 0.003, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.019, 0.193, 0.007, 0.009, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.002, 0.005, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, + 0.004, 0.035, 0.03, 0.004, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.019, 0.008, 0.026, 0.006, 0.003, 0.008, + 0.005, 0.003, 0.002, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "bm": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.129, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.167, 0.007, 0.144, 0.0001, 0.001, 0.013, 0.002, 0.256, 0.237, 0.237, 0.007, + 0.003, 0.973, 0.158, 0.97, 0.007, 0.243, 0.224, 0.128, 0.052, 0.064, 0.06, 0.072, 0.055, 0.07, 0.12, 0.287, + 0.015, 0.0001, 0.01, 0.0001, 0.005, 0.0001, 0.444, 0.348, 0.111, 0.212, 0.105, 0.277, 0.105, 0.044, 0.094, + 0.171, 0.429, 0.132, 0.368, 0.21, 0.091, 0.065, 0.003, 0.072, 0.446, 0.184, 0.079, 0.027, 0.078, 0.004, 0.046, + 0.018, 0.018, 0.0001, 0.014, 0.0001, 0.017, 0.0001, 12.037, 2.27, 0.406, 1.816, 3.589, 1.305, 1.615, 0.299, + 5.301, 0.672, 3.384, 3.18, 2.268, 7.22, 3.282, 0.194, 0.029, 2.428, 2.045, 1.645, 2.796, 0.059, 0.96, 0.016, + 1.69, 0.107, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.237, 0.003, 0.001, 0.017, 0.017, 0.007, 0.015, 0.003, + 0.008, 0.011, 0.026, 0.017, 0.001, 0.0001, 0.018, 0.005, 0.013, 0.002, 0.004, 0.018, 1.999, 0.0001, 0.0001, + 0.0001, 0.002, 0.172, 0.0001, 1.879, 0.012, 0.017, 0.004, 0.0001, 0.054, 0.002, 0.001, 0.001, 0.002, 0.003, + 0.005, 0.027, 0.322, 0.21, 0.005, 0.017, 0.007, 0.002, 0.001, 0.011, 0.002, 0.012, 0.238, 0.014, 0.415, 0.435, + 0.001, 0.007, 0.005, 0.009, 0.01, 0.017, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.064, 1.039, 0.002, + 0.033, 0.027, 0.0001, 0.0001, 4.089, 0.016, 0.002, 0.003, 0.0001, 0.433, 0.0001, 0.024, 0.005, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.065, 0.05, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.0001, 0.003, + 0.233, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "bn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.319, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.406, 0.001, 0.076, 0.0001, 0.0001, 0.012, 0.0001, 0.015, 0.057, 0.058, 0.0001, + 0.001, 0.196, 0.086, 0.029, 0.005, 0.005, 0.006, 0.004, 0.002, 0.002, 0.002, 0.002, 0.001, 0.002, 0.002, 0.016, + 0.009, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.005, 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.003, 0.002, + 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.004, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.043, 0.007, 0.016, 0.016, 0.05, 0.009, 0.009, 0.017, + 0.038, 0.001, 0.004, 0.022, 0.013, 0.034, 0.034, 0.01, 0.001, 0.031, 0.027, 0.033, 0.016, 0.005, 0.005, 0.002, + 0.008, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.359, 0.551, 0.299, 0.082, 0.002, 0.229, 0.186, 2.436, + 0.034, 0.152, 0.002, 0.333, 0.036, 2.245, 0.026, 0.384, 0.008, 0.001, 0.001, 0.181, 0.002, 1.31, 0.16, 0.34, + 0.043, 0.053, 0.26, 0.209, 0.4, 0.015, 0.042, 0.46, 0.067, 0.212, 0.008, 0.16, 1.542, 0.621, 24.834, 6.808, + 1.602, 0.04, 0.792, 0.149, 1.148, 0.261, 0.867, 1.261, 2.631, 0.001, 0.874, 0.001, 0.001, 0.001, 0.381, 0.232, + 0.963, 0.451, 0.001, 0.001, 0.701, 0.0001, 2.837, 1.811, 0.0001, 0.0001, 0.013, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.008, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.991, 0.0001, 0.03, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "bo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.169, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.69, 0.0001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.01, 0.0001, + 0.0001, 0.002, 0.003, 0.005, 0.001, 0.003, 0.004, 0.003, 0.002, 0.001, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.012, 0.002, 0.004, 0.004, 0.015, 0.003, + 0.003, 0.006, 0.011, 0.0001, 0.001, 0.005, 0.003, 0.01, 0.01, 0.003, 0.0001, 0.008, 0.008, 0.01, 0.004, 0.001, + 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.3, 0.21, 1.61, 0.004, 1.096, 0.171, 0.232, + 0.056, 0.006, 0.125, 0.009, 7.85, 0.044, 0.821, 0.01, 0.147, 0.305, 1.571, 0.233, 1.086, 0.826, 0.17, 1.379, + 0.052, 0.974, 0.101, 0.175, 0.065, 0.005, 0.008, 0.253, 0.318, 0.893, 0.39, 1.207, 0.915, 0.217, 0.014, 2.41, + 0.028, 0.071, 0.06, 0.002, 0.023, 0.001, 0.018, 0.001, 0.001, 0.003, 0.913, 2.028, 0.112, 1.086, 0.005, 0.001, + 0.055, 0.005, 0.003, 0.951, 0.005, 10.217, 21.49, 2.602, 0.016, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 32.905, 0.0001, + 0.024, 0.009, 0.002, 0.006, 0.004, 0.005, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "bpy": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.902, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.282, 0.0001, 0.009, 0.0001, 0.0001, 0.224, 0.0001, 0.002, 0.281, 0.281, + 0.0001, 0.0001, 0.306, 0.253, 0.183, 0.08, 0.005, 0.009, 0.002, 0.004, 0.002, 0.003, 0.003, 0.003, 0.003, 0.003, + 0.197, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.016, 0.008, 0.017, 0.005, 0.005, 0.002, 0.004, 0.002, + 0.003, 0.003, 0.005, 0.003, 0.007, 0.007, 0.001, 0.007, 0.0001, 0.004, 0.019, 0.004, 0.016, 0.002, 0.001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.014, 0.0001, 0.118, 0.01, 0.016, 0.026, 0.05, 0.006, + 0.015, 0.031, 0.057, 0.004, 0.009, 0.031, 0.017, 0.064, 0.06, 0.015, 0.001, 0.059, 0.03, 0.047, 0.04, 0.005, + 0.005, 0.001, 0.018, 0.002, 0.0001, 0.016, 0.0001, 0.0001, 0.0001, 0.094, 0.582, 0.295, 0.004, 0.001, 0.199, + 0.278, 1.651, 0.006, 0.325, 0.001, 0.49, 0.119, 1.057, 0.003, 0.285, 0.0001, 0.0001, 0.0001, 0.034, 0.032, + 0.592, 0.143, 0.798, 0.084, 0.129, 0.075, 0.036, 0.484, 0.004, 0.03, 0.329, 0.051, 0.128, 0.007, 0.019, 1.405, + 0.659, 24.309, 6.387, 2.166, 0.231, 0.814, 0.355, 0.961, 0.379, 1.131, 0.99, 2.941, 0.034, 0.919, 0.004, 0.001, + 0.001, 0.243, 0.193, 0.791, 1.05, 0.0001, 0.0001, 0.626, 0.0001, 4.392, 1.335, 0.0001, 0.0001, 0.04, 0.01, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 30.31, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001 + ], + "br": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.678, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.255, 0.004, 0.515, 0.0001, 0.0001, 0.007, 0.002, 0.663, 0.246, 0.246, 0.001, + 0.002, 0.881, 0.746, 0.901, 0.014, 0.258, 0.444, 0.187, 0.109, 0.115, 0.122, 0.109, 0.12, 0.152, 0.228, 0.115, + 0.024, 0.015, 0.004, 0.016, 0.003, 0.0001, 0.347, 0.279, 0.201, 0.205, 0.261, 0.098, 0.212, 0.134, 0.164, 0.075, + 0.201, 0.168, 0.253, 0.109, 0.059, 0.199, 0.006, 0.146, 0.289, 0.136, 0.097, 0.091, 0.051, 0.019, 0.032, 0.015, + 0.024, 0.0001, 0.024, 0.0001, 0.001, 0.0001, 9.146, 1.127, 0.833, 2.777, 10.42, 0.294, 1.799, 2.456, 3.655, + 0.167, 1.352, 2.97, 1.505, 5.492, 4.696, 0.867, 0.019, 5.665, 2.33, 3.448, 2.744, 1.784, 0.434, 0.03, 0.247, + 2.302, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.1, 0.012, 0.008, 0.007, 0.005, 0.004, 0.003, 0.003, 0.004, 0.005, + 0.002, 0.002, 0.004, 0.005, 0.003, 0.002, 0.003, 0.002, 0.002, 0.011, 0.005, 0.002, 0.002, 0.002, 0.002, 0.074, + 0.002, 0.003, 0.005, 0.005, 0.001, 0.004, 0.021, 0.015, 0.009, 0.005, 0.007, 0.003, 0.004, 0.009, 0.013, 0.045, + 0.076, 0.018, 0.003, 0.013, 0.003, 0.005, 0.011, 0.591, 0.009, 0.012, 0.018, 0.007, 0.006, 0.004, 0.009, 0.467, + 0.008, 0.021, 0.017, 0.008, 0.005, 0.006, 0.0001, 0.0001, 0.048, 1.28, 0.01, 0.011, 0.0001, 0.001, 0.0001, + 0.004, 0.002, 0.002, 0.002, 0.0001, 0.032, 0.015, 0.039, 0.015, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.006, + 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.009, 0.096, 0.003, 0.001, 0.003, 0.002, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "bs": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.108, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.139, 0.002, 0.313, 0.001, 0.001, 0.017, 0.002, 0.011, 0.204, 0.204, 0.001, + 0.006, 0.915, 0.157, 1.176, 0.034, 0.332, 0.467, 0.264, 0.159, 0.151, 0.151, 0.132, 0.126, 0.142, 0.226, 0.068, + 0.015, 0.006, 0.007, 0.006, 0.001, 0.0001, 0.156, 0.174, 0.174, 0.143, 0.072, 0.074, 0.155, 0.136, 0.152, 0.073, + 0.147, 0.082, 0.163, 0.218, 0.118, 0.225, 0.003, 0.11, 0.283, 0.122, 0.105, 0.088, 0.031, 0.007, 0.007, 0.073, + 0.025, 0.0001, 0.025, 0.0001, 0.008, 0.0001, 8.723, 0.95, 0.762, 2.331, 6.777, 0.26, 1.369, 0.582, 7.412, 3.867, + 2.673, 2.682, 2.205, 4.994, 6.632, 1.941, 0.005, 3.955, 3.612, 3.234, 3.103, 2.415, 0.036, 0.017, 0.061, 1.207, + 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.038, 0.004, 0.003, 0.002, 0.002, 0.001, 0.003, 0.388, 0.002, 0.001, + 0.001, 0.001, 0.016, 0.618, 0.001, 0.0001, 0.003, 0.172, 0.002, 0.018, 0.001, 0.0001, 0.001, 0.001, 0.002, + 0.003, 0.001, 0.001, 0.006, 0.003, 0.004, 0.002, 0.035, 0.482, 0.001, 0.001, 0.003, 0.001, 0.001, 0.002, 0.001, + 0.008, 0.001, 0.002, 0.001, 0.003, 0.001, 0.001, 0.007, 0.004, 0.003, 0.004, 0.002, 0.003, 0.004, 0.002, 0.004, + 0.002, 0.002, 0.003, 0.006, 0.012, 0.366, 0.002, 0.0001, 0.0001, 0.02, 0.032, 1.199, 0.874, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.014, 0.006, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.037, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "bug": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.068, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.164, 0.0001, 0.016, 0.0001, 0.0001, 0.003, 0.001, 0.137, 0.016, 0.016, 0.0001, + 0.001, 0.196, 1.935, 1.044, 0.004, 0.035, 0.02, 0.023, 0.01, 0.009, 0.007, 0.007, 0.006, 0.007, 0.013, 0.007, + 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.516, 0.311, 0.434, 0.185, 0.139, 0.134, 0.304, 0.324, 0.039, + 0.055, 0.029, 0.369, 0.412, 0.063, 0.111, 1.316, 0.017, 0.157, 0.558, 0.13, 0.016, 0.233, 0.012, 0.002, 0.073, + 0.002, 0.007, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 9.887, 0.241, 1.633, 1.832, 7.179, 0.088, 0.757, 0.513, + 7.161, 0.111, 1.126, 1.683, 2.724, 6.291, 2.861, 1.308, 0.04, 7.537, 3.873, 3.7, 4.723, 0.375, 1.036, 0.149, + 1.531, 0.172, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.047, 0.009, 0.005, 0.004, 0.009, 0.007, 0.006, 0.004, + 0.009, 0.039, 0.01, 0.038, 0.003, 0.005, 0.002, 0.001, 0.004, 0.012, 0.007, 0.011, 0.011, 0.02, 0.001, 0.02, + 0.012, 0.019, 0.011, 0.012, 0.002, 0.001, 0.006, 0.003, 0.004, 0.003, 0.047, 0.002, 0.016, 0.005, 0.004, 0.01, + 0.405, 2.36, 0.01, 0.013, 0.003, 0.001, 0.008, 0.004, 0.008, 0.004, 0.008, 0.005, 0.176, 0.005, 0.002, 0.003, + 0.012, 0.005, 0.008, 0.007, 0.003, 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.007, 2.887, 0.002, 0.04, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.023, 0.014, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.007, 0.008, 0.007, 0.001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.048, 0.15, 0.04, 0.0001, + 0.0001, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "bxr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.49, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.129, 0.001, 0.08, 0.0001, 0.0001, 0.012, 0.0001, 0.001, 0.147, 0.147, 0.0001, + 0.002, 0.553, 0.131, 0.523, 0.004, 0.151, 0.243, 0.109, 0.074, 0.068, 0.074, 0.065, 0.062, 0.079, 0.12, 0.022, + 0.018, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.004, 0.002, 0.007, 0.001, 0.002, 0.002, 0.002, 0.004, 0.037, 0.001, + 0.001, 0.002, 0.003, 0.003, 0.003, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.011, 0.001, 0.019, 0.001, + 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.037, 0.005, 0.011, 0.009, 0.029, 0.005, 0.007, 0.031, + 0.027, 0.001, 0.005, 0.019, 0.012, 0.022, 0.025, 0.008, 0.001, 0.023, 0.018, 0.017, 0.016, 0.003, 0.002, 0.001, + 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.392, 0.859, 1.489, 1.628, 0.046, 1.574, 0.057, 0.037, + 0.549, 0.002, 0.003, 0.546, 0.265, 4.264, 0.148, 0.174, 0.118, 0.207, 0.029, 0.069, 0.123, 0.028, 0.013, 0.033, + 0.034, 0.005, 0.055, 0.03, 0.09, 0.073, 0.049, 0.037, 0.094, 0.079, 0.088, 0.076, 0.026, 0.12, 0.011, 0.016, + 0.032, 0.306, 0.001, 0.058, 0.001, 0.071, 0.033, 1.461, 5.842, 1.346, 0.152, 2.003, 2.072, 0.704, 0.52, 0.475, + 1.576, 1.562, 0.254, 3.078, 0.893, 3.534, 3.045, 0.105, 0.0001, 0.0001, 0.188, 0.005, 0.003, 0.001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.006, 0.002, 27.741, 14.028, 2.178, 0.307, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.075, 0.002, 0.001, + 0.004, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "cdo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.899, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.597, 0.001, 0.273, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.549, 0.551, 0.0001, + 0.001, 0.624, 3.929, 0.732, 0.03, 0.251, 0.611, 0.29, 0.189, 0.163, 0.163, 0.16, 0.156, 0.166, 0.215, 0.133, + 0.012, 0.001, 0.0001, 0.001, 0.002, 0.0001, 0.053, 0.117, 0.299, 0.251, 0.017, 0.027, 0.504, 0.23, 0.082, 0.03, + 0.071, 0.135, 0.356, 0.159, 0.039, 0.068, 0.004, 0.027, 0.229, 0.101, 0.044, 0.025, 0.062, 0.001, 0.013, 0.003, + 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.822, 0.392, 1.504, 1.05, 0.748, 0.033, 6.691, 1.959, 3.832, + 0.006, 1.877, 0.724, 0.396, 5.597, 0.623, 0.123, 0.005, 0.411, 2.143, 0.557, 2.118, 0.037, 0.065, 0.039, 0.184, + 0.014, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.562, 0.653, 0.229, 0.604, 0.418, 0.298, 0.318, 0.129, 0.175, + 0.171, 0.118, 0.212, 0.31, 0.409, 0.113, 0.98, 0.125, 0.066, 0.036, 0.255, 0.106, 0.397, 0.142, 0.124, 0.138, + 0.172, 0.096, 0.139, 0.338, 0.116, 0.144, 0.186, 0.41, 1.078, 0.77, 0.114, 1.515, 0.081, 0.097, 0.077, 0.628, + 0.714, 1.044, 0.603, 1.183, 1.024, 0.119, 0.129, 0.135, 0.183, 0.537, 1.615, 1.19, 0.067, 0.211, 0.1, 0.216, + 1.217, 0.179, 0.199, 0.306, 0.119, 0.135, 0.091, 0.0001, 0.0001, 0.041, 7.531, 2.472, 1.618, 0.001, 0.001, + 0.0001, 0.002, 0.002, 0.001, 2.018, 0.0001, 0.014, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.757, 0.108, 0.212, 0.359, 1.361, + 0.793, 0.503, 0.549, 0.397, 0.002, 0.003, 0.004, 0.001, 0.0001, 0.218, 0.03, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ce": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.477, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.593, 0.0001, 0.003, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.462, 0.462, + 0.0001, 0.166, 0.461, 0.186, 0.813, 0.002, 0.175, 0.094, 0.109, 0.14, 0.045, 0.029, 0.022, 0.02, 0.031, 0.028, + 0.033, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.145, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.145, 0.144, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, + 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.704, + 1.438, 1.762, 1.875, 0.015, 2.329, 0.449, 0.169, 0.835, 0.009, 0.342, 0.05, 1.751, 0.164, 0.611, 0.21, 0.068, + 0.113, 0.056, 0.04, 0.434, 0.02, 0.006, 0.019, 0.028, 0.002, 0.404, 0.034, 0.196, 0.056, 0.049, 0.075, 0.184, + 0.229, 0.057, 0.026, 0.146, 0.02, 0.017, 0.02, 0.129, 0.002, 0.0001, 0.004, 0.0001, 0.008, 0.009, 0.018, 7.603, + 0.877, 1.017, 0.93, 0.629, 1.84, 0.05, 0.386, 1.788, 1.009, 1.778, 2.253, 0.873, 3.199, 2.291, 0.075, 0.0001, + 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, + 0.0001, 28.632, 13.675, 0.0001, 0.638, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.405, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ceb": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.228, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.341, 0.0001, 0.15, 0.0001, 0.0001, 0.002, 0.0001, 0.016, 0.068, 0.068, + 0.0001, 0.0001, 1.15, 0.441, 1.259, 0.001, 0.028, 0.059, 0.035, 0.022, 0.021, 0.022, 0.021, 0.021, 0.026, 0.036, + 0.037, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.098, 0.168, 0.578, 0.161, 0.203, 0.063, 0.093, 0.198, + 0.052, 0.044, 0.126, 0.151, 0.236, 0.118, 0.082, 0.261, 0.02, 0.131, 0.295, 0.118, 0.081, 0.041, 0.087, 0.005, + 0.015, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 15.378, 2.318, 0.367, 1.953, 2.974, 0.093, 5.126, + 1.479, 4.851, 0.069, 2.449, 3.4, 2.839, 8.407, 4.701, 1.442, 0.019, 2.43, 4.783, 3.214, 2.941, 0.169, 0.623, + 0.03, 1.539, 0.068, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.059, 0.004, 0.005, 0.004, 0.004, 0.003, + 0.008, 0.005, 0.003, 0.002, 0.001, 0.004, 0.009, 0.002, 0.004, 0.002, 0.003, 0.0001, 0.003, 0.001, 0.001, 0.001, + 0.001, 0.01, 0.005, 0.001, 0.002, 0.001, 0.001, 0.002, 0.006, 0.184, 0.019, 0.007, 0.005, 0.008, 0.019, 0.003, + 0.009, 0.007, 0.025, 0.004, 0.049, 0.001, 0.018, 0.002, 0.008, 0.279, 0.015, 0.004, 0.013, 0.004, 0.003, 0.007, + 0.001, 0.046, 0.006, 0.007, 0.005, 0.006, 0.004, 0.006, 0.001, 0.0001, 0.0001, 0.452, 0.166, 0.097, 0.047, + 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.031, 0.01, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.019, 0.018, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.012, 0.008, + 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "ch": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.587, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.467, 0.008, 0.286, 0.0001, 0.0001, 0.018, 0.0001, 1.077, 0.189, 0.189, + 0.0001, 0.0001, 1.14, 0.532, 1.257, 0.007, 0.648, 0.639, 0.504, 0.182, 0.3, 0.173, 0.195, 0.169, 0.204, 0.218, + 0.042, 0.013, 0.0001, 0.001, 0.0001, 0.005, 0.0001, 0.26, 0.146, 0.257, 0.104, 0.401, 0.111, 0.564, 0.173, + 0.223, 0.038, 0.106, 0.097, 0.317, 0.12, 0.025, 0.199, 0.01, 0.074, 0.256, 0.153, 0.279, 0.066, 0.06, 0.002, + 0.047, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 10.968, 0.472, 0.524, 1.575, 4.239, 0.44, 3.776, + 1.808, 6.943, 0.028, 1.21, 2.019, 1.749, 8.291, 5.798, 1.592, 0.018, 1.795, 5.81, 3.872, 3.565, 0.141, 0.106, + 0.012, 0.845, 0.055, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.016, 0.008, 0.003, 0.001, 0.002, 0.01, 0.001, + 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.0001, 0.0001, 0.006, 0.001, 0.0001, 0.005, 0.003, 0.0001, + 0.0001, 0.001, 0.0001, 0.011, 0.0001, 0.003, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.02, 0.002, 0.003, 0.001, + 0.974, 0.0001, 0.004, 0.003, 0.012, 0.0001, 0.0001, 0.001, 0.009, 0.0001, 0.0001, 0.002, 0.432, 0.0001, 0.044, + 0.0001, 0.001, 0.003, 0.001, 0.002, 0.002, 0.006, 0.007, 0.002, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.001, + 1.51, 0.004, 0.013, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 0.0001, 0.005, 0.005, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.008, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.012, 0.0001, 0.0001, 0.003, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.004, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "cho": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.477, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.446, 0.089, 1.242, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.621, 0.621, + 0.0001, 0.0001, 0.799, 0.0001, 0.532, 0.0001, 0.0001, 0.177, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.355, 0.266, 0.0001, 0.0001, 0.0001, 0.089, 0.0001, 0.444, 0.0001, 1.154, 0.0001, 0.0001, + 0.0001, 0.089, 0.799, 0.177, 0.0001, 0.177, 0.0001, 0.355, 0.177, 0.177, 0.444, 0.0001, 0.0001, 0.355, 0.0001, + 0.0001, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.955, 1.154, + 0.799, 0.0001, 2.839, 0.177, 0.621, 7.365, 8.252, 0.0001, 5.146, 2.662, 3.549, 3.727, 5.413, 1.597, 0.0001, + 0.799, 3.638, 5.146, 1.597, 1.065, 0.089, 0.0001, 1.331, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.154, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.266, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.177, + 0.0001, 0.0001, 0.0001, 1.154, 0.0001, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "chr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.394, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.115, 0.002, 0.174, 0.0001, 0.001, 0.005, 0.001, 0.018, 0.095, 0.095, 0.0001, + 0.001, 0.499, 0.081, 0.439, 0.009, 0.086, 0.076, 0.045, 0.025, 0.02, 0.027, 0.02, 0.018, 0.025, 0.029, 0.03, + 0.019, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.037, 0.02, 0.038, 0.014, 0.023, 0.017, 0.012, 0.014, 0.019, 0.011, + 0.01, 0.013, 0.028, 0.014, 0.01, 0.02, 0.002, 0.016, 0.034, 0.027, 0.013, 0.008, 0.015, 0.002, 0.005, 0.003, + 0.065, 0.0001, 0.065, 0.0001, 0.004, 0.0001, 0.692, 0.092, 0.264, 0.31, 0.823, 0.092, 0.184, 0.209, 0.663, 0.01, + 0.064, 0.374, 0.188, 0.502, 0.498, 0.163, 0.016, 0.479, 0.482, 0.523, 0.235, 0.107, 0.076, 0.023, 0.123, 0.021, + 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.027, 0.355, 0.722, 0.213, 0.313, 0.628, 0.115, 0.06, 0.021, 0.056, + 0.084, 0.04, 0.154, 1.876, 13.554, 13.952, 0.082, 0.032, 0.441, 0.837, 0.268, 0.161, 0.041, 1.986, 0.138, 0.561, + 0.191, 0.664, 0.014, 0.045, 0.005, 0.13, 2.057, 0.126, 1.445, 0.138, 1.031, 0.39, 0.904, 0.381, 0.457, 1.048, + 0.569, 0.458, 0.748, 0.433, 0.062, 1.427, 0.213, 0.207, 0.29, 0.574, 0.831, 0.687, 0.218, 0.077, 0.387, 0.051, + 0.016, 0.01, 0.004, 0.004, 1.405, 0.134, 0.0001, 0.0001, 0.009, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 27.238, 0.017, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "chy": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.992, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.662, 0.002, 0.655, 0.0001, 0.0001, 0.0001, 0.0001, 4.281, 0.488, 0.49, 0.012, + 0.039, 1.209, 0.935, 1.193, 0.009, 0.099, 0.186, 0.07, 0.039, 0.048, 0.046, 0.051, 0.032, 0.087, 0.113, 0.294, + 0.06, 0.044, 0.012, 0.043, 0.009, 0.0001, 0.28, 0.143, 0.271, 0.068, 0.058, 0.046, 0.056, 0.705, 0.041, 0.084, + 0.094, 0.075, 0.71, 0.203, 0.133, 0.21, 0.01, 0.123, 0.333, 0.369, 0.109, 0.326, 0.043, 0.02, 0.015, 0.015, + 0.017, 0.0001, 0.017, 0.0001, 0.0001, 0.005, 5.694, 0.454, 0.435, 0.594, 8.431, 0.195, 0.654, 4.544, 1.753, + 0.053, 1.313, 1.118, 1.931, 4.523, 6.14, 0.553, 0.043, 1.203, 5.097, 4.735, 0.637, 1.842, 0.224, 0.461, 0.27, + 0.08, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.024, 0.014, 0.009, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.002, + 0.113, 0.0001, 0.002, 0.007, 0.005, 0.0001, 0.0001, 0.005, 0.002, 0.0001, 0.058, 0.012, 0.0001, 0.003, 0.029, + 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.002, 0.044, 1.384, 0.696, 0.009, 0.027, 0.002, 0.002, + 0.039, 0.005, 3.484, 0.98, 0.162, 0.003, 0.009, 0.002, 0.017, 0.009, 0.003, 0.005, 1.282, 0.993, 0.003, 0.142, + 0.0001, 0.017, 0.0001, 0.002, 0.009, 0.007, 0.0001, 0.007, 0.005, 0.0001, 0.0001, 0.014, 8.846, 0.043, 0.545, + 0.0001, 0.005, 0.046, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.031, 0.009, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.019, 0.003, + 0.017, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "ckb": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.676, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.035, 0.002, 0.062, 0.0001, 0.0001, 0.003, 0.0001, 0.002, 0.131, 0.13, 0.001, + 0.001, 0.011, 0.034, 0.374, 0.013, 0.01, 0.014, 0.008, 0.005, 0.004, 0.004, 0.004, 0.004, 0.005, 0.007, 0.05, + 0.0001, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.009, 0.006, 0.007, 0.006, 0.004, 0.004, 0.004, 0.004, 0.005, + 0.002, 0.003, 0.004, 0.007, 0.005, 0.003, 0.007, 0.001, 0.005, 0.01, 0.007, 0.002, 0.002, 0.003, 0.001, 0.001, + 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.003, 0.0001, 0.058, 0.008, 0.018, 0.017, 0.063, 0.009, 0.012, 0.017, + 0.048, 0.001, 0.008, 0.031, 0.019, 0.043, 0.045, 0.012, 0.001, 0.045, 0.029, 0.036, 0.019, 0.006, 0.008, 0.003, + 0.011, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.386, 0.193, 0.124, 0.067, 1.187, 1.207, 3.947, 0.41, + 3.556, 0.028, 0.015, 0.002, 5.576, 0.003, 1.191, 0.005, 0.006, 0.005, 0.002, 0.004, 0.001, 6.665, 0.001, 0.002, + 0.236, 0.001, 0.002, 0.008, 0.002, 0.002, 0.001, 0.006, 0.161, 0.192, 0.114, 0.062, 0.112, 0.064, 0.707, 4.366, + 1.564, 2.13, 1.551, 0.015, 0.253, 0.092, 0.303, 2.261, 0.008, 2.411, 0.524, 1.151, 0.651, 0.531, 0.001, 0.004, + 0.003, 0.092, 0.048, 0.036, 0.003, 0.003, 0.823, 0.003, 0.0001, 0.0001, 0.028, 0.007, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 15.514, 10.978, 4.45, 13.188, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.375, 0.002, + 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.063, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "co": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.449, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.862, 0.008, 0.387, 0.0001, 0.0001, 0.006, 0.001, 0.763, 0.212, 0.212, 0.003, + 0.001, 0.925, 0.075, 0.859, 0.019, 0.189, 0.28, 0.146, 0.097, 0.087, 0.101, 0.081, 0.085, 0.107, 0.132, 0.097, + 0.026, 0.009, 0.003, 0.01, 0.004, 0.0001, 0.325, 0.102, 0.335, 0.094, 0.091, 0.089, 0.126, 0.077, 0.208, 0.025, + 0.02, 0.156, 0.189, 0.082, 0.052, 0.201, 0.016, 0.093, 0.268, 0.121, 0.17, 0.078, 0.019, 0.022, 0.005, 0.013, + 0.032, 0.0001, 0.032, 0.0001, 0.016, 0.0001, 8.602, 0.557, 3.322, 3.101, 4.329, 0.784, 1.174, 1.381, 10.092, + 0.419, 0.069, 2.83, 1.864, 5.457, 2.618, 1.888, 0.179, 4.342, 3.458, 4.676, 6.626, 0.877, 0.033, 0.017, 0.063, + 0.595, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.058, 0.006, 0.004, 0.002, 0.003, 0.001, 0.001, 0.001, 0.004, + 0.001, 0.001, 0.0001, 0.002, 0.002, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.0001, + 0.001, 0.039, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.789, 0.005, 0.002, 0.002, 0.004, 0.001, 0.002, + 0.004, 0.94, 0.016, 0.001, 0.007, 0.251, 0.004, 0.001, 0.002, 0.005, 0.006, 0.189, 0.011, 0.005, 0.003, 0.002, + 0.024, 0.003, 0.252, 0.004, 0.007, 0.006, 0.005, 0.002, 0.004, 0.0001, 0.0001, 0.05, 2.469, 0.006, 0.004, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.032, 0.015, 0.008, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.04, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "cr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.443, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.088, 0.004, 0.073, 0.0001, 0.0001, 0.02, 0.0001, 0.023, 0.121, 0.12, 0.0001, + 0.002, 0.629, 0.081, 0.971, 0.012, 0.119, 0.193, 0.101, 0.064, 0.076, 0.066, 0.061, 0.066, 0.062, 0.105, 0.063, + 0.027, 0.0001, 0.0001, 0.0001, 0.015, 0.0001, 0.161, 0.04, 0.143, 0.045, 0.195, 0.034, 0.029, 0.053, 0.081, + 0.084, 0.151, 0.056, 0.235, 0.167, 0.103, 0.138, 0.009, 0.033, 0.115, 0.119, 0.03, 0.034, 0.067, 0.012, 0.01, + 0.004, 0.05, 0.0001, 0.047, 0.0001, 0.014, 0.0001, 9.914, 0.233, 4.69, 1.145, 5.906, 0.235, 0.326, 1.052, + 10.924, 0.134, 6.149, 1.256, 2.551, 4.689, 5.033, 1.928, 0.073, 2.706, 3.099, 5.744, 0.924, 0.192, 2.967, 0.038, + 0.312, 0.067, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.088, 0.031, 0.077, 0.099, 0.046, 0.115, 0.007, 0.048, + 0.054, 0.011, 0.091, 0.103, 0.074, 0.037, 0.073, 0.005, 0.766, 0.405, 0.312, 0.295, 0.175, 0.052, 0.036, 0.009, + 0.01, 0.038, 0.001, 0.005, 0.002, 0.0001, 0.001, 0.021, 0.037, 0.111, 0.205, 0.026, 0.084, 0.087, 0.065, 0.093, + 0.076, 0.063, 0.057, 0.032, 0.002, 0.144, 0.111, 0.096, 0.017, 0.078, 0.065, 0.232, 0.037, 0.005, 0.0001, + 0.0001, 0.021, 0.005, 0.022, 0.02, 0.014, 0.002, 0.005, 0.005, 0.0001, 0.0001, 0.046, 0.821, 0.023, 0.077, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 1.861, + 0.08, 0.005, 0.002, 0.009, 0.005, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "crh": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.666, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.545, 0.003, 0.2, 0.0001, 0.003, 0.006, 0.0001, 0.011, 0.498, 0.498, 0.001, + 0.003, 0.581, 0.375, 1.265, 0.029, 0.54, 0.844, 0.447, 0.25, 0.254, 0.244, 0.225, 0.224, 0.237, 0.353, 0.036, + 0.017, 0.017, 0.002, 0.017, 0.003, 0.0001, 0.292, 0.227, 0.115, 0.122, 0.258, 0.045, 0.081, 0.079, 0.299, 0.014, + 0.172, 0.079, 0.19, 0.068, 0.102, 0.074, 0.317, 0.092, 0.196, 0.162, 0.157, 0.161, 0.003, 0.13, 0.089, 0.035, + 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 7.42, 1.383, 0.39, 2.173, 6.493, 0.253, 0.439, 0.324, 6.527, + 0.039, 1.974, 3.301, 1.629, 5.164, 1.476, 0.486, 0.955, 4.625, 3.637, 2.416, 1.149, 1.071, 0.013, 0.004, 1.959, + 0.598, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.415, 0.022, 0.015, 0.022, 0.008, 0.007, 0.005, 0.065, 0.008, + 0.005, 0.004, 0.008, 0.007, 0.007, 0.003, 0.008, 0.005, 0.004, 0.004, 0.069, 0.234, 0.004, 0.026, 0.004, 0.006, + 0.008, 0.008, 0.005, 0.067, 0.049, 0.094, 1.497, 0.026, 0.01, 0.278, 0.006, 0.008, 0.006, 0.005, 0.416, 0.004, + 0.006, 0.005, 0.014, 0.004, 0.007, 0.006, 0.006, 0.149, 5.025, 0.014, 0.011, 0.012, 0.067, 0.295, 0.006, 0.022, + 0.01, 0.019, 0.017, 0.605, 0.022, 0.039, 0.006, 0.0001, 0.0001, 0.035, 2.796, 4.495, 1.1, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.002, 0.256, 0.079, 0.004, 0.002, 0.0001, 0.004, 0.008, + 0.013, 0.021, 0.017, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.015, 0.009, 0.398, 0.007, 0.004, 0.019, + 0.009, 0.005, 0.004, 0.004, 0.003, 0.002, 0.004, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "csb": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.825, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.296, 0.002, 0.584, 0.0001, 0.0001, 0.003, 0.001, 0.009, 0.331, 0.334, 0.002, + 0.0001, 0.877, 0.236, 1.256, 0.065, 0.271, 0.637, 0.291, 0.193, 0.181, 0.174, 0.153, 0.187, 0.256, 0.339, 0.093, + 0.04, 0.024, 0.004, 0.024, 0.003, 0.0001, 0.093, 0.136, 0.203, 0.135, 0.053, 0.045, 0.141, 0.038, 0.163, 0.132, + 0.28, 0.122, 0.184, 0.116, 0.024, 0.275, 0.002, 0.1, 0.23, 0.118, 0.014, 0.056, 0.218, 0.119, 0.003, 0.085, + 0.006, 0.0001, 0.007, 0.0001, 0.002, 0.0001, 4.612, 0.986, 3.096, 2.007, 3.546, 0.161, 1.136, 0.946, 4.255, + 1.343, 2.142, 1.634, 1.571, 3.378, 2.668, 1.384, 0.004, 3.469, 3.152, 2.405, 0.834, 0.037, 2.89, 0.011, 0.614, + 4.079, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.169, 0.025, 0.879, 0.003, 0.332, 0.515, 0.031, 0.005, 0.001, + 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.005, 0.001, 0.013, 0.102, 0.134, 0.005, 0.002, 0.001, 0.001, 0.003, + 0.049, 0.005, 0.012, 0.006, 0.026, 0.025, 0.003, 0.016, 0.006, 0.006, 0.677, 0.002, 0.001, 0.001, 0.001, 0.003, + 1.17, 0.001, 2.19, 0.001, 0.003, 0.0001, 0.002, 0.009, 0.003, 2.322, 0.76, 1.31, 0.003, 0.004, 0.001, 0.007, + 0.615, 0.005, 0.077, 0.465, 0.007, 0.003, 0.002, 0.0001, 0.0001, 0.14, 9.122, 0.543, 1.724, 0.0001, 0.001, + 0.002, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.006, 0.002, 0.024, 0.023, 0.0001, 0.0001, 0.0001, 0.001, 0.002, + 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.197, 0.0001, 0.001, + 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "cu": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.095, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.137, 0.0001, 0.05, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.026, 0.026, 0.001, + 0.0001, 0.049, 0.014, 0.024, 0.015, 0.131, 0.259, 0.12, 0.082, 0.083, 0.082, 0.076, 0.078, 0.096, 0.129, 0.009, + 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.001, 0.006, 0.001, 0.001, 0.001, 0.0001, 0.006, 0.004, + 0.0001, 0.001, 0.001, 0.002, 0.002, 0.004, 0.001, 0.0001, 0.002, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 0.023, 0.002, 0.008, 0.007, 0.018, 0.001, 0.005, + 0.004, 0.017, 0.005, 0.009, 0.01, 0.003, 0.016, 0.015, 0.003, 0.001, 0.01, 0.011, 0.009, 0.011, 0.004, 0.0001, + 0.002, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.938, 4.019, 2.29, 0.582, 0.265, 0.184, 0.28, + 0.33, 0.175, 0.126, 2.698, 0.002, 1.962, 0.002, 0.135, 0.0001, 0.124, 0.906, 0.12, 0.072, 1.561, 0.0001, 0.139, + 0.857, 0.034, 2.179, 0.103, 0.119, 0.097, 0.099, 0.095, 0.124, 0.126, 0.438, 0.049, 1.297, 0.06, 0.96, 0.01, + 0.295, 0.011, 0.359, 0.005, 0.236, 0.002, 0.101, 0.019, 0.025, 3.114, 0.623, 1.373, 0.62, 1.221, 0.086, 0.518, + 0.573, 2.627, 0.002, 1.325, 1.567, 0.924, 2.121, 2.823, 0.585, 0.0001, 0.0001, 0.514, 0.003, 0.006, 0.003, + 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.408, 0.0001, 0.016, 0.012, 21.25, 18.718, 0.249, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.51, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 1.747, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "cv": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.247, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.093, 0.001, 0.059, 0.0001, 0.0001, 0.007, 0.0001, 0.003, 0.152, 0.151, 0.0001, + 0.002, 0.478, 0.273, 0.79, 0.011, 0.204, 0.309, 0.183, 0.104, 0.101, 0.1, 0.081, 0.081, 0.096, 0.17, 0.076, + 0.008, 0.002, 0.002, 0.002, 0.003, 0.0001, 0.004, 0.003, 0.005, 0.002, 0.002, 0.002, 0.002, 0.002, 0.019, 0.001, + 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.003, 0.005, 0.003, 0.002, 0.006, 0.001, 0.01, 0.001, 0.0001, + 0.013, 0.0001, 0.013, 0.0001, 0.001, 0.0001, 0.027, 0.004, 0.007, 0.008, 0.027, 0.004, 0.006, 0.007, 0.02, + 0.001, 0.004, 0.016, 0.009, 0.019, 0.018, 0.006, 0.0001, 0.019, 0.014, 0.015, 0.011, 0.003, 0.002, 0.002, 0.004, + 0.001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 3.257, 1.78, 2.381, 2.851, 0.156, 1.36, 0.178, 0.773, 1.001, + 0.006, 0.006, 0.869, 0.319, 0.035, 0.373, 0.165, 0.161, 0.088, 0.098, 0.049, 0.312, 2.25, 0.007, 0.017, 0.069, + 0.007, 0.174, 0.039, 0.101, 0.06, 0.095, 0.155, 0.212, 0.157, 0.129, 0.054, 0.061, 0.066, 0.005, 1.16, 0.101, + 0.002, 0.0001, 0.045, 0.001, 0.021, 0.156, 0.041, 4.16, 0.372, 1.295, 0.368, 0.304, 3.139, 0.041, 0.13, 2.185, + 0.64, 1.311, 1.785, 0.994, 3.619, 1.18, 1.135, 0.0001, 0.0001, 0.101, 1.175, 3.79, 0.002, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.002, 0.001, 24.733, 13.586, 0.004, 0.088, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.282, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "cy": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.628, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.48, 0.003, 0.545, 0.0001, 0.001, 0.007, 0.002, 0.872, 0.259, 0.258, 0.001, + 0.001, 0.777, 0.194, 0.96, 0.016, 0.363, 0.487, 0.244, 0.138, 0.133, 0.135, 0.125, 0.126, 0.164, 0.239, 0.149, + 0.081, 0.022, 0.001, 0.022, 0.003, 0.0001, 0.36, 0.242, 0.56, 0.267, 0.155, 0.163, 0.331, 0.126, 0.112, 0.06, + 0.033, 0.279, 0.433, 0.133, 0.073, 0.238, 0.004, 0.18, 0.303, 0.196, 0.061, 0.026, 0.092, 0.003, 0.167, 0.006, + 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 7.082, 0.905, 1.506, 6.475, 6.263, 2.165, 2.494, 2.4, 4.773, 0.015, + 0.114, 3.901, 1.419, 6.217, 4.277, 0.556, 0.008, 5.57, 2.092, 2.13, 1.941, 0.086, 2.82, 0.025, 5.712, 0.034, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.074, 0.005, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.021, 0.002, 0.001, 0.0001, 0.001, 0.002, 0.033, + 0.001, 0.001, 0.007, 0.009, 0.001, 0.001, 0.033, 0.007, 0.059, 0.003, 0.003, 0.001, 0.001, 0.003, 0.004, 0.015, + 0.016, 0.004, 0.001, 0.004, 0.01, 0.012, 0.004, 0.003, 0.003, 0.004, 0.074, 0.043, 0.005, 0.016, 0.003, 0.006, + 0.003, 0.002, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.036, 0.221, 0.003, 0.06, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.007, 0.004, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.072, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "din": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.698, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.927, 0.0001, 0.06, 0.0001, 0.003, 0.013, 0.0001, 0.015, 0.171, 0.17, 0.0001, + 0.0001, 0.878, 0.077, 0.901, 0.027, 0.297, 0.229, 0.151, 0.055, 0.064, 0.078, 0.053, 0.048, 0.049, 0.126, 0.018, + 0.013, 0.002, 0.0001, 0.002, 0.005, 0.0001, 0.424, 0.153, 0.093, 0.101, 0.075, 0.019, 0.074, 0.021, 0.051, + 0.069, 0.324, 0.085, 0.16, 0.163, 0.021, 0.306, 0.002, 0.087, 0.062, 0.288, 0.034, 0.007, 0.069, 0.0001, 0.136, + 0.003, 0.027, 0.0001, 0.027, 0.0001, 0.0001, 0.0001, 5.438, 0.999, 2.9, 1.603, 4.394, 0.024, 0.521, 1.912, + 3.749, 0.362, 4.818, 2.02, 1.512, 4.26, 1.668, 1.035, 0.003, 2.29, 0.155, 3.595, 3.428, 0.022, 0.527, 0.011, + 2.005, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.036, 0.001, 0.001, 0.0001, 0.027, 0.0001, 0.026, 0.0001, + 1.487, 0.0001, 0.005, 1.04, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 2.319, 0.0001, + 0.0001, 0.0001, 0.001, 0.002, 0.0001, 1.678, 0.006, 0.006, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.222, 1.181, + 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.0001, 3.25, 0.0001, 0.001, 0.006, 1.508, 0.003, 0.002, 0.006, 0.002, + 0.0001, 0.011, 1.021, 0.001, 0.004, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.016, + 6.971, 0.0001, 1.041, 0.02, 0.0001, 0.0001, 4.193, 0.0001, 0.0001, 1.487, 0.0001, 0.027, 0.005, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.062, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001 + ], + "diq": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.719, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.354, 0.008, 0.4, 0.0001, 0.0001, 0.009, 0.0001, 0.031, 0.299, 0.3, 0.001, + 0.003, 0.98, 0.165, 1.27, 0.045, 0.227, 0.302, 0.162, 0.087, 0.08, 0.089, 0.076, 0.082, 0.096, 0.17, 0.156, + 0.035, 0.026, 0.008, 0.027, 0.01, 0.0001, 0.309, 0.187, 0.135, 0.206, 0.243, 0.108, 0.12, 0.188, 0.05, 0.033, + 0.209, 0.106, 0.271, 0.167, 0.06, 0.167, 0.062, 0.13, 0.271, 0.259, 0.059, 0.085, 0.06, 0.052, 0.088, 0.128, + 0.014, 0.0001, 0.014, 0.0001, 0.002, 0.001, 7.586, 1.293, 0.911, 2.514, 8.148, 0.439, 0.62, 0.759, 4.61, 0.11, + 2.125, 1.599, 2.095, 4.93, 3.468, 0.588, 0.377, 4.808, 2.018, 2.359, 1.695, 0.626, 1.106, 0.479, 3.36, 1.081, + 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.078, 0.018, 0.011, 0.012, 0.02, 0.015, 0.019, 0.078, 0.016, 0.004, + 0.018, 0.002, 0.014, 0.004, 0.014, 0.003, 0.006, 0.005, 0.003, 0.011, 0.005, 0.006, 0.005, 0.002, 0.009, 0.023, + 0.002, 0.004, 0.022, 0.016, 0.065, 0.865, 0.032, 0.01, 0.013, 0.005, 0.007, 0.004, 0.006, 0.242, 0.014, 0.032, + 2.716, 0.012, 0.007, 0.008, 0.29, 0.015, 0.191, 2.379, 0.013, 0.015, 0.01, 0.006, 0.021, 0.004, 0.009, 0.01, + 0.007, 0.128, 0.093, 0.009, 0.008, 0.006, 0.0001, 0.0001, 0.039, 3.563, 2.668, 0.816, 0.0001, 0.001, 0.0001, + 0.005, 0.003, 0.002, 0.002, 0.0001, 0.03, 0.013, 0.034, 0.014, 0.001, 0.0001, 0.001, 0.012, 0.005, 0.037, 0.126, + 0.091, 0.007, 0.013, 0.003, 0.0001, 0.0001, 0.0001, 0.019, 0.012, 0.072, 0.001, 0.0001, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "dsb": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.783, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.853, 0.003, 0.608, 0.0001, 0.0001, 0.007, 0.002, 0.016, 0.311, 0.311, 0.022, + 0.002, 0.839, 0.138, 1.194, 0.023, 0.287, 0.411, 0.214, 0.128, 0.124, 0.131, 0.109, 0.104, 0.125, 0.201, 0.084, + 0.035, 0.006, 0.007, 0.007, 0.003, 0.0001, 0.155, 0.168, 0.123, 0.122, 0.077, 0.058, 0.102, 0.068, 0.054, 0.115, + 0.164, 0.108, 0.197, 0.144, 0.038, 0.256, 0.004, 0.113, 0.246, 0.119, 0.042, 0.025, 0.244, 0.005, 0.007, 0.075, + 0.008, 0.0001, 0.008, 0.0001, 0.002, 0.0001, 6.833, 1.047, 1.719, 1.818, 5.619, 0.234, 0.977, 0.835, 3.647, + 3.795, 2.962, 1.965, 2.079, 4.006, 5.923, 1.615, 0.008, 3.224, 3.399, 2.803, 2.458, 0.071, 3.327, 0.021, 1.623, + 1.195, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.148, 0.049, 0.931, 0.01, 0.22, 0.006, 0.005, 0.266, 0.005, 0.002, + 0.002, 0.002, 0.017, 0.029, 0.002, 0.002, 0.007, 0.003, 0.004, 0.026, 0.004, 0.064, 0.004, 0.004, 0.009, 0.024, + 0.008, 1.886, 0.043, 0.009, 0.04, 0.009, 0.064, 0.625, 0.008, 0.004, 0.017, 0.003, 0.003, 0.004, 0.006, 0.017, + 0.003, 0.004, 0.001, 0.008, 0.001, 0.002, 0.019, 0.008, 0.014, 1.225, 0.005, 0.009, 0.011, 0.005, 0.012, 0.012, + 0.395, 0.009, 0.027, 0.02, 0.616, 0.016, 0.0001, 0.0001, 0.039, 1.311, 1.431, 3.692, 0.0001, 0.0001, 0.001, + 0.004, 0.001, 0.001, 0.001, 0.0001, 0.017, 0.009, 0.074, 0.029, 0.001, 0.0001, 0.0001, 0.002, 0.007, 0.043, + 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.012, 0.141, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "dty": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.724, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.716, 0.001, 0.019, 0.0001, 0.0001, 0.003, 0.0001, 0.008, 0.063, 0.066, 0.001, + 0.0001, 0.189, 0.033, 0.052, 0.008, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.027, + 0.004, 0.012, 0.001, 0.012, 0.001, 0.0001, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.017, 0.012, 0.004, 0.005, 0.014, 0.002, 0.003, 0.006, + 0.016, 0.001, 0.004, 0.007, 0.008, 0.013, 0.011, 0.003, 0.0001, 0.019, 0.008, 0.009, 0.004, 0.001, 0.003, + 0.0001, 0.003, 0.001, 0.0001, 0.015, 0.0001, 0.0001, 0.0001, 0.87, 0.744, 0.354, 0.069, 0.0001, 0.295, 0.114, + 1.106, 0.404, 0.216, 0.006, 1.008, 0.08, 2.434, 0.0001, 0.171, 0.009, 0.001, 0.001, 0.025, 0.014, 1.53, 0.174, + 0.539, 0.045, 0.068, 0.25, 0.269, 0.443, 0.023, 0.04, 0.304, 0.083, 0.214, 0.028, 0.182, 24.937, 7.5, 0.641, + 0.298, 1.687, 0.033, 0.816, 0.129, 0.459, 0.371, 1.179, 1.062, 2.109, 0.002, 1.084, 0.0001, 0.0001, 0.578, + 0.275, 0.191, 1.004, 0.659, 0.001, 0.0001, 0.01, 0.01, 3.197, 1.534, 0.0001, 0.0001, 0.004, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.897, + 0.0001, 0.034, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "dv": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.449, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.782, 0.003, 0.057, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.068, 0.068, 0.0001, + 0.001, 0.01, 0.02, 0.58, 0.003, 0.08, 0.111, 0.068, 0.041, 0.031, 0.037, 0.03, 0.031, 0.035, 0.052, 0.01, 0.001, + 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.002, 0.002, 0.001, 0.003, 0.003, 0.001, + 0.001, 0.001, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.002, 0.003, 0.005, 0.001, 0.001, 0.003, 0.0001, 0.001, + 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.004, 0.0001, 0.069, 0.013, 0.026, 0.027, 0.096, 0.015, 0.017, 0.033, + 0.065, 0.001, 0.006, 0.037, 0.021, 0.063, 0.061, 0.016, 0.001, 0.05, 0.05, 0.064, 0.025, 0.009, 0.011, 0.002, + 0.014, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.961, 0.592, 2.65, 1.657, 0.723, 0.269, 1.597, 3.461, + 1.72, 1.651, 0.757, 0.977, 1.223, 0.768, 1.538, 0.011, 0.778, 0.359, 0.094, 0.266, 0.255, 0.126, 0.187, 0.051, + 0.006, 0.076, 0.047, 0.004, 0.004, 0.086, 0.041, 0.008, 0.02, 0.003, 0.091, 0.008, 0.069, 0.003, 5.331, 1.558, + 2.986, 0.988, 3.164, 0.17, 3.662, 0.439, 0.51, 0.17, 3.636, 0.006, 0.014, 0.003, 0.002, 0.002, 0.001, 0.014, + 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.201, 0.101, 0.0001, 0.002, 0.0001, 0.0001, 45.417, 0.0001, 0.002, 0.0001, 0.011, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "dz": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.39, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.815, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.023, 0.023, + 0.0001, 0.002, 0.003, 0.013, 0.008, 0.001, 0.017, 0.015, 0.012, 0.006, 0.005, 0.004, 0.005, 0.004, 0.004, 0.004, + 0.001, 0.0001, 0.007, 0.0001, 0.007, 0.001, 0.0001, 0.002, 0.004, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.001, 0.001, 0.0001, 0.001, 0.003, 0.001, 0.0001, 0.004, 0.0001, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.03, 0.011, 0.006, 0.008, 0.024, 0.002, + 0.006, 0.009, 0.021, 0.002, 0.004, 0.014, 0.011, 0.019, 0.021, 0.004, 0.0001, 0.02, 0.011, 0.013, 0.01, 0.002, + 0.002, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.269, 0.247, 1.794, 0.002, 1.18, 0.189, + 0.19, 0.052, 0.002, 0.102, 0.016, 7.859, 0.051, 0.549, 0.008, 0.12, 0.301, 1.592, 0.28, 1.053, 0.694, 0.157, + 1.278, 0.061, 0.824, 0.093, 0.2, 0.068, 0.006, 0.019, 0.267, 0.283, 0.898, 0.517, 1.238, 0.954, 0.214, 0.015, + 2.251, 0.029, 0.117, 0.081, 0.001, 0.058, 0.0001, 0.012, 0.002, 0.0001, 0.002, 0.89, 2.149, 0.094, 1.08, 0.001, + 0.0001, 0.053, 0.001, 0.0001, 0.926, 0.001, 10.076, 21.494, 2.583, 0.002, 0.0001, 0.0001, 0.002, 0.004, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 32.733, + 0.0001, 0.016, 0.005, 0.001, 0.002, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "ee": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.047, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.659, 0.001, 0.347, 0.0001, 0.001, 0.004, 0.004, 0.044, 0.199, 0.199, 0.001, + 0.0001, 0.713, 0.054, 1.348, 0.005, 0.312, 0.38, 0.219, 0.115, 0.09, 0.132, 0.118, 0.118, 0.109, 0.211, 0.064, + 0.006, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.552, 0.172, 0.134, 0.182, 0.397, 0.085, 0.215, 0.112, 0.083, + 0.04, 0.209, 0.217, 0.202, 0.168, 0.043, 0.117, 0.006, 0.112, 0.229, 0.176, 0.053, 0.059, 0.177, 0.021, 0.139, + 0.02, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 7.214, 1.62, 0.258, 2.122, 10.212, 0.557, 1.427, 0.62, 4.11, + 0.028, 2.137, 3.419, 2.267, 3.348, 4.663, 0.886, 0.007, 1.264, 2.303, 2.327, 2.541, 0.557, 2.031, 0.389, 1.697, + 0.84, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.058, 0.011, 0.016, 0.109, 0.004, 0.002, 0.009, 0.001, 0.003, + 0.01, 0.044, 0.61, 0.005, 0.002, 0.0001, 0.003, 0.018, 0.018, 1.229, 0.009, 2.883, 0.003, 1.23, 0.001, 0.002, + 0.008, 0.003, 0.085, 0.02, 0.018, 0.001, 0.001, 0.052, 0.01, 0.004, 0.485, 0.002, 0.0001, 0.002, 0.004, 0.005, + 0.042, 0.003, 0.002, 0.003, 0.025, 0.002, 0.002, 0.007, 0.009, 0.047, 0.01, 0.005, 0.003, 0.005, 0.003, 0.006, + 0.005, 0.14, 0.007, 0.005, 0.138, 0.008, 0.004, 0.0001, 0.0001, 0.039, 0.487, 0.018, 0.548, 1.276, 0.0001, + 0.004, 4.335, 0.128, 0.004, 0.106, 0.013, 0.028, 0.013, 0.041, 0.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, + 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.138, 0.051, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "eml": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.684, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.039, 0.004, 0.415, 0.0001, 0.0001, 0.004, 0.001, 1.632, 0.216, 0.216, 0.001, + 0.001, 0.746, 0.069, 0.997, 0.011, 0.415, 0.659, 0.408, 0.216, 0.231, 0.235, 0.226, 0.213, 0.215, 0.256, 0.061, + 0.026, 0.05, 0.006, 0.05, 0.003, 0.0001, 0.44, 0.139, 0.4, 0.112, 0.078, 0.095, 0.114, 0.018, 0.424, 0.019, + 0.012, 0.251, 0.226, 0.059, 0.026, 0.233, 0.016, 0.153, 0.231, 0.099, 0.036, 0.164, 0.011, 0.127, 0.003, 0.015, + 0.004, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 7.63, 0.549, 2.301, 3.601, 3.529, 0.617, 1.263, 0.808, 5.22, 0.113, + 0.052, 4.92, 1.657, 5.406, 1.72, 1.353, 0.118, 3.957, 2.689, 3.146, 2.026, 0.904, 0.024, 0.02, 0.047, 0.34, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.239, 0.003, 0.006, 0.003, 0.004, 0.052, 0.002, 0.003, 0.008, 0.003, + 0.006, 0.001, 0.002, 0.193, 0.002, 0.001, 0.002, 0.002, 0.003, 0.098, 0.002, 0.001, 0.001, 0.001, 0.033, 0.188, + 0.003, 0.047, 0.006, 0.006, 0.001, 0.078, 0.562, 0.025, 0.617, 0.129, 0.182, 0.072, 0.003, 0.005, 1.444, 0.829, + 0.895, 0.057, 0.235, 0.011, 0.346, 0.001, 0.004, 0.003, 0.664, 0.345, 0.314, 0.007, 0.019, 0.001, 0.003, 0.275, + 0.004, 0.186, 0.062, 0.002, 0.002, 0.006, 0.0001, 0.0001, 0.011, 6.936, 0.1, 0.325, 0.0001, 0.004, 0.0001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.003, 0.002, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.192, 0.237, 0.003, 0.002, 0.005, 0.003, + 0.003, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "eo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.154, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.737, 0.006, 0.429, 0.0001, 0.0001, 0.01, 0.001, 0.015, 0.235, 0.235, 0.001, + 0.003, 0.936, 0.306, 0.916, 0.015, 0.284, 0.481, 0.226, 0.14, 0.134, 0.143, 0.121, 0.123, 0.155, 0.273, 0.072, + 0.027, 0.012, 0.007, 0.013, 0.002, 0.0001, 0.209, 0.154, 0.114, 0.106, 0.232, 0.094, 0.127, 0.102, 0.106, 0.077, + 0.183, 0.354, 0.184, 0.118, 0.083, 0.187, 0.004, 0.116, 0.241, 0.149, 0.061, 0.074, 0.035, 0.004, 0.009, 0.024, + 0.021, 0.0001, 0.021, 0.0001, 0.004, 0.0001, 9.544, 0.784, 0.841, 2.534, 6.934, 0.706, 0.989, 0.423, 6.212, + 2.407, 2.868, 4.302, 1.963, 5.456, 7.143, 1.699, 0.009, 4.617, 4.113, 4.222, 2.31, 1.083, 0.045, 0.017, 0.108, + 0.46, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.058, 0.01, 0.009, 0.008, 0.004, 0.004, 0.002, 0.003, 0.037, + 0.239, 0.001, 0.001, 0.004, 0.007, 0.001, 0.002, 0.002, 0.007, 0.002, 0.018, 0.008, 0.001, 0.002, 0.002, 0.002, + 0.012, 0.003, 0.005, 0.093, 0.609, 0.008, 0.005, 0.021, 0.066, 0.005, 0.003, 0.01, 0.029, 0.002, 0.005, 0.005, + 0.035, 0.002, 0.007, 0.002, 0.34, 0.001, 0.002, 0.012, 0.007, 0.011, 0.025, 0.006, 0.093, 0.016, 0.003, 0.007, + 0.003, 0.008, 0.009, 0.016, 0.009, 0.009, 0.003, 0.0001, 0.0001, 0.038, 0.2, 0.946, 0.502, 0.0001, 0.001, 0.005, + 0.001, 0.001, 0.001, 0.001, 0.0001, 0.012, 0.006, 0.045, 0.015, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.003, + 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.056, 0.002, 0.001, 0.003, 0.002, + 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "eu": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.418, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.177, 0.001, 0.297, 0.0001, 0.0001, 0.006, 0.001, 0.01, 0.167, 0.167, 0.0001, + 0.001, 1.097, 0.307, 1.039, 0.006, 0.582, 0.665, 0.539, 0.263, 0.232, 0.207, 0.196, 0.233, 0.193, 0.297, 0.077, + 0.037, 0.019, 0.004, 0.019, 0.001, 0.0001, 0.228, 0.197, 0.105, 0.074, 0.177, 0.09, 0.111, 0.131, 0.123, 0.048, + 0.077, 0.106, 0.134, 0.065, 0.059, 0.121, 0.005, 0.05, 0.134, 0.08, 0.034, 0.046, 0.019, 0.022, 0.008, 0.029, + 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.0001, 11.924, 1.97, 0.229, 2.409, 9.817, 0.3, 1.545, 0.915, 6.874, 0.162, + 4.015, 2.508, 1.08, 6.457, 4.385, 0.883, 0.011, 6.261, 2.025, 5.706, 3.55, 0.077, 0.032, 0.337, 0.117, 3.463, + 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.014, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.003, + 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.008, 0.009, 0.002, 0.002, 0.004, 0.001, 0.001, 0.003, + 0.009, 0.023, 0.001, 0.012, 0.001, 0.01, 0.001, 0.001, 0.003, 0.012, 0.007, 0.008, 0.006, 0.001, 0.003, 0.001, + 0.002, 0.001, 0.004, 0.012, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.039, 0.094, 0.003, 0.003, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.007, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.013, 0.001, + 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ext": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.183, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.144, 0.002, 0.474, 0.0001, 0.0001, 0.008, 0.001, 0.271, 0.191, 0.19, 0.004, + 0.002, 1.06, 0.101, 0.854, 0.021, 0.249, 0.293, 0.188, 0.105, 0.088, 0.096, 0.085, 0.084, 0.099, 0.161, 0.072, + 0.026, 0.008, 0.003, 0.006, 0.002, 0.0001, 0.241, 0.103, 0.248, 0.095, 0.369, 0.065, 0.091, 0.071, 0.128, 0.047, + 0.018, 0.238, 0.161, 0.09, 0.062, 0.171, 0.026, 0.094, 0.188, 0.116, 0.077, 0.083, 0.02, 0.035, 0.009, 0.011, + 0.028, 0.0001, 0.029, 0.0001, 0.001, 0.002, 8.822, 0.896, 2.974, 2.338, 7.586, 0.409, 0.951, 0.639, 6.63, 0.18, + 0.079, 4.794, 1.966, 5.508, 3.713, 1.742, 0.451, 4.358, 5.625, 3.427, 5.456, 0.664, 0.026, 0.047, 0.265, 0.205, + 0.0001, 0.012, 0.0001, 0.001, 0.0001, 0.09, 0.042, 0.016, 0.012, 0.021, 0.01, 0.009, 0.007, 0.019, 0.01, 0.009, + 0.002, 0.007, 0.012, 0.003, 0.002, 0.01, 0.006, 0.003, 0.011, 0.012, 0.003, 0.002, 0.002, 0.004, 0.049, 0.003, + 0.005, 0.01, 0.009, 0.003, 0.003, 0.02, 0.663, 0.003, 0.009, 0.008, 0.004, 0.004, 0.092, 0.006, 0.332, 0.01, + 0.012, 0.009, 0.354, 0.005, 0.01, 0.016, 0.295, 0.019, 0.537, 0.024, 0.015, 0.008, 0.008, 0.011, 0.017, 0.174, + 0.02, 0.041, 0.023, 0.01, 0.023, 0.0001, 0.0001, 0.078, 2.453, 0.012, 0.009, 0.0001, 0.0001, 0.0001, 0.019, + 0.008, 0.025, 0.005, 0.0001, 0.151, 0.073, 0.021, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.034, + 0.026, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.021, 0.082, 0.001, 0.001, 0.002, 0.002, 0.001, + 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ff": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.229, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.756, 0.003, 0.154, 0.0001, 0.0001, 0.002, 0.0001, 0.07, 0.321, 0.324, 0.004, + 0.001, 1.19, 0.201, 1.011, 0.039, 0.221, 0.281, 0.197, 0.076, 0.082, 0.099, 0.098, 0.084, 0.101, 0.154, 0.153, + 0.028, 0.04, 0.008, 0.04, 0.01, 0.0001, 0.371, 0.159, 0.12, 0.097, 0.095, 0.198, 0.111, 0.12, 0.065, 0.102, + 0.267, 0.138, 0.299, 0.201, 0.095, 0.085, 0.014, 0.046, 0.262, 0.159, 0.061, 0.013, 0.059, 0.003, 0.066, 0.008, + 0.007, 0.0001, 0.007, 0.0001, 0.006, 0.0001, 10.449, 0.928, 0.343, 3.119, 8.063, 0.727, 1.432, 1.127, 6.432, + 0.966, 2.387, 3.274, 2.586, 6.222, 6.89, 0.484, 0.058, 2.623, 1.086, 2.251, 3.239, 0.048, 1.581, 0.013, 1.385, + 0.042, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.25, 0.043, 0.0001, 0.008, 0.007, 0.001, 0.007, 0.002, 0.023, + 0.003, 0.031, 0.086, 0.001, 0.0001, 0.009, 0.005, 0.007, 0.017, 0.003, 1.378, 0.001, 0.001, 0.0001, 1.485, 0.01, + 0.123, 0.001, 0.002, 0.036, 0.035, 0.003, 0.0001, 0.06, 0.009, 0.0001, 0.003, 0.0001, 0.002, 0.02, 0.011, 0.007, + 0.04, 0.001, 0.024, 0.001, 0.003, 0.0001, 0.0001, 0.006, 0.154, 0.006, 0.01, 0.135, 0.002, 0.002, 0.009, 0.004, + 0.002, 0.004, 0.025, 0.02, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.111, 0.229, 0.005, 0.088, 0.202, 0.0001, + 0.0001, 2.86, 0.02, 0.001, 0.001, 0.0001, 0.003, 0.0001, 0.017, 0.011, 0.0001, 0.0001, 0.001, 0.002, 0.002, + 0.0001, 0.023, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.248, 0.0001, 0.0001, + 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "fj": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.647, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.11, 0.005, 0.222, 0.0001, 0.0001, 0.0001, 0.002, 0.182, 0.39, 0.39, 0.002, + 0.003, 0.665, 0.202, 1.418, 0.055, 0.382, 0.504, 0.342, 0.179, 0.168, 0.196, 0.159, 0.133, 0.129, 0.164, 0.07, + 0.04, 0.02, 0.002, 0.02, 0.013, 0.002, 0.352, 0.212, 0.246, 0.146, 0.319, 0.066, 0.096, 0.061, 0.166, 0.217, + 0.277, 0.179, 0.262, 0.29, 0.095, 0.254, 0.022, 0.118, 0.377, 0.355, 0.066, 0.534, 0.043, 0.003, 0.05, 0.01, + 0.0001, 0.0001, 0.005, 0.0001, 0.008, 0.0001, 13.891, 0.708, 1.055, 1.505, 4.909, 0.352, 0.936, 0.685, 8.96, + 0.075, 2.998, 2.827, 2.182, 5.506, 3.831, 0.546, 0.257, 2.747, 2.722, 3.592, 4.532, 2.046, 0.526, 0.045, 0.71, + 0.111, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.267, 0.01, 0.007, 0.005, 0.007, 0.002, 0.0001, 0.002, 0.003, + 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.008, 0.0001, 0.0001, 0.013, 0.192, 0.0001, 0.003, + 0.002, 0.0001, 0.008, 0.002, 0.0001, 0.023, 0.022, 0.002, 0.0001, 0.007, 0.005, 0.0001, 0.01, 0.003, 0.0001, + 0.002, 0.005, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.008, 0.0001, 0.003, 0.022, 0.003, + 0.002, 0.005, 0.0001, 0.008, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.013, 0.065, + 0.0001, 0.023, 0.002, 0.0001, 0.0001, 0.013, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.002, 0.01, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.007, 0.26, 0.0001, 0.003, 0.002, 0.0001, 0.003, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "fo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.171, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.257, 0.003, 0.223, 0.0001, 0.0001, 0.01, 0.002, 0.015, 0.14, 0.141, 0.001, + 0.001, 0.983, 0.292, 1.473, 0.021, 0.562, 0.624, 0.361, 0.197, 0.187, 0.183, 0.177, 0.172, 0.176, 0.285, 0.092, + 0.018, 0.015, 0.005, 0.015, 0.002, 0.0001, 0.162, 0.14, 0.076, 0.088, 0.116, 0.204, 0.083, 0.244, 0.058, 0.087, + 0.291, 0.108, 0.161, 0.114, 0.065, 0.092, 0.004, 0.082, 0.312, 0.204, 0.061, 0.078, 0.034, 0.003, 0.012, 0.006, + 0.004, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 6.488, 0.752, 0.145, 1.557, 3.939, 1.383, 2.415, 1.123, 6.407, + 0.628, 2.151, 3.099, 2.563, 5.616, 2.172, 0.663, 0.005, 6.541, 3.536, 4.094, 3.571, 2.164, 0.044, 0.017, 0.862, + 0.025, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.054, 0.049, 0.002, 0.002, 0.002, 0.004, 0.003, 0.001, 0.001, + 0.001, 0.001, 0.0001, 0.001, 0.091, 0.001, 0.001, 0.001, 0.001, 0.001, 0.033, 0.002, 0.001, 0.002, 0.001, 0.017, + 0.004, 0.006, 0.001, 0.006, 0.009, 0.001, 0.001, 0.01, 0.939, 0.001, 0.001, 0.016, 0.008, 0.277, 0.003, 0.006, + 0.007, 0.001, 0.002, 0.001, 1.13, 0.001, 0.004, 1.899, 0.003, 0.003, 0.718, 0.002, 0.002, 0.014, 0.001, 0.801, + 0.002, 0.333, 0.003, 0.004, 0.203, 0.003, 0.002, 0.0001, 0.0001, 0.022, 6.504, 0.004, 0.004, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.012, 0.005, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.002, 0.004, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.053, 0.001, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "frp": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.788, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.014, 0.012, 0.659, 0.001, 0.0001, 0.001, 0.001, 0.361, 0.368, 0.368, 0.001, + 0.0001, 0.743, 0.467, 0.873, 0.02, 0.214, 0.426, 0.274, 0.128, 0.113, 0.117, 0.113, 0.107, 0.116, 0.228, 0.11, + 0.019, 0.081, 0.005, 0.081, 0.002, 0.0001, 0.35, 0.279, 0.333, 0.142, 0.141, 0.152, 0.135, 0.066, 0.159, 0.087, + 0.033, 0.593, 0.22, 0.099, 0.082, 0.206, 0.019, 0.236, 0.314, 0.121, 0.062, 0.179, 0.013, 0.025, 0.027, 0.009, + 0.022, 0.0001, 0.022, 0.0001, 0.006, 0.0001, 6.3, 0.639, 2.237, 2.924, 6.953, 0.549, 0.996, 0.581, 3.639, 0.252, + 0.124, 3.838, 1.505, 5.552, 4.982, 1.442, 0.366, 4.363, 4.487, 4.4, 2.763, 0.919, 0.029, 0.168, 0.501, 0.132, + 0.0001, 0.008, 0.0001, 0.001, 0.0001, 0.591, 0.012, 0.04, 0.026, 0.003, 0.003, 0.002, 0.002, 0.077, 0.083, + 0.002, 0.003, 0.004, 0.003, 0.002, 0.005, 0.007, 0.003, 0.002, 0.023, 0.039, 0.002, 0.001, 0.002, 0.013, 0.56, + 0.002, 0.002, 0.004, 0.004, 0.002, 0.004, 0.079, 0.014, 0.761, 0.004, 0.005, 0.003, 0.004, 0.044, 1.724, 0.994, + 0.451, 0.049, 0.014, 0.007, 0.008, 0.004, 0.024, 0.005, 0.02, 0.03, 0.411, 0.012, 0.002, 0.176, 0.006, 0.01, + 0.014, 0.089, 0.007, 0.007, 0.007, 0.005, 0.0001, 0.0001, 0.277, 4.789, 0.008, 0.018, 0.001, 0.0001, 0.0001, + 0.008, 0.004, 0.004, 0.003, 0.001, 0.014, 0.004, 0.075, 0.032, 0.0001, 0.0001, 0.001, 0.005, 0.001, 0.004, + 0.007, 0.005, 0.0001, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.004, 0.024, 0.586, 0.003, 0.0001, 0.001, 0.002, + 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "frr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.212, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.548, 0.003, 0.682, 0.0001, 0.001, 0.008, 0.0001, 0.237, 0.407, 0.407, 0.015, + 0.002, 0.738, 0.264, 1.349, 0.032, 0.426, 0.487, 0.285, 0.155, 0.131, 0.142, 0.153, 0.132, 0.154, 0.213, 0.163, + 0.033, 0.094, 0.019, 0.094, 0.014, 0.0001, 0.424, 0.235, 0.114, 0.463, 0.142, 0.219, 0.132, 0.243, 0.123, 0.143, + 0.217, 0.156, 0.239, 0.202, 0.1, 0.178, 0.008, 0.163, 0.493, 0.169, 0.107, 0.04, 0.158, 0.005, 0.006, 0.018, + 0.02, 0.0001, 0.02, 0.0001, 0.015, 0.0001, 7.38, 1.026, 0.694, 2.643, 7.751, 1.48, 1.329, 1.414, 5.143, 0.835, + 1.946, 2.506, 1.658, 6.635, 2.847, 0.757, 0.017, 4.866, 3.953, 4.835, 3.559, 0.125, 1.078, 0.025, 0.13, 0.078, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.121, 0.04, 0.005, 0.007, 0.011, 0.01, 0.004, 0.003, 0.014, 0.003, + 0.007, 0.003, 0.003, 0.004, 0.004, 0.002, 0.006, 0.041, 0.003, 0.029, 0.004, 0.002, 0.039, 0.002, 0.005, 0.057, + 0.003, 0.003, 0.033, 0.001, 0.015, 0.005, 0.043, 0.01, 0.008, 0.004, 0.702, 0.24, 0.006, 0.008, 0.007, 0.041, + 0.006, 0.01, 0.003, 0.013, 0.002, 0.004, 0.015, 0.008, 0.014, 0.009, 0.006, 0.008, 0.971, 0.003, 0.022, 0.007, + 0.006, 0.005, 0.964, 0.005, 0.004, 0.003, 0.0001, 0.0001, 0.041, 3.039, 0.101, 0.012, 0.0001, 0.001, 0.0001, + 0.016, 0.008, 0.014, 0.003, 0.0001, 0.014, 0.006, 0.019, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.018, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.024, 0.122, 0.0001, 0.0001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "fur": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.465, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.803, 0.002, 0.385, 0.0001, 0.0001, 0.006, 0.001, 0.135, 0.204, 0.203, 0.001, + 0.001, 0.945, 0.084, 1.045, 0.015, 0.262, 0.474, 0.24, 0.16, 0.15, 0.158, 0.149, 0.15, 0.168, 0.219, 0.076, + 0.046, 0.024, 0.003, 0.006, 0.002, 0.0001, 0.268, 0.102, 0.337, 0.116, 0.078, 0.115, 0.121, 0.022, 0.278, 0.048, + 0.02, 0.218, 0.154, 0.07, 0.05, 0.172, 0.005, 0.086, 0.217, 0.131, 0.073, 0.108, 0.016, 0.024, 0.002, 0.027, + 0.004, 0.001, 0.004, 0.0001, 0.016, 0.0001, 6.873, 0.54, 3.119, 3.521, 7.672, 0.855, 0.912, 0.901, 8.131, 0.838, + 0.065, 4.486, 1.745, 5.361, 3.491, 1.873, 0.016, 4.269, 4.833, 4.488, 2.566, 1.056, 0.024, 0.012, 0.029, 0.497, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.039, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.005, 0.001, 0.001, + 0.0001, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.001, 0.0001, 0.001, 0.0001, 0.002, + 0.013, 0.0001, 0.001, 0.008, 0.008, 0.0001, 0.002, 0.187, 0.005, 0.973, 0.001, 0.004, 0.001, 0.001, 0.127, + 0.268, 0.009, 0.161, 0.005, 0.069, 0.003, 0.185, 0.001, 0.033, 0.003, 0.05, 0.006, 0.254, 0.001, 0.005, 0.001, + 0.001, 0.015, 0.003, 0.208, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.042, 2.523, 0.01, 0.009, 0.0001, + 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.01, 0.005, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.038, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "fy": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.82, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.701, 0.001, 0.398, 0.0001, 0.001, 0.014, 0.003, 0.455, 0.166, 0.166, 0.001, + 0.0001, 0.747, 0.192, 0.908, 0.008, 0.277, 0.415, 0.181, 0.098, 0.101, 0.113, 0.107, 0.108, 0.145, 0.219, 0.052, + 0.025, 0.005, 0.001, 0.005, 0.002, 0.0001, 0.213, 0.183, 0.091, 0.343, 0.093, 0.196, 0.109, 0.18, 0.193, 0.088, + 0.132, 0.122, 0.161, 0.156, 0.11, 0.106, 0.003, 0.108, 0.302, 0.13, 0.038, 0.048, 0.113, 0.006, 0.12, 0.009, + 0.007, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 6.027, 1.091, 0.691, 3.439, 11.73, 1.889, 1.306, 1.373, 5.412, + 1.009, 2.464, 2.808, 1.837, 7.368, 3.471, 1.074, 0.006, 5.381, 4.264, 5.226, 1.268, 0.226, 1.241, 0.017, 1.595, + 0.254, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.043, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.007, 0.001, 0.0001, 0.001, 0.001, + 0.004, 0.021, 0.0001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.013, 0.004, 0.263, 0.001, 0.008, 0.001, 0.001, 0.002, + 0.002, 0.01, 0.258, 0.016, 0.001, 0.003, 0.001, 0.013, 0.005, 0.004, 0.006, 0.003, 0.084, 0.002, 0.006, 0.001, + 0.003, 0.002, 0.21, 0.348, 0.006, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.02, 1.229, 0.004, 0.003, 0.0001, + 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.015, 0.005, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.042, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ga": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.234, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.249, 0.002, 0.288, 0.0001, 0.001, 0.013, 0.002, 0.109, 0.15, 0.15, 0.0001, + 0.002, 0.872, 0.193, 0.872, 0.017, 0.241, 0.359, 0.187, 0.093, 0.09, 0.096, 0.095, 0.093, 0.117, 0.202, 0.044, + 0.013, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.26, 0.338, 0.441, 0.188, 0.097, 0.15, 0.18, 0.066, 0.279, 0.041, + 0.036, 0.154, 0.249, 0.121, 0.062, 0.138, 0.005, 0.145, 0.311, 0.272, 0.036, 0.033, 0.04, 0.007, 0.009, 0.007, + 0.033, 0.0001, 0.031, 0.0001, 0.002, 0.0001, 11.315, 1.29, 2.859, 2.236, 4.184, 0.692, 2.117, 5.503, 7.212, + 0.011, 0.093, 2.991, 1.605, 6.018, 2.868, 0.471, 0.007, 4.409, 3.653, 3.32, 1.715, 0.088, 0.061, 0.021, 0.135, + 0.028, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.063, 0.032, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, + 0.059, 0.001, 0.002, 0.002, 0.009, 0.001, 0.001, 0.001, 0.001, 0.001, 0.044, 0.003, 0.001, 0.001, 0.001, 0.005, + 0.023, 0.008, 0.001, 0.006, 0.006, 0.0001, 0.001, 0.02, 1.278, 0.008, 0.002, 0.005, 0.001, 0.001, 0.002, 0.002, + 1.021, 0.001, 0.002, 0.002, 1.343, 0.001, 0.001, 0.006, 0.004, 0.004, 0.674, 0.002, 0.003, 0.005, 0.001, 0.004, + 0.002, 0.624, 0.002, 0.005, 0.004, 0.003, 0.002, 0.0001, 0.0001, 0.022, 5.087, 0.004, 0.005, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.011, 0.005, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.061, 0.0001, 0.0001, 0.002, + 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "gag": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.391, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.28, 0.016, 0.1, 0.0001, 0.001, 0.011, 0.0001, 0.023, 0.153, 0.154, 0.0001, + 0.0001, 0.918, 0.454, 1.065, 0.029, 0.183, 0.22, 0.131, 0.062, 0.067, 0.072, 0.06, 0.06, 0.062, 0.143, 0.13, + 0.023, 0.015, 0.004, 0.015, 0.028, 0.0001, 0.378, 0.403, 0.048, 0.156, 0.135, 0.049, 0.237, 0.117, 0.049, 0.029, + 0.415, 0.105, 0.242, 0.108, 0.187, 0.134, 0.003, 0.159, 0.189, 0.383, 0.092, 0.136, 0.005, 0.011, 0.079, 0.04, + 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 9.932, 1.463, 0.503, 2.949, 4.34, 0.314, 1.11, 0.547, 5.816, 0.052, + 2.859, 4.285, 1.983, 5.174, 2.034, 0.659, 0.007, 5.297, 2.304, 2.138, 2.154, 0.741, 0.006, 0.007, 1.825, 1.011, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.33, 0.02, 0.014, 0.017, 0.012, 0.006, 0.003, 0.09, 0.004, 0.002, + 0.005, 0.006, 0.005, 0.012, 0.002, 0.007, 0.002, 0.004, 0.002, 0.034, 0.066, 0.003, 0.036, 0.002, 0.004, 0.038, + 0.004, 0.03, 0.138, 0.106, 0.046, 1.073, 0.005, 0.011, 0.07, 0.054, 1.028, 0.001, 0.006, 0.629, 0.003, 0.006, + 0.12, 0.006, 0.002, 0.001, 0.004, 0.003, 0.193, 2.957, 0.016, 0.012, 0.008, 0.03, 0.347, 0.009, 0.023, 0.005, + 0.018, 0.016, 1.278, 0.014, 0.03, 0.005, 0.0001, 0.0001, 0.012, 3.601, 3.155, 1.149, 0.001, 0.0001, 0.029, 0.03, + 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.224, 0.106, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.003, 0.019, + 0.015, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.005, 0.317, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "gan": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.76, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.481, 0.002, 0.018, 0.0001, 0.0001, 0.024, 0.003, 0.008, 0.023, 0.024, 0.002, + 0.006, 0.023, 0.038, 0.047, 0.01, 0.315, 0.585, 0.297, 0.204, 0.191, 0.202, 0.185, 0.171, 0.182, 0.259, 0.005, + 0.001, 0.007, 0.003, 0.007, 0.002, 0.0001, 0.033, 0.019, 0.032, 0.016, 0.012, 0.012, 0.016, 0.021, 0.015, 0.011, + 0.012, 0.015, 0.023, 0.016, 0.01, 0.022, 0.002, 0.018, 0.031, 0.022, 0.006, 0.009, 0.014, 0.002, 0.005, 0.001, + 0.008, 0.001, 0.008, 0.0001, 0.002, 0.0001, 0.219, 0.03, 0.061, 0.069, 0.246, 0.023, 0.046, 0.084, 0.187, 0.005, + 0.034, 0.116, 0.064, 0.184, 0.17, 0.035, 0.003, 0.158, 0.115, 0.138, 0.085, 0.023, 0.019, 0.007, 0.04, 0.007, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 3.244, 1.279, 2.127, 0.643, 0.387, 0.883, 0.435, 0.848, 1.431, 1.201, + 0.629, 1.296, 2.258, 1.163, 0.623, 0.808, 0.937, 0.395, 0.26, 0.593, 0.667, 0.608, 1.031, 1.999, 0.578, 0.845, + 0.936, 0.665, 1.536, 0.644, 0.439, 0.928, 0.498, 0.603, 0.631, 0.704, 0.585, 0.768, 0.515, 0.538, 0.76, 0.649, + 0.365, 0.712, 0.597, 1.095, 0.882, 0.565, 2.328, 1.119, 0.438, 0.543, 1.012, 0.372, 0.441, 0.708, 1.829, 1.205, + 1.47, 1.203, 2.219, 1.044, 0.843, 1.251, 0.0001, 0.0001, 0.055, 0.02, 0.005, 0.006, 0.001, 0.0001, 0.0001, + 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.018, 0.009, 0.031, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.007, + 0.036, 0.032, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.029, 0.011, 0.055, 2.062, 3.549, 9.312, 4.838, + 3.056, 2.889, 2.67, 0.003, 0.005, 0.013, 0.003, 0.002, 1.772, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "gd": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.483, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.829, 0.001, 0.374, 0.0001, 0.0001, 0.027, 0.001, 0.653, 0.225, 0.224, 0.001, + 0.001, 0.74, 0.732, 0.959, 0.016, 0.275, 0.512, 0.251, 0.163, 0.143, 0.16, 0.146, 0.151, 0.187, 0.234, 0.126, + 0.023, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.399, 0.354, 0.494, 0.195, 0.121, 0.114, 0.226, 0.061, 0.158, 0.033, + 0.034, 0.204, 0.239, 0.107, 0.062, 0.151, 0.004, 0.164, 0.477, 0.402, 0.038, 0.033, 0.037, 0.023, 0.009, 0.008, + 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.001, 13.191, 1.481, 2.674, 2.933, 4.722, 0.55, 2.044, 6.832, 6.396, + 0.019, 0.13, 2.757, 1.684, 7.147, 2.433, 0.32, 0.014, 3.962, 3.004, 2.554, 2.054, 0.073, 0.068, 0.016, 0.125, + 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.262, 0.013, 0.005, 0.005, 0.004, 0.003, 0.002, 0.002, 0.031, + 0.005, 0.004, 0.001, 0.011, 0.003, 0.002, 0.001, 0.006, 0.003, 0.012, 0.014, 0.004, 0.002, 0.002, 0.002, 0.027, + 0.178, 0.003, 0.005, 0.012, 0.011, 0.001, 0.003, 0.677, 0.029, 0.002, 0.003, 0.009, 0.003, 0.004, 0.005, 0.218, + 0.029, 0.004, 0.003, 0.303, 0.022, 0.002, 0.003, 0.018, 0.008, 0.323, 0.026, 0.004, 0.004, 0.01, 0.002, 0.006, + 0.223, 0.01, 0.003, 0.014, 0.004, 0.005, 0.002, 0.0001, 0.0001, 0.041, 1.912, 0.009, 0.011, 0.0001, 0.0001, + 0.0001, 0.018, 0.01, 0.015, 0.003, 0.0001, 0.015, 0.007, 0.02, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, + 0.008, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.244, 0.002, 0.0001, 0.002, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "gl": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.812, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.39, 0.002, 0.342, 0.0001, 0.0001, 0.01, 0.001, 0.013, 0.144, 0.144, 0.001, + 0.002, 1.02, 0.075, 0.726, 0.01, 0.251, 0.326, 0.181, 0.093, 0.083, 0.092, 0.082, 0.082, 0.102, 0.185, 0.047, + 0.021, 0.003, 0.002, 0.002, 0.001, 0.0001, 0.331, 0.122, 0.257, 0.114, 0.192, 0.107, 0.104, 0.065, 0.139, 0.039, + 0.03, 0.104, 0.167, 0.127, 0.177, 0.186, 0.007, 0.111, 0.187, 0.12, 0.054, 0.074, 0.026, 0.055, 0.009, 0.01, + 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 9.121, 0.85, 3.271, 4.11, 8.668, 0.721, 0.784, 0.524, 5.185, 0.017, + 0.092, 2.548, 2.069, 5.528, 7.673, 1.889, 0.464, 5.046, 5.357, 3.627, 2.8, 0.704, 0.036, 0.564, 0.085, 0.291, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.015, 0.013, 0.003, 0.002, 0.002, 0.001, 0.002, 0.002, 0.001, 0.012, + 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.006, 0.003, 0.001, 0.001, 0.001, 0.001, 0.002, + 0.001, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.028, 0.396, 0.001, 0.002, 0.002, 0.001, 0.001, 0.003, 0.003, 0.383, + 0.003, 0.007, 0.001, 0.442, 0.001, 0.001, 0.005, 0.193, 0.006, 0.599, 0.002, 0.002, 0.003, 0.001, 0.003, 0.002, + 0.219, 0.007, 0.008, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.05, 2.267, 0.004, 0.006, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.011, 0.005, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.014, 0.003, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "glk": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.405, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.911, 0.005, 0.048, 0.0001, 0.0001, 0.001, 0.0001, 0.017, 0.104, 0.105, 0.0001, + 0.001, 0.019, 0.086, 0.553, 0.019, 0.043, 0.074, 0.037, 0.051, 0.028, 0.037, 0.027, 0.021, 0.025, 0.021, 0.078, + 0.0001, 0.005, 0.006, 0.007, 0.001, 0.0001, 0.004, 0.003, 0.008, 0.003, 0.003, 0.002, 0.002, 0.002, 0.003, + 0.001, 0.001, 0.002, 0.004, 0.002, 0.001, 0.003, 0.0001, 0.003, 0.005, 0.008, 0.006, 0.001, 0.002, 0.0001, + 0.001, 0.001, 0.003, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.177, 0.041, 0.015, 0.061, 0.102, 0.013, 0.028, + 0.036, 0.115, 0.015, 0.035, 0.047, 0.057, 0.128, 0.083, 0.024, 0.008, 0.098, 0.063, 0.07, 0.058, 0.027, 0.009, + 0.013, 0.021, 0.022, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.159, 0.386, 0.313, 0.148, 1.28, 2.09, 3.65, 3.311, + 2.644, 0.084, 1.185, 0.003, 3.768, 0.001, 0.042, 0.015, 0.057, 0.007, 0.001, 0.006, 0.005, 0.0001, 0.0001, + 0.0001, 0.027, 0.07, 0.004, 0.009, 0.002, 0.001, 0.0001, 0.024, 0.001, 0.005, 0.174, 0.185, 0.526, 0.0001, + 0.349, 5.779, 1.561, 0.992, 2.058, 0.045, 0.725, 0.235, 0.5, 2.399, 0.083, 3.048, 0.622, 2.068, 1.214, 0.15, + 0.072, 0.14, 0.046, 0.343, 0.079, 0.014, 0.001, 0.0001, 0.271, 0.0001, 0.0001, 0.0001, 0.044, 0.065, 0.002, + 0.021, 0.0001, 0.003, 0.0001, 0.068, 0.0001, 0.285, 0.001, 0.0001, 0.001, 0.0001, 0.005, 0.002, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 21.901, 14.77, 1.833, 3.683, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.141, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "gn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.37, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.685, 0.002, 0.175, 0.0001, 0.0001, 0.007, 0.0001, 0.625, 0.171, 0.173, 0.001, + 0.002, 1.108, 0.288, 0.925, 0.011, 0.221, 0.306, 0.165, 0.094, 0.084, 0.088, 0.078, 0.08, 0.105, 0.172, 0.107, + 0.053, 0.096, 0.001, 0.096, 0.001, 0.0001, 0.314, 0.094, 0.194, 0.053, 0.124, 0.074, 0.125, 0.128, 0.14, 0.097, + 0.171, 0.086, 0.202, 0.077, 0.188, 0.312, 0.005, 0.119, 0.136, 0.188, 0.098, 0.072, 0.01, 0.015, 0.073, 0.005, + 0.013, 0.0001, 0.013, 0.0001, 0.0001, 0.003, 10.368, 1.134, 1.037, 1.076, 7.653, 0.097, 1.575, 2.931, 4.208, + 1.013, 1.951, 0.867, 2.302, 2.015, 5.216, 3.17, 0.036, 4.342, 1.438, 2.887, 4.01, 2.242, 0.013, 0.023, 2.052, + 0.103, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 1.036, 0.019, 0.002, 0.069, 0.003, 0.001, 0.001, 0.001, 0.002, + 0.002, 0.001, 0.003, 0.001, 0.004, 0.0001, 0.001, 0.002, 0.06, 0.001, 0.011, 0.003, 0.002, 0.001, 0.001, 0.002, + 0.862, 0.001, 0.001, 0.08, 0.08, 0.0001, 0.001, 0.04, 0.787, 0.003, 0.72, 0.019, 0.002, 0.003, 0.003, 0.016, + 1.383, 0.003, 0.016, 0.003, 0.256, 0.002, 0.013, 0.007, 0.786, 0.011, 0.399, 0.027, 0.172, 0.004, 0.001, 0.003, + 0.065, 0.529, 0.066, 0.013, 0.527, 0.003, 0.003, 0.0001, 0.0001, 0.078, 4.545, 0.392, 0.1, 0.0001, 0.0001, + 0.0001, 0.003, 0.001, 0.002, 0.065, 0.0001, 0.004, 0.002, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.405, 1.034, 0.0001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "gom": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.459, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.409, 0.004, 0.032, 0.0001, 0.0001, 0.004, 0.001, 0.065, 0.082, 0.086, 0.0001, + 0.001, 0.31, 0.092, 0.614, 0.025, 0.037, 0.076, 0.035, 0.025, 0.021, 0.026, 0.02, 0.018, 0.022, 0.033, 0.044, + 0.02, 0.0001, 0.003, 0.0001, 0.007, 0.0001, 0.043, 0.023, 0.024, 0.027, 0.017, 0.011, 0.022, 0.028, 0.023, + 0.016, 0.018, 0.014, 0.036, 0.017, 0.018, 0.033, 0.001, 0.019, 0.035, 0.046, 0.011, 0.011, 0.005, 0.004, 0.003, + 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.007, 0.001, 1.398, 0.134, 0.264, 0.41, 0.83, 0.062, 0.182, 0.613, 0.742, + 0.041, 0.372, 0.505, 0.457, 0.862, 0.987, 0.203, 0.002, 0.568, 0.367, 0.732, 0.344, 0.233, 0.034, 0.102, 0.093, + 0.096, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 1.014, 0.337, 1.717, 0.03, 0.0001, 0.2, 0.49, 1.091, 0.031, 0.184, + 0.021, 0.587, 0.017, 1.766, 0.002, 0.057, 0.002, 0.019, 0.005, 0.016, 0.001, 1.048, 0.146, 0.534, 0.083, 0.03, + 0.659, 0.006, 0.381, 0.026, 0.006, 0.26, 0.031, 0.261, 0.004, 0.294, 21.971, 5.237, 0.529, 0.24, 0.912, 0.021, + 0.699, 0.107, 0.285, 0.131, 0.613, 1.017, 1.508, 0.008, 1.629, 0.499, 0.008, 0.864, 0.313, 0.067, 0.93, 0.419, + 0.0001, 0.006, 0.002, 0.0001, 3.471, 0.661, 0.0001, 0.0001, 0.008, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 26.65, 0.0001, 0.078, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "got": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.339, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.094, 0.003, 1.291, 0.0001, 0.0001, 0.0001, 0.0001, 0.038, 0.115, 0.115, 0.004, + 0.002, 1.558, 0.264, 1.449, 0.007, 0.147, 0.29, 0.265, 0.261, 0.158, 0.118, 0.082, 0.102, 0.128, 0.101, 0.042, + 0.039, 0.006, 0.003, 0.008, 0.017, 0.0001, 0.013, 0.006, 0.028, 0.006, 0.126, 0.004, 0.142, 0.123, 0.192, 0.004, + 0.003, 0.01, 0.007, 0.004, 0.248, 0.007, 0.0001, 0.011, 0.012, 0.024, 0.014, 0.037, 0.008, 0.0001, 0.001, 0.001, + 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 1.416, 0.252, 0.277, 0.447, 1.622, 0.345, 0.341, 0.482, 1.005, + 0.151, 0.167, 0.523, 0.441, 1.296, 0.895, 0.224, 0.019, 0.998, 0.984, 0.975, 0.495, 0.221, 0.388, 0.018, 0.135, + 0.029, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.227, 0.027, 0.943, 1.525, 0.623, 0.417, 0.281, 0.024, 0.043, + 0.442, 0.017, 0.001, 12.517, 4.391, 0.0001, 0.004, 16.904, 0.001, 0.002, 0.005, 0.001, 0.003, 0.004, 0.004, + 0.0001, 0.003, 0.047, 0.043, 0.003, 0.003, 0.004, 0.002, 1.424, 0.066, 0.105, 0.001, 0.004, 0.001, 0.009, 0.002, + 0.017, 0.005, 0.002, 0.005, 0.002, 0.035, 0.001, 0.003, 3.235, 0.309, 0.439, 0.698, 0.617, 0.042, 0.143, 0.379, + 0.509, 2.203, 0.495, 0.498, 0.573, 1.215, 0.432, 0.907, 0.0001, 0.0001, 1.432, 0.164, 0.007, 0.004, 0.001, + 0.002, 0.0001, 0.004, 0.018, 0.002, 0.024, 0.0001, 0.034, 0.019, 0.033, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.003, 0.002, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.003, 0.09, 0.108, 0.0001, 0.0001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.902, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "gv": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.271, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.449, 0.001, 0.421, 0.002, 0.001, 0.012, 0.004, 0.833, 0.218, 0.217, 0.001, + 0.004, 1.036, 0.572, 0.962, 0.016, 0.26, 0.327, 0.165, 0.089, 0.084, 0.093, 0.087, 0.088, 0.107, 0.189, 0.087, + 0.045, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.277, 0.194, 0.324, 0.123, 0.14, 0.124, 0.191, 0.146, 0.079, 0.067, + 0.068, 0.129, 0.207, 0.152, 0.084, 0.138, 0.02, 0.179, 0.402, 0.526, 0.063, 0.198, 0.043, 0.005, 0.079, 0.006, + 0.009, 0.0001, 0.009, 0.0001, 0.001, 0.0001, 8.563, 0.792, 1.691, 1.903, 8.594, 0.377, 2.885, 5.368, 3.902, + 0.512, 0.598, 3.599, 1.506, 6.663, 4.174, 0.394, 0.032, 4.839, 4.581, 2.625, 1.233, 0.647, 0.279, 0.018, 6.112, + 0.053, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.052, 0.016, 0.011, 0.007, 0.006, 0.002, 0.002, 0.033, 0.003, + 0.008, 0.001, 0.001, 0.002, 0.004, 0.001, 0.003, 0.004, 0.002, 0.001, 0.008, 0.005, 0.001, 0.002, 0.002, 0.007, + 0.032, 0.003, 0.002, 0.002, 0.002, 0.001, 0.001, 0.013, 0.034, 0.001, 0.003, 0.006, 0.002, 0.002, 0.259, 0.003, + 0.024, 0.003, 0.005, 0.003, 0.021, 0.001, 0.003, 0.016, 0.006, 0.011, 0.021, 0.003, 0.006, 0.005, 0.006, 0.011, + 0.008, 0.015, 0.005, 0.007, 0.005, 0.006, 0.004, 0.0001, 0.0001, 0.024, 0.446, 0.012, 0.021, 0.0001, 0.001, + 0.0001, 0.006, 0.003, 0.004, 0.002, 0.0001, 0.012, 0.007, 0.044, 0.019, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.006, 0.05, 0.002, 0.0001, 0.002, + 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ha": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.755, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.253, 0.006, 0.093, 0.001, 0.0001, 0.003, 0.001, 0.233, 0.264, 0.267, 0.0001, + 0.001, 0.745, 0.202, 0.904, 0.054, 0.25, 0.351, 0.185, 0.101, 0.092, 0.11, 0.102, 0.101, 0.107, 0.226, 0.077, + 0.015, 0.009, 0.002, 0.009, 0.006, 0.001, 0.703, 0.295, 0.111, 0.155, 0.055, 0.098, 0.113, 0.13, 0.318, 0.133, + 0.225, 0.088, 0.271, 0.163, 0.048, 0.074, 0.005, 0.115, 0.268, 0.173, 0.05, 0.018, 0.079, 0.003, 0.091, 0.042, + 0.023, 0.0001, 0.025, 0.0001, 0.021, 0.001, 18.747, 1.651, 0.919, 2.906, 2.679, 0.906, 1.302, 1.831, 6.455, + 0.467, 3.514, 2.109, 2.474, 6.749, 1.839, 0.213, 0.023, 4.031, 3.401, 2.21, 3.388, 0.067, 1.617, 0.015, 2.266, + 0.447, 0.001, 0.001, 0.003, 0.002, 0.0001, 0.116, 0.007, 0.003, 0.001, 0.009, 0.005, 0.003, 0.003, 0.007, 0.002, + 0.01, 0.001, 0.001, 0.0001, 0.003, 0.001, 0.002, 0.002, 0.001, 0.029, 0.002, 0.001, 0.0001, 0.094, 0.018, 0.242, + 0.0001, 0.001, 0.01, 0.009, 0.001, 0.004, 0.02, 0.005, 0.002, 0.006, 0.0001, 0.001, 0.003, 0.015, 0.004, 0.013, + 0.004, 0.002, 0.002, 0.004, 0.002, 0.003, 0.004, 0.011, 0.001, 0.005, 0.011, 0.003, 0.002, 0.003, 0.002, 0.004, + 0.002, 0.001, 0.003, 0.003, 0.0001, 0.002, 0.0001, 0.0001, 0.03, 0.04, 0.008, 0.004, 0.18, 0.0001, 0.0001, + 0.118, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.011, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.044, 0.043, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.115, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "hak": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.757, 0.001, 0.06, 0.0001, 0.0001, 0.014, 0.0001, 0.007, 0.281, 0.281, 0.0001, + 0.001, 0.836, 6.558, 0.681, 0.018, 0.337, 0.407, 0.278, 0.148, 0.134, 0.137, 0.13, 0.123, 0.136, 0.173, 0.065, + 0.014, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.079, 0.057, 0.378, 0.035, 0.025, 0.133, 0.042, 0.182, 0.024, 0.017, + 0.335, 0.169, 0.185, 0.174, 0.026, 0.169, 0.016, 0.027, 0.334, 0.366, 0.012, 0.069, 0.025, 0.002, 0.166, 0.009, + 0.007, 0.0001, 0.007, 0.0001, 0.003, 0.0001, 1.796, 0.086, 1.609, 0.16, 2.657, 0.577, 2.978, 5.312, 4.077, + 0.022, 2.986, 0.978, 0.836, 6.046, 1.214, 0.924, 0.006, 0.355, 1.925, 2.85, 1.719, 0.417, 0.063, 0.011, 1.033, + 0.05, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.624, 0.347, 0.489, 0.127, 0.115, 0.217, 0.079, 0.128, 0.198, 0.185, + 0.153, 0.188, 0.325, 0.981, 0.111, 0.161, 0.125, 0.071, 0.062, 0.072, 0.143, 0.099, 0.164, 0.124, 0.154, 0.164, + 0.132, 0.118, 0.284, 0.116, 0.086, 0.138, 0.587, 0.284, 0.798, 0.114, 0.117, 0.11, 0.089, 0.096, 0.66, 0.449, + 0.294, 0.11, 0.804, 0.308, 1.169, 0.118, 0.192, 0.187, 0.596, 1.486, 0.608, 0.076, 0.115, 0.115, 0.317, 1.436, + 0.679, 1.022, 0.36, 0.128, 0.129, 0.134, 0.0001, 0.0001, 0.018, 7.409, 0.013, 0.036, 0.003, 0.005, 0.0001, + 0.003, 0.001, 0.002, 1.194, 0.0001, 0.01, 0.005, 0.045, 0.02, 0.001, 0.001, 0.0001, 0.0001, 0.003, 0.013, 0.006, + 0.004, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 1.011, 0.064, 0.254, 0.448, 1.333, 0.785, 0.602, + 0.451, 0.439, 0.002, 0.004, 0.008, 0.003, 0.0001, 0.269, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "haw": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.221, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.294, 0.012, 0.203, 0.0001, 0.0001, 0.0001, 0.001, 0.132, 0.34, 0.352, 0.0001, + 0.001, 1.505, 0.111, 0.979, 0.007, 0.17, 0.218, 0.129, 0.06, 0.059, 0.065, 0.059, 0.085, 0.093, 0.096, 0.074, + 0.017, 0.01, 0.0001, 0.01, 0.007, 0.0001, 0.393, 0.447, 0.582, 0.062, 0.097, 0.065, 0.079, 0.798, 0.153, 0.05, + 0.341, 0.594, 0.369, 0.112, 0.254, 0.296, 0.019, 0.112, 0.703, 0.122, 0.065, 0.176, 0.058, 0.005, 0.01, 0.09, + 0.005, 0.0001, 0.006, 0.0001, 0.003, 0.006, 12.798, 0.268, 0.355, 0.813, 5.652, 0.089, 0.569, 1.324, 6.125, + 0.081, 4.131, 4.145, 2.483, 4.121, 5.223, 1.895, 0.028, 1.627, 1.407, 0.928, 3.376, 0.134, 0.71, 0.014, 0.137, + 0.178, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 1.411, 1.393, 0.012, 0.01, 0.008, 0.004, 0.003, 0.003, 0.01, + 0.001, 0.006, 0.004, 0.027, 0.239, 0.001, 0.004, 0.011, 0.006, 0.002, 0.111, 0.01, 0.006, 0.002, 0.004, 1.323, + 0.019, 0.006, 0.004, 0.007, 0.006, 0.005, 0.004, 0.006, 0.059, 0.005, 0.006, 0.006, 0.004, 0.001, 0.013, 0.01, + 0.035, 0.014, 0.268, 0.004, 0.047, 0.003, 0.004, 0.012, 0.061, 0.008, 0.113, 0.006, 0.007, 0.004, 0.005, 0.011, + 0.005, 0.014, 1.288, 0.011, 0.01, 0.006, 0.004, 0.0001, 0.0001, 0.011, 0.331, 1.585, 0.461, 0.0001, 0.008, + 0.0001, 0.011, 1.285, 0.01, 0.001, 0.0001, 0.031, 0.013, 0.031, 0.011, 0.001, 0.0001, 0.0001, 0.0001, 0.004, + 0.043, 0.02, 0.017, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.013, 1.362, 0.0001, 0.001, 0.006, + 0.003, 0.002, 0.001, 0.001, 0.002, 0.007, 0.008, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "hif": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.441, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.1, 0.004, 0.114, 0.0001, 0.001, 0.009, 0.004, 0.035, 0.174, 0.173, 0.001, + 0.001, 0.931, 0.131, 1.205, 0.021, 0.405, 0.564, 0.33, 0.156, 0.134, 0.134, 0.137, 0.132, 0.161, 0.312, 0.075, + 0.009, 0.003, 0.005, 0.003, 0.001, 0.0001, 0.456, 0.322, 0.355, 0.197, 0.18, 0.293, 0.19, 0.17, 0.372, 0.16, + 0.181, 0.207, 0.307, 0.247, 0.078, 0.33, 0.012, 0.201, 0.529, 0.239, 0.168, 0.085, 0.095, 0.004, 0.174, 0.017, + 0.016, 0.0001, 0.016, 0.0001, 0.019, 0.0001, 12.241, 1.338, 1.486, 1.704, 7.791, 0.593, 1.202, 3.829, 6.515, + 0.754, 3.146, 2.684, 2.468, 4.596, 2.829, 0.958, 0.04, 4.362, 3.289, 3.315, 2.328, 0.443, 0.421, 0.04, 0.804, + 0.089, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.026, 0.089, 0.009, 0.002, 0.003, 0.005, 0.002, 0.014, 0.008, + 0.001, 0.001, 0.004, 0.002, 0.02, 0.003, 0.003, 0.003, 0.002, 0.001, 0.042, 0.003, 0.007, 0.001, 0.003, 0.002, + 0.005, 0.002, 0.011, 0.004, 0.001, 0.001, 0.013, 0.018, 0.009, 0.001, 0.005, 0.072, 0.024, 0.007, 0.009, 0.007, + 0.012, 0.004, 0.029, 0.003, 0.013, 0.009, 0.007, 0.017, 0.022, 0.012, 0.006, 0.004, 0.005, 0.014, 0.002, 0.01, + 0.032, 0.005, 0.004, 0.012, 0.003, 0.011, 0.006, 0.0001, 0.0001, 0.028, 0.074, 0.148, 0.035, 0.0001, 0.0001, + 0.0001, 0.005, 0.002, 0.005, 0.003, 0.0001, 0.004, 0.001, 0.016, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.012, 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.105, 0.033, 0.022, 0.002, 0.001, 0.002, + 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ho": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.445, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.244, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.681, 0.84, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 5.042, 0.0001, 0.0001, 0.0001, 0.84, 1.681, 0.0001, 0.84, 0.0001, 0.0001, 1.681, 1.681, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.966, 0.84, + 0.0001, 0.0001, 7.563, 0.0001, 0.84, 0.0001, 5.042, 0.0001, 0.0001, 2.521, 1.681, 5.882, 12.605, 1.681, 0.0001, + 3.361, 1.681, 1.681, 0.0001, 1.681, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "hsb": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.885, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.708, 0.001, 0.633, 0.0001, 0.0001, 0.02, 0.001, 0.006, 0.349, 0.351, 0.019, + 0.001, 0.617, 0.09, 1.156, 0.027, 0.335, 0.549, 0.233, 0.161, 0.153, 0.173, 0.141, 0.134, 0.184, 0.278, 0.061, + 0.039, 0.002, 0.004, 0.002, 0.001, 0.0001, 0.124, 0.184, 0.091, 0.139, 0.058, 0.04, 0.059, 0.112, 0.043, 0.103, + 0.189, 0.142, 0.204, 0.143, 0.038, 0.227, 0.002, 0.151, 0.281, 0.088, 0.037, 0.024, 0.263, 0.004, 0.003, 0.079, + 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.0001, 6.697, 1.107, 1.636, 2.081, 6.467, 0.188, 0.301, 1.756, 3.527, + 3.654, 2.787, 1.99, 1.872, 3.895, 5.864, 1.456, 0.004, 3.313, 3.645, 2.804, 2.176, 0.063, 3.44, 0.018, 1.507, + 1.152, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.124, 0.059, 0.706, 0.009, 0.065, 0.003, 0.009, 0.741, 0.003, + 0.001, 0.002, 0.003, 0.046, 0.476, 0.001, 0.004, 0.004, 0.003, 0.003, 0.038, 0.003, 0.003, 0.002, 0.005, 0.005, + 0.336, 0.005, 1.33, 0.03, 0.004, 0.03, 0.009, 0.055, 0.752, 0.003, 0.003, 0.008, 0.003, 0.002, 0.003, 0.003, + 0.008, 0.001, 0.003, 0.001, 0.011, 0.001, 0.003, 0.025, 0.008, 0.015, 0.5, 0.006, 0.013, 0.014, 0.003, 0.014, + 0.005, 0.495, 0.011, 0.018, 0.033, 0.697, 0.004, 0.0001, 0.0001, 0.023, 0.573, 2.597, 3.085, 0.0001, 0.0001, + 0.0001, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.01, 0.005, 0.144, 0.055, 0.001, 0.001, 0.001, 0.011, 0.004, + 0.015, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.112, 0.002, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ht": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.728, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.82, 0.005, 0.108, 0.0001, 0.0001, 0.002, 0.001, 0.044, 0.203, 0.204, 0.004, + 0.0001, 1.177, 0.16, 1.277, 0.006, 1.128, 0.316, 0.385, 0.25, 0.229, 0.141, 0.146, 0.14, 0.135, 0.218, 0.285, + 0.009, 0.002, 0.002, 0.002, 0.073, 0.0001, 0.308, 0.114, 0.31, 0.14, 0.272, 0.082, 0.233, 0.111, 0.459, 0.083, + 0.546, 0.457, 0.33, 0.177, 0.124, 0.284, 0.004, 0.107, 0.215, 0.201, 0.017, 0.07, 0.083, 0.002, 0.054, 0.009, + 0.003, 0.0001, 0.009, 0.003, 0.007, 0.0001, 8.338, 0.713, 0.405, 1.058, 6.922, 0.493, 1.121, 0.484, 5.37, 0.359, + 1.684, 3.389, 1.726, 9.14, 4.981, 1.524, 0.032, 2.005, 4.201, 3.104, 1.485, 1.12, 1.14, 0.06, 3.565, 0.552, + 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.036, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.007, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.023, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.04, 0.015, 0.008, 0.0001, 0.0001, 0.0001, 0.003, + 0.003, 0.815, 0.088, 0.005, 0.004, 0.0001, 0.019, 0.002, 0.004, 0.0001, 0.005, 0.398, 0.011, 0.003, 0.0001, + 0.001, 0.0001, 0.001, 0.002, 0.004, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.04, 1.397, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.001, 0.036, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "hy": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.597, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.8, 0.0001, 0.032, 0.0001, 0.0001, 0.007, 0.0001, 0.004, 0.144, 0.144, 0.0001, + 0.001, 0.586, 0.166, 0.08, 0.013, 0.201, 0.284, 0.165, 0.087, 0.08, 0.086, 0.077, 0.075, 0.09, 0.155, 0.113, + 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.01, 0.007, 0.01, 0.005, 0.005, 0.004, 0.004, 0.004, 0.018, 0.002, + 0.002, 0.005, 0.008, 0.005, 0.004, 0.006, 0.001, 0.005, 0.011, 0.008, 0.002, 0.006, 0.004, 0.006, 0.001, 0.001, + 0.002, 0.0001, 0.002, 0.0001, 0.003, 0.016, 0.046, 0.006, 0.015, 0.015, 0.053, 0.008, 0.009, 0.013, 0.038, + 0.001, 0.005, 0.027, 0.014, 0.034, 0.04, 0.008, 0.001, 0.036, 0.026, 0.029, 0.018, 0.005, 0.004, 0.002, 0.008, + 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.414, 0.639, 1.93, 0.109, 0.557, 0.081, 0.132, 0.316, 0.027, + 0.402, 0.05, 0.015, 0.042, 0.09, 0.048, 0.034, 0.002, 0.004, 0.002, 0.02, 0.024, 0.021, 0.028, 0.001, 0.0001, + 0.001, 0.001, 0.003, 0.001, 0.123, 0.001, 0.0001, 0.042, 6.697, 0.434, 0.595, 0.616, 2.608, 0.304, 0.502, 0.621, + 0.7, 0.114, 2.81, 0.856, 0.261, 0.333, 1.634, 0.66, 0.29, 0.576, 0.139, 1.799, 1.257, 4.145, 0.346, 3.356, + 0.233, 0.437, 0.354, 0.321, 1.025, 1.123, 1.395, 0.0001, 0.0001, 0.223, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.029, 0.01, 0.0001, 0.0001, 0.652, 36.534, 7.186, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.026, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "hz": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 25.0, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.667, + 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ia": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.646, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.141, 0.002, 0.329, 0.0001, 0.0001, 0.008, 0.001, 0.021, 0.18, 0.18, 0.001, + 0.003, 1.016, 0.166, 0.808, 0.013, 0.184, 0.275, 0.136, 0.08, 0.078, 0.085, 0.074, 0.075, 0.088, 0.135, 0.073, + 0.032, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.226, 0.141, 0.296, 0.096, 0.165, 0.073, 0.096, 0.067, 0.304, 0.056, + 0.03, 0.329, 0.174, 0.087, 0.056, 0.186, 0.016, 0.106, 0.253, 0.115, 0.079, 0.078, 0.031, 0.017, 0.009, 0.016, + 0.018, 0.0001, 0.018, 0.0001, 0.006, 0.0001, 7.783, 0.726, 2.95, 2.701, 11.264, 0.558, 0.916, 0.687, 6.773, + 0.133, 0.102, 4.659, 2.226, 5.924, 5.837, 2.221, 0.5, 4.607, 4.777, 5.188, 3.143, 1.186, 0.054, 0.19, 0.205, + 0.091, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.033, 0.014, 0.005, 0.003, 0.003, 0.002, 0.001, 0.002, 0.002, + 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.01, 0.005, 0.001, 0.001, 0.002, 0.003, + 0.007, 0.001, 0.002, 0.005, 0.005, 0.001, 0.001, 0.01, 0.02, 0.003, 0.006, 0.005, 0.003, 0.002, 0.005, 0.004, + 0.021, 0.003, 0.011, 0.003, 0.018, 0.002, 0.002, 0.005, 0.011, 0.005, 0.019, 0.002, 0.002, 0.005, 0.002, 0.004, + 0.005, 0.009, 0.012, 0.006, 0.004, 0.003, 0.005, 0.0001, 0.0001, 0.026, 0.115, 0.014, 0.006, 0.001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.019, 0.01, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.009, 0.031, 0.001, 0.001, 0.004, + 0.003, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ie": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.521, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.809, 0.001, 0.247, 0.0001, 0.0001, 0.004, 0.006, 0.019, 0.181, 0.18, 0.001, + 0.0001, 0.349, 1.199, 1.232, 0.019, 0.563, 0.838, 0.612, 0.225, 0.226, 0.24, 0.207, 0.206, 0.219, 0.382, 0.048, + 0.005, 0.006, 0.001, 0.006, 0.0001, 0.0001, 0.309, 0.238, 0.27, 0.166, 0.167, 0.136, 0.184, 0.184, 0.432, 0.068, + 0.108, 0.44, 0.245, 0.141, 0.106, 0.224, 0.013, 0.149, 0.37, 0.155, 0.122, 0.083, 0.052, 0.007, 0.021, 0.046, + 0.016, 0.0001, 0.017, 0.0001, 0.0001, 0.0001, 6.871, 0.75, 2.348, 2.768, 8.937, 0.584, 0.855, 0.832, 7.829, + 0.174, 0.338, 4.504, 1.934, 5.948, 3.473, 1.445, 0.281, 4.186, 4.435, 5.077, 2.881, 0.926, 0.103, 0.2, 0.235, + 0.149, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.011, 0.008, 0.006, 0.012, 0.004, 0.002, 0.001, 0.038, 0.001, + 0.002, 0.0001, 0.001, 0.004, 0.016, 0.001, 0.001, 0.004, 0.003, 0.001, 0.004, 0.002, 0.001, 0.002, 0.003, 0.002, + 0.005, 0.002, 0.003, 0.002, 0.002, 0.002, 0.01, 0.018, 0.107, 0.002, 0.003, 0.013, 0.003, 0.002, 0.004, 0.007, + 0.34, 0.002, 0.007, 0.001, 0.079, 0.001, 0.001, 0.011, 0.009, 0.004, 0.067, 0.003, 0.005, 0.02, 0.001, 0.012, + 0.001, 0.025, 0.006, 0.034, 0.009, 0.011, 0.002, 0.0001, 0.0001, 0.012, 0.714, 0.064, 0.047, 0.0001, 0.0001, + 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.007, 0.004, 0.047, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.01, 0.006, 0.0001, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ig": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.656, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.908, 0.0001, 0.773, 0.0001, 0.001, 0.002, 0.004, 0.323, 0.322, 0.321, 0.001, + 0.0001, 0.801, 0.348, 0.989, 0.009, 0.349, 0.514, 0.434, 0.211, 0.141, 0.149, 0.14, 0.138, 0.136, 0.236, 0.05, + 0.04, 0.002, 0.002, 0.002, 0.002, 0.001, 0.437, 0.139, 0.167, 0.124, 0.161, 0.093, 0.162, 0.08, 0.189, 0.162, + 0.069, 0.102, 0.246, 0.453, 0.257, 0.111, 0.006, 0.081, 0.231, 0.102, 0.09, 0.023, 0.104, 0.006, 0.033, 0.007, + 0.018, 0.0001, 0.018, 0.0001, 0.003, 0.003, 8.644, 2.249, 1.219, 1.734, 6.313, 0.761, 1.664, 1.979, 4.558, + 0.257, 2.436, 1.453, 1.97, 6.1, 4.008, 0.966, 0.02, 3.332, 1.739, 2.408, 2.889, 0.225, 1.517, 0.034, 1.16, + 0.258, 0.0001, 0.007, 0.001, 0.0001, 0.0001, 0.13, 0.024, 0.004, 0.004, 0.007, 0.006, 0.001, 0.002, 0.001, + 0.004, 0.004, 0.623, 0.118, 0.962, 0.001, 0.0001, 0.002, 0.001, 0.004, 0.022, 0.005, 0.001, 0.031, 0.002, 0.001, + 0.082, 0.001, 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.34, 0.233, 0.001, 0.001, 0.012, 1.142, 0.001, 0.003, 0.105, + 0.2, 0.002, 0.014, 0.036, 0.183, 0.028, 0.019, 0.004, 0.004, 0.029, 0.095, 0.002, 0.001, 0.009, 0.001, 0.003, + 0.143, 0.201, 2.836, 0.03, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.146, 1.356, 0.009, 0.021, 0.0001, 0.014, + 0.039, 0.003, 0.0001, 0.001, 0.029, 0.0001, 0.005, 0.001, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 2.927, 0.109, 0.003, 0.0001, 0.002, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ii": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.208, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.146, 0.0001, 1.029, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.343, 0.343, + 0.0001, 0.0001, 0.0001, 0.0001, 0.686, 0.0001, 4.803, 0.172, 2.401, 0.0001, 0.0001, 0.172, 0.343, 0.686, 0.686, + 0.343, 0.0001, 0.0001, 0.0001, 0.0001, 0.515, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.172, 0.0001, 0.0001, 0.0001, 0.172, 0.858, + 0.0001, 0.343, 0.343, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.0001, 0.0001, 0.343, 0.343, 0.343, 0.172, 0.0001, + 0.172, 0.343, 0.0001, 0.515, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.172, 0.0001, 0.0001, + 2.573, 1.887, 1.544, 0.858, 2.058, 0.343, 1.715, 0.343, 0.343, 0.0001, 0.172, 1.201, 1.887, 1.029, 1.372, 0.172, + 0.343, 1.029, 0.686, 0.172, 0.172, 0.172, 0.686, 0.858, 0.686, 0.172, 0.343, 0.0001, 0.515, 0.172, 0.343, 0.686, + 0.343, 0.172, 0.0001, 0.0001, 0.343, 0.0001, 0.172, 1.544, 0.172, 0.343, 0.686, 0.858, 0.686, 0.858, 0.343, + 0.686, 0.172, 0.343, 0.343, 0.515, 2.744, 0.172, 0.0001, 0.343, 0.858, 2.916, 0.343, 0.686, 0.343, 0.0001, + 0.343, 0.172, 0.0001, 0.0001, 1.372, 0.0001, 0.172, 0.172, 0.0001, 0.0001, 0.0001, 0.172, 0.172, 0.0001, 0.515, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.515, 1.029, 4.631, 1.029, 0.686, 0.0001, + 0.858, 10.635, 0.0001, 0.0001, 0.0001, 0.0001, 0.343, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ik": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.089, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.203, 0.0001, 1.053, 0.0001, 0.0001, 0.002, 0.004, 0.019, 1.043, 1.038, 0.0001, + 0.004, 0.489, 0.212, 1.246, 0.04, 0.17, 0.264, 0.162, 0.084, 0.065, 0.055, 0.132, 0.065, 0.076, 0.124, 0.136, + 0.025, 0.013, 0.002, 0.002, 0.0001, 0.0001, 0.824, 0.109, 0.155, 0.065, 0.052, 0.025, 0.048, 0.076, 0.634, + 0.073, 0.409, 0.111, 0.352, 0.545, 0.069, 0.285, 0.321, 0.155, 0.436, 0.755, 0.409, 0.076, 0.046, 0.008, 0.044, + 0.002, 0.01, 0.0001, 0.015, 0.0001, 0.008, 0.0001, 9.867, 0.308, 1.051, 0.799, 2.404, 0.327, 1.605, 1.011, + 7.743, 0.063, 2.113, 2.725, 1.552, 3.495, 1.668, 1.101, 3.682, 2.526, 3.015, 4.496, 6.747, 0.801, 0.229, 0.065, + 0.707, 0.103, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.097, 0.073, 0.183, 0.023, 0.006, 0.031, 0.013, 0.103, + 0.05, 0.008, 0.004, 0.952, 0.019, 0.055, 0.002, 0.023, 0.013, 0.008, 0.0001, 0.002, 0.008, 0.067, 0.013, 0.015, + 0.004, 0.002, 0.04, 0.01, 0.017, 0.01, 0.002, 0.019, 0.013, 0.843, 0.013, 0.029, 1.206, 0.281, 0.025, 0.006, + 0.067, 0.006, 0.055, 0.004, 0.038, 0.017, 0.078, 0.034, 0.172, 0.862, 0.059, 0.01, 0.01, 0.067, 0.008, 0.187, + 0.269, 0.134, 0.055, 0.021, 0.038, 0.019, 0.189, 0.046, 0.0001, 0.0001, 0.008, 0.944, 0.835, 1.051, 0.0001, + 0.0001, 0.0001, 0.0001, 0.006, 0.006, 0.008, 0.0001, 0.025, 0.023, 0.42, 0.185, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.408, 0.191, 0.013, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ilo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.301, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.793, 0.111, 0.271, 0.0001, 0.001, 0.008, 0.001, 0.018, 0.172, 0.172, 0.003, + 0.003, 0.83, 0.304, 0.649, 0.008, 0.21, 0.325, 0.155, 0.097, 0.09, 0.094, 0.083, 0.085, 0.1, 0.166, 0.048, 0.03, + 0.005, 0.001, 0.005, 0.001, 0.0001, 0.349, 0.225, 0.111, 0.217, 0.099, 0.09, 0.118, 0.1, 0.241, 0.035, 0.175, + 0.118, 0.232, 0.163, 0.054, 0.279, 0.009, 0.088, 0.233, 0.461, 0.072, 0.035, 0.029, 0.006, 0.014, 0.012, 0.036, + 0.0001, 0.036, 0.0001, 0.001, 0.0001, 16.461, 1.586, 0.189, 2.856, 3.734, 0.046, 3.664, 0.306, 10.008, 0.024, + 3.303, 2.245, 1.909, 7.066, 3.393, 2.095, 0.012, 2.409, 3.066, 6.078, 2.307, 0.067, 0.549, 0.014, 1.361, 0.048, + 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.043, 0.006, 0.003, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, + 0.001, 0.001, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.033, 0.004, 0.001, 0.001, 0.001, 0.001, + 0.004, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.015, 0.007, 0.001, 0.001, 0.003, 0.002, 0.001, 0.003, 0.002, + 0.009, 0.002, 0.004, 0.001, 0.006, 0.002, 0.001, 0.013, 0.007, 0.003, 0.007, 0.004, 0.001, 0.003, 0.001, 0.004, + 0.002, 0.004, 0.002, 0.003, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.027, 0.049, 0.008, 0.009, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.007, 0.004, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.043, 0.0001, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "io": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.24, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.878, 0.001, 0.226, 0.0001, 0.145, 0.683, 0.001, 0.155, 0.19, 0.19, 0.002, + 0.001, 1.502, 0.399, 2.049, 0.127, 1.123, 1.116, 0.845, 0.565, 0.593, 0.586, 0.516, 0.395, 0.578, 0.496, 0.056, + 0.039, 0.008, 0.001, 0.008, 0.001, 0.0001, 0.262, 0.119, 0.082, 0.063, 0.203, 0.065, 0.07, 0.089, 0.077, 0.042, + 0.131, 0.387, 0.144, 0.086, 0.052, 0.185, 0.006, 0.067, 0.238, 0.064, 0.127, 0.06, 0.027, 0.002, 0.018, 0.007, + 0.008, 0.0001, 0.008, 0.0001, 0.001, 0.0001, 8.848, 0.82, 0.665, 2.487, 7.044, 0.592, 0.8, 0.82, 7.741, 0.211, + 1.575, 3.65, 2.435, 4.587, 5.58, 1.431, 0.273, 4.484, 4.553, 2.971, 2.4, 1.482, 0.052, 0.098, 0.514, 0.499, + 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.011, 0.008, 0.004, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, + 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.003, 0.002, 0.001, 0.0001, 0.002, 0.001, + 0.004, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.096, 0.01, 0.001, 0.003, 0.003, 0.001, 0.001, 0.003, 0.002, + 0.015, 0.001, 0.004, 0.001, 0.008, 0.001, 0.001, 0.005, 0.003, 0.253, 0.006, 0.002, 0.002, 0.003, 0.001, 0.003, + 0.002, 0.004, 0.005, 0.003, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.356, 0.056, 0.003, 0.003, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.01, 0.006, 0.0001, 0.002, + 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "is": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.97, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.586, 0.001, 0.206, 0.0001, 0.0001, 0.008, 0.002, 0.007, 0.124, 0.124, 0.0001, + 0.001, 0.499, 0.123, 1.026, 0.011, 0.247, 0.371, 0.182, 0.092, 0.087, 0.097, 0.09, 0.091, 0.11, 0.206, 0.046, + 0.01, 0.008, 0.003, 0.008, 0.001, 0.0001, 0.15, 0.156, 0.07, 0.071, 0.123, 0.128, 0.099, 0.219, 0.049, 0.069, + 0.114, 0.102, 0.145, 0.086, 0.033, 0.076, 0.003, 0.091, 0.275, 0.089, 0.03, 0.081, 0.029, 0.009, 0.012, 0.006, + 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 6.834, 0.671, 0.132, 1.35, 4.383, 2.01, 2.575, 1.208, 5.351, 0.788, + 2.14, 3.293, 2.549, 5.87, 1.807, 0.609, 0.005, 6.508, 4.164, 3.597, 3.384, 1.444, 0.036, 0.05, 0.678, 0.023, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.079, 0.071, 0.003, 0.002, 0.002, 0.001, 0.004, 0.001, 0.001, 0.002, + 0.001, 0.001, 0.001, 0.093, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.031, 0.002, 0.001, 0.01, 0.001, 0.001, 0.001, + 0.008, 0.001, 0.029, 0.003, 0.162, 0.001, 0.007, 1.147, 0.001, 0.001, 0.003, 0.001, 0.559, 0.002, 0.002, 0.221, + 0.001, 0.001, 0.001, 1.194, 0.001, 0.001, 2.653, 0.002, 0.003, 0.801, 0.002, 0.002, 0.588, 0.001, 0.004, 0.002, + 0.419, 0.002, 0.005, 0.183, 0.658, 0.001, 0.0001, 0.0001, 0.014, 8.751, 0.003, 0.003, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.079, 0.001, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "iu": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.678, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.59, 0.002, 0.2, 0.001, 0.003, 0.002, 0.003, 0.015, 0.174, 0.173, 0.0001, + 0.002, 0.361, 0.227, 0.729, 0.057, 0.148, 0.113, 0.088, 0.041, 0.055, 0.057, 0.038, 0.037, 0.041, 0.075, 0.086, + 0.012, 0.034, 0.007, 0.037, 0.002, 0.001, 0.071, 0.015, 0.028, 0.016, 0.027, 0.021, 0.01, 0.09, 0.106, 0.011, + 0.032, 0.025, 0.039, 0.045, 0.015, 0.038, 0.016, 0.009, 0.047, 0.052, 0.031, 0.008, 0.018, 0.002, 0.004, 0.0001, + 0.042, 0.001, 0.038, 0.0001, 0.005, 0.0001, 3.23, 0.132, 0.269, 0.325, 0.963, 0.137, 0.72, 0.796, 3.179, 0.121, + 0.846, 1.083, 0.73, 1.94, 0.65, 0.417, 0.773, 0.909, 0.645, 2.138, 2.24, 0.378, 0.125, 0.018, 0.352, 0.009, + 0.063, 0.016, 0.064, 0.0001, 0.0001, 0.195, 0.104, 0.722, 2.277, 0.527, 2.845, 0.283, 0.577, 0.292, 0.16, 1.105, + 0.322, 0.08, 0.107, 0.751, 0.183, 5.797, 4.461, 2.284, 5.133, 1.078, 2.99, 2.939, 0.631, 0.063, 0.2, 0.245, + 0.066, 0.007, 0.045, 0.004, 0.005, 0.011, 0.073, 0.039, 0.009, 0.018, 0.411, 1.389, 0.092, 0.103, 0.04, 1.113, + 0.086, 0.008, 0.439, 0.043, 0.681, 0.098, 0.475, 0.284, 0.202, 0.231, 0.064, 0.012, 0.003, 0.129, 0.126, 0.009, + 0.223, 0.007, 0.015, 0.041, 0.125, 0.0001, 0.0001, 0.1, 0.024, 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.004, + 0.0001, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.131, 0.044, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.009, 0.014, + 0.007, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 21.14, 0.181, 0.003, 0.004, 0.004, 0.004, 0.0001, + 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "jam": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.114, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.204, 0.0001, 0.437, 0.0001, 0.002, 0.015, 0.001, 0.02, 0.246, 0.245, 0.0001, + 0.001, 1.286, 0.238, 0.848, 0.011, 0.225, 0.262, 0.144, 0.074, 0.072, 0.083, 0.075, 0.089, 0.083, 0.132, 0.047, + 0.038, 0.014, 0.002, 0.014, 0.002, 0.0001, 0.33, 0.18, 0.107, 0.273, 0.095, 0.097, 0.106, 0.027, 0.375, 0.206, + 0.243, 0.122, 0.218, 0.135, 0.052, 0.177, 0.004, 0.132, 0.376, 0.091, 0.038, 0.042, 0.116, 0.003, 0.09, 0.009, + 0.033, 0.0001, 0.032, 0.0001, 0.0001, 0.0001, 11.751, 1.124, 0.777, 3.113, 4.403, 1.279, 0.882, 3.07, 11.71, + 0.554, 2.318, 3.164, 2.271, 5.696, 3.101, 1.655, 0.006, 3.113, 3.636, 3.486, 2.985, 0.575, 1.126, 0.207, 0.616, + 0.737, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.054, 0.013, 0.006, 0.006, 0.011, 0.005, 0.006, 0.002, 0.011, + 0.004, 0.003, 0.002, 0.005, 0.004, 0.004, 0.001, 0.005, 0.003, 0.003, 0.026, 0.009, 0.002, 0.001, 0.003, 0.001, + 0.005, 0.001, 0.003, 0.008, 0.008, 0.001, 0.0001, 0.066, 0.009, 0.001, 0.004, 0.01, 0.005, 0.003, 0.008, 0.009, + 0.009, 0.007, 0.005, 0.005, 0.009, 0.003, 0.008, 0.005, 0.014, 0.004, 0.031, 0.002, 0.005, 0.002, 0.003, 0.006, + 0.009, 0.008, 0.006, 0.007, 0.007, 0.004, 0.009, 0.0001, 0.0001, 0.069, 0.057, 0.012, 0.006, 0.0001, 0.001, + 0.0001, 0.011, 0.004, 0.01, 0.001, 0.0001, 0.049, 0.024, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.007, 0.002, + 0.004, 0.025, 0.021, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.017, 0.008, 0.051, 0.0001, 0.002, 0.004, + 0.003, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "jbo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.007, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 18.83, 0.0001, 0.137, 0.0001, 0.0001, 0.001, 0.0001, 3.634, 0.016, 0.016, + 0.0001, 0.0001, 0.047, 0.014, 2.419, 0.008, 0.161, 0.318, 0.2, 0.098, 0.09, 0.087, 0.087, 0.089, 0.108, 0.172, + 0.004, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.035, 0.022, 0.028, 0.013, 0.017, 0.01, 0.012, 0.013, + 0.015, 0.011, 0.012, 0.019, 0.022, 0.019, 0.015, 0.017, 0.001, 0.021, 0.029, 0.019, 0.006, 0.006, 0.008, 0.002, + 0.002, 0.004, 0.002, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 7.616, 1.669, 2.73, 1.665, 6.288, 0.906, 1.481, + 0.055, 8.607, 1.326, 2.153, 5.868, 2.296, 4.062, 6.049, 1.389, 0.004, 2.945, 3.13, 2.492, 4.934, 0.679, 0.018, + 0.589, 0.829, 0.701, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.01, 0.006, 0.006, 0.011, 0.005, 0.003, + 0.004, 0.008, 0.003, 0.008, 0.003, 0.003, 0.002, 0.002, 0.002, 0.003, 0.002, 0.001, 0.003, 0.004, 0.004, 0.001, + 0.002, 0.001, 0.006, 0.001, 0.002, 0.002, 0.002, 0.001, 0.002, 0.003, 0.006, 0.002, 0.003, 0.005, 0.003, 0.006, + 0.013, 0.006, 0.012, 0.005, 0.003, 0.005, 0.008, 0.003, 0.005, 0.01, 0.01, 0.007, 0.008, 0.003, 0.008, 0.002, + 0.003, 0.01, 0.005, 0.017, 0.007, 0.005, 0.005, 0.004, 0.003, 0.0001, 0.0001, 0.004, 0.032, 0.005, 0.003, + 0.0001, 0.0001, 0.0001, 0.006, 0.004, 0.004, 0.002, 0.0001, 0.016, 0.008, 0.046, 0.017, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.007, 0.035, 0.026, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.006, 0.007, 0.005, + 0.001, 0.004, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "jv": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.393, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.972, 0.002, 0.376, 0.0001, 0.001, 0.006, 0.002, 0.021, 0.174, 0.174, 0.0001, + 0.002, 1.038, 0.248, 0.884, 0.027, 0.242, 0.269, 0.17, 0.077, 0.072, 0.083, 0.071, 0.073, 0.084, 0.157, 0.063, + 0.014, 0.005, 0.004, 0.005, 0.001, 0.0001, 0.298, 0.282, 0.139, 0.175, 0.052, 0.071, 0.122, 0.1, 0.279, 0.193, + 0.491, 0.137, 0.261, 0.155, 0.054, 0.404, 0.008, 0.134, 0.426, 0.252, 0.063, 0.039, 0.13, 0.007, 0.04, 0.014, + 0.024, 0.0001, 0.024, 0.0001, 0.001, 0.0001, 13.56, 1.271, 0.49, 2.178, 3.499, 0.191, 4.675, 1.646, 6.887, + 0.617, 3.65, 2.625, 2.089, 9.349, 2.312, 1.888, 0.011, 3.362, 3.296, 3.086, 3.992, 0.185, 1.217, 0.022, 0.792, + 0.054, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.032, 0.007, 0.005, 0.003, 0.005, 0.004, 0.003, 0.003, 0.005, + 0.012, 0.002, 0.001, 0.001, 0.004, 0.005, 0.002, 0.003, 0.002, 0.003, 0.01, 0.003, 0.002, 0.001, 0.001, 0.003, + 0.007, 0.001, 0.003, 0.006, 0.006, 0.001, 0.001, 0.039, 0.004, 0.002, 0.003, 0.006, 0.005, 0.004, 0.006, 0.531, + 1.186, 0.005, 0.003, 0.002, 0.005, 0.002, 0.002, 0.007, 0.006, 0.005, 0.006, 0.002, 0.002, 0.002, 0.001, 0.008, + 0.005, 0.003, 0.002, 0.004, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.048, 1.757, 0.01, 0.01, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.007, 0.003, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.015, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.005, 0.031, 0.001, 0.001, 0.003, + 0.002, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ka": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.399, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 4.467, 0.006, 0.05, 0.004, 0.0001, 0.005, 0.0001, 0.002, 0.08, 0.08, 0.0001, + 0.001, 0.389, 0.146, 0.411, 0.004, 0.126, 0.165, 0.095, 0.049, 0.046, 0.05, 0.043, 0.044, 0.053, 0.091, 0.022, + 0.014, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.009, 0.008, 0.011, 0.006, 0.004, 0.005, 0.005, 0.004, 0.036, 0.001, + 0.002, 0.005, 0.008, 0.005, 0.004, 0.007, 0.001, 0.005, 0.01, 0.01, 0.002, 0.01, 0.003, 0.012, 0.001, 0.001, + 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.058, 0.009, 0.021, 0.031, 0.066, 0.012, 0.013, 0.018, 0.047, + 0.001, 0.009, 0.032, 0.017, 0.042, 0.05, 0.013, 0.001, 0.044, 0.039, 0.037, 0.025, 0.006, 0.004, 0.003, 0.014, + 0.002, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.133, 0.001, 0.001, 30.616, 0.001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.203, 1.072, 0.617, 1.27, 2.811, 0.901, 0.251, 0.727, + 3.846, 0.492, 1.468, 1.522, 1.35, 1.641, 0.3, 0.022, 1.853, 2.198, 0.578, 0.828, 0.251, 0.28, 0.142, 0.172, + 0.523, 0.1, 0.36, 0.118, 0.305, 0.039, 0.412, 0.073, 0.048, 0.001, 0.009, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.023, 0.002, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.013, 0.004, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 30.616, 0.133, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "kaa": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.138, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 10.976, 0.002, 0.25, 0.0001, 0.0001, 0.021, 0.001, 3.483, 0.188, 0.189, 0.0001, + 0.005, 0.857, 0.333, 1.07, 0.015, 0.261, 0.313, 0.191, 0.105, 0.096, 0.102, 0.088, 0.083, 0.102, 0.171, 0.072, + 0.024, 0.027, 0.002, 0.027, 0.004, 0.0001, 0.278, 0.237, 0.043, 0.064, 0.083, 0.059, 0.068, 0.047, 0.074, 0.082, + 0.125, 0.051, 0.155, 0.064, 0.155, 0.081, 0.145, 0.091, 0.217, 0.129, 0.07, 0.048, 0.02, 0.093, 0.029, 0.015, + 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.174, 10.672, 1.536, 0.082, 2.608, 4.846, 0.175, 1.712, 1.492, 6.03, + 0.848, 1.882, 4.983, 2.176, 5.612, 2.458, 1.187, 1.824, 4.354, 3.602, 3.336, 1.517, 0.264, 0.926, 0.28, 1.912, + 0.845, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.223, 0.008, 0.008, 0.008, 0.005, 0.003, 0.002, 0.003, 0.003, + 0.001, 0.002, 0.004, 0.002, 0.002, 0.002, 0.003, 0.008, 0.001, 0.002, 0.024, 0.089, 0.003, 0.024, 0.001, 0.007, + 0.086, 0.002, 0.002, 0.011, 0.008, 0.005, 0.018, 0.016, 0.006, 0.003, 0.007, 0.007, 0.002, 0.001, 0.006, 0.003, + 0.004, 0.002, 0.012, 0.002, 0.006, 0.001, 0.009, 0.142, 4.113, 0.008, 0.007, 0.005, 0.049, 0.005, 0.002, 0.01, + 0.003, 0.009, 0.024, 0.009, 0.012, 0.029, 0.003, 0.0001, 0.0001, 0.053, 0.053, 4.15, 0.014, 0.0001, 0.002, + 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.009, 0.003, 0.235, 0.052, 0.004, 0.001, 0.001, 0.003, 0.0001, + 0.002, 0.013, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.006, 0.216, 0.0001, 0.001, 0.003, + 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "kab": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.63, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.911, 0.026, 0.321, 0.0001, 0.0001, 0.004, 0.001, 0.063, 0.372, 0.372, 0.003, + 0.002, 1.155, 1.35, 0.936, 0.038, 0.266, 0.305, 0.202, 0.119, 0.101, 0.107, 0.102, 0.091, 0.121, 0.181, 0.18, + 0.035, 0.01, 0.019, 0.017, 0.012, 0.0001, 0.467, 0.145, 0.091, 0.191, 0.038, 0.078, 0.046, 0.038, 0.257, 0.025, + 0.056, 0.211, 0.226, 0.079, 0.026, 0.046, 0.014, 0.063, 0.175, 0.468, 0.109, 0.016, 0.087, 0.018, 0.161, 0.062, + 0.014, 0.0001, 0.014, 0.0001, 0.076, 0.0001, 9.2, 0.865, 0.672, 3.845, 7.769, 0.911, 1.711, 0.292, 5.622, 0.162, + 1.372, 2.877, 2.842, 6.403, 0.445, 0.148, 0.603, 3.37, 3.532, 4.882, 2.937, 0.09, 1.486, 0.181, 2.148, 0.956, + 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.079, 0.004, 0.004, 0.003, 0.012, 0.007, 0.008, 0.003, 0.006, 0.01, + 0.01, 0.0001, 0.003, 0.341, 0.007, 0.006, 0.04, 0.002, 0.003, 0.156, 0.017, 0.001, 0.002, 0.001, 0.004, 0.031, + 0.007, 0.42, 0.023, 0.016, 0.002, 0.009, 0.025, 0.004, 0.015, 1.13, 0.027, 0.269, 0.019, 0.099, 0.024, 0.093, + 0.007, 0.018, 0.013, 0.276, 0.002, 0.011, 0.014, 0.01, 0.006, 0.129, 0.025, 0.113, 0.001, 0.005, 0.586, 0.529, + 0.15, 0.021, 0.004, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.056, 0.149, 0.056, 0.01, 0.05, 0.088, 0.0001, 1.3, + 0.001, 0.001, 0.003, 0.0001, 0.203, 0.001, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.008, 0.063, + 0.048, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 1.257, 0.143, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "kbd": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.877, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.792, 0.0001, 0.075, 0.0001, 0.001, 0.011, 0.0001, 0.003, 0.141, 0.14, 0.0001, + 0.003, 0.771, 0.205, 0.683, 0.004, 0.136, 0.165, 0.088, 0.057, 0.049, 0.062, 0.042, 0.043, 0.05, 0.078, 0.043, + 0.017, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.304, + 0.0001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.008, 0.001, 0.014, + 0.0001, 0.0001, 0.008, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 0.03, 0.003, 0.008, 0.007, 0.025, 0.002, 0.005, + 0.007, 0.023, 0.001, 0.003, 0.195, 0.01, 0.018, 0.016, 0.007, 0.001, 0.016, 0.015, 0.015, 0.012, 0.002, 0.002, + 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.555, 0.735, 0.993, 2.937, 0.251, 2.403, 0.222, + 0.078, 0.401, 1.056, 2.895, 2.991, 0.659, 6.305, 0.005, 0.318, 0.209, 0.078, 0.019, 0.048, 0.196, 0.035, 0.012, + 0.035, 0.104, 0.003, 0.214, 0.042, 0.072, 0.044, 0.009, 0.068, 0.044, 0.057, 0.06, 0.06, 0.029, 0.076, 0.012, + 0.013, 0.04, 0.033, 0.001, 0.031, 0.001, 0.015, 0.002, 0.026, 2.293, 0.626, 0.124, 1.164, 0.956, 0.819, 0.63, + 0.861, 1.412, 0.263, 1.894, 1.024, 2.202, 1.111, 0.541, 0.996, 0.0001, 0.0001, 0.089, 0.003, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.007, 0.001, 0.005, 0.002, 18.347, 24.31, 0.001, 1.322, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.144, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "kbp": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.616, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.57, 0.002, 0.071, 0.0001, 0.0001, 0.002, 0.0001, 0.006, 0.116, 0.115, 0.0001, + 0.002, 0.667, 0.749, 0.841, 0.003, 0.17, 0.215, 0.112, 0.059, 0.061, 0.065, 0.059, 0.058, 0.083, 0.103, 0.043, + 0.02, 0.0001, 0.014, 0.0001, 0.002, 0.0001, 0.165, 0.045, 0.077, 0.029, 0.079, 0.067, 0.032, 0.069, 0.044, + 0.029, 0.18, 0.072, 0.11, 0.068, 0.032, 0.297, 0.002, 0.044, 0.127, 0.122, 0.017, 0.016, 0.035, 0.003, 0.036, + 0.006, 0.025, 0.0001, 0.025, 0.0001, 0.0001, 0.0001, 8.914, 0.693, 0.409, 0.775, 2.26, 0.236, 0.534, 0.509, + 1.986, 0.346, 2.598, 2.297, 1.559, 3.608, 1.061, 1.995, 0.02, 0.616, 1.735, 2.888, 0.861, 0.082, 0.914, 0.015, + 2.587, 0.783, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.019, 0.022, 0.002, 0.003, 0.114, 0.001, 0.002, 0.001, + 0.002, 0.067, 2.039, 2.33, 0.002, 0.002, 0.001, 0.0001, 0.179, 0.013, 0.001, 0.001, 2.735, 0.001, 1.381, 0.0001, + 0.001, 0.007, 0.0001, 5.08, 0.004, 0.003, 0.0001, 0.0001, 0.004, 0.008, 0.005, 1.151, 0.003, 0.001, 0.001, + 0.004, 0.013, 4.529, 0.002, 0.019, 0.001, 0.004, 0.003, 0.007, 0.003, 0.207, 0.003, 0.002, 0.003, 0.002, 0.003, + 0.001, 0.006, 0.003, 0.002, 0.02, 0.003, 0.002, 0.002, 0.006, 0.0001, 0.0001, 0.035, 0.33, 0.004, 1.069, 0.247, + 0.001, 0.0001, 14.815, 3.312, 0.001, 0.128, 0.0001, 0.011, 0.006, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.007, 0.013, 0.0001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "kg": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.239, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.886, 0.007, 0.336, 0.0001, 0.0001, 0.012, 0.002, 0.078, 0.324, 0.324, 0.001, + 0.002, 0.656, 0.558, 1.416, 0.029, 0.129, 0.236, 0.138, 0.114, 0.084, 0.072, 0.081, 0.089, 0.086, 0.136, 0.151, + 0.002, 0.018, 0.006, 0.018, 0.004, 0.0001, 0.545, 0.514, 0.255, 0.205, 0.262, 0.18, 0.131, 0.1, 0.152, 0.059, + 0.708, 0.293, 0.752, 0.533, 0.094, 0.176, 0.01, 0.241, 0.354, 0.199, 0.108, 0.106, 0.05, 0.006, 0.156, 0.054, + 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.001, 12.562, 2.277, 0.331, 1.547, 5.722, 0.691, 1.741, 0.399, 6.386, + 0.118, 3.863, 3.599, 2.582, 6.478, 2.883, 0.88, 0.049, 1.355, 2.305, 2.139, 4.827, 0.445, 0.58, 0.051, 3.145, + 1.337, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.071, 0.012, 0.003, 0.002, 0.01, 0.004, 0.003, 0.001, 0.004, + 0.005, 0.003, 0.002, 0.002, 0.003, 0.001, 0.001, 0.006, 0.001, 0.001, 0.062, 0.006, 0.002, 0.0001, 0.001, 0.001, + 0.009, 0.002, 0.004, 0.002, 0.001, 0.001, 0.001, 0.037, 0.129, 0.127, 0.006, 0.006, 0.002, 0.017, 0.018, 0.037, + 0.077, 0.018, 0.027, 0.002, 0.034, 0.066, 0.007, 0.011, 0.023, 0.005, 0.025, 0.156, 0.002, 0.001, 0.003, 0.003, + 0.002, 0.014, 0.066, 0.013, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.038, 0.798, 0.007, 0.01, 0.0001, 0.0001, + 0.0001, 0.013, 0.006, 0.004, 0.0001, 0.001, 0.012, 0.004, 0.009, 0.006, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.006, 0.021, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.016, 0.007, 0.069, 0.0001, 0.001, 0.002, + 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ki": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.157, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.033, 0.001, 0.1, 0.001, 0.0001, 0.002, 0.005, 0.051, 0.116, 0.115, 0.0001, + 0.0001, 0.384, 0.122, 1.505, 0.04, 0.182, 0.215, 0.151, 0.09, 0.071, 0.091, 0.067, 0.064, 0.059, 0.089, 0.065, + 0.003, 0.006, 0.002, 0.008, 0.01, 0.0001, 0.273, 0.233, 0.763, 0.125, 0.089, 0.072, 0.168, 0.139, 0.145, 0.105, + 0.364, 0.123, 0.376, 0.291, 0.066, 0.138, 0.046, 0.111, 0.252, 0.278, 0.132, 0.045, 0.093, 0.048, 0.079, 0.058, + 0.02, 0.0001, 0.02, 0.0001, 0.015, 0.0001, 10.33, 0.786, 1.541, 0.901, 3.961, 0.163, 2.604, 2.426, 8.641, 0.326, + 1.916, 0.633, 2.867, 6.576, 3.627, 0.309, 0.068, 4.492, 0.79, 3.938, 2.525, 0.104, 1.397, 0.085, 2.472, 0.26, + 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.05, 0.003, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, + 0.037, 0.01, 0.0001, 0.001, 0.003, 0.0001, 0.001, 0.001, 0.013, 0.005, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.001, 0.06, 4.809, 0.0001, 0.069, 0.002, 0.006, 0.001, 0.004, 0.016, 0.25, 0.0001, 0.009, 0.003, 0.002, 0.0001, + 0.009, 0.003, 0.001, 0.003, 0.026, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.021, 0.032, 2.884, 2.321, + 0.0001, 0.002, 0.0001, 0.002, 0.021, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.009, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.048, + 0.0001, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "kj": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.677, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.71, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.323, 0.323, + 0.0001, 0.0001, 0.645, 0.0001, 0.323, 0.0001, 1.613, 0.0001, 0.323, 0.323, 0.0001, 0.0001, 0.645, 0.323, 0.0001, + 0.0001, 0.968, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, + 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.323, 0.0001, 2.903, 0.323, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.097, 3.226, + 0.0001, 6.774, 6.774, 1.935, 1.29, 2.903, 10.645, 0.0001, 3.226, 3.226, 6.129, 2.581, 8.065, 0.323, 0.0001, + 0.0001, 0.968, 0.323, 1.935, 0.645, 2.581, 0.0001, 0.323, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "kk": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.706, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.721, 0.001, 0.107, 0.001, 0.0001, 0.006, 0.0001, 0.002, 0.151, 0.153, 0.001, + 0.003, 0.51, 0.246, 0.686, 0.019, 0.221, 0.251, 0.17, 0.104, 0.092, 0.099, 0.09, 0.082, 0.09, 0.149, 0.04, + 0.015, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.007, 0.006, 0.025, 0.003, 0.016, 0.005, 0.021, 0.002, 0.024, 0.001, + 0.002, 0.003, 0.008, 0.018, 0.004, 0.01, 0.0001, 0.004, 0.021, 0.003, 0.003, 0.004, 0.004, 0.005, 0.001, 0.003, + 0.003, 0.0001, 0.003, 0.0001, 0.002, 0.0001, 0.029, 0.005, 0.01, 0.008, 0.028, 0.004, 0.005, 0.007, 0.042, + 0.0001, 0.004, 0.014, 0.009, 0.02, 0.023, 0.007, 0.0001, 0.021, 0.015, 0.017, 0.01, 0.003, 0.003, 0.001, 0.004, + 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.667, 1.698, 2.42, 0.825, 0.088, 0.097, 0.101, 0.026, 0.573, + 0.004, 0.008, 3.51, 0.092, 0.043, 0.029, 0.226, 0.151, 0.105, 0.034, 0.789, 0.175, 0.042, 2.128, 0.009, 0.046, + 0.288, 0.211, 1.223, 0.099, 0.041, 0.082, 0.052, 0.093, 0.104, 0.084, 0.646, 0.032, 0.032, 0.003, 0.007, 0.066, + 0.363, 0.0001, 0.047, 0.001, 0.014, 0.013, 0.268, 5.447, 1.26, 0.188, 0.541, 1.919, 3.092, 0.668, 0.583, 0.903, + 0.603, 1.169, 2.242, 1.309, 3.102, 1.26, 0.548, 0.0001, 0.0001, 0.145, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 25.612, 14.266, 3.356, 0.697, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.197, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "kl": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.635, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.811, 0.001, 0.341, 0.0001, 0.0001, 0.006, 0.002, 0.029, 0.34, 0.34, 0.002, + 0.001, 0.7, 0.575, 1.063, 0.02, 0.29, 0.457, 0.333, 0.207, 0.125, 0.141, 0.14, 0.129, 0.134, 0.187, 0.161, + 0.026, 0.008, 0.005, 0.008, 0.0001, 0.0001, 0.28, 0.09, 0.107, 0.095, 0.075, 0.086, 0.052, 0.078, 0.183, 0.108, + 0.243, 0.074, 0.184, 0.254, 0.06, 0.118, 0.079, 0.062, 0.257, 0.166, 0.177, 0.059, 0.032, 0.002, 0.012, 0.015, + 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 12.711, 0.276, 0.184, 0.432, 3.419, 0.731, 1.669, 0.268, 10.409, + 0.217, 2.335, 4.586, 2.81, 6.778, 2.817, 1.735, 2.883, 5.126, 5.68, 6.217, 6.675, 0.652, 0.054, 0.023, 0.144, + 0.055, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.031, 0.035, 0.014, 0.011, 0.03, 0.017, 0.013, 0.007, 0.019, + 0.003, 0.015, 0.002, 0.011, 0.008, 0.02, 0.004, 0.014, 0.011, 0.007, 0.013, 0.007, 0.01, 0.01, 0.01, 0.008, + 0.016, 0.005, 0.005, 0.009, 0.004, 0.004, 0.006, 0.015, 0.021, 0.01, 0.011, 0.03, 0.03, 0.045, 0.038, 0.021, + 0.031, 0.02, 0.014, 0.007, 0.018, 0.005, 0.016, 0.035, 0.027, 0.022, 0.024, 0.011, 0.015, 0.016, 0.009, 0.078, + 0.018, 0.016, 0.011, 0.01, 0.011, 0.018, 0.012, 0.0001, 0.0001, 0.012, 0.201, 0.031, 0.017, 0.001, 0.001, + 0.0001, 0.004, 0.004, 0.004, 0.004, 0.0001, 0.016, 0.008, 0.085, 0.031, 0.0001, 0.001, 0.0001, 0.0001, 0.024, + 0.053, 0.13, 0.094, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.065, 0.039, 0.022, 0.0001, 0.001, 0.011, + 0.007, 0.001, 0.001, 0.003, 0.001, 0.002, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "km": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.234, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 2.565, 0.004, 0.038, 0.0001, 0.0001, 0.004, 0.0001, 0.009, 0.049, 0.049, 0.0001, + 0.001, 0.07, 0.028, 0.072, 0.003, 0.02, 0.022, 0.013, 0.008, 0.007, 0.007, 0.006, 0.006, 0.007, 0.012, 0.008, + 0.003, 0.007, 0.012, 0.008, 0.004, 0.0001, 0.018, 0.012, 0.02, 0.008, 0.012, 0.009, 0.007, 0.009, 0.013, 0.004, + 0.006, 0.012, 0.012, 0.009, 0.006, 0.011, 0.001, 0.009, 0.018, 0.02, 0.004, 0.004, 0.006, 0.002, 0.002, 0.001, + 0.022, 0.0001, 0.022, 0.0001, 0.004, 0.0001, 0.403, 0.068, 0.154, 0.173, 0.554, 0.096, 0.093, 0.2, 0.358, 0.005, + 0.025, 0.201, 0.122, 0.348, 0.339, 0.093, 0.005, 0.306, 0.292, 0.378, 0.132, 0.051, 0.059, 0.012, 0.073, 0.006, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.652, 0.801, 0.696, 0.139, 1.351, 0.735, 0.591, 0.836, 0.083, 0.299, + 0.563, 1.859, 0.05, 0.041, 0.223, 1.134, 0.273, 0.671, 2.897, 1.707, 1.359, 0.097, 0.57, 0.24, 1.039, 0.72, + 1.493, 0.708, 0.482, 0.006, 22.614, 7.802, 0.292, 0.16, 0.416, 0.027, 0.02, 0.041, 0.016, 0.053, 0.015, 0.021, + 0.003, 0.006, 0.019, 0.002, 0.004, 0.041, 0.002, 0.021, 0.047, 0.001, 0.001, 0.001, 2.388, 0.829, 0.388, 0.131, + 0.053, 0.602, 0.318, 0.199, 0.385, 0.021, 0.0001, 0.0001, 0.017, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 29.306, 1.288, 0.001, 0.0001, + 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "kn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.22, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 4.193, 0.001, 0.077, 0.0001, 0.001, 0.006, 0.001, 0.024, 0.05, 0.05, 0.001, + 0.001, 0.263, 0.039, 0.387, 0.008, 0.055, 0.048, 0.031, 0.015, 0.013, 0.017, 0.014, 0.014, 0.016, 0.027, 0.012, + 0.01, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.007, 0.004, 0.007, 0.004, 0.004, 0.003, 0.002, 0.002, 0.007, 0.001, + 0.001, 0.002, 0.005, 0.003, 0.003, 0.004, 0.0001, 0.003, 0.008, 0.004, 0.004, 0.002, 0.002, 0.001, 0.0001, + 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.001, 0.001, 0.019, 0.003, 0.007, 0.007, 0.022, 0.004, 0.004, 0.008, + 0.016, 0.001, 0.002, 0.009, 0.007, 0.014, 0.015, 0.005, 0.0001, 0.014, 0.012, 0.015, 0.006, 0.002, 0.003, 0.001, + 0.003, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.377, 1.744, 1.056, 0.052, 0.0001, 0.294, 1.302, 0.476, + 0.14, 0.07, 0.25, 0.184, 0.18, 3.237, 0.115, 0.016, 0.01, 0.0001, 0.076, 0.009, 0.004, 1.075, 0.058, 1.134, + 0.019, 0.006, 0.205, 0.005, 0.214, 0.004, 0.012, 0.397, 0.02, 0.439, 0.004, 0.214, 1.341, 0.105, 1.57, 0.184, + 1.477, 0.01, 0.553, 0.067, 0.408, 0.14, 0.772, 0.936, 1.909, 0.0001, 24.738, 8.223, 0.0001, 1.147, 0.212, 0.182, + 0.975, 0.409, 0.0001, 0.0001, 0.001, 0.0001, 1.605, 2.364, 0.0001, 0.0001, 0.01, 0.004, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.178, 0.0001, 0.177, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "koi": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.5, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.538, 0.003, 0.105, 0.0001, 0.0001, 0.012, 0.0001, 0.066, 0.298, 0.299, 0.001, + 0.003, 0.665, 0.135, 0.828, 0.022, 0.193, 0.238, 0.151, 0.096, 0.069, 0.095, 0.069, 0.062, 0.067, 0.14, 0.09, + 0.011, 0.011, 0.003, 0.011, 0.012, 0.0001, 0.012, 0.004, 0.007, 0.003, 0.004, 0.002, 0.002, 0.009, 0.016, 0.003, + 0.015, 0.007, 0.012, 0.004, 0.018, 0.015, 0.0001, 0.004, 0.016, 0.008, 0.003, 0.011, 0.001, 0.01, 0.001, 0.0001, + 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.204, 0.031, 0.062, 0.036, 0.122, 0.007, 0.019, 0.037, 0.201, + 0.009, 0.035, 0.077, 0.03, 0.109, 0.075, 0.025, 0.001, 0.099, 0.08, 0.059, 0.07, 0.013, 0.004, 0.003, 0.013, + 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.529, 2.707, 1.977, 1.216, 0.076, 0.086, 0.043, 0.37, 0.314, + 0.008, 0.015, 2.496, 1.151, 0.356, 0.143, 0.67, 0.146, 0.176, 0.113, 0.201, 0.173, 0.031, 0.44, 0.017, 0.071, + 0.03, 0.345, 0.07, 0.14, 0.058, 0.096, 0.178, 0.09, 0.17, 0.07, 0.048, 0.048, 0.034, 0.04, 1.604, 0.03, 0.001, + 0.001, 0.041, 0.0001, 0.038, 0.042, 0.02, 3.314, 0.375, 1.556, 0.398, 1.638, 1.43, 1.24, 0.859, 1.906, 0.527, + 1.802, 1.787, 1.504, 2.903, 2.273, 0.718, 0.0001, 0.0001, 0.079, 0.905, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.001, 0.021, 0.0001, 0.001, 0.001, 25.357, 14.367, 0.001, 1.602, 0.0001, 0.0001, 0.001, 0.002, + 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.0001, 0.293, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "kr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 25.0, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.667, + 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001 + ], + "krc": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.633, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.611, 0.001, 0.078, 0.0001, 0.002, 0.011, 0.0001, 0.002, 0.139, 0.14, 0.0001, + 0.001, 0.591, 0.21, 0.542, 0.004, 0.138, 0.24, 0.114, 0.076, 0.067, 0.073, 0.058, 0.056, 0.073, 0.12, 0.04, + 0.013, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.004, 0.004, 0.006, 0.003, 0.003, 0.002, 0.003, 0.002, 0.03, 0.001, + 0.002, 0.003, 0.004, 0.002, 0.002, 0.002, 0.001, 0.002, 0.005, 0.004, 0.001, 0.01, 0.002, 0.017, 0.0001, 0.001, + 0.014, 0.0001, 0.014, 0.0001, 0.001, 0.0001, 0.038, 0.009, 0.012, 0.014, 0.044, 0.006, 0.01, 0.013, 0.029, + 0.002, 0.006, 0.019, 0.015, 0.026, 0.027, 0.008, 0.001, 0.031, 0.024, 0.024, 0.014, 0.007, 0.003, 0.002, 0.005, + 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.564, 1.141, 1.579, 1.633, 0.148, 0.303, 0.164, 0.503, 0.456, + 0.003, 1.306, 2.454, 0.134, 0.294, 0.686, 0.418, 0.168, 0.334, 0.032, 0.057, 0.2, 0.019, 0.006, 0.011, 0.056, + 0.006, 0.17, 0.03, 0.076, 0.03, 0.044, 0.051, 0.143, 0.104, 0.049, 0.03, 0.04, 0.03, 0.005, 0.024, 0.052, 0.001, + 0.001, 0.061, 0.001, 0.035, 0.01, 0.009, 6.121, 1.252, 0.294, 1.328, 2.359, 2.412, 0.507, 0.442, 2.779, 0.471, + 1.691, 3.418, 1.039, 3.402, 1.301, 0.302, 0.0001, 0.0001, 0.209, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.009, 0.0001, 0.006, 0.002, 30.423, 13.816, 0.001, 0.0001, 0.0001, 0.001, 0.0001, + 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.14, 0.0001, 0.0001, 0.002, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ks": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.09, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.116, 0.0001, 0.395, 0.007, 0.0001, 0.0001, 0.004, 0.023, 0.126, 0.124, 0.0001, + 0.001, 0.08, 0.153, 0.257, 0.005, 0.042, 0.08, 0.041, 0.04, 0.021, 0.031, 0.018, 0.019, 0.02, 0.048, 0.059, + 0.003, 0.053, 0.167, 0.053, 0.0001, 0.0001, 0.005, 0.003, 0.008, 0.007, 0.01, 0.007, 0.001, 0.002, 0.016, 0.003, + 0.003, 0.003, 0.004, 0.019, 0.008, 0.002, 0.0001, 0.005, 0.01, 0.013, 0.001, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.198, 0.016, 0.127, 0.13, 0.17, 0.01, 0.074, 0.033, + 0.171, 0.002, 0.016, 0.235, 0.092, 0.256, 0.101, 0.014, 0.0001, 0.218, 0.145, 0.254, 0.031, 0.065, 0.054, + 0.0001, 0.012, 0.0001, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.451, 1.562, 0.534, 0.248, 1.154, 1.571, 2.211, + 0.263, 1.281, 0.132, 0.341, 0.16, 1.683, 0.702, 0.993, 0.637, 0.623, 0.052, 0.37, 0.043, 0.331, 0.813, 0.313, + 0.319, 0.042, 0.007, 0.092, 0.282, 0.326, 0.013, 0.006, 0.065, 0.245, 0.114, 0.179, 0.083, 8.684, 2.577, 0.461, + 2.698, 1.217, 0.995, 1.306, 0.114, 0.545, 0.242, 0.666, 1.253, 0.811, 1.543, 0.848, 0.915, 0.434, 0.417, 0.188, + 0.11, 0.481, 0.73, 0.156, 0.08, 0.312, 0.004, 2.104, 0.512, 0.0001, 0.0001, 0.188, 0.0001, 0.017, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.031, 0.0001, 0.008, 0.002, 0.028, 0.008, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 10.045, 10.482, 2.72, 3.264, 0.0001, 0.0001, 0.0001, 0.0001, 10.717, 0.001, + 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.129, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "ksh": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.3, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.544, 0.007, 0.195, 0.001, 0.0001, 0.006, 0.002, 0.064, 0.077, 0.076, 0.018, + 0.0001, 0.951, 0.126, 1.237, 0.01, 0.258, 0.351, 0.176, 0.091, 0.09, 0.099, 0.083, 0.083, 0.116, 0.206, 0.046, + 0.013, 0.003, 0.002, 0.003, 0.004, 0.0001, 0.29, 0.361, 0.086, 0.549, 0.218, 0.205, 0.059, 0.258, 0.102, 0.404, + 0.343, 0.228, 0.359, 0.191, 0.138, 0.226, 0.009, 0.194, 0.601, 0.11, 0.081, 0.179, 0.232, 0.004, 0.009, 0.121, + 0.015, 0.0001, 0.017, 0.0001, 0.132, 0.0001, 4.203, 0.771, 2.07, 4.046, 9.612, 0.707, 0.863, 3.367, 3.374, + 1.363, 1.028, 2.762, 2.009, 5.309, 3.906, 0.798, 0.006, 4.302, 3.629, 3.86, 2.108, 1.453, 1.005, 0.049, 0.079, + 0.749, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.123, 0.002, 0.002, 0.001, 0.082, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.005, 0.0001, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.005, 0.011, 0.0001, 0.082, 0.036, + 0.001, 0.009, 0.0001, 0.001, 0.047, 0.002, 0.044, 0.413, 0.03, 0.004, 0.001, 0.001, 1.721, 0.001, 0.004, 0.002, + 0.003, 0.013, 0.001, 0.084, 0.001, 0.002, 0.0001, 0.008, 0.003, 0.001, 0.005, 0.025, 0.002, 0.001, 1.538, 0.002, + 0.001, 0.001, 0.002, 0.003, 0.531, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.029, 4.494, 0.051, 0.013, 0.0001, + 0.0001, 0.0001, 0.005, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.124, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "ku": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.393, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.949, 0.005, 0.256, 0.0001, 0.0001, 0.006, 0.001, 0.113, 0.21, 0.21, 0.006, + 0.003, 0.803, 0.095, 1.083, 0.023, 0.197, 0.26, 0.139, 0.073, 0.067, 0.078, 0.071, 0.068, 0.08, 0.162, 0.084, + 0.022, 0.008, 0.003, 0.008, 0.006, 0.0001, 0.192, 0.235, 0.084, 0.253, 0.208, 0.064, 0.107, 0.175, 0.032, 0.081, + 0.247, 0.144, 0.22, 0.115, 0.035, 0.144, 0.05, 0.104, 0.203, 0.123, 0.017, 0.026, 0.063, 0.071, 0.053, 0.061, + 0.009, 0.0001, 0.009, 0.0001, 0.003, 0.002, 7.122, 1.894, 0.369, 2.998, 7.334, 0.296, 0.895, 1.263, 5.92, 0.932, + 2.612, 1.973, 1.601, 5.257, 1.434, 0.604, 0.177, 4.384, 1.643, 2.193, 1.071, 1.195, 1.296, 0.608, 2.23, 0.722, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.075, 0.006, 0.004, 0.007, 0.009, 0.007, 0.012, 0.062, 0.012, 0.002, + 0.018, 0.001, 0.015, 0.003, 0.068, 0.002, 0.001, 0.001, 0.002, 0.006, 0.001, 0.004, 0.003, 0.001, 0.007, 0.019, + 0.001, 0.009, 0.013, 0.012, 0.074, 0.658, 0.013, 0.005, 0.004, 0.002, 0.003, 0.002, 0.004, 0.335, 0.008, 0.015, + 3.587, 0.004, 0.003, 0.008, 2.776, 0.007, 0.009, 0.038, 0.007, 0.007, 0.016, 0.003, 0.007, 0.002, 0.005, 0.004, + 0.005, 1.203, 0.019, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.03, 8.061, 0.042, 0.73, 0.0001, 0.0001, 0.001, + 0.001, 0.001, 0.001, 0.001, 0.0001, 0.01, 0.005, 0.017, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, + 0.063, 0.061, 0.005, 0.012, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.006, 0.073, 0.0001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "kv": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.403, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.572, 0.002, 0.112, 0.0001, 0.0001, 0.004, 0.0001, 0.006, 0.253, 0.254, 0.001, + 0.001, 0.652, 0.237, 0.796, 0.019, 0.199, 0.362, 0.176, 0.114, 0.094, 0.095, 0.085, 0.09, 0.105, 0.228, 0.059, + 0.022, 0.003, 0.001, 0.004, 0.001, 0.0001, 0.008, 0.005, 0.011, 0.005, 0.005, 0.004, 0.005, 0.005, 0.02, 0.004, + 0.011, 0.006, 0.006, 0.007, 0.004, 0.005, 0.002, 0.005, 0.011, 0.006, 0.004, 0.008, 0.003, 0.013, 0.003, 0.002, + 0.039, 0.0001, 0.039, 0.0001, 0.0001, 0.0001, 0.115, 0.019, 0.016, 0.027, 0.069, 0.009, 0.022, 0.03, 0.155, + 0.012, 0.027, 0.043, 0.035, 0.068, 0.048, 0.017, 0.005, 0.048, 0.041, 0.048, 0.044, 0.012, 0.013, 0.005, 0.014, + 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.292, 3.131, 1.711, 1.163, 0.094, 0.093, 0.068, 0.394, 0.316, + 0.013, 0.283, 2.417, 0.996, 0.157, 0.138, 0.933, 0.185, 0.144, 0.161, 0.163, 0.266, 0.043, 0.288, 0.024, 0.072, + 0.036, 0.257, 0.079, 0.116, 0.07, 0.051, 0.125, 0.115, 0.273, 0.082, 0.056, 0.037, 0.021, 0.028, 2.085, 0.052, + 0.007, 0.009, 0.112, 0.005, 0.032, 0.025, 0.019, 3.353, 0.487, 1.618, 0.507, 1.803, 1.293, 0.994, 0.555, 1.916, + 0.692, 1.739, 1.936, 1.41, 2.819, 2.119, 0.641, 0.0001, 0.0001, 0.211, 0.665, 0.015, 0.015, 0.006, 0.004, 0.002, + 0.021, 0.019, 0.013, 0.017, 0.003, 0.013, 0.006, 25.09, 14.142, 0.006, 2.075, 0.003, 0.001, 0.001, 0.003, 0.01, + 0.008, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.016, 0.023, 0.303, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "kw": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.271, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.698, 0.003, 0.428, 0.0001, 0.0001, 0.066, 0.001, 0.379, 0.501, 0.501, 0.001, + 0.001, 1.043, 0.466, 1.444, 0.019, 0.602, 0.995, 0.55, 0.31, 0.288, 0.284, 0.283, 0.29, 0.333, 0.472, 0.076, + 0.113, 0.013, 0.003, 0.013, 0.002, 0.0001, 0.413, 0.261, 0.217, 0.211, 0.211, 0.117, 0.24, 0.182, 0.089, 0.078, + 0.627, 0.279, 0.264, 0.166, 0.089, 0.271, 0.018, 0.16, 0.497, 0.182, 0.13, 0.12, 0.167, 0.003, 0.325, 0.009, + 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 7.247, 1.102, 0.333, 2.599, 6.963, 0.397, 1.527, 3.863, 2.585, + 0.151, 1.745, 2.596, 1.638, 6.936, 4.292, 0.693, 0.011, 4.812, 4.449, 2.907, 1.185, 1.044, 2.706, 0.022, 4.495, + 0.043, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.063, 0.013, 0.005, 0.007, 0.005, 0.004, 0.003, 0.003, 0.006, + 0.002, 0.002, 0.001, 0.003, 0.005, 0.002, 0.002, 0.003, 0.003, 0.001, 0.033, 0.004, 0.002, 0.002, 0.004, 0.004, + 0.02, 0.001, 0.001, 0.003, 0.002, 0.001, 0.002, 0.025, 0.014, 0.004, 0.005, 0.015, 0.004, 0.003, 0.007, 0.004, + 0.018, 0.007, 0.005, 0.002, 0.009, 0.005, 0.004, 0.012, 0.007, 0.012, 0.009, 0.008, 0.009, 0.007, 0.003, 0.012, + 0.008, 0.009, 0.008, 0.006, 0.007, 0.012, 0.004, 0.0001, 0.0001, 0.028, 0.1, 0.011, 0.012, 0.0001, 0.001, + 0.0001, 0.007, 0.003, 0.004, 0.004, 0.0001, 0.012, 0.004, 0.062, 0.02, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.004, 0.013, 0.011, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.013, 0.007, 0.058, 0.0001, 0.001, 0.002, + 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ky": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.608, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.786, 0.001, 0.076, 0.0001, 0.0001, 0.007, 0.001, 0.001, 0.181, 0.185, 0.0001, + 0.003, 0.592, 0.375, 0.793, 0.011, 0.212, 0.26, 0.154, 0.095, 0.087, 0.095, 0.083, 0.081, 0.088, 0.165, 0.05, + 0.023, 0.024, 0.003, 0.024, 0.002, 0.0001, 0.006, 0.009, 0.006, 0.003, 0.002, 0.01, 0.002, 0.004, 0.023, 0.001, + 0.001, 0.003, 0.004, 0.009, 0.004, 0.011, 0.0001, 0.003, 0.019, 0.005, 0.001, 0.003, 0.002, 0.004, 0.001, + 0.0001, 0.007, 0.0001, 0.008, 0.0001, 0.002, 0.0001, 0.034, 0.028, 0.011, 0.01, 0.036, 0.004, 0.007, 0.01, + 0.029, 0.001, 0.005, 0.017, 0.009, 0.023, 0.028, 0.008, 0.001, 0.047, 0.02, 0.022, 0.013, 0.003, 0.003, 0.002, + 0.006, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 2.775, 1.184, 2.443, 1.907, 0.113, 0.08, 0.128, 0.561, + 0.622, 0.004, 0.005, 2.414, 0.086, 0.264, 0.107, 0.368, 0.184, 0.149, 0.029, 0.1, 0.146, 0.009, 0.06, 0.008, + 0.039, 0.003, 0.233, 0.023, 0.133, 0.051, 0.082, 0.045, 0.072, 0.109, 0.101, 0.162, 0.039, 0.017, 0.003, 0.031, + 0.045, 0.843, 0.0001, 0.06, 0.001, 0.049, 0.011, 1.059, 5.238, 0.934, 0.249, 1.237, 1.665, 2.222, 0.662, 0.522, + 2.314, 0.665, 2.431, 2.219, 1.157, 3.498, 1.756, 0.567, 0.0001, 0.0001, 0.135, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 28.842, 12.881, 1.192, 0.856, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.186, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "la": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.703, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.582, 0.002, 0.557, 0.0001, 0.0001, 0.004, 0.001, 0.038, 0.296, 0.296, 0.016, + 0.002, 1.029, 0.127, 0.917, 0.01, 0.288, 0.518, 0.368, 0.158, 0.135, 0.172, 0.155, 0.139, 0.169, 0.292, 0.103, + 0.058, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.441, 0.179, 0.385, 0.16, 0.131, 0.176, 0.158, 0.144, 0.363, 0.023, + 0.04, 0.184, 0.266, 0.121, 0.103, 0.293, 0.049, 0.202, 0.319, 0.152, 0.063, 0.122, 0.033, 0.022, 0.01, 0.013, + 0.004, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 7.718, 1.137, 2.983, 1.877, 7.832, 0.566, 0.934, 0.721, 8.862, + 0.018, 0.079, 2.703, 3.638, 5.533, 4.661, 1.753, 0.47, 5.095, 5.379, 5.968, 5.347, 0.814, 0.036, 0.291, 0.205, + 0.069, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.045, 0.018, 0.011, 0.014, 0.009, 0.005, 0.004, 0.005, 0.004, + 0.018, 0.002, 0.002, 0.005, 0.007, 0.002, 0.002, 0.004, 0.003, 0.002, 0.014, 0.007, 0.002, 0.002, 0.002, 0.003, + 0.004, 0.003, 0.002, 0.004, 0.003, 0.003, 0.004, 0.013, 0.011, 0.004, 0.003, 0.009, 0.004, 0.004, 0.006, 0.01, + 0.02, 0.004, 0.013, 0.003, 0.007, 0.003, 0.005, 0.044, 0.013, 0.009, 0.008, 0.006, 0.012, 0.008, 0.005, 0.014, + 0.01, 0.011, 0.011, 0.013, 0.014, 0.01, 0.01, 0.0001, 0.0001, 0.047, 0.083, 0.019, 0.012, 0.0001, 0.001, 0.002, + 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.062, 0.03, 0.07, 0.024, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.005, + 0.012, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.015, 0.037, 0.003, 0.001, 0.003, 0.002, + 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "lad": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.233, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.114, 0.001, 0.334, 0.0001, 0.0001, 0.009, 0.001, 0.032, 0.169, 0.169, 0.0001, + 0.0001, 1.028, 0.087, 0.763, 0.008, 0.237, 0.25, 0.147, 0.074, 0.074, 0.086, 0.072, 0.065, 0.078, 0.138, 0.053, + 0.043, 0.005, 0.001, 0.005, 0.001, 0.0001, 0.303, 0.15, 0.122, 0.124, 0.422, 0.07, 0.094, 0.073, 0.145, 0.052, + 0.173, 0.269, 0.273, 0.076, 0.097, 0.169, 0.01, 0.114, 0.279, 0.178, 0.068, 0.08, 0.015, 0.026, 0.054, 0.024, + 0.01, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 10.092, 0.654, 0.428, 4.329, 9.389, 0.52, 0.701, 0.524, 5.468, + 0.466, 2.315, 4.475, 1.912, 5.533, 6.266, 1.56, 0.038, 4.367, 5.784, 3.223, 2.47, 1.069, 0.027, 0.043, 1.039, + 0.561, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.02, 0.012, 0.005, 0.005, 0.009, 0.006, 0.004, 0.004, 0.005, + 0.003, 0.006, 0.002, 0.002, 0.003, 0.003, 0.001, 0.015, 0.012, 0.004, 0.011, 0.018, 0.019, 0.004, 0.004, 0.007, + 0.031, 0.002, 0.006, 0.016, 0.006, 0.01, 0.011, 0.017, 0.14, 0.008, 0.005, 0.006, 0.003, 0.003, 0.02, 0.02, + 0.11, 0.013, 0.01, 0.003, 0.09, 0.002, 0.005, 0.012, 0.024, 0.019, 0.137, 0.008, 0.006, 0.005, 0.006, 0.008, + 0.006, 0.03, 0.011, 0.011, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.044, 0.511, 0.018, 0.013, 0.0001, 0.001, + 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.017, 0.007, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.005, 0.02, + 0.199, 0.037, 0.028, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.006, 0.018, 0.0001, 0.001, 0.003, + 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "lb": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.412, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.95, 0.002, 0.355, 0.0001, 0.0001, 0.008, 0.002, 0.417, 0.145, 0.146, 0.001, + 0.003, 0.802, 0.307, 1.03, 0.016, 0.348, 0.52, 0.266, 0.139, 0.134, 0.143, 0.128, 0.134, 0.162, 0.294, 0.059, + 0.012, 0.015, 0.003, 0.015, 0.001, 0.0001, 0.428, 0.324, 0.254, 0.594, 0.233, 0.259, 0.289, 0.233, 0.12, 0.196, + 0.27, 0.284, 0.379, 0.192, 0.132, 0.314, 0.012, 0.243, 0.585, 0.165, 0.101, 0.142, 0.167, 0.006, 0.01, 0.098, + 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 4.931, 0.886, 1.95, 2.841, 11.151, 0.974, 2.202, 2.438, 4.449, + 0.072, 0.85, 2.736, 2.142, 6.511, 2.976, 0.873, 0.044, 5.369, 4.192, 4.448, 3.418, 0.952, 0.815, 0.087, 0.179, + 0.783, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.039, 0.004, 0.003, 0.002, 0.022, 0.001, 0.001, 0.002, 0.001, + 0.016, 0.001, 0.02, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.012, 0.001, 0.0001, 0.001, 0.002, 0.001, + 0.002, 0.001, 0.001, 0.01, 0.002, 0.008, 0.002, 0.053, 0.005, 0.005, 0.001, 0.485, 0.001, 0.003, 0.007, 0.029, + 0.959, 0.004, 0.541, 0.001, 0.003, 0.002, 0.002, 0.009, 0.004, 0.006, 0.005, 0.01, 0.003, 0.01, 0.001, 0.004, + 0.002, 0.003, 0.005, 0.046, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.061, 2.169, 0.003, 0.004, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.004, 0.024, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.037, 0.001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "lbe": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.255, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.9, 0.001, 0.252, 0.0001, 0.0001, 0.001, 0.0001, 0.011, 0.416, 0.416, 0.0001, + 0.003, 0.481, 0.136, 0.815, 0.07, 0.265, 0.236, 0.199, 0.107, 0.105, 0.116, 0.098, 0.098, 0.121, 0.12, 0.136, + 0.067, 0.071, 0.002, 0.067, 0.006, 0.0001, 0.016, 0.004, 0.021, 0.002, 0.004, 0.005, 0.004, 0.003, 0.485, + 0.0001, 0.002, 0.006, 0.012, 0.003, 0.003, 0.014, 0.001, 0.005, 0.011, 0.004, 0.002, 0.006, 0.002, 0.003, 0.002, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.216, 0.084, 0.071, 0.045, 0.128, 0.01, 0.022, 0.031, + 0.155, 0.002, 0.014, 0.09, 0.049, 0.088, 0.086, 0.051, 0.003, 0.174, 0.114, 0.069, 0.102, 0.012, 0.003, 0.009, + 0.024, 0.006, 0.001, 0.001, 0.001, 0.001, 0.0001, 3.391, 1.985, 1.311, 3.41, 0.076, 1.237, 0.309, 0.579, 0.377, + 0.095, 0.645, 0.087, 1.158, 0.044, 0.125, 0.671, 0.313, 0.089, 0.058, 0.221, 0.212, 0.014, 0.015, 0.044, 0.077, + 0.005, 0.185, 0.069, 0.144, 0.054, 0.029, 0.04, 0.037, 0.075, 0.123, 0.038, 0.018, 0.116, 0.052, 0.091, 0.05, + 0.027, 0.003, 0.033, 0.004, 0.04, 0.009, 0.029, 7.018, 0.742, 1.169, 0.714, 1.012, 0.485, 0.137, 0.404, 2.976, + 0.818, 1.445, 2.805, 1.012, 2.921, 0.476, 0.297, 0.0001, 0.0001, 0.062, 0.008, 0.006, 0.002, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 26.245, 14.532, 0.0001, 0.534, 0.0001, 0.001, + 0.0001, 0.009, 0.088, 0.067, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.019, 0.318, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "lez": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.788, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.917, 0.001, 0.11, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.118, 0.119, 0.0001, + 0.001, 0.531, 0.18, 0.599, 0.004, 0.16, 0.227, 0.133, 0.076, 0.063, 0.071, 0.067, 0.062, 0.08, 0.115, 0.048, + 0.01, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.003, 0.002, 0.005, 0.001, 0.002, 0.001, 0.001, 0.001, 0.351, + 0.0001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.01, 0.001, 0.037, + 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.023, 0.003, 0.006, 0.005, 0.017, 0.002, 0.004, + 0.004, 0.014, 0.001, 0.003, 0.017, 0.004, 0.011, 0.011, 0.005, 0.0001, 0.013, 0.01, 0.009, 0.009, 0.002, 0.001, + 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.387, 1.088, 1.449, 2.206, 0.197, 0.805, 0.228, + 0.469, 0.264, 0.003, 0.696, 0.03, 1.797, 0.123, 0.075, 0.643, 0.214, 0.062, 0.057, 0.099, 0.243, 0.013, 0.01, + 0.016, 0.072, 0.013, 0.197, 0.034, 0.095, 0.027, 0.015, 0.041, 0.182, 0.109, 0.046, 0.053, 0.025, 0.087, 0.024, + 0.038, 0.035, 0.001, 0.001, 0.075, 0.001, 0.022, 0.007, 0.017, 6.908, 0.463, 1.591, 1.254, 1.853, 1.815, 0.195, + 0.884, 4.344, 1.376, 1.744, 1.947, 0.879, 2.868, 0.597, 0.413, 0.0001, 0.0001, 0.264, 0.003, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.007, 0.0001, 0.004, 0.002, 30.62, 13.045, 0.0001, 0.248, 0.0001, + 0.001, 0.0001, 0.001, 0.004, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.149, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "lg": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.42, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.857, 0.039, 0.098, 0.0001, 0.0001, 0.008, 0.0001, 0.193, 0.619, 0.652, 0.006, + 0.013, 0.576, 0.063, 0.759, 0.031, 0.142, 0.149, 0.106, 0.065, 0.048, 0.064, 0.043, 0.046, 0.035, 0.039, 0.112, + 0.029, 0.002, 0.038, 0.003, 0.025, 0.0001, 0.202, 0.147, 0.077, 0.032, 0.406, 0.021, 0.082, 0.019, 0.071, 0.01, + 0.184, 0.083, 0.172, 0.138, 0.35, 0.039, 0.002, 0.027, 0.089, 0.063, 0.041, 0.016, 0.06, 0.001, 0.036, 0.019, + 0.012, 0.0001, 0.012, 0.0001, 0.01, 0.001, 11.513, 4.158, 0.451, 1.382, 6.569, 0.546, 2.789, 0.349, 6.274, + 0.363, 4.548, 2.809, 3.269, 5.614, 5.854, 0.404, 0.013, 2.198, 2.205, 2.706, 6.16, 0.367, 2.254, 0.045, 2.427, + 1.395, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 1.181, 0.001, 0.015, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, + 0.006, 0.008, 0.842, 0.001, 0.0001, 0.092, 0.085, 0.0001, 0.0001, 0.001, 0.001, 0.113, 0.0001, 0.0001, 0.0001, + 0.017, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, + 0.006, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 1.181, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "li": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.944, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.135, 0.002, 0.418, 0.0001, 0.0001, 0.017, 0.001, 1.033, 0.22, 0.22, 0.002, + 0.001, 0.717, 0.245, 0.974, 0.02, 0.269, 0.322, 0.176, 0.093, 0.094, 0.096, 0.096, 0.091, 0.103, 0.161, 0.092, + 0.054, 0.018, 0.002, 0.018, 0.001, 0.0001, 0.18, 0.177, 0.097, 0.347, 0.099, 0.066, 0.119, 0.148, 0.188, 0.05, + 0.105, 0.134, 0.157, 0.158, 0.108, 0.098, 0.003, 0.104, 0.185, 0.093, 0.028, 0.141, 0.105, 0.003, 0.004, 0.083, + 0.008, 0.001, 0.008, 0.0001, 0.0001, 0.001, 5.507, 1.139, 0.937, 3.64, 13.741, 0.575, 2.233, 1.264, 5.103, + 1.163, 1.751, 2.989, 1.798, 6.008, 4.376, 1.144, 0.011, 4.793, 3.527, 4.666, 1.997, 1.767, 1.153, 0.045, 0.112, + 0.704, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.031, 0.005, 0.002, 0.002, 0.002, 0.002, 0.001, 0.001, 0.004, + 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.01, 0.001, 0.0001, 0.002, 0.0001, + 0.007, 0.018, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.002, 0.004, 0.007, 0.003, 0.002, 0.113, 0.003, 0.001, 0.003, + 0.424, 0.024, 0.004, 0.246, 0.001, 0.004, 0.001, 0.014, 0.003, 0.003, 0.027, 0.238, 0.005, 0.002, 0.354, 0.001, + 0.005, 0.003, 0.003, 0.002, 0.014, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.028, 1.471, 0.005, 0.005, 0.0001, + 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.01, 0.004, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.031, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "lij": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.115, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.653, 0.006, 0.425, 0.0001, 0.0001, 0.003, 0.001, 1.006, 0.211, 0.212, 0.0001, + 0.0001, 1.079, 0.522, 0.689, 0.013, 0.183, 0.34, 0.145, 0.099, 0.1, 0.107, 0.089, 0.101, 0.099, 0.127, 0.107, + 0.071, 0.08, 0.003, 0.08, 0.006, 0.0001, 0.288, 0.108, 0.216, 0.12, 0.091, 0.089, 0.116, 0.025, 0.235, 0.016, + 0.018, 0.145, 0.148, 0.083, 0.128, 0.166, 0.021, 0.11, 0.224, 0.097, 0.053, 0.082, 0.012, 0.025, 0.004, 0.066, + 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 7.807, 0.66, 2.955, 3.041, 7.727, 0.79, 1.509, 0.643, 7.15, 0.033, + 0.062, 2.465, 2.057, 5.516, 6.662, 1.83, 0.232, 3.742, 3.269, 4.498, 2.078, 1.097, 0.032, 0.327, 0.052, 0.447, + 0.0001, 0.015, 0.0001, 0.0001, 0.0001, 0.126, 0.011, 0.006, 0.006, 0.007, 0.003, 0.005, 0.015, 0.003, 0.004, + 0.003, 0.001, 0.004, 0.006, 0.001, 0.002, 0.001, 0.002, 0.007, 0.108, 0.002, 0.001, 0.003, 0.001, 0.007, 0.097, + 0.001, 0.002, 0.005, 0.004, 0.001, 0.001, 0.105, 0.013, 0.443, 0.002, 0.076, 0.002, 0.52, 0.668, 0.246, 0.118, + 0.122, 0.032, 0.129, 0.012, 0.108, 0.033, 0.028, 0.081, 0.222, 0.058, 0.152, 0.005, 0.088, 0.002, 0.006, 0.059, + 0.022, 0.1, 0.117, 0.007, 0.005, 0.013, 0.0001, 0.0001, 0.059, 3.444, 0.014, 0.118, 0.0001, 0.001, 0.0001, + 0.001, 0.001, 0.001, 0.003, 0.0001, 0.026, 0.013, 0.031, 0.013, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, + 0.016, 0.012, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.009, 0.005, 0.121, 0.0001, 0.001, 0.002, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "lmo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.694, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.003, 0.007, 0.496, 0.0001, 0.002, 0.011, 0.001, 1.536, 0.286, 0.286, 0.0001, + 0.001, 1.048, 0.242, 0.905, 0.061, 0.214, 0.291, 0.19, 0.13, 0.124, 0.121, 0.109, 0.107, 0.118, 0.137, 0.12, + 0.041, 0.23, 0.036, 0.23, 0.004, 0.0001, 0.256, 0.222, 0.29, 0.092, 0.333, 0.125, 0.138, 0.035, 0.151, 0.022, + 0.022, 0.325, 0.213, 0.07, 0.062, 0.237, 0.013, 0.158, 0.284, 0.115, 0.042, 0.131, 0.03, 0.012, 0.005, 0.017, + 0.008, 0.0001, 0.008, 0.0001, 0.008, 0.0001, 8.462, 0.843, 2.691, 3.762, 7.44, 0.686, 1.303, 1.109, 4.912, + 0.086, 0.225, 4.93, 2.005, 5.17, 2.753, 1.529, 0.12, 4.31, 3.255, 3.626, 1.912, 0.803, 0.038, 0.028, 0.061, + 0.501, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.065, 0.004, 0.005, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, + 0.003, 0.001, 0.002, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, 0.002, 0.011, 0.002, 0.0001, 0.002, 0.001, 0.012, + 0.042, 0.001, 0.001, 0.018, 0.002, 0.001, 0.003, 0.883, 0.012, 0.006, 0.001, 0.021, 0.001, 0.002, 0.005, 0.978, + 0.311, 0.003, 0.015, 0.376, 0.025, 0.002, 0.002, 0.004, 0.005, 0.393, 0.184, 0.028, 0.003, 0.199, 0.002, 0.003, + 0.227, 0.023, 0.007, 0.722, 0.004, 0.002, 0.004, 0.0001, 0.0001, 0.146, 4.287, 0.005, 0.015, 0.0001, 0.0001, + 0.0001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.019, 0.008, 0.013, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.061, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ln": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.397, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.893, 0.03, 0.25, 0.011, 0.001, 0.018, 0.001, 0.058, 0.196, 0.195, 0.019, + 0.0001, 0.627, 0.278, 0.997, 0.017, 0.237, 0.316, 0.167, 0.077, 0.074, 0.095, 0.09, 0.07, 0.092, 0.208, 0.084, + 0.022, 0.031, 0.028, 0.031, 0.008, 0.0001, 0.272, 0.381, 0.139, 0.08, 0.273, 0.07, 0.073, 0.036, 0.085, 0.047, + 0.397, 0.244, 0.485, 0.279, 0.076, 0.136, 0.004, 0.069, 0.216, 0.116, 0.035, 0.048, 0.05, 0.005, 0.052, 0.034, + 0.014, 0.018, 0.014, 0.0001, 0.004, 0.0001, 10.636, 2.915, 0.49, 0.988, 4.562, 0.3, 1.532, 0.289, 5.022, 0.059, + 3.253, 3.932, 3.872, 5.27, 5.607, 1.218, 0.071, 1.319, 2.651, 2.571, 1.582, 0.27, 0.506, 0.061, 2.255, 1.262, + 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.045, 0.425, 0.034, 0.001, 0.004, 0.002, 0.016, 0.0001, 0.002, 0.009, + 0.003, 0.0001, 0.047, 0.002, 0.03, 0.0001, 0.012, 0.0001, 0.122, 0.011, 0.585, 0.0001, 0.0001, 0.0001, 0.001, + 0.025, 0.001, 0.584, 0.003, 0.002, 0.001, 0.0001, 0.21, 1.199, 0.019, 0.009, 0.001, 0.001, 0.002, 0.013, 0.036, + 1.009, 0.021, 0.019, 0.002, 0.983, 0.006, 0.015, 0.003, 0.003, 0.005, 0.692, 0.016, 0.003, 0.001, 0.001, 0.001, + 0.002, 0.332, 0.02, 0.002, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.228, 4.372, 0.034, 0.004, 0.008, 0.141, + 0.0001, 1.137, 0.001, 0.001, 0.5, 0.0001, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.005, 0.014, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.057, 0.0001, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "lo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.442, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 2.079, 0.001, 0.049, 0.0001, 0.0001, 0.006, 0.0001, 0.004, 0.071, 0.071, 0.001, + 0.001, 0.152, 0.034, 0.234, 0.012, 0.09, 0.111, 0.08, 0.044, 0.039, 0.045, 0.029, 0.03, 0.029, 0.051, 0.034, + 0.006, 0.003, 0.002, 0.003, 0.001, 0.0001, 0.013, 0.008, 0.01, 0.008, 0.006, 0.005, 0.004, 0.005, 0.01, 0.003, + 0.004, 0.008, 0.008, 0.007, 0.003, 0.012, 0.0001, 0.005, 0.013, 0.013, 0.003, 0.004, 0.004, 0.001, 0.001, + 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.157, 0.027, 0.063, 0.059, 0.202, 0.033, 0.037, 0.067, + 0.14, 0.003, 0.015, 0.078, 0.05, 0.13, 0.139, 0.039, 0.002, 0.117, 0.112, 0.142, 0.055, 0.018, 0.023, 0.006, + 0.028, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.694, 1.8, 0.562, 0.336, 0.72, 0.0001, 0.034, 1.352, + 1.675, 1.044, 0.455, 0.525, 0.031, 0.727, 0.002, 0.001, 0.005, 0.004, 0.004, 0.01, 1.254, 0.484, 0.162, 0.734, + 0.009, 2.294, 0.653, 0.586, 0.209, 0.092, 0.491, 0.038, 0.022, 1.013, 0.148, 0.224, 0.003, 0.796, 0.001, 0.85, + 0.016, 0.008, 0.816, 0.509, 0.001, 1.145, 0.216, 0.004, 1.227, 1.202, 2.293, 0.24, 0.573, 0.78, 0.113, 0.39, + 1.673, 0.52, 24.114, 5.723, 0.116, 0.133, 0.001, 0.0001, 0.0001, 0.0001, 0.085, 0.006, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.829, 0.002, 0.538, + 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "lrc": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.503, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 10.494, 0.003, 0.04, 0.0001, 0.0001, 0.008, 0.0001, 0.002, 0.084, 0.084, 0.002, + 0.001, 0.009, 0.028, 0.484, 0.015, 0.026, 0.035, 0.019, 0.017, 0.01, 0.011, 0.009, 0.009, 0.015, 0.017, 0.04, + 0.001, 0.009, 0.002, 0.009, 0.0001, 0.0001, 0.006, 0.003, 0.003, 0.006, 0.003, 0.002, 0.001, 0.002, 0.005, + 0.001, 0.002, 0.002, 0.003, 0.002, 0.001, 0.003, 0.0001, 0.002, 0.003, 0.003, 0.001, 0.001, 0.002, 0.0001, + 0.0001, 0.001, 0.003, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.043, 0.006, 0.016, 0.023, 0.041, 0.004, 0.008, + 0.011, 0.044, 0.001, 0.008, 0.022, 0.01, 0.037, 0.028, 0.011, 0.001, 0.026, 0.016, 0.024, 0.015, 0.007, 0.006, + 0.002, 0.007, 0.003, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.141, 0.397, 0.205, 0.02, 1.605, 1.614, 3.115, + 2.266, 3.47, 0.018, 0.099, 0.005, 5.078, 0.005, 0.021, 0.008, 0.02, 0.003, 0.001, 0.004, 0.007, 0.374, 0.0001, + 0.001, 0.02, 0.38, 0.001, 0.042, 0.001, 0.001, 0.001, 0.003, 0.001, 0.003, 0.35, 0.86, 0.5, 0.014, 1.898, 5.042, + 0.917, 1.365, 1.804, 0.048, 0.445, 0.131, 0.29, 3.021, 0.146, 3.091, 0.704, 1.565, 1.062, 0.145, 0.062, 0.1, + 0.06, 0.212, 0.059, 0.025, 0.002, 0.001, 0.485, 0.001, 0.0001, 0.0001, 0.044, 0.006, 0.003, 0.003, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.017, 0.007, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.007, 20.669, 13.379, 3.076, 5.814, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.002, 0.138, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ltg": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.505, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.915, 0.002, 0.48, 0.0001, 0.0001, 0.03, 0.001, 0.011, 0.307, 0.306, 0.001, + 0.001, 1.036, 0.186, 1.128, 0.03, 0.246, 0.429, 0.198, 0.13, 0.123, 0.148, 0.107, 0.108, 0.116, 0.317, 0.161, + 0.072, 0.029, 0.005, 0.029, 0.004, 0.0001, 0.199, 0.123, 0.06, 0.183, 0.07, 0.028, 0.064, 0.021, 0.12, 0.092, + 0.204, 0.323, 0.133, 0.101, 0.065, 0.288, 0.001, 0.16, 0.239, 0.103, 0.036, 0.21, 0.007, 0.022, 0.001, 0.052, + 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 7.469, 0.962, 0.824, 2.269, 4.253, 0.17, 1.648, 0.088, 6.306, + 1.422, 2.423, 2.524, 1.996, 2.559, 4.514, 1.853, 0.001, 3.554, 6.061, 4.103, 4.999, 1.941, 0.013, 0.006, 1.629, + 1.118, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.287, 1.24, 0.018, 0.009, 0.002, 0.008, 0.371, 0.004, 0.003, + 0.001, 0.001, 0.004, 0.014, 0.08, 0.001, 0.011, 0.003, 0.002, 0.002, 0.271, 0.142, 0.001, 0.001, 0.003, 0.003, + 0.007, 0.001, 0.001, 0.003, 0.032, 0.034, 0.002, 0.043, 0.709, 0.001, 0.005, 0.004, 0.002, 0.0001, 0.0001, + 0.001, 0.001, 0.015, 2.24, 0.001, 0.001, 0.0001, 0.001, 0.04, 0.01, 0.024, 0.01, 0.013, 0.028, 0.003, 0.011, + 0.033, 0.006, 0.014, 0.026, 0.687, 0.026, 0.226, 0.009, 0.0001, 0.0001, 0.023, 0.015, 3.578, 2.215, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.003, 0.001, 0.252, 0.098, 0.0001, 0.0001, 0.0001, 0.004, + 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.265, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "mai": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.888, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.023, 0.001, 0.03, 0.0001, 0.0001, 0.003, 0.001, 0.013, 0.071, 0.074, 0.0001, + 0.001, 0.267, 0.061, 0.074, 0.006, 0.01, 0.016, 0.009, 0.005, 0.004, 0.005, 0.004, 0.004, 0.005, 0.012, 0.021, + 0.006, 0.004, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, + 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.018, 0.005, 0.005, 0.005, 0.017, 0.003, 0.004, + 0.008, 0.015, 0.001, 0.002, 0.009, 0.005, 0.013, 0.013, 0.004, 0.001, 0.014, 0.017, 0.012, 0.006, 0.002, 0.003, + 0.001, 0.003, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.792, 0.705, 0.351, 0.05, 0.0001, 0.548, 0.202, + 1.331, 0.277, 0.165, 0.004, 0.356, 0.051, 2.185, 0.0001, 0.286, 0.005, 0.001, 0.0001, 0.066, 0.006, 1.874, + 0.183, 0.514, 0.043, 0.102, 0.293, 0.463, 0.567, 0.024, 0.087, 0.255, 0.05, 0.178, 0.022, 0.166, 25.43, 6.866, + 0.581, 0.373, 1.476, 0.06, 0.857, 0.137, 0.417, 0.41, 1.258, 0.71, 1.883, 0.001, 1.344, 0.001, 0.001, 0.686, + 0.286, 0.227, 1.223, 0.469, 0.0001, 0.0001, 0.026, 0.025, 2.747, 1.736, 0.0001, 0.0001, 0.009, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.668, + 0.0001, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "mdf": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.974, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.901, 0.002, 0.147, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.239, 0.241, 0.0001, + 0.001, 0.661, 0.233, 0.828, 0.004, 0.16, 0.227, 0.113, 0.065, 0.054, 0.071, 0.072, 0.058, 0.067, 0.13, 0.047, + 0.019, 0.002, 0.0001, 0.002, 0.001, 0.0001, 0.006, 0.002, 0.008, 0.002, 0.002, 0.003, 0.002, 0.002, 0.025, + 0.001, 0.002, 0.002, 0.005, 0.002, 0.002, 0.006, 0.001, 0.003, 0.005, 0.003, 0.001, 0.008, 0.001, 0.014, 0.0001, + 0.0001, 0.004, 0.0001, 0.005, 0.0001, 0.002, 0.0001, 0.07, 0.006, 0.018, 0.016, 0.05, 0.004, 0.011, 0.014, + 0.042, 0.003, 0.009, 0.03, 0.013, 0.041, 0.036, 0.013, 0.001, 0.037, 0.035, 0.028, 0.024, 0.005, 0.003, 0.003, + 0.006, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.013, 2.98, 2.587, 0.748, 0.583, 0.414, 0.428, 0.203, + 0.631, 0.045, 0.095, 0.17, 2.818, 0.257, 0.113, 1.375, 0.157, 0.181, 0.113, 0.066, 0.125, 0.013, 0.006, 0.022, + 0.063, 0.005, 0.16, 0.068, 0.186, 0.053, 0.097, 0.114, 0.073, 0.188, 0.099, 0.03, 0.023, 0.016, 0.014, 0.014, + 0.049, 0.003, 0.001, 0.054, 0.002, 0.05, 0.007, 0.022, 4.7, 0.292, 1.108, 0.449, 1.264, 2.755, 0.106, 0.711, + 2.236, 0.41, 2.142, 1.743, 1.474, 3.418, 3.1, 0.637, 0.0001, 0.0001, 0.118, 0.006, 0.005, 0.003, 0.0001, 0.0001, + 0.0001, 0.005, 0.002, 0.003, 0.002, 0.0001, 0.004, 0.002, 28.205, 15.445, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.006, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.0001, 0.122, 0.001, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "mg": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.132, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.344, 0.0001, 0.051, 0.0001, 0.0001, 0.003, 0.0001, 1.722, 0.134, 0.134, + 0.0001, 0.062, 0.6, 1.054, 1.426, 0.011, 0.88, 0.969, 0.776, 0.547, 0.574, 0.473, 0.464, 0.436, 0.531, 0.535, + 0.029, 0.033, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.281, 0.132, 0.16, 0.072, 0.212, 0.148, 0.178, 0.056, + 0.346, 0.102, 0.053, 0.101, 0.354, 0.788, 0.05, 0.139, 0.008, 0.098, 0.209, 0.172, 0.049, 0.057, 0.038, 0.005, + 0.021, 0.009, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 15.071, 0.568, 0.216, 2.816, 2.902, 0.81, 0.249, + 1.395, 7.562, 0.225, 1.469, 1.52, 3.108, 9.36, 4.666, 0.931, 0.023, 4.686, 1.843, 3.288, 0.414, 0.748, 0.044, + 0.043, 4.297, 0.559, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.076, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, + 0.002, 0.001, 0.008, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.052, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.017, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.15, 0.01, 0.007, 0.008, 0.001, + 0.0001, 0.001, 0.006, 0.026, 0.088, 0.003, 0.004, 0.001, 0.005, 0.002, 0.002, 0.137, 0.002, 0.001, 0.004, 0.086, + 0.001, 0.002, 0.001, 0.003, 0.001, 0.002, 0.01, 0.003, 0.001, 0.001, 0.008, 0.0001, 0.0001, 0.143, 0.408, 0.006, + 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.001, 0.069, 0.004, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "mh": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.376, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.504, 0.0001, 0.156, 0.0001, 0.0001, 0.0001, 0.039, 0.039, 0.039, 0.039, + 0.0001, 0.0001, 1.325, 0.078, 1.247, 0.039, 0.156, 0.039, 0.078, 0.0001, 0.0001, 0.039, 0.0001, 0.0001, 0.039, + 0.0001, 0.039, 0.078, 0.078, 0.039, 0.078, 0.0001, 0.0001, 0.701, 0.273, 0.156, 0.078, 0.312, 0.039, 0.156, + 0.078, 0.351, 0.779, 0.779, 0.234, 0.779, 0.0001, 0.039, 0.156, 0.0001, 0.312, 0.195, 0.156, 0.195, 0.039, + 0.078, 0.0001, 0.195, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.103, 1.558, 0.312, 0.818, 6.584, + 0.078, 0.351, 1.013, 7.402, 4.675, 3.584, 3.039, 2.766, 5.804, 6.389, 0.779, 0.078, 4.753, 1.48, 2.337, 1.441, + 0.117, 1.597, 0.0001, 1.558, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.351, 0.0001, 0.0001, + 0.156, 0.0001, 0.039, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.039, 0.545, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.467, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.078, 0.0001, 0.117, 0.0001, 0.0001, 0.0001, 1.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.208, 0.429, 0.584, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.662, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "mhr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.247, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.433, 0.01, 0.105, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.242, 0.243, 0.0001, + 0.004, 0.563, 0.341, 0.763, 0.006, 0.23, 0.307, 0.193, 0.103, 0.088, 0.092, 0.076, 0.077, 0.081, 0.164, 0.099, + 0.012, 0.003, 0.005, 0.003, 0.006, 0.0001, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.001, 0.001, 0.045, + 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.016, 0.001, 0.019, + 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.02, 0.004, 0.007, 0.008, 0.02, 0.002, 0.003, + 0.004, 0.014, 0.0001, 0.002, 0.01, 0.005, 0.01, 0.012, 0.004, 0.0001, 0.013, 0.009, 0.01, 0.005, 0.002, 0.002, + 0.0001, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.161, 0.998, 2.463, 1.262, 0.079, 0.06, 0.073, + 0.732, 2.145, 0.012, 0.024, 3.429, 0.167, 0.157, 0.039, 0.3, 0.114, 0.051, 0.084, 0.076, 0.173, 0.021, 0.005, + 0.012, 0.07, 0.035, 0.245, 0.039, 0.204, 0.055, 0.073, 0.108, 0.142, 0.124, 0.167, 0.046, 0.023, 0.257, 0.01, + 0.146, 0.069, 0.001, 0.001, 0.099, 0.002, 0.093, 0.02, 0.031, 3.766, 0.43, 0.916, 0.689, 1.067, 3.621, 0.573, + 0.276, 1.798, 1.177, 2.133, 2.766, 1.884, 2.711, 2.445, 0.765, 0.0001, 0.0001, 0.222, 0.109, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.008, 0.004, 28.363, 13.911, 0.249, 0.424, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, + 0.203, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "mi": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.242, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 18.048, 0.002, 0.114, 0.0001, 0.0001, 0.007, 0.0001, 0.316, 0.24, 0.24, 0.0001, + 0.0001, 0.815, 0.729, 1.027, 0.003, 0.15, 0.245, 0.11, 0.069, 0.067, 0.071, 0.069, 0.066, 0.083, 0.097, 0.029, + 0.194, 0.002, 0.0001, 0.002, 0.002, 0.0001, 0.243, 0.042, 0.09, 0.013, 0.207, 0.019, 0.023, 0.227, 0.154, 0.011, + 0.858, 0.022, 0.414, 0.264, 0.035, 0.344, 0.001, 0.143, 0.039, 1.088, 0.016, 0.015, 0.518, 0.001, 0.002, 0.003, + 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 10.57, 0.047, 0.232, 0.102, 7.727, 0.029, 1.763, 3.618, 6.701, + 0.008, 3.514, 0.582, 0.854, 4.652, 6.133, 0.788, 0.003, 3.052, 0.255, 6.464, 3.231, 0.037, 1.326, 0.008, 0.217, + 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.025, 2.749, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.003, + 0.001, 0.001, 0.001, 0.072, 0.357, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.284, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.004, 0.001, 0.003, 0.004, 0.003, + 0.003, 0.013, 0.525, 0.001, 0.002, 0.001, 0.002, 0.003, 0.004, 0.018, 0.005, 0.001, 0.001, 0.002, 0.001, 0.002, + 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.019, 0.015, 3.257, 0.759, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.006, 0.008, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.002, 0.004, 0.001, 0.0001, 0.002, + 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "min": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.172, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.612, 0.0001, 0.04, 0.005, 0.0001, 0.002, 0.004, 0.018, 0.155, 0.155, 0.0001, + 0.0001, 1.063, 0.022, 1.041, 0.001, 0.404, 0.298, 0.265, 0.112, 0.103, 0.128, 0.132, 0.113, 0.114, 0.233, 0.009, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.635, 0.069, 0.223, 0.216, 0.107, 0.023, 0.035, 0.059, 0.25, + 0.026, 0.062, 0.356, 0.142, 0.089, 0.046, 0.143, 0.014, 0.06, 0.402, 0.123, 0.018, 0.017, 0.016, 0.015, 0.037, + 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.754, 1.953, 0.961, 4.093, 4.246, 0.532, 1.865, 1.575, + 6.705, 0.46, 3.68, 3.421, 3.054, 5.905, 5.613, 2.448, 0.009, 4.152, 3.536, 3.358, 3.758, 0.175, 0.156, 0.045, + 0.909, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, 0.016, 0.004, 0.004, 0.011, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.005, + 0.0001, 0.0001, 0.014, 0.007, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.008, 0.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.029, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "mk": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.442, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.507, 0.001, 0.094, 0.0001, 0.0001, 0.006, 0.001, 0.012, 0.086, 0.086, 0.001, + 0.004, 0.588, 0.074, 0.535, 0.01, 0.197, 0.23, 0.143, 0.089, 0.082, 0.088, 0.076, 0.074, 0.08, 0.116, 0.032, + 0.012, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.015, 0.008, 0.047, 0.006, 0.006, 0.005, 0.034, 0.005, 0.026, 0.002, + 0.003, 0.006, 0.012, 0.023, 0.006, 0.014, 0.001, 0.007, 0.019, 0.01, 0.006, 0.006, 0.004, 0.004, 0.001, 0.001, + 0.008, 0.0001, 0.008, 0.0001, 0.002, 0.0001, 0.08, 0.013, 0.03, 0.022, 0.08, 0.011, 0.022, 0.023, 0.061, 0.003, + 0.011, 0.035, 0.039, 0.054, 0.06, 0.012, 0.001, 0.056, 0.049, 0.047, 0.027, 0.008, 0.006, 0.003, 0.012, 0.004, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.279, 1.922, 3.072, 0.896, 0.157, 0.085, 0.296, 0.344, 0.32, 0.001, + 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.012, 0.067, 0.066, 0.1, 0.11, 0.062, 0.046, 0.008, 0.029, 0.825, 0.009, + 0.229, 0.032, 0.208, 0.077, 0.103, 0.118, 0.054, 0.125, 0.063, 0.016, 0.028, 0.03, 0.013, 0.01, 0.018, 0.002, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 5.692, 0.585, 1.752, 0.746, 1.619, 3.647, 0.195, 0.665, 3.964, + 0.001, 1.64, 1.494, 0.888, 3.068, 4.767, 1.117, 0.0001, 0.0001, 0.015, 0.006, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 33.101, 10.345, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.096, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ml": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.283, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 3.554, 0.001, 0.034, 0.0001, 0.0001, 0.002, 0.0001, 0.013, 0.046, 0.046, 0.0001, + 0.001, 0.155, 0.051, 0.434, 0.004, 0.069, 0.096, 0.051, 0.026, 0.025, 0.029, 0.025, 0.024, 0.03, 0.054, 0.011, + 0.004, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.005, 0.003, 0.005, 0.002, 0.002, 0.002, 0.002, 0.002, 0.004, + 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.004, 0.0001, 0.002, 0.005, 0.004, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.044, 0.007, 0.016, 0.014, 0.045, 0.007, 0.009, + 0.015, 0.036, 0.001, 0.004, 0.022, 0.013, 0.031, 0.031, 0.01, 0.001, 0.031, 0.025, 0.029, 0.015, 0.004, 0.005, + 0.002, 0.008, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.284, 1.637, 0.889, 0.045, 0.0001, 0.237, 0.843, + 0.478, 0.108, 0.077, 0.086, 0.336, 0.062, 4.599, 0.152, 0.029, 0.008, 0.0001, 0.075, 0.022, 0.003, 1.759, 0.042, + 0.219, 0.023, 0.382, 0.512, 0.004, 0.161, 0.001, 0.086, 0.887, 0.025, 0.094, 0.002, 0.484, 1.618, 0.083, 0.303, + 0.146, 1.873, 0.0001, 0.931, 0.058, 0.143, 0.126, 0.78, 1.209, 1.122, 0.589, 0.667, 0.458, 22.229, 10.029, + 0.199, 0.193, 0.652, 0.135, 0.025, 0.171, 0.328, 0.323, 1.631, 2.28, 0.0001, 0.0001, 0.014, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.391, + 0.001, 0.071, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "mn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.502, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.684, 0.002, 0.094, 0.001, 0.001, 0.006, 0.001, 0.003, 0.078, 0.078, 0.001, + 0.002, 0.423, 0.192, 0.522, 0.019, 0.207, 0.249, 0.16, 0.075, 0.065, 0.07, 0.06, 0.055, 0.066, 0.128, 0.025, + 0.008, 0.003, 0.005, 0.004, 0.002, 0.0001, 0.018, 0.012, 0.019, 0.013, 0.012, 0.008, 0.007, 0.009, 0.026, 0.003, + 0.004, 0.011, 0.017, 0.01, 0.009, 0.02, 0.002, 0.012, 0.024, 0.016, 0.006, 0.007, 0.006, 0.007, 0.003, 0.001, + 0.006, 0.001, 0.006, 0.0001, 0.005, 0.0001, 0.097, 0.016, 0.039, 0.037, 0.119, 0.017, 0.023, 0.03, 0.088, 0.002, + 0.012, 0.052, 0.031, 0.08, 0.086, 0.026, 0.002, 0.079, 0.064, 0.078, 0.038, 0.025, 0.012, 0.008, 0.018, 0.003, + 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 2.438, 1.425, 1.576, 1.589, 0.047, 1.639, 0.295, 0.416, 0.311, 0.001, + 0.008, 0.672, 0.369, 2.886, 0.106, 0.163, 0.114, 0.151, 0.023, 0.067, 0.081, 0.017, 0.027, 0.033, 0.044, 0.004, + 0.046, 0.028, 0.128, 0.083, 0.044, 0.031, 0.048, 0.074, 0.102, 0.063, 0.021, 0.125, 0.02, 0.022, 0.053, 1.026, + 0.001, 0.019, 0.001, 0.067, 0.028, 1.192, 4.733, 1.04, 0.537, 2.615, 2.04, 0.399, 0.621, 0.396, 2.01, 1.723, + 0.207, 2.589, 0.943, 3.889, 2.383, 0.107, 0.0001, 0.0001, 0.065, 0.012, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 27.532, 13.908, 1.199, 1.049, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.072, 0.002, 0.0001, 0.002, + 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "mo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.77, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.47, 0.002, 0.214, 0.0001, 0.0001, 0.017, 0.001, 0.035, 0.128, 0.128, 0.002, + 0.001, 0.656, 0.155, 0.49, 0.006, 0.172, 0.19, 0.096, 0.052, 0.062, 0.054, 0.034, 0.043, 0.06, 0.129, 0.06, + 0.015, 0.017, 0.012, 0.017, 0.0001, 0.0001, 0.018, 0.009, 0.023, 0.009, 0.011, 0.002, 0.006, 0.004, 0.035, + 0.002, 0.005, 0.007, 0.014, 0.008, 0.008, 0.009, 0.001, 0.009, 0.019, 0.008, 0.005, 0.004, 0.007, 0.007, 0.001, + 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.381, 0.035, 0.167, 0.122, 0.44, 0.045, 0.036, 0.034, + 0.432, 0.005, 0.016, 0.206, 0.12, 0.248, 0.177, 0.096, 0.003, 0.253, 0.183, 0.236, 0.214, 0.038, 0.01, 0.011, + 0.011, 0.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.01, 1.642, 2.712, 2.46, 0.4, 0.066, 0.487, 0.515, 0.507, + 0.001, 0.001, 0.622, 0.372, 0.933, 0.029, 0.581, 0.134, 0.087, 0.042, 0.032, 0.081, 0.073, 0.022, 0.008, 0.061, + 0.004, 0.139, 0.063, 0.145, 0.05, 0.043, 0.149, 0.144, 0.143, 0.069, 0.113, 0.038, 0.031, 0.007, 0.03, 0.013, + 0.002, 0.001, 0.064, 0.002, 0.001, 0.029, 0.007, 3.78, 0.37, 0.558, 0.274, 1.316, 4.346, 0.072, 0.319, 3.558, + 0.657, 1.356, 2.204, 1.073, 2.802, 2.13, 1.099, 0.0001, 0.0001, 0.025, 0.051, 0.091, 0.068, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.005, 0.0001, 0.008, 0.004, 27.537, 14.047, 0.001, 0.161, 0.0001, 0.0001, 0.0001, + 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.022, 0.0001, 0.0001, 0.001, + 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "mr": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.525, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.348, 0.002, 0.043, 0.0001, 0.0001, 0.004, 0.0001, 0.024, 0.061, 0.064, 0.0001, + 0.001, 0.221, 0.063, 0.539, 0.009, 0.009, 0.009, 0.006, 0.003, 0.003, 0.003, 0.003, 0.003, 0.003, 0.005, 0.03, + 0.01, 0.003, 0.004, 0.003, 0.003, 0.0001, 0.008, 0.004, 0.006, 0.004, 0.003, 0.003, 0.003, 0.003, 0.007, 0.002, + 0.002, 0.003, 0.006, 0.003, 0.002, 0.005, 0.0001, 0.004, 0.008, 0.009, 0.001, 0.002, 0.002, 0.0001, 0.001, + 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.001, 0.0001, 0.138, 0.021, 0.046, 0.053, 0.162, 0.029, 0.028, 0.063, + 0.114, 0.003, 0.011, 0.062, 0.038, 0.106, 0.103, 0.03, 0.002, 0.096, 0.09, 0.116, 0.04, 0.015, 0.019, 0.003, + 0.023, 0.002, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 1.224, 0.397, 1.061, 0.056, 0.001, 0.297, 0.351, 1.664, + 0.084, 0.127, 0.02, 0.461, 0.026, 2.286, 0.0001, 0.096, 0.005, 0.018, 0.001, 0.019, 0.005, 1.098, 0.145, 0.403, + 0.083, 0.015, 0.659, 0.012, 0.404, 0.067, 0.014, 0.287, 0.125, 0.236, 0.039, 0.415, 24.995, 7.065, 0.585, 0.404, + 1.081, 0.036, 0.727, 0.118, 0.317, 0.211, 0.844, 1.342, 1.809, 0.018, 1.056, 0.198, 0.001, 0.975, 0.327, 0.194, + 1.035, 0.79, 0.001, 0.001, 0.003, 0.001, 3.71, 0.926, 0.0001, 0.0001, 0.015, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.418, 0.001, 0.048, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "mrj": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.556, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.792, 0.004, 0.111, 0.0001, 0.0001, 0.008, 0.001, 0.036, 0.371, 0.372, 0.0001, + 0.001, 0.508, 0.256, 0.9, 0.015, 0.334, 0.401, 0.27, 0.169, 0.152, 0.17, 0.137, 0.141, 0.168, 0.185, 0.1, 0.046, + 0.009, 0.005, 0.008, 0.012, 0.0001, 0.017, 0.012, 0.012, 0.011, 0.006, 0.006, 0.008, 0.006, 0.083, 0.004, 0.011, + 0.006, 0.014, 0.007, 0.024, 0.016, 0.001, 0.008, 0.014, 0.009, 0.003, 0.03, 0.002, 0.042, 0.002, 0.001, 0.008, + 0.0001, 0.009, 0.0001, 0.003, 0.0001, 0.281, 0.025, 0.082, 0.065, 0.202, 0.013, 0.027, 0.052, 0.157, 0.003, + 0.032, 0.08, 0.041, 0.09, 0.092, 0.03, 0.005, 0.117, 0.072, 0.076, 0.073, 0.015, 0.012, 0.004, 0.024, 0.01, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.356, 0.846, 2.179, 0.887, 0.116, 0.285, 0.312, 0.236, 2.316, 0.007, + 0.004, 2.565, 0.266, 0.252, 0.05, 0.215, 0.187, 0.062, 0.078, 1.679, 0.285, 0.024, 0.005, 0.016, 0.067, 0.046, + 0.237, 0.053, 0.116, 0.054, 0.059, 0.117, 0.058, 0.115, 0.145, 0.033, 0.102, 0.049, 0.064, 0.062, 0.066, 0.006, + 0.001, 0.056, 0.003, 0.041, 0.007, 0.023, 2.651, 0.259, 1.194, 0.797, 1.113, 1.956, 0.572, 0.253, 2.277, 2.969, + 1.78, 2.755, 1.532, 2.591, 1.704, 0.818, 0.0001, 0.0001, 0.138, 0.095, 0.012, 0.006, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.001, 0.011, 0.0001, 0.008, 0.006, 24.363, 12.5, 0.002, 4.142, 0.0001, 0.0001, 0.0001, 0.001, + 0.015, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.004, 0.341, 0.005, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ms": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.423, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.116, 0.004, 0.276, 0.001, 0.003, 0.028, 0.005, 0.04, 0.153, 0.154, 0.011, + 0.002, 0.825, 0.313, 0.841, 0.02, 0.335, 0.324, 0.225, 0.11, 0.099, 0.112, 0.094, 0.087, 0.096, 0.171, 0.041, + 0.019, 0.01, 0.005, 0.01, 0.002, 0.001, 0.327, 0.313, 0.169, 0.197, 0.08, 0.09, 0.097, 0.122, 0.22, 0.145, + 0.326, 0.158, 0.369, 0.143, 0.065, 0.427, 0.013, 0.147, 0.487, 0.268, 0.071, 0.05, 0.063, 0.007, 0.038, 0.022, + 0.015, 0.0001, 0.015, 0.0001, 0.002, 0.0001, 15.253, 2.008, 0.502, 3.234, 6.807, 0.209, 2.704, 2.141, 5.701, + 0.605, 3.195, 3.049, 3.025, 7.562, 1.688, 2.054, 0.019, 4.172, 2.861, 3.513, 3.855, 0.159, 0.407, 0.024, 1.19, + 0.123, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.025, 0.005, 0.003, 0.004, 0.003, 0.002, 0.002, 0.004, 0.003, + 0.002, 0.002, 0.001, 0.002, 0.007, 0.004, 0.002, 0.001, 0.002, 0.001, 0.009, 0.003, 0.001, 0.001, 0.001, 0.002, + 0.01, 0.001, 0.003, 0.004, 0.004, 0.001, 0.007, 0.031, 0.013, 0.003, 0.003, 0.003, 0.002, 0.001, 0.006, 0.007, + 0.017, 0.002, 0.003, 0.001, 0.007, 0.002, 0.002, 0.004, 0.011, 0.003, 0.006, 0.005, 0.001, 0.006, 0.001, 0.004, + 0.002, 0.003, 0.002, 0.008, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.034, 0.074, 0.022, 0.02, 0.0001, 0.0001, + 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.012, 0.015, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.024, 0.004, 0.001, + 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "mt": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.717, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.569, 0.003, 0.319, 0.001, 0.001, 0.009, 0.001, 0.699, 0.116, 0.117, 0.001, + 0.002, 0.868, 2.789, 0.736, 0.014, 0.299, 0.341, 0.218, 0.093, 0.081, 0.087, 0.085, 0.082, 0.1, 0.201, 0.053, + 0.022, 0.013, 0.012, 0.013, 0.002, 0.0001, 0.223, 0.171, 0.118, 0.162, 0.107, 0.236, 0.127, 0.076, 0.3, 0.048, + 0.158, 0.199, 0.315, 0.08, 0.056, 0.187, 0.018, 0.103, 0.221, 0.127, 0.065, 0.054, 0.053, 0.02, 0.007, 0.009, + 0.022, 0.0001, 0.023, 0.0001, 0.008, 0.002, 9.087, 1.533, 0.244, 1.812, 5.201, 1.498, 1.212, 0.809, 8.439, 2.13, + 1.92, 5.784, 2.557, 4.221, 2.69, 1.16, 0.488, 3.837, 2.631, 5.521, 3.106, 0.451, 1.062, 0.484, 0.085, 0.753, + 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.211, 0.004, 0.004, 0.002, 0.003, 0.001, 0.001, 0.004, 0.002, 0.001, + 0.016, 0.407, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.042, 0.003, 0.001, 0.001, 0.001, 0.005, 0.141, + 0.001, 0.001, 0.01, 0.01, 0.001, 0.002, 0.13, 0.527, 0.002, 0.004, 0.002, 0.001, 0.025, 1.521, 0.007, 0.014, + 0.001, 0.004, 0.005, 0.008, 0.001, 0.001, 0.004, 0.005, 0.009, 0.004, 0.002, 0.002, 0.003, 0.001, 0.003, 0.01, + 0.003, 0.015, 0.566, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.015, 0.129, 2.554, 0.578, 0.0001, 0.0001, 0.002, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.011, 0.005, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.004, + 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.212, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "mus": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.612, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 19.388, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 1.02, 0.0001, 1.02, 1.02, + 0.0001, 2.041, 1.02, 0.0001, 1.02, 1.02, 4.082, 1.02, 1.02, 2.041, 0.0001, 1.02, 1.02, 1.02, 1.02, 1.02, 1.02, + 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.061, 0.0001, 0.0001, 0.0001, 5.102, + 0.0001, 1.02, 0.0001, 1.02, 0.0001, 5.102, 0.0001, 1.02, 1.02, 2.041, 0.0001, 0.0001, 0.0001, 2.041, 0.0001, + 0.0001, 2.041, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "my": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.476, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 2.676, 0.0001, 0.018, 0.0001, 0.0001, 0.001, 0.0001, 0.009, 0.072, 0.072, + 0.0001, 0.001, 0.013, 0.027, 0.014, 0.004, 0.007, 0.006, 0.005, 0.003, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, + 0.002, 0.001, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.009, 0.007, 0.011, 0.006, 0.004, 0.004, 0.005, 0.004, + 0.006, 0.002, 0.003, 0.004, 0.008, 0.005, 0.004, 0.007, 0.0001, 0.005, 0.011, 0.008, 0.003, 0.002, 0.003, + 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.087, 0.015, 0.033, 0.032, 0.11, 0.015, + 0.02, 0.035, 0.072, 0.001, 0.01, 0.046, 0.027, 0.071, 0.073, 0.021, 0.001, 0.069, 0.054, 0.072, 0.03, 0.01, + 0.011, 0.003, 0.016, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 32.171, 1.737, 0.141, 0.03, 1.382, 0.783, + 0.273, 0.069, 0.03, 0.083, 0.874, 0.307, 0.061, 0.061, 0.009, 0.119, 1.037, 0.261, 0.115, 0.031, 0.966, 0.888, + 0.304, 0.058, 0.131, 1.12, 0.266, 0.843, 0.619, 0.172, 1.057, 0.095, 0.006, 0.703, 0.001, 0.001, 0.009, 0.019, + 0.041, 0.006, 0.0001, 0.005, 0.0001, 0.239, 1.811, 1.255, 0.357, 1.497, 0.246, 1.317, 0.249, 0.0001, 0.0001, + 0.0001, 0.294, 0.751, 1.889, 0.152, 3.975, 0.6, 0.881, 0.616, 0.651, 0.004, 0.0001, 0.0001, 0.003, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 31.801, 0.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001 + ], + "myv": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.363, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.917, 0.015, 0.248, 0.0001, 0.0001, 0.022, 0.0001, 0.001, 0.283, 0.286, 0.002, + 0.004, 0.691, 0.215, 0.812, 0.009, 0.174, 0.262, 0.16, 0.093, 0.073, 0.077, 0.073, 0.069, 0.078, 0.133, 0.142, + 0.014, 0.011, 0.005, 0.01, 0.008, 0.0001, 0.003, 0.002, 0.005, 0.001, 0.001, 0.002, 0.001, 0.001, 0.012, 0.001, + 0.001, 0.002, 0.003, 0.001, 0.001, 0.004, 0.0001, 0.002, 0.003, 0.002, 0.001, 0.004, 0.001, 0.007, 0.0001, + 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.003, 0.048, 0.012, 0.02, 0.007, 0.038, 0.002, 0.005, 0.006, + 0.024, 0.002, 0.008, 0.023, 0.008, 0.017, 0.019, 0.008, 0.0001, 0.032, 0.018, 0.013, 0.014, 0.004, 0.001, 0.001, + 0.004, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 2.092, 2.863, 2.802, 0.895, 0.06, 0.084, 0.303, 0.361, + 0.574, 0.012, 0.006, 0.456, 2.653, 0.734, 0.106, 1.014, 0.129, 0.284, 0.186, 0.058, 0.27, 0.019, 0.007, 0.024, + 0.083, 0.006, 0.182, 0.079, 0.175, 0.059, 0.072, 0.148, 0.231, 0.176, 0.101, 0.047, 0.012, 0.013, 0.018, 0.046, + 0.024, 0.001, 0.0001, 0.091, 0.002, 0.065, 0.014, 0.024, 3.393, 0.354, 1.588, 0.391, 1.0, 3.63, 0.2, 0.667, + 2.033, 0.447, 2.062, 1.616, 1.324, 3.27, 3.572, 0.635, 0.0001, 0.0001, 0.332, 0.006, 0.003, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.0001, 0.001, 0.001, 27.959, 14.855, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.281, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.032, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "mzn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.201, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.629, 0.002, 0.049, 0.0001, 0.0001, 0.001, 0.004, 0.002, 0.134, 0.134, 0.0001, + 0.0001, 0.026, 0.054, 0.593, 0.02, 0.019, 0.017, 0.017, 0.008, 0.004, 0.006, 0.012, 0.005, 0.01, 0.015, 0.042, + 0.0001, 0.001, 0.014, 0.001, 0.004, 0.0001, 0.004, 0.003, 0.005, 0.003, 0.006, 0.016, 0.002, 0.002, 0.003, + 0.001, 0.001, 0.009, 0.006, 0.002, 0.001, 0.004, 0.0001, 0.003, 0.005, 0.007, 0.001, 0.001, 0.01, 0.0001, 0.001, + 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.009, 0.0001, 0.072, 0.016, 0.031, 0.045, 0.106, 0.011, 0.011, 0.023, + 0.094, 0.004, 0.019, 0.044, 0.012, 0.044, 0.054, 0.042, 0.001, 0.056, 0.056, 0.055, 0.021, 0.007, 0.011, 0.005, + 0.015, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.44, 0.427, 0.449, 0.013, 1.516, 2.042, 3.291, 3.912, + 3.162, 0.001, 0.032, 0.014, 4.412, 0.002, 0.195, 0.007, 0.446, 0.17, 0.001, 0.002, 0.012, 0.004, 0.0001, 0.001, + 0.045, 0.005, 0.0001, 0.006, 0.001, 0.0001, 0.0001, 0.003, 0.003, 0.013, 0.18, 0.011, 0.008, 0.001, 0.211, + 5.124, 1.425, 1.013, 2.263, 0.078, 0.559, 0.214, 0.344, 2.205, 0.318, 3.605, 0.725, 1.866, 1.033, 0.295, 0.164, + 0.271, 0.156, 0.676, 0.058, 0.031, 0.001, 0.001, 0.258, 0.0001, 0.0001, 0.0001, 0.056, 0.008, 0.001, 0.002, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.009, 0.003, 0.0001, 0.003, + 0.0001, 0.001, 0.001, 0.002, 19.953, 15.923, 1.548, 5.327, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.427, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "na": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.998, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.709, 0.015, 0.646, 0.0001, 0.002, 0.0001, 0.004, 0.021, 0.659, 0.659, 0.017, + 0.002, 0.883, 0.333, 1.719, 0.03, 1.451, 2.231, 1.063, 0.565, 0.61, 0.611, 0.586, 0.586, 0.597, 1.829, 0.199, + 0.094, 0.009, 0.006, 0.009, 0.002, 0.0001, 0.49, 0.423, 0.263, 0.348, 0.486, 0.143, 0.225, 0.131, 0.617, 0.095, + 0.263, 0.178, 0.552, 0.272, 0.136, 0.483, 0.013, 0.313, 0.36, 0.336, 0.074, 0.114, 0.249, 0.018, 0.046, 0.052, + 0.006, 0.0001, 0.007, 0.0001, 0.006, 0.0001, 7.914, 1.267, 0.542, 1.393, 6.136, 0.161, 1.565, 0.525, 5.317, + 0.298, 1.632, 1.173, 1.479, 6.133, 5.204, 0.602, 0.04, 3.812, 1.491, 2.75, 1.848, 0.267, 2.105, 0.037, 0.79, + 0.308, 0.0001, 0.0001, 0.0001, 0.013, 0.0001, 0.299, 0.053, 0.064, 0.017, 0.038, 0.029, 0.014, 0.008, 0.026, + 0.003, 0.007, 0.007, 0.016, 0.016, 0.006, 0.008, 0.013, 0.032, 0.004, 0.043, 0.108, 0.002, 0.004, 0.01, 0.017, + 0.017, 0.017, 0.015, 0.011, 0.008, 0.009, 0.017, 0.085, 0.124, 0.117, 0.04, 0.025, 0.023, 0.025, 0.032, 0.017, + 0.097, 0.007, 0.031, 0.013, 0.031, 0.009, 0.016, 0.079, 0.095, 0.056, 0.083, 0.021, 0.063, 0.052, 0.013, 0.046, + 0.015, 0.047, 0.045, 0.034, 0.035, 0.045, 0.013, 0.0001, 0.0001, 0.04, 0.466, 0.079, 0.167, 0.001, 0.002, + 0.0001, 0.023, 0.01, 0.013, 0.002, 0.001, 0.027, 0.006, 0.292, 0.12, 0.0001, 0.0001, 0.009, 0.199, 0.04, 0.007, + 0.055, 0.037, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.021, 0.074, 0.244, 0.0001, 0.005, 0.01, 0.006, + 0.001, 0.002, 0.006, 0.003, 0.003, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "nah": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.08, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.795, 0.004, 0.316, 0.0001, 0.0001, 0.001, 0.0001, 0.011, 0.502, 0.505, 0.006, + 0.329, 1.148, 0.317, 0.599, 1.663, 0.178, 0.339, 0.18, 0.099, 0.094, 0.088, 0.135, 0.085, 0.092, 0.204, 0.686, + 0.012, 0.001, 0.002, 0.002, 0.012, 0.0001, 0.583, 0.136, 0.486, 0.282, 0.369, 0.108, 0.135, 0.149, 0.382, 0.043, + 0.01, 0.153, 0.41, 0.267, 0.154, 0.356, 0.041, 0.209, 0.348, 0.531, 0.077, 0.099, 0.006, 0.046, 0.078, 0.021, + 0.306, 0.0001, 0.304, 0.0001, 0.018, 0.0001, 8.12, 0.52, 3.826, 1.716, 6.024, 0.239, 0.598, 2.703, 7.016, 0.169, + 0.062, 5.071, 1.759, 4.856, 5.013, 1.61, 0.66, 3.183, 2.38, 4.798, 3.279, 0.368, 0.013, 0.578, 0.571, 0.892, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.023, 0.52, 0.003, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.007, + 0.001, 0.001, 0.005, 0.446, 0.001, 0.001, 0.001, 0.002, 0.001, 0.26, 0.002, 0.003, 0.001, 0.001, 0.001, 0.002, + 0.003, 0.001, 0.002, 0.001, 0.001, 0.001, 0.003, 0.117, 0.005, 0.001, 0.004, 0.001, 0.001, 0.002, 0.003, 0.168, + 0.013, 0.475, 0.001, 0.136, 0.018, 0.008, 0.004, 0.071, 0.003, 0.269, 0.002, 0.003, 0.001, 0.001, 0.003, 0.002, + 0.068, 0.005, 0.005, 0.002, 0.003, 0.016, 0.0001, 0.0001, 0.033, 0.838, 1.259, 0.446, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.009, 0.004, 0.012, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, + 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.027, 0.002, 0.008, 0.004, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "nap": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.664, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.609, 0.012, 0.443, 0.0001, 0.0001, 0.005, 0.002, 3.603, 0.188, 0.187, 0.001, + 0.001, 0.851, 0.111, 0.916, 0.025, 0.289, 0.464, 0.288, 0.212, 0.187, 0.195, 0.184, 0.177, 0.191, 0.229, 0.063, + 0.027, 0.064, 0.004, 0.064, 0.004, 0.0001, 0.359, 0.17, 0.431, 0.088, 0.101, 0.128, 0.139, 0.019, 0.153, 0.024, + 0.014, 0.18, 0.269, 0.172, 0.129, 0.252, 0.015, 0.136, 0.331, 0.141, 0.042, 0.154, 0.012, 0.021, 0.004, 0.014, + 0.007, 0.0001, 0.007, 0.0001, 0.001, 0.0001, 8.472, 0.677, 3.575, 1.818, 8.836, 0.628, 1.161, 0.605, 5.326, + 0.294, 0.072, 2.854, 1.959, 5.855, 5.118, 1.978, 0.107, 4.154, 2.774, 4.302, 3.256, 1.068, 0.047, 0.011, 0.049, + 0.778, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.167, 0.005, 0.004, 0.005, 0.003, 0.002, 0.001, 0.001, 0.017, + 0.002, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.003, 0.001, 0.001, 0.008, 0.005, 0.001, 0.001, 0.001, 0.033, + 0.118, 0.001, 0.001, 0.005, 0.005, 0.001, 0.002, 0.266, 0.085, 0.051, 0.002, 0.003, 0.001, 0.003, 0.003, 0.62, + 0.161, 0.023, 0.139, 0.069, 0.03, 0.001, 0.002, 0.025, 0.004, 0.164, 0.026, 0.08, 0.002, 0.003, 0.002, 0.002, + 0.107, 0.016, 0.007, 0.005, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.057, 1.779, 0.007, 0.055, 0.0001, 0.001, + 0.0001, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.013, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, + 0.002, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.165, 0.003, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "nds": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.919, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.282, 0.001, 0.235, 0.0001, 0.0001, 0.09, 0.002, 0.046, 0.155, 0.155, 0.017, + 0.001, 0.777, 0.214, 1.137, 0.014, 0.414, 0.571, 0.279, 0.157, 0.152, 0.165, 0.151, 0.162, 0.212, 0.299, 0.042, + 0.019, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.383, 0.397, 0.141, 0.527, 0.184, 0.228, 0.238, 0.278, 0.228, 0.153, + 0.317, 0.238, 0.331, 0.224, 0.164, 0.212, 0.007, 0.201, 0.654, 0.206, 0.119, 0.194, 0.231, 0.003, 0.008, 0.039, + 0.011, 0.0001, 0.011, 0.0001, 0.001, 0.0001, 4.393, 1.051, 1.267, 3.394, 10.917, 0.767, 1.396, 2.581, 3.914, + 0.085, 1.325, 2.618, 1.593, 8.321, 3.314, 0.889, 0.009, 5.125, 3.768, 5.421, 2.363, 1.177, 0.929, 0.056, 0.171, + 0.239, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.454, 0.002, 0.002, 0.001, 0.006, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.023, 0.001, 0.0001, 0.022, 0.001, + 0.009, 0.334, 0.001, 0.001, 0.057, 0.001, 0.038, 0.018, 0.048, 0.004, 0.001, 0.001, 0.208, 0.002, 0.001, 0.001, + 0.002, 0.009, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.005, 0.002, 0.014, 0.003, 0.002, 0.002, 0.82, 0.001, + 0.004, 0.001, 0.001, 0.001, 0.763, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.055, 1.884, 0.003, 0.003, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.007, 0.003, 0.008, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.454, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "ne": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.49, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.629, 0.002, 0.033, 0.0001, 0.0001, 0.006, 0.0001, 0.018, 0.053, 0.057, 0.0001, + 0.001, 0.2, 0.042, 0.073, 0.008, 0.003, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.015, + 0.002, 0.005, 0.002, 0.006, 0.002, 0.0001, 0.004, 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.003, 0.001, + 0.001, 0.002, 0.002, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.056, 0.012, 0.021, 0.02, 0.066, 0.011, 0.012, 0.023, + 0.048, 0.001, 0.005, 0.027, 0.017, 0.042, 0.043, 0.015, 0.001, 0.044, 0.036, 0.045, 0.017, 0.005, 0.008, 0.001, + 0.01, 0.001, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.608, 0.76, 0.405, 0.065, 0.0001, 0.231, 0.124, 1.05, + 0.333, 0.225, 0.003, 1.089, 0.054, 2.553, 0.0001, 0.268, 0.005, 0.0001, 0.0001, 0.016, 0.009, 1.681, 0.188, + 0.574, 0.05, 0.059, 0.235, 0.302, 0.411, 0.024, 0.038, 0.296, 0.063, 0.16, 0.029, 0.16, 24.986, 7.481, 0.637, + 0.298, 1.766, 0.034, 0.895, 0.142, 0.406, 0.37, 1.169, 0.857, 2.172, 0.0001, 1.023, 0.0001, 0.0001, 0.652, + 0.263, 0.209, 1.099, 0.646, 0.0001, 0.0001, 0.001, 0.001, 3.096, 1.51, 0.0001, 0.0001, 0.006, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.857, + 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "new": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.658, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.736, 0.0001, 0.005, 0.0001, 0.0001, 0.016, 0.0001, 0.016, 0.053, 0.053, + 0.0001, 0.0001, 0.168, 0.064, 0.05, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.014, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.001, 0.001, 0.002, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.045, 0.006, 0.015, 0.015, 0.048, 0.008, + 0.009, 0.021, 0.034, 0.001, 0.003, 0.019, 0.011, 0.032, 0.03, 0.01, 0.0001, 0.03, 0.026, 0.034, 0.014, 0.004, + 0.005, 0.001, 0.007, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.748, 1.473, 1.078, 0.313, 0.0001, 0.165, + 0.087, 0.934, 0.049, 0.145, 0.004, 0.213, 0.295, 3.035, 0.001, 0.021, 0.01, 0.0001, 0.001, 0.003, 0.002, 0.891, + 0.378, 1.026, 0.007, 0.007, 0.145, 0.227, 0.557, 0.002, 0.008, 0.138, 0.03, 0.275, 0.076, 0.203, 24.519, 8.651, + 0.655, 0.317, 1.238, 0.066, 0.765, 0.114, 0.288, 0.474, 0.695, 2.038, 1.25, 0.006, 0.967, 0.005, 0.016, 1.209, + 0.15, 0.223, 0.893, 0.295, 0.0001, 0.001, 0.016, 0.0001, 3.268, 1.125, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.648, + 0.0001, 0.246, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "ng": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.332, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.852, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.028, + 0.0001, 0.0001, 0.569, 0.014, 0.833, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.042, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.291, 0.028, 0.014, 0.069, 0.125, + 0.0001, 0.194, 0.153, 0.5, 0.042, 0.069, 0.0001, 0.056, 0.153, 0.402, 0.083, 0.0001, 0.0001, 0.014, 0.18, 0.222, + 0.0001, 0.222, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.728, 1.221, 0.236, + 1.443, 7.106, 0.347, 2.859, 3.65, 4.136, 0.125, 4.316, 3.539, 3.983, 7.412, 7.883, 1.596, 0.0001, 1.138, 1.901, + 3.511, 6.62, 0.402, 2.776, 0.0001, 2.11, 0.194, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.014, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.056, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.056, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "nov": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.223, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.739, 0.005, 0.371, 0.0001, 0.0001, 0.004, 0.0001, 0.014, 0.258, 0.258, 0.003, + 0.008, 0.827, 0.256, 1.132, 0.016, 0.643, 0.521, 0.435, 0.122, 0.19, 0.117, 0.125, 0.112, 0.14, 0.247, 0.122, + 0.023, 0.02, 0.012, 0.021, 0.004, 0.0001, 0.495, 0.126, 0.101, 0.11, 0.205, 0.084, 0.113, 0.079, 0.113, 0.072, + 0.274, 0.517, 0.205, 0.19, 0.072, 0.148, 0.01, 0.107, 0.475, 0.124, 0.103, 0.078, 0.049, 0.006, 0.028, 0.032, + 0.002, 0.0001, 0.003, 0.0001, 0.002, 0.0001, 6.407, 1.088, 0.275, 3.233, 10.596, 0.875, 0.958, 0.605, 7.974, + 0.212, 2.738, 4.237, 2.737, 5.182, 4.585, 1.557, 0.08, 4.568, 4.834, 4.299, 2.875, 0.823, 0.156, 0.296, 0.238, + 0.085, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.026, 0.009, 0.01, 0.005, 0.006, 0.003, 0.001, 0.003, 0.003, 0.003, + 0.001, 0.001, 0.003, 0.004, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.016, 0.003, 0.003, 0.001, 0.001, 0.001, + 0.007, 0.002, 0.003, 0.003, 0.007, 0.001, 0.0001, 0.012, 0.008, 0.002, 0.005, 0.005, 0.002, 0.003, 0.003, 0.008, + 0.015, 0.002, 0.001, 0.004, 0.007, 0.004, 0.004, 0.003, 0.005, 0.01, 0.013, 0.003, 0.002, 0.006, 0.004, 0.012, + 0.004, 0.008, 0.008, 0.012, 0.008, 0.004, 0.006, 0.0001, 0.0001, 0.013, 0.071, 0.012, 0.013, 0.001, 0.0001, + 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.04, 0.019, 0.02, 0.007, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.008, 0.025, 0.004, 0.0001, + 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "nrm": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.521, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.376, 0.004, 0.467, 0.0001, 0.0001, 0.003, 0.0001, 1.947, 0.163, 0.162, + 0.0001, 0.0001, 0.761, 0.157, 0.914, 0.012, 1.102, 1.934, 0.564, 0.483, 0.476, 0.487, 0.557, 0.61, 0.644, 0.66, + 0.069, 0.027, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.78, 0.094, 0.435, 0.253, 0.108, 0.06, 0.094, 0.042, 0.231, + 0.101, 0.009, 0.332, 0.216, 0.104, 0.043, 0.114, 0.015, 0.096, 0.165, 0.06, 0.048, 0.107, 0.012, 0.147, 0.029, + 0.002, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 4.848, 0.485, 1.639, 2.302, 7.56, 0.544, 0.696, 1.469, + 3.879, 0.15, 0.04, 3.065, 1.372, 5.618, 3.164, 1.345, 0.499, 2.846, 4.958, 4.48, 3.809, 0.712, 0.015, 0.135, + 0.467, 0.062, 0.0001, 1.427, 0.0001, 0.0001, 0.0001, 0.085, 0.003, 0.016, 0.002, 0.004, 0.002, 0.001, 0.0001, + 0.002, 0.014, 0.026, 0.0001, 0.001, 0.001, 0.016, 0.0001, 0.001, 0.001, 0.001, 0.016, 0.002, 0.001, 0.0001, + 0.0001, 0.002, 0.06, 0.0001, 0.023, 0.002, 0.001, 0.0001, 0.001, 0.219, 0.004, 0.233, 0.004, 0.005, 0.011, + 0.0001, 0.016, 0.454, 2.065, 0.259, 0.013, 0.002, 0.004, 0.368, 0.008, 0.001, 0.008, 0.002, 0.004, 0.081, 0.004, + 0.002, 0.012, 0.002, 0.151, 0.004, 0.112, 0.003, 0.005, 0.001, 0.003, 0.0001, 0.0001, 0.015, 4.079, 0.017, + 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.029, 0.013, 0.005, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.077, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "nso": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.78, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.755, 0.002, 0.038, 0.001, 0.0001, 0.004, 0.0001, 0.009, 0.457, 0.457, 0.0001, + 0.0001, 0.676, 0.052, 0.694, 0.005, 0.466, 0.863, 0.377, 0.269, 0.237, 0.244, 0.243, 0.245, 0.241, 0.264, 0.019, + 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.278, 0.349, 0.291, 0.135, 0.079, 0.05, 0.105, 0.055, 0.212, + 0.029, 0.164, 0.314, 0.912, 0.402, 0.025, 0.107, 0.005, 0.046, 0.407, 0.145, 0.02, 0.095, 0.034, 0.21, 0.005, + 0.034, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 11.556, 1.304, 0.158, 0.76, 9.745, 0.742, 5.815, 1.511, + 2.097, 0.062, 3.221, 3.795, 3.273, 4.341, 8.239, 1.391, 0.015, 2.291, 2.998, 2.898, 0.946, 0.091, 3.286, 0.014, + 0.713, 0.058, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.019, 0.718, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.045, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.083, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.005, 0.134, 0.0001, 0.733, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "nv": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.509, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.471, 0.0001, 0.553, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.132, 0.131, + 0.0001, 0.0001, 0.333, 0.05, 0.853, 0.008, 0.262, 0.198, 0.155, 0.093, 0.082, 0.107, 0.089, 0.066, 0.073, 0.069, + 0.012, 0.267, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.105, 0.358, 0.12, 0.313, 0.022, 0.005, 0.023, 0.24, + 0.014, 0.023, 0.045, 0.016, 0.036, 0.298, 0.014, 0.019, 0.001, 0.01, 0.1, 0.28, 0.004, 0.005, 0.04, 0.001, + 0.048, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 5.817, 1.241, 0.605, 3.905, 1.9, 0.016, 1.415, + 4.266, 6.018, 0.364, 1.038, 1.394, 0.149, 2.559, 2.764, 0.063, 0.003, 0.149, 2.248, 2.042, 0.092, 0.019, 0.145, + 0.037, 1.033, 1.245, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.08, 1.403, 1.567, 0.013, 0.082, 1.105, 0.0001, + 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.067, 0.008, + 0.0001, 0.0001, 0.0001, 0.0001, 0.294, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 2.758, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 2.445, 0.0001, 0.311, 0.0001, 4.591, 0.0001, 0.504, 0.001, 0.001, + 0.001, 2.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.013, 4.172, 0.001, 0.0001, 0.013, 0.0001, + 0.0001, 0.002, 11.893, 1.899, 1.744, 0.0001, 0.311, 0.0001, 0.0001, 4.171, 0.0001, 1.234, 0.0001, 0.002, 0.003, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.08, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ny": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.625, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.431, 0.001, 0.161, 0.0001, 0.001, 0.013, 0.004, 0.199, 0.151, 0.149, 0.001, + 0.0001, 0.726, 0.052, 1.005, 0.011, 0.425, 0.321, 0.242, 0.114, 0.121, 0.146, 0.109, 0.097, 0.1, 0.188, 0.119, + 0.008, 0.003, 0.006, 0.003, 0.001, 0.0001, 0.324, 0.194, 0.362, 0.113, 0.083, 0.06, 0.055, 0.057, 0.099, 0.059, + 0.134, 0.101, 0.607, 0.172, 0.041, 0.204, 0.005, 0.064, 0.151, 0.1, 0.088, 0.025, 0.048, 0.003, 0.047, 0.083, + 0.018, 0.0001, 0.019, 0.0001, 0.0001, 0.003, 13.746, 1.132, 1.623, 2.856, 4.347, 0.427, 1.15, 2.997, 7.993, + 0.223, 3.837, 3.15, 3.985, 6.204, 4.4, 1.606, 0.018, 2.007, 1.898, 3.156, 4.108, 0.173, 2.53, 0.014, 1.184, + 1.868, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.066, 0.003, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.0001, + 0.004, 0.05, 0.0001, 0.0001, 0.006, 0.005, 0.001, 0.001, 0.013, 0.003, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 0.013, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.004, 0.001, 0.006, 0.001, 0.06, 0.0001, + 0.011, 0.002, 0.003, 0.003, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.023, 0.029, 0.004, 0.064, + 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.009, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.066, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "oc": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.196, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.065, 0.002, 0.316, 0.046, 0.0001, 0.007, 0.001, 0.708, 0.193, 0.193, 0.002, + 0.001, 0.913, 0.337, 0.785, 0.01, 0.177, 0.339, 0.143, 0.091, 0.092, 0.097, 0.087, 0.093, 0.11, 0.155, 0.065, + 0.02, 0.037, 0.032, 0.038, 0.002, 0.0001, 0.316, 0.163, 0.28, 0.118, 0.18, 0.101, 0.108, 0.046, 0.126, 0.059, + 0.019, 0.366, 0.206, 0.087, 0.061, 0.2, 0.02, 0.116, 0.247, 0.092, 0.045, 0.108, 0.016, 0.03, 0.009, 0.007, + 0.013, 0.0001, 0.013, 0.0001, 0.002, 0.0001, 9.22, 0.793, 2.634, 3.53, 8.653, 0.714, 1.084, 0.594, 5.176, 0.154, + 0.069, 4.196, 2.017, 5.599, 4.023, 1.809, 0.517, 4.973, 5.482, 4.438, 3.287, 0.768, 0.022, 0.148, 0.146, 0.139, + 0.0001, 0.011, 0.002, 0.002, 0.0001, 0.071, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.007, 0.009, + 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.001, 0.006, 0.007, 0.005, 0.001, 0.0001, 0.0001, 0.001, + 0.051, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.145, 0.074, 0.024, 0.002, 0.002, 0.001, 0.002, 0.134, + 0.929, 0.452, 0.016, 0.026, 0.001, 0.096, 0.005, 0.03, 0.005, 0.004, 0.448, 0.027, 0.01, 0.002, 0.002, 0.002, + 0.002, 0.004, 0.011, 0.027, 0.011, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.068, 2.417, 0.003, 0.007, 0.0001, + 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.008, 0.004, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.067, 0.001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "olo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.555, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.165, 0.001, 0.091, 0.0001, 0.0001, 0.009, 0.001, 0.061, 0.221, 0.221, 0.0001, + 0.001, 0.891, 0.306, 1.442, 0.031, 0.305, 0.513, 0.256, 0.174, 0.154, 0.153, 0.124, 0.134, 0.157, 0.296, 0.102, + 0.011, 0.01, 0.003, 0.01, 0.002, 0.001, 0.151, 0.077, 0.024, 0.041, 0.069, 0.036, 0.06, 0.101, 0.085, 0.112, + 0.389, 0.128, 0.177, 0.115, 0.068, 0.258, 0.001, 0.092, 0.352, 0.141, 0.032, 0.27, 0.012, 0.021, 0.024, 0.01, + 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.005, 7.441, 0.351, 0.076, 1.841, 5.414, 0.122, 0.914, 2.187, 8.145, + 1.143, 3.3, 4.3, 1.89, 6.075, 4.589, 1.29, 0.001, 2.71, 3.519, 3.872, 5.598, 2.436, 0.016, 0.008, 1.054, 0.985, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.389, 0.086, 0.073, 0.032, 0.01, 0.011, 0.006, 0.01, 0.008, 0.001, + 0.002, 0.006, 0.036, 0.349, 0.005, 0.017, 0.009, 0.004, 0.01, 0.105, 0.013, 0.002, 0.002, 0.002, 0.005, 0.148, + 0.017, 0.006, 0.011, 0.056, 0.001, 0.018, 0.051, 0.118, 0.003, 0.002, 1.86, 0.003, 0.001, 0.007, 0.003, 0.003, + 0.001, 0.01, 0.001, 0.003, 0.001, 0.002, 0.143, 0.012, 0.077, 0.019, 0.054, 0.096, 0.298, 0.031, 0.077, 0.038, + 0.064, 0.07, 0.021, 0.096, 0.259, 0.018, 0.0001, 0.0001, 0.075, 2.173, 0.359, 0.275, 0.0001, 0.0001, 0.0001, + 0.003, 0.001, 0.002, 0.001, 0.0001, 0.01, 0.006, 0.977, 0.34, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, + 0.008, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.004, 0.001, 0.32, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "om": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.856, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.47, 0.007, 0.135, 0.001, 0.001, 0.02, 0.001, 0.415, 0.149, 0.148, 0.003, + 0.001, 0.598, 0.088, 0.774, 0.024, 0.177, 0.196, 0.107, 0.055, 0.058, 0.069, 0.055, 0.055, 0.062, 0.111, 0.03, + 0.031, 0.014, 0.003, 0.015, 0.004, 0.0001, 0.377, 0.227, 0.059, 0.14, 0.066, 0.078, 0.179, 0.124, 0.131, 0.063, + 0.149, 0.064, 0.172, 0.076, 0.188, 0.061, 0.049, 0.057, 0.159, 0.099, 0.042, 0.016, 0.108, 0.015, 0.076, 0.01, + 0.011, 0.0001, 0.011, 0.0001, 0.003, 0.13, 18.959, 2.318, 0.672, 2.536, 5.221, 1.607, 1.449, 2.234, 8.071, + 0.935, 2.586, 2.201, 2.811, 5.266, 4.391, 0.29, 0.68, 3.658, 3.072, 4.065, 4.017, 0.087, 0.574, 0.143, 1.425, + 0.099, 0.01, 0.001, 0.01, 0.0001, 0.0001, 0.186, 0.003, 0.002, 0.003, 0.006, 0.002, 0.002, 0.001, 0.004, 0.002, + 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.007, + 0.12, 0.0001, 0.0001, 0.011, 0.011, 0.005, 0.0001, 0.099, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.03, 0.008, + 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.001, 0.002, 0.003, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.001, + 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.105, 0.005, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.004, 0.001, 0.002, 0.0001, 0.0001, 0.007, 0.004, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.024, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.191, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "or": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.414, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.789, 0.001, 0.049, 0.0001, 0.0001, 0.027, 0.0001, 0.016, 0.066, 0.066, 0.001, + 0.0001, 0.194, 0.029, 0.065, 0.008, 0.012, 0.014, 0.009, 0.005, 0.004, 0.005, 0.004, 0.004, 0.004, 0.006, 0.014, + 0.004, 0.003, 0.001, 0.003, 0.0001, 0.0001, 0.006, 0.004, 0.006, 0.004, 0.003, 0.002, 0.002, 0.003, 0.007, + 0.001, 0.002, 0.003, 0.005, 0.003, 0.003, 0.005, 0.0001, 0.003, 0.007, 0.006, 0.001, 0.001, 0.001, 0.0001, + 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.081, 0.011, 0.027, 0.026, 0.08, 0.013, 0.015, + 0.029, 0.067, 0.002, 0.006, 0.037, 0.021, 0.058, 0.062, 0.019, 0.001, 0.059, 0.056, 0.058, 0.033, 0.007, 0.008, + 0.003, 0.014, 0.002, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.461, 0.87, 0.209, 0.086, 0.0001, 0.314, 0.231, + 1.688, 0.023, 0.138, 0.001, 0.379, 0.073, 2.56, 0.0001, 0.427, 0.002, 0.0001, 0.0001, 0.16, 0.011, 1.385, 0.13, + 0.389, 0.041, 0.233, 0.239, 0.105, 0.371, 0.014, 0.058, 0.871, 0.144, 0.225, 0.017, 0.346, 1.495, 0.883, 0.609, + 0.353, 1.21, 0.043, 0.827, 0.113, 24.372, 7.183, 0.945, 0.296, 2.678, 0.059, 0.571, 0.283, 0.0001, 0.05, 0.328, + 0.264, 0.929, 0.701, 0.0001, 0.0001, 0.094, 0.0001, 2.794, 2.229, 0.0001, 0.0001, 0.045, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.66, 0.0001, + 0.069, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "os": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.314, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.198, 0.001, 0.075, 0.0001, 0.0001, 0.009, 0.0001, 0.003, 0.221, 0.221, 0.0001, + 0.001, 0.656, 0.268, 0.647, 0.003, 0.149, 0.239, 0.119, 0.07, 0.068, 0.074, 0.065, 0.065, 0.08, 0.138, 0.043, + 0.023, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.003, 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.001, 0.024, 0.001, + 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.005, 0.002, 0.001, 0.007, 0.001, 0.014, 0.001, + 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.032, 0.005, 0.009, 0.008, 0.024, 0.004, 0.005, 0.006, + 0.02, 0.001, 0.005, 0.014, 0.008, 0.019, 0.019, 0.004, 0.0001, 0.021, 0.013, 0.014, 0.012, 0.003, 0.002, 0.001, + 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.723, 1.959, 2.433, 1.742, 0.485, 1.045, 0.733, 0.104, + 0.039, 0.003, 0.515, 3.703, 0.088, 0.047, 0.033, 0.054, 0.152, 0.11, 0.038, 0.09, 0.183, 0.021, 0.005, 0.03, + 0.137, 0.06, 0.132, 0.043, 0.092, 0.063, 0.026, 0.055, 0.062, 0.15, 0.074, 0.109, 0.063, 0.115, 4.882, 0.027, + 0.022, 0.001, 0.001, 0.076, 0.0001, 0.018, 0.005, 0.007, 3.663, 0.542, 0.469, 1.346, 2.223, 0.835, 0.243, 0.949, + 1.778, 1.262, 0.952, 1.134, 1.447, 2.532, 1.739, 0.347, 0.0001, 0.0001, 0.16, 4.829, 0.002, 0.001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.0001, 0.002, 0.001, 23.204, 15.519, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.01, 0.127, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "pa": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.424, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.354, 0.003, 0.052, 0.0001, 0.0001, 0.005, 0.0001, 0.026, 0.07, 0.07, 0.0001, + 0.001, 0.252, 0.083, 0.057, 0.008, 0.09, 0.134, 0.073, 0.034, 0.034, 0.037, 0.032, 0.033, 0.039, 0.073, 0.023, + 0.007, 0.005, 0.003, 0.005, 0.001, 0.0001, 0.004, 0.002, 0.004, 0.002, 0.003, 0.002, 0.002, 0.002, 0.006, 0.001, + 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.005, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.002, 0.003, 0.035, 0.006, 0.011, 0.011, 0.037, 0.006, 0.008, 0.011, + 0.028, 0.001, 0.004, 0.018, 0.013, 0.026, 0.027, 0.009, 0.001, 0.025, 0.019, 0.024, 0.012, 0.004, 0.004, 0.001, + 0.005, 0.001, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 1.534, 0.423, 1.17, 0.001, 0.001, 0.437, 0.548, 1.695, + 0.606, 0.237, 0.024, 0.573, 0.09, 0.23, 0.001, 0.065, 0.035, 0.0001, 0.001, 0.028, 0.011, 1.172, 0.229, 0.428, + 0.077, 0.013, 0.442, 0.041, 0.755, 0.032, 0.001, 0.286, 0.066, 0.192, 0.017, 0.267, 1.499, 0.487, 1.308, 0.154, + 24.532, 6.371, 0.647, 0.143, 0.447, 0.172, 0.696, 0.068, 2.373, 0.727, 0.943, 0.005, 0.001, 0.891, 0.001, 0.001, + 1.461, 1.12, 0.001, 0.001, 0.465, 0.001, 2.611, 1.487, 0.0001, 0.0001, 0.039, 0.002, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.008, 0.006, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 30.092, 0.001, 0.038, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "pag": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.03, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.592, 0.019, 0.241, 0.0001, 0.0001, 0.002, 0.0001, 0.022, 0.579, 0.579, 0.001, + 0.002, 1.012, 0.179, 1.28, 0.004, 0.607, 0.517, 0.439, 0.246, 0.233, 0.22, 0.206, 0.189, 0.188, 0.203, 0.287, + 0.029, 0.2, 0.003, 0.2, 0.007, 0.0001, 0.514, 0.233, 0.299, 0.377, 0.293, 0.091, 0.061, 0.039, 0.141, 0.067, + 0.298, 0.143, 0.228, 0.153, 0.107, 0.323, 0.017, 0.066, 0.835, 0.144, 0.158, 0.036, 0.141, 0.001, 0.016, 0.024, + 0.044, 0.0001, 0.045, 0.0001, 0.001, 0.0001, 14.553, 2.155, 0.612, 2.213, 4.092, 0.158, 2.144, 0.652, 5.448, + 0.026, 2.943, 4.371, 1.62, 6.468, 4.169, 1.489, 0.134, 1.92, 4.171, 4.111, 1.822, 0.133, 0.774, 0.019, 2.966, + 0.181, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.082, 0.003, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.005, 0.002, 0.0001, 0.001, 0.001, + 0.001, 0.048, 0.0001, 0.001, 0.01, 0.009, 0.0001, 0.0001, 0.004, 0.017, 0.0001, 0.001, 0.002, 0.001, 0.004, + 0.002, 0.001, 0.008, 0.001, 0.001, 0.001, 0.005, 0.0001, 0.001, 0.003, 0.012, 0.002, 0.005, 0.002, 0.001, 0.001, + 0.001, 0.004, 0.001, 0.005, 0.001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.004, 0.049, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.009, 0.003, 0.0001, 0.0001, + 0.0001, 0.002, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, + 0.075, 0.004, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "pam": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.69, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.089, 0.008, 0.379, 0.001, 0.002, 0.006, 0.002, 0.032, 0.278, 0.278, 0.002, + 0.002, 1.032, 0.272, 0.824, 0.024, 0.328, 0.294, 0.247, 0.119, 0.115, 0.114, 0.097, 0.092, 0.106, 0.173, 0.084, + 0.034, 0.037, 0.005, 0.037, 0.004, 0.0001, 0.446, 0.258, 0.283, 0.225, 0.147, 0.167, 0.119, 0.095, 0.427, 0.078, + 0.159, 0.17, 0.339, 0.137, 0.085, 0.26, 0.014, 0.119, 0.316, 0.173, 0.073, 0.129, 0.078, 0.01, 0.038, 0.027, + 0.056, 0.0001, 0.058, 0.0001, 0.003, 0.0001, 11.717, 1.42, 1.079, 1.934, 5.65, 0.412, 5.535, 0.984, 6.498, + 0.051, 2.215, 3.499, 2.546, 9.826, 2.443, 1.882, 0.041, 3.326, 2.846, 3.809, 3.421, 0.311, 0.524, 0.064, 1.429, + 0.196, 0.0001, 0.012, 0.001, 0.0001, 0.0001, 0.064, 0.007, 0.004, 0.005, 0.004, 0.002, 0.003, 0.002, 0.002, + 0.001, 0.001, 0.002, 0.002, 0.006, 0.001, 0.001, 0.002, 0.001, 0.002, 0.019, 0.004, 0.002, 0.002, 0.002, 0.003, + 0.009, 0.002, 0.002, 0.017, 0.008, 0.009, 0.013, 0.012, 0.022, 0.007, 0.002, 0.067, 0.005, 0.005, 0.005, 0.009, + 0.033, 0.004, 0.003, 0.003, 0.006, 0.006, 0.004, 0.01, 0.012, 0.01, 0.01, 0.006, 0.003, 0.032, 0.002, 0.004, + 0.003, 0.008, 0.007, 0.067, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.014, 0.263, 0.005, 0.006, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.008, 0.006, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.04, 0.011, 0.063, 0.0001, 0.001, + 0.004, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "pap": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.577, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 17.041, 0.006, 0.256, 0.002, 0.001, 0.008, 0.005, 0.088, 0.145, 0.144, 0.001, + 0.001, 0.829, 0.082, 0.948, 0.014, 0.296, 0.379, 0.247, 0.133, 0.132, 0.125, 0.108, 0.098, 0.111, 0.184, 0.198, + 0.046, 0.009, 0.003, 0.009, 0.012, 0.0001, 0.325, 0.157, 0.17, 0.173, 0.346, 0.09, 0.081, 0.124, 0.155, 0.09, + 0.129, 0.105, 0.233, 0.162, 0.14, 0.176, 0.005, 0.132, 0.285, 0.134, 0.07, 0.056, 0.051, 0.003, 0.069, 0.012, + 0.014, 0.0001, 0.014, 0.0001, 0.003, 0.0001, 10.584, 1.755, 0.96, 3.481, 6.611, 0.57, 0.793, 1.086, 6.922, + 0.094, 2.168, 2.197, 2.209, 6.462, 5.124, 1.889, 0.017, 4.387, 3.838, 4.459, 3.468, 0.348, 0.249, 0.043, 0.415, + 0.112, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.051, 0.006, 0.003, 0.006, 0.004, 0.001, 0.001, 0.002, 0.002, + 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.012, 0.002, 0.005, 0.003, 0.001, 0.001, 0.001, 0.006, + 0.016, 0.001, 0.001, 0.01, 0.01, 0.001, 0.001, 0.023, 0.288, 0.003, 0.003, 0.003, 0.001, 0.002, 0.007, 0.143, + 0.171, 0.002, 0.003, 0.001, 0.133, 0.0001, 0.002, 0.003, 0.162, 0.171, 0.076, 0.001, 0.002, 0.002, 0.001, 0.004, + 0.053, 0.027, 0.003, 0.086, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.023, 1.326, 0.004, 0.005, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.007, 0.004, 0.023, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.007, 0.048, 0.001, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "pcd": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.27, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.657, 0.008, 0.673, 0.0001, 0.0001, 0.003, 0.004, 1.579, 0.485, 0.482, 0.004, + 0.002, 0.764, 0.743, 0.844, 0.029, 0.205, 0.439, 0.185, 0.104, 0.105, 0.099, 0.112, 0.109, 0.159, 0.228, 0.141, + 0.017, 0.014, 0.103, 0.015, 0.005, 0.0001, 0.322, 0.315, 0.578, 0.163, 0.158, 0.188, 0.128, 0.139, 0.259, 0.095, + 0.035, 0.293, 0.23, 0.148, 0.082, 0.416, 0.024, 0.141, 0.362, 0.132, 0.056, 0.121, 0.049, 0.026, 0.011, 0.008, + 0.008, 0.0001, 0.009, 0.0001, 0.004, 0.004, 4.164, 0.548, 3.109, 2.876, 7.669, 0.633, 0.742, 2.062, 6.133, + 0.168, 0.261, 3.265, 1.584, 5.6, 3.825, 1.718, 0.299, 3.984, 4.345, 3.994, 3.516, 0.729, 0.062, 0.099, 0.331, + 0.121, 0.0001, 0.008, 0.001, 0.001, 0.0001, 0.34, 0.006, 0.009, 0.004, 0.003, 0.002, 0.003, 0.003, 0.01, 0.086, + 0.002, 0.001, 0.004, 0.005, 0.003, 0.002, 0.003, 0.002, 0.002, 0.018, 0.009, 0.001, 0.001, 0.002, 0.003, 0.283, + 0.001, 0.003, 0.003, 0.002, 0.001, 0.001, 0.283, 0.006, 0.038, 0.003, 0.005, 0.006, 0.003, 0.025, 0.548, 2.644, + 0.014, 0.04, 0.002, 0.005, 0.009, 0.049, 0.019, 0.006, 0.015, 0.007, 0.051, 0.004, 0.002, 0.022, 0.007, 0.018, + 0.005, 0.043, 0.008, 0.005, 0.004, 0.007, 0.0001, 0.0001, 0.109, 3.762, 0.007, 0.017, 0.0001, 0.0001, 0.0001, + 0.005, 0.002, 0.003, 0.0001, 0.0001, 0.018, 0.008, 0.022, 0.007, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, + 0.009, 0.005, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.006, 0.329, 0.001, 0.002, 0.009, 0.006, + 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "pdc": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.347, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.345, 0.014, 0.296, 0.0001, 0.002, 0.001, 0.004, 0.083, 0.252, 0.251, 0.004, + 0.0001, 0.899, 0.34, 1.232, 0.016, 0.318, 0.569, 0.233, 0.139, 0.122, 0.133, 0.151, 0.187, 0.197, 0.319, 0.11, + 0.028, 0.009, 0.001, 0.009, 0.014, 0.001, 0.435, 0.396, 0.269, 0.612, 0.446, 0.261, 0.34, 0.266, 0.158, 0.126, + 0.345, 0.316, 0.408, 0.189, 0.112, 0.446, 0.018, 0.164, 0.922, 0.173, 0.1, 0.127, 0.257, 0.003, 0.091, 0.087, + 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.001, 5.822, 0.784, 2.856, 3.127, 10.434, 0.913, 1.544, 3.717, 6.407, + 0.033, 0.633, 2.751, 1.821, 6.435, 2.483, 0.545, 0.012, 4.834, 4.912, 3.94, 2.397, 0.665, 1.309, 0.053, 0.442, + 0.521, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.13, 0.003, 0.001, 0.002, 0.004, 0.002, 0.002, 0.001, 0.002, + 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.012, 0.001, 0.0001, 0.001, 0.0001, + 0.012, 0.052, 0.0001, 0.0001, 0.021, 0.02, 0.013, 0.012, 0.005, 0.005, 0.001, 0.002, 0.087, 0.001, 0.002, 0.004, + 0.002, 0.014, 0.002, 0.001, 0.002, 0.005, 0.0001, 0.002, 0.002, 0.007, 0.005, 0.01, 0.013, 0.001, 0.014, 0.0001, + 0.001, 0.001, 0.001, 0.001, 0.03, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.019, 0.191, 0.004, 0.004, 0.0001, + 0.0001, 0.0001, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.003, 0.011, 0.007, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.129, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "pfl": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.263, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.706, 0.009, 0.364, 0.0001, 0.0001, 0.013, 0.001, 0.091, 0.195, 0.195, 0.003, + 0.001, 0.686, 0.342, 1.046, 0.015, 0.201, 0.285, 0.126, 0.084, 0.075, 0.083, 0.073, 0.08, 0.09, 0.133, 0.057, + 0.007, 0.004, 0.002, 0.005, 0.003, 0.0001, 0.282, 0.468, 0.129, 0.696, 0.183, 0.211, 0.353, 0.23, 0.145, 0.127, + 0.364, 0.254, 0.349, 0.172, 0.165, 0.214, 0.007, 0.306, 0.587, 0.085, 0.112, 0.133, 0.253, 0.004, 0.004, 0.083, + 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.001, 5.458, 1.123, 3.147, 5.166, 9.364, 1.012, 2.021, 4.491, 5.715, + 0.138, 0.564, 2.856, 2.578, 5.721, 2.982, 0.339, 0.016, 4.316, 5.155, 2.124, 2.997, 0.789, 1.349, 0.04, 0.119, + 0.948, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.073, 0.001, 0.001, 0.001, 0.025, 0.007, 0.0001, 0.0001, 0.0001, + 0.003, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.014, 0.001, 0.005, 0.002, 0.0001, + 0.001, 0.004, 0.001, 0.001, 0.027, 0.001, 0.026, 0.15, 0.041, 0.008, 0.01, 0.001, 1.309, 0.09, 0.0001, 0.002, + 0.017, 0.105, 0.002, 0.002, 0.07, 0.023, 0.0001, 0.002, 0.004, 0.001, 0.016, 0.015, 0.003, 0.033, 0.029, 0.001, + 0.0001, 0.001, 0.001, 0.001, 0.044, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.024, 1.987, 0.001, 0.015, 0.0001, + 0.0001, 0.0001, 0.002, 0.003, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.07, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "pi": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.055, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 4.983, 0.003, 0.019, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.015, 0.015, 0.0001, + 0.0001, 0.196, 0.05, 0.162, 0.001, 0.012, 0.032, 0.016, 0.014, 0.013, 0.015, 0.012, 0.01, 0.008, 0.011, 0.012, + 0.002, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.014, 0.008, 0.005, 0.012, 0.009, 0.003, 0.003, 0.008, 0.003, 0.003, + 0.005, 0.005, 0.006, 0.016, 0.004, 0.013, 0.0001, 0.005, 0.023, 0.015, 0.011, 0.002, 0.003, 0.0001, 0.036, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.761, 0.196, 0.276, 0.305, 0.454, 0.017, 0.165, 0.648, + 0.799, 0.068, 0.545, 0.11, 0.265, 0.512, 0.167, 0.383, 0.0001, 0.263, 0.542, 0.555, 0.3, 0.254, 0.017, 0.002, + 0.396, 0.01, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.585, 1.349, 0.631, 0.309, 0.001, 0.704, 0.099, 0.738, + 0.496, 0.135, 0.002, 0.598, 0.015, 3.249, 0.0001, 0.471, 0.004, 0.001, 0.0001, 0.007, 0.008, 1.087, 0.017, + 0.945, 0.067, 0.032, 0.055, 0.004, 0.076, 0.002, 0.011, 0.133, 0.012, 0.507, 0.001, 0.315, 18.309, 9.394, 0.355, + 1.002, 0.59, 0.225, 0.335, 0.42, 0.344, 0.341, 0.537, 1.408, 2.487, 0.078, 0.724, 0.001, 0.0001, 0.527, 0.043, + 0.432, 2.004, 0.558, 0.0001, 0.0001, 0.014, 0.0001, 1.176, 0.438, 0.0001, 0.0001, 0.0001, 0.095, 0.876, 0.019, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 26.149, 0.497, + 0.061, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "pih": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.022, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.521, 0.009, 0.204, 0.0001, 0.0001, 0.004, 0.001, 2.454, 0.291, 0.293, 0.002, + 0.001, 0.888, 0.295, 1.488, 0.018, 0.431, 0.479, 0.302, 0.13, 0.163, 0.176, 0.152, 0.154, 0.17, 0.228, 0.107, + 0.024, 0.002, 0.004, 0.002, 0.0001, 0.0001, 0.58, 0.327, 0.222, 0.2, 0.438, 0.166, 0.153, 0.179, 0.225, 0.154, + 0.281, 0.167, 0.407, 0.329, 0.234, 0.386, 0.004, 0.196, 0.528, 0.379, 0.134, 0.065, 0.116, 0.0001, 0.083, 0.034, + 0.002, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 8.21, 0.769, 1.021, 1.638, 6.843, 0.747, 0.93, 1.82, 7.969, 0.261, + 1.7, 3.13, 1.378, 5.431, 3.567, 1.341, 0.022, 3.668, 4.749, 4.715, 2.394, 0.289, 0.906, 0.045, 1.135, 0.094, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.092, 0.039, 0.046, 0.01, 0.019, 0.008, 0.006, 0.003, 0.009, 0.001, + 0.001, 0.017, 0.011, 0.007, 0.006, 0.02, 0.015, 0.009, 0.001, 0.019, 0.012, 0.0001, 0.001, 0.006, 0.003, 0.028, + 0.004, 0.009, 0.002, 0.007, 0.002, 0.006, 0.077, 0.019, 0.006, 0.004, 0.002, 0.001, 0.001, 0.004, 0.006, 0.035, + 0.017, 0.004, 0.004, 0.012, 0.004, 0.0001, 0.082, 0.011, 0.044, 0.037, 0.018, 0.034, 0.007, 0.017, 0.057, 0.008, + 0.047, 0.04, 0.021, 0.031, 0.077, 0.012, 0.0001, 0.0001, 0.098, 0.125, 0.02, 0.026, 0.002, 0.0001, 0.0001, + 0.016, 0.007, 0.004, 0.0001, 0.001, 0.0001, 0.0001, 0.45, 0.193, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.006, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.026, 0.048, 0.0001, 0.0001, 0.003, 0.002, + 0.001, 0.0001, 0.001, 0.001, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "pms": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.299, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.832, 0.001, 0.162, 0.0001, 0.0001, 0.004, 0.001, 1.011, 0.156, 0.156, 0.0001, + 0.0001, 1.253, 0.787, 0.992, 0.342, 0.318, 0.594, 0.327, 0.281, 0.214, 0.205, 0.231, 0.17, 0.187, 0.641, 0.121, + 0.014, 0.149, 0.035, 0.149, 0.034, 0.0001, 0.513, 0.293, 0.3, 0.101, 0.054, 0.096, 0.128, 0.035, 0.079, 0.03, + 0.029, 0.305, 0.216, 0.126, 0.053, 0.205, 0.008, 0.226, 0.291, 0.098, 0.028, 0.104, 0.023, 0.014, 0.012, 0.01, + 0.002, 0.0001, 0.002, 0.0001, 0.011, 0.0001, 9.348, 0.753, 2.346, 3.335, 4.488, 0.731, 0.919, 0.76, 4.936, 0.31, + 0.385, 3.85, 2.042, 6.393, 3.543, 1.375, 0.084, 3.728, 4.566, 4.041, 1.559, 0.688, 0.145, 0.036, 0.118, 0.134, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.165, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, + 0.001, 0.059, 0.002, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.02, + 0.115, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.661, 0.007, 0.005, 0.001, 0.004, 0.0001, 0.001, 0.004, + 0.295, 0.64, 0.002, 2.121, 0.312, 0.006, 0.001, 0.001, 0.002, 0.006, 0.658, 0.012, 0.019, 0.001, 0.003, 0.0001, + 0.001, 0.07, 0.002, 0.002, 0.005, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.286, 4.639, 0.003, 0.003, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.137, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "pnb": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.056, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.3, 0.001, 0.061, 0.0001, 0.0001, 0.004, 0.0001, 0.019, 0.084, 0.084, 0.0001, + 0.001, 0.02, 0.088, 0.041, 0.008, 0.132, 0.201, 0.102, 0.067, 0.062, 0.067, 0.058, 0.058, 0.067, 0.099, 0.044, + 0.011, 0.014, 0.019, 0.014, 0.0001, 0.0001, 0.005, 0.015, 0.004, 0.007, 0.004, 0.002, 0.006, 0.002, 0.006, + 0.004, 0.001, 0.002, 0.002, 0.003, 0.002, 0.003, 0.0001, 0.004, 0.004, 0.005, 0.001, 0.001, 0.003, 0.0001, + 0.0001, 0.0001, 0.016, 0.0001, 0.016, 0.0001, 0.001, 0.001, 0.078, 0.007, 0.025, 0.032, 0.067, 0.025, 0.012, + 0.031, 0.075, 0.001, 0.005, 0.047, 0.03, 0.057, 0.061, 0.011, 0.001, 0.056, 0.035, 0.078, 0.015, 0.016, 0.005, + 0.001, 0.026, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.037, 1.78, 0.208, 0.002, 1.668, 1.155, 3.673, + 0.01, 3.168, 0.001, 0.005, 0.003, 4.417, 0.001, 0.019, 0.031, 0.026, 0.339, 2.06, 0.022, 0.634, 0.001, 0.0001, + 0.0001, 0.015, 0.009, 0.0001, 0.004, 0.002, 0.002, 0.0001, 0.002, 0.01, 0.033, 0.198, 0.001, 0.068, 0.002, + 0.419, 5.965, 1.027, 1.695, 1.567, 0.022, 0.752, 0.178, 0.132, 2.73, 0.025, 2.399, 0.214, 1.507, 0.366, 0.211, + 0.103, 0.103, 0.037, 0.788, 1.21, 0.001, 0.001, 0.002, 1.61, 0.001, 0.0001, 0.0001, 0.01, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.007, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 17.991, 10.598, 5.545, 8.408, 0.0001, 0.004, 0.0001, 0.0001, 0.008, 0.001, + 0.037, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "pnt": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.111, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.571, 0.001, 0.271, 0.0001, 0.0001, 0.001, 0.001, 0.535, 0.166, 0.167, 0.003, + 0.001, 0.374, 0.066, 0.728, 0.006, 0.22, 0.256, 0.213, 0.123, 0.09, 0.093, 0.091, 0.105, 0.105, 0.136, 0.082, + 0.003, 0.006, 0.005, 0.006, 0.0001, 0.0001, 0.027, 0.009, 0.018, 0.007, 0.008, 0.002, 0.007, 0.007, 0.011, + 0.005, 0.01, 0.006, 0.014, 0.004, 0.003, 0.01, 0.001, 0.009, 0.009, 0.01, 0.001, 0.002, 0.009, 0.001, 0.001, + 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.102, 0.019, 0.03, 0.031, 0.116, 0.01, 0.025, 0.028, + 0.096, 0.002, 0.026, 0.047, 0.026, 0.078, 0.081, 0.022, 0.002, 0.09, 0.05, 0.057, 0.045, 0.011, 0.005, 0.004, + 0.012, 0.009, 0.0001, 0.182, 0.0001, 0.0001, 0.0001, 1.086, 2.28, 1.131, 1.649, 3.333, 0.911, 0.24, 0.496, + 0.069, 0.319, 0.04, 0.001, 0.823, 0.357, 0.222, 0.002, 0.015, 0.24, 0.073, 0.124, 0.043, 0.159, 0.008, 0.102, + 0.032, 0.07, 0.198, 0.037, 0.134, 0.044, 0.005, 0.136, 0.134, 0.042, 0.001, 0.198, 0.245, 0.005, 0.018, 0.079, + 0.003, 0.008, 0.001, 0.042, 1.012, 0.786, 0.269, 1.272, 0.017, 4.369, 0.221, 0.746, 0.384, 2.578, 0.144, 1.385, + 0.301, 1.937, 1.463, 1.533, 1.22, 4.421, 0.103, 3.268, 0.0001, 0.0001, 0.091, 0.022, 0.01, 0.004, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 29.379, 12.776, 0.049, 0.015, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.003, 0.011, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.059, 0.041, 0.0001, + 0.001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ps": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.579, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.932, 0.004, 0.044, 0.0001, 0.0001, 0.003, 0.0001, 0.002, 0.118, 0.118, 0.001, + 0.001, 0.026, 0.037, 0.443, 0.009, 0.022, 0.03, 0.021, 0.014, 0.011, 0.012, 0.01, 0.009, 0.01, 0.013, 0.062, + 0.001, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.015, 0.007, 0.011, 0.007, 0.006, 0.005, 0.004, 0.007, 0.009, + 0.002, 0.003, 0.005, 0.01, 0.006, 0.004, 0.009, 0.001, 0.006, 0.013, 0.009, 0.003, 0.002, 0.003, 0.001, 0.001, + 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.003, 0.0001, 0.147, 0.023, 0.055, 0.054, 0.165, 0.027, 0.031, 0.061, + 0.131, 0.002, 0.012, 0.073, 0.048, 0.109, 0.113, 0.034, 0.002, 0.103, 0.097, 0.116, 0.047, 0.015, 0.017, 0.005, + 0.027, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.103, 0.528, 0.202, 0.231, 2.393, 1.822, 2.655, 3.163, + 4.608, 0.307, 2.451, 0.006, 1.513, 0.136, 0.015, 0.009, 1.675, 0.004, 0.009, 0.507, 0.005, 0.0001, 0.154, 0.001, + 0.093, 0.002, 0.229, 0.007, 0.005, 0.003, 0.0001, 0.006, 0.024, 0.025, 0.048, 0.014, 0.025, 0.008, 0.038, 4.145, + 0.839, 1.375, 1.43, 0.077, 0.25, 0.229, 0.647, 2.983, 0.085, 2.528, 0.449, 1.14, 0.525, 0.146, 0.073, 0.106, + 0.064, 0.333, 0.407, 0.02, 0.265, 0.005, 1.278, 0.002, 0.0001, 0.0001, 0.016, 0.003, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.028, 0.011, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 16.081, 19.012, 3.763, 3.368, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.026, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.038, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "qu": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.204, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.108, 0.002, 0.638, 0.0001, 0.0001, 0.004, 0.002, 0.39, 0.494, 0.494, 0.05, + 0.002, 1.04, 0.188, 0.977, 0.036, 0.261, 0.409, 0.214, 0.137, 0.12, 0.137, 0.117, 0.112, 0.136, 0.208, 0.401, + 0.061, 0.041, 0.006, 0.041, 0.004, 0.0001, 0.371, 0.173, 0.36, 0.119, 0.076, 0.064, 0.097, 0.189, 0.192, 0.096, + 0.255, 0.187, 0.305, 0.078, 0.042, 0.428, 0.148, 0.146, 0.31, 0.198, 0.198, 0.061, 0.174, 0.014, 0.102, 0.014, + 0.014, 0.0001, 0.015, 0.0001, 0.002, 0.0001, 14.813, 0.229, 1.579, 0.795, 1.296, 0.084, 0.286, 2.331, 7.773, + 0.067, 3.004, 4.09, 3.086, 5.006, 1.165, 2.96, 3.746, 3.293, 3.447, 3.494, 5.678, 0.135, 1.682, 0.024, 2.244, + 0.111, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.055, 0.016, 0.009, 0.013, 0.008, 0.006, 0.004, 0.006, 0.004, + 0.004, 0.003, 0.002, 0.006, 0.007, 0.003, 0.002, 0.012, 0.023, 0.002, 0.011, 0.004, 0.004, 0.003, 0.002, 0.004, + 0.015, 0.003, 0.003, 0.005, 0.003, 0.002, 0.003, 0.038, 0.068, 0.004, 0.005, 0.014, 0.005, 0.006, 0.009, 0.007, + 0.056, 0.005, 0.005, 0.005, 0.075, 0.004, 0.006, 0.014, 0.34, 0.013, 0.069, 0.007, 0.008, 0.006, 0.005, 0.016, + 0.009, 0.022, 0.008, 0.011, 0.009, 0.01, 0.01, 0.0001, 0.0001, 0.026, 0.649, 0.01, 0.009, 0.001, 0.001, 0.0001, + 0.002, 0.001, 0.008, 0.002, 0.0001, 0.042, 0.02, 0.051, 0.016, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.006, + 0.016, 0.012, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.031, 0.016, 0.047, 0.001, 0.001, 0.006, 0.005, + 0.002, 0.002, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "rm": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.612, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.511, 0.003, 0.167, 0.0001, 0.0001, 0.015, 0.0001, 0.104, 0.151, 0.151, 0.003, + 0.0001, 0.439, 0.065, 0.823, 0.012, 0.199, 0.275, 0.114, 0.07, 0.072, 0.078, 0.067, 0.073, 0.099, 0.138, 0.045, + 0.054, 0.005, 0.002, 0.005, 0.002, 0.0001, 0.139, 0.111, 0.151, 0.1, 0.17, 0.069, 0.113, 0.045, 0.217, 0.028, + 0.029, 0.208, 0.121, 0.055, 0.036, 0.132, 0.042, 0.086, 0.226, 0.106, 0.051, 0.07, 0.023, 0.003, 0.003, 0.008, + 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.001, 11.404, 0.601, 3.031, 3.677, 6.353, 0.757, 1.578, 1.412, 6.549, + 0.076, 0.068, 4.778, 1.866, 6.046, 2.159, 1.856, 0.265, 4.97, 5.963, 4.375, 3.712, 1.407, 0.03, 0.131, 0.049, + 0.802, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.828, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.043, 0.0001, 0.0001, 0.001, + 0.001, 0.0001, 0.675, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.294, 0.003, 0.002, 0.0001, 0.006, 0.001, + 0.001, 0.002, 0.333, 0.017, 0.002, 0.02, 0.128, 0.003, 0.0001, 0.001, 0.004, 0.002, 0.027, 0.004, 0.001, 0.001, + 0.012, 0.0001, 0.001, 0.054, 0.054, 0.02, 0.042, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.079, 0.841, 0.004, + 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.005, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.828, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "rmy": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.439, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.022, 0.009, 0.624, 0.001, 0.0001, 0.014, 0.003, 0.015, 0.443, 0.441, 0.003, + 0.003, 1.038, 0.232, 0.983, 0.037, 0.243, 0.24, 0.172, 0.071, 0.075, 0.081, 0.064, 0.056, 0.058, 0.153, 0.179, + 0.028, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.429, 0.231, 0.183, 0.167, 0.219, 0.086, 0.091, 0.078, 0.193, + 0.094, 0.424, 0.255, 0.23, 0.124, 0.22, 0.316, 0.009, 0.404, 0.577, 0.193, 0.066, 0.142, 0.014, 0.008, 0.107, + 0.022, 0.003, 0.0001, 0.004, 0.0001, 0.001, 0.001, 10.986, 1.012, 0.769, 2.129, 6.975, 0.334, 0.958, 2.547, + 6.287, 0.364, 2.952, 3.16, 1.944, 5.241, 5.031, 1.512, 0.108, 4.343, 3.649, 3.301, 2.127, 1.805, 0.051, 0.119, + 2.702, 0.234, 0.0001, 0.003, 0.001, 0.001, 0.0001, 0.065, 0.024, 0.024, 0.136, 0.011, 0.006, 0.01, 0.023, 0.009, + 0.001, 0.005, 0.016, 0.01, 0.054, 0.02, 0.004, 0.003, 0.007, 0.001, 0.025, 0.008, 0.009, 0.004, 0.007, 0.004, + 0.054, 0.005, 0.044, 0.006, 0.002, 0.003, 0.008, 0.038, 0.056, 0.061, 0.004, 0.069, 0.023, 0.011, 0.016, 0.012, + 0.016, 0.02, 0.006, 0.003, 0.014, 0.084, 0.01, 0.051, 0.028, 0.039, 0.03, 0.013, 0.014, 0.009, 0.007, 0.027, + 0.007, 0.021, 0.023, 0.024, 0.034, 0.062, 0.014, 0.0001, 0.0001, 0.036, 0.28, 0.165, 0.061, 0.0001, 0.011, + 0.089, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.007, 0.003, 0.242, 0.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.008, 0.026, 0.02, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.128, 0.005, 0.037, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.004, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "rn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.466, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.984, 0.029, 0.062, 0.0001, 0.0001, 0.003, 0.0001, 0.574, 0.079, 0.089, 0.011, + 0.0001, 1.075, 0.049, 1.054, 0.052, 0.102, 0.296, 0.219, 0.136, 0.097, 0.085, 0.071, 0.069, 0.063, 0.086, 0.222, + 0.076, 0.048, 0.0001, 0.048, 0.055, 0.0001, 0.35, 0.153, 0.043, 0.033, 0.087, 0.042, 0.05, 0.106, 0.336, 0.016, + 0.136, 0.035, 0.208, 0.24, 0.02, 0.055, 0.001, 0.138, 0.132, 0.082, 0.29, 0.029, 0.019, 0.0001, 0.195, 0.032, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 10.973, 3.104, 0.817, 1.265, 5.117, 0.295, 2.193, 1.806, 7.318, + 0.542, 2.677, 0.668, 3.393, 5.179, 4.081, 0.677, 0.004, 4.518, 2.135, 2.161, 5.935, 1.185, 2.07, 0.007, 2.3, + 1.432, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.174, 0.023, 0.002, 0.005, 0.007, 0.004, 0.003, 0.003, 0.006, + 0.0001, 0.004, 0.0001, 0.015, 0.271, 0.012, 0.002, 0.008, 0.004, 0.004, 0.008, 0.004, 0.0001, 0.0001, 0.0001, + 0.001, 0.284, 0.0001, 0.196, 0.005, 0.002, 0.004, 0.014, 0.082, 0.437, 0.009, 0.0001, 0.0001, 0.006, 0.001, + 0.018, 0.002, 0.13, 0.002, 0.17, 0.0001, 0.586, 0.007, 0.108, 0.004, 0.019, 0.001, 0.014, 0.007, 0.001, 0.01, + 0.001, 0.001, 0.002, 0.049, 0.153, 0.015, 0.123, 0.121, 0.0001, 0.0001, 0.0001, 0.386, 1.335, 0.539, 0.45, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.006, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, + 0.167, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "rue": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.059, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.931, 0.003, 0.134, 0.004, 0.0001, 0.006, 0.0001, 0.004, 0.175, 0.175, 0.004, + 0.001, 0.601, 0.077, 0.708, 0.007, 0.16, 0.303, 0.147, 0.097, 0.093, 0.095, 0.084, 0.09, 0.099, 0.137, 0.031, + 0.011, 0.003, 0.006, 0.002, 0.001, 0.0001, 0.009, 0.006, 0.011, 0.005, 0.005, 0.004, 0.005, 0.007, 0.017, 0.002, + 0.003, 0.006, 0.008, 0.01, 0.004, 0.008, 0.0001, 0.006, 0.012, 0.008, 0.004, 0.005, 0.003, 0.005, 0.001, 0.001, + 0.002, 0.011, 0.003, 0.0001, 0.004, 0.0001, 0.091, 0.013, 0.033, 0.032, 0.099, 0.015, 0.014, 0.02, 0.081, 0.006, + 0.012, 0.045, 0.028, 0.055, 0.071, 0.018, 0.002, 0.069, 0.058, 0.052, 0.039, 0.016, 0.006, 0.004, 0.014, 0.011, + 0.002, 0.0001, 0.002, 0.0001, 0.0001, 2.51, 1.935, 2.11, 1.119, 0.168, 0.507, 0.468, 0.486, 0.356, 0.046, 0.009, + 1.422, 0.678, 0.003, 0.239, 0.784, 0.089, 0.301, 0.121, 0.074, 0.371, 0.035, 1.647, 0.529, 0.012, 0.009, 0.09, + 0.04, 0.101, 0.07, 0.061, 0.137, 0.108, 0.152, 0.055, 0.234, 0.024, 0.016, 0.017, 0.032, 0.025, 0.005, 0.001, + 0.015, 0.002, 0.004, 0.009, 0.015, 3.672, 0.621, 2.19, 0.526, 1.267, 2.143, 0.348, 0.764, 1.53, 0.62, 1.849, + 1.595, 1.255, 2.617, 4.166, 1.0, 0.0001, 0.0001, 0.065, 0.026, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.006, 0.0001, 0.02, 0.009, 27.547, 15.28, 0.159, 0.0001, 0.0001, 0.001, 0.001, 0.004, 0.006, + 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.115, 0.004, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "rw": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.278, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.768, 0.007, 0.605, 0.0001, 0.0001, 0.01, 0.005, 0.156, 0.48, 0.479, 0.0001, + 0.001, 0.554, 0.104, 0.846, 0.03, 0.199, 0.216, 0.155, 0.113, 0.085, 0.082, 0.092, 0.069, 0.073, 0.138, 0.279, + 0.158, 0.014, 0.006, 0.014, 0.022, 0.0001, 0.463, 0.203, 0.115, 0.093, 0.067, 0.068, 0.134, 0.078, 0.521, 0.056, + 0.247, 0.076, 0.283, 0.278, 0.063, 0.134, 0.006, 0.219, 0.18, 0.135, 0.469, 0.053, 0.038, 0.003, 0.047, 0.033, + 0.002, 0.005, 0.003, 0.0001, 0.005, 0.003, 10.187, 2.795, 0.85, 1.072, 4.678, 0.399, 2.704, 1.553, 8.747, 0.332, + 2.605, 0.938, 3.443, 4.833, 3.164, 0.42, 0.036, 4.477, 2.07, 2.396, 6.084, 0.329, 1.941, 0.023, 2.813, 1.358, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.976, 0.03, 0.025, 0.03, 0.043, 0.049, 0.025, 0.021, 0.028, 0.009, + 0.036, 0.011, 0.018, 0.014, 0.026, 0.013, 0.02, 0.015, 0.01, 0.15, 0.008, 0.015, 0.009, 0.008, 0.011, 0.787, + 0.007, 0.008, 0.021, 0.011, 0.011, 0.034, 0.016, 0.016, 0.009, 0.011, 0.025, 0.012, 0.025, 0.083, 0.028, 0.057, + 0.013, 0.014, 0.038, 0.019, 0.024, 0.039, 0.055, 0.067, 0.03, 0.036, 0.018, 0.034, 0.017, 0.013, 0.045, 0.024, + 0.03, 0.026, 0.034, 0.02, 0.028, 0.012, 0.0001, 0.0001, 0.03, 0.13, 0.052, 0.028, 0.001, 0.001, 0.001, 0.009, + 0.002, 0.001, 0.003, 0.0001, 0.02, 0.007, 0.21, 0.107, 0.008, 0.005, 0.001, 0.006, 0.005, 0.025, 0.234, 0.162, + 0.005, 0.009, 0.0001, 0.0001, 0.009, 0.0001, 0.108, 0.055, 0.961, 0.001, 0.002, 0.013, 0.008, 0.004, 0.003, + 0.002, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sa": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.358, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 4.441, 0.003, 0.019, 0.0001, 0.0001, 0.003, 0.0001, 0.034, 0.04, 0.042, 0.0001, + 0.001, 0.189, 0.124, 0.061, 0.009, 0.003, 0.004, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.002, 0.022, + 0.001, 0.005, 0.003, 0.005, 0.005, 0.0001, 0.002, 0.001, 0.007, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, + 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.036, 0.006, 0.009, 0.018, 0.033, 0.003, 0.005, 0.01, + 0.026, 0.001, 0.003, 0.015, 0.009, 0.022, 0.022, 0.013, 0.0001, 0.02, 0.014, 0.02, 0.007, 0.002, 0.005, 0.001, + 0.004, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.485, 0.531, 0.737, 0.892, 0.001, 0.437, 0.14, 1.014, + 0.103, 0.083, 0.003, 0.31, 0.053, 4.186, 0.001, 0.123, 0.004, 0.001, 0.0001, 0.016, 0.005, 0.929, 0.077, 0.397, + 0.036, 0.098, 0.308, 0.026, 0.311, 0.017, 0.076, 0.146, 0.037, 0.11, 0.008, 0.362, 26.378, 7.803, 0.723, 0.32, + 1.5, 0.025, 0.84, 0.05, 0.176, 0.36, 1.148, 1.481, 1.847, 0.0001, 0.431, 0.017, 0.001, 1.168, 0.412, 0.409, + 1.347, 0.264, 0.0001, 0.0001, 0.002, 0.029, 2.443, 1.602, 0.0001, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.344, 0.0001, 0.071, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "sah": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.686, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.508, 0.002, 0.063, 0.0001, 0.0001, 0.006, 0.0001, 0.001, 0.091, 0.092, 0.0001, + 0.001, 0.559, 0.22, 0.713, 0.008, 0.141, 0.211, 0.115, 0.061, 0.06, 0.065, 0.051, 0.05, 0.056, 0.124, 0.035, + 0.013, 0.006, 0.002, 0.006, 0.002, 0.0001, 0.005, 0.004, 0.005, 0.003, 0.002, 0.002, 0.002, 0.002, 0.017, 0.001, + 0.002, 0.002, 0.004, 0.003, 0.002, 0.003, 0.0001, 0.002, 0.006, 0.004, 0.001, 0.004, 0.001, 0.007, 0.002, + 0.0001, 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 0.029, 0.008, 0.012, 0.008, 0.028, 0.005, 0.006, 0.038, + 0.023, 0.001, 0.004, 0.015, 0.01, 0.02, 0.025, 0.007, 0.0001, 0.024, 0.015, 0.017, 0.012, 0.003, 0.003, 0.001, + 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.31, 1.601, 3.034, 2.129, 0.054, 0.947, 0.056, 0.303, + 0.028, 0.008, 0.002, 2.384, 0.325, 2.811, 0.018, 0.129, 0.129, 0.118, 0.035, 0.051, 0.111, 0.426, 0.011, 0.007, + 0.063, 0.002, 0.123, 0.02, 0.075, 0.059, 0.083, 0.041, 0.09, 0.172, 0.066, 0.042, 0.018, 0.342, 0.005, 0.017, + 0.028, 0.688, 0.0001, 0.065, 0.003, 0.027, 0.027, 0.911, 6.03, 1.253, 0.256, 0.681, 0.862, 0.464, 0.024, 0.065, + 2.76, 0.764, 1.431, 3.082, 0.589, 3.175, 2.114, 0.327, 0.0001, 0.0001, 0.173, 0.003, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.001, 24.486, 17.038, 2.234, 0.706, 0.0001, 0.001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.102, 0.001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sc": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.057, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.585, 0.005, 0.337, 0.0001, 0.0001, 0.01, 0.001, 0.519, 0.179, 0.179, 0.0001, + 0.001, 0.997, 0.097, 0.746, 0.025, 0.237, 0.292, 0.15, 0.087, 0.082, 0.09, 0.079, 0.083, 0.093, 0.166, 0.067, + 0.032, 0.007, 0.002, 0.008, 0.003, 0.0001, 0.224, 0.132, 0.261, 0.092, 0.103, 0.086, 0.108, 0.028, 0.255, 0.028, + 0.024, 0.103, 0.181, 0.091, 0.054, 0.171, 0.006, 0.093, 0.455, 0.116, 0.064, 0.058, 0.024, 0.025, 0.008, 0.012, + 0.012, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 9.363, 0.921, 2.394, 4.179, 7.513, 0.745, 1.075, 0.764, 6.94, + 0.075, 0.096, 1.956, 1.851, 5.606, 4.069, 1.688, 0.018, 4.534, 7.393, 5.178, 5.316, 0.445, 0.037, 0.029, 0.067, + 0.854, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.107, 0.01, 0.006, 0.008, 0.004, 0.002, 0.002, 0.003, 0.006, + 0.002, 0.002, 0.002, 0.006, 0.004, 0.002, 0.001, 0.003, 0.002, 0.003, 0.008, 0.004, 0.001, 0.002, 0.001, 0.003, + 0.058, 0.001, 0.002, 0.016, 0.017, 0.001, 0.001, 0.306, 0.009, 0.002, 0.003, 0.003, 0.002, 0.001, 0.004, 0.232, + 0.016, 0.003, 0.007, 0.252, 0.007, 0.001, 0.002, 0.008, 0.007, 0.176, 0.008, 0.002, 0.004, 0.003, 0.006, 0.005, + 0.096, 0.007, 0.007, 0.006, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.032, 1.097, 0.007, 0.006, 0.0001, 0.0001, + 0.0001, 0.011, 0.003, 0.007, 0.001, 0.0001, 0.018, 0.009, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.003, 0.001, + 0.003, 0.006, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.096, 0.007, 0.001, 0.002, + 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "scn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.769, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.859, 0.005, 0.376, 0.001, 0.0001, 0.006, 0.001, 0.62, 0.187, 0.189, 0.001, + 0.001, 0.862, 0.093, 0.813, 0.026, 0.237, 0.31, 0.158, 0.093, 0.09, 0.099, 0.092, 0.087, 0.104, 0.161, 0.085, + 0.032, 0.027, 0.008, 0.034, 0.003, 0.0001, 0.211, 0.12, 0.299, 0.095, 0.077, 0.106, 0.122, 0.053, 0.143, 0.031, + 0.023, 0.333, 0.207, 0.158, 0.044, 0.198, 0.02, 0.123, 0.32, 0.125, 0.061, 0.101, 0.022, 0.022, 0.008, 0.012, + 0.019, 0.0001, 0.019, 0.0001, 0.007, 0.001, 8.698, 0.715, 3.649, 2.751, 2.764, 0.729, 1.223, 0.71, 11.435, + 0.098, 0.087, 3.105, 2.009, 5.881, 1.955, 1.977, 0.125, 4.751, 3.262, 4.998, 7.156, 1.012, 0.04, 0.022, 0.077, + 0.978, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.123, 0.005, 0.005, 0.005, 0.003, 0.001, 0.002, 0.001, 0.009, + 0.002, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.001, 0.002, 0.002, 0.01, 0.003, 0.001, 0.002, 0.001, 0.012, + 0.059, 0.001, 0.002, 0.014, 0.013, 0.001, 0.001, 0.271, 0.006, 0.312, 0.002, 0.001, 0.001, 0.001, 0.004, 0.478, + 0.013, 0.046, 0.017, 0.359, 0.007, 0.096, 0.002, 0.008, 0.004, 0.23, 0.006, 0.189, 0.003, 0.002, 0.003, 0.004, + 0.145, 0.006, 0.184, 0.003, 0.004, 0.002, 0.003, 0.0001, 0.0001, 0.038, 2.342, 0.007, 0.007, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.018, 0.008, 0.018, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.107, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sco": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.424, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.792, 0.003, 0.394, 0.001, 0.002, 0.018, 0.003, 0.122, 0.265, 0.265, 0.001, + 0.001, 1.079, 0.194, 0.878, 0.014, 0.365, 0.437, 0.262, 0.125, 0.119, 0.131, 0.116, 0.116, 0.135, 0.238, 0.065, + 0.052, 0.004, 0.002, 0.004, 0.001, 0.0001, 0.38, 0.213, 0.323, 0.162, 0.132, 0.149, 0.164, 0.147, 0.281, 0.103, + 0.117, 0.162, 0.281, 0.134, 0.098, 0.228, 0.015, 0.18, 0.416, 0.389, 0.071, 0.084, 0.096, 0.009, 0.031, 0.022, + 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 7.525, 0.973, 2.32, 1.915, 9.145, 0.867, 0.966, 3.175, 6.858, + 0.086, 0.556, 2.986, 1.72, 5.779, 4.854, 1.317, 0.066, 4.925, 4.607, 6.432, 2.109, 0.676, 1.003, 0.125, 1.018, + 0.144, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.052, 0.009, 0.005, 0.004, 0.004, 0.003, 0.002, 0.004, 0.002, + 0.003, 0.002, 0.001, 0.002, 0.005, 0.001, 0.002, 0.001, 0.002, 0.001, 0.033, 0.006, 0.001, 0.002, 0.002, 0.002, + 0.009, 0.001, 0.002, 0.003, 0.003, 0.001, 0.005, 0.039, 0.026, 0.003, 0.006, 0.015, 0.004, 0.002, 0.007, 0.005, + 0.025, 0.002, 0.006, 0.002, 0.019, 0.001, 0.002, 0.01, 0.012, 0.013, 0.016, 0.004, 0.005, 0.011, 0.002, 0.007, + 0.003, 0.007, 0.003, 0.009, 0.004, 0.004, 0.002, 0.0001, 0.0001, 0.051, 0.152, 0.018, 0.014, 0.0001, 0.0001, + 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.011, 0.005, 0.019, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.002, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.005, 0.05, 0.001, 0.001, 0.002, + 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sd": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.527, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.452, 0.004, 0.026, 0.001, 0.0001, 0.002, 0.0001, 0.004, 0.108, 0.108, 0.004, + 0.001, 0.009, 0.252, 0.565, 0.015, 0.09, 0.18, 0.083, 0.051, 0.047, 0.052, 0.047, 0.048, 0.055, 0.112, 0.038, + 0.003, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.01, 0.007, 0.009, 0.005, 0.004, 0.003, 0.004, 0.004, 0.005, 0.002, + 0.003, 0.004, 0.007, 0.004, 0.003, 0.007, 0.001, 0.004, 0.011, 0.007, 0.002, 0.002, 0.003, 0.0001, 0.001, + 0.0001, 0.005, 0.0001, 0.005, 0.001, 0.003, 0.0001, 0.093, 0.018, 0.025, 0.03, 0.086, 0.014, 0.018, 0.031, + 0.075, 0.002, 0.009, 0.041, 0.026, 0.061, 0.064, 0.018, 0.001, 0.061, 0.048, 0.062, 0.025, 0.01, 0.009, 0.005, + 0.016, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.358, 0.355, 0.367, 0.044, 1.492, 1.56, 3.771, 2.24, + 3.043, 0.003, 5.411, 0.006, 0.747, 0.045, 0.229, 0.346, 0.139, 0.006, 0.013, 0.002, 0.041, 0.001, 0.001, 0.003, + 0.036, 0.237, 0.0001, 0.007, 0.063, 0.063, 0.001, 0.009, 0.066, 0.346, 0.511, 0.005, 0.013, 0.004, 0.6, 4.552, + 0.858, 0.458, 2.417, 0.053, 1.486, 0.357, 0.248, 1.426, 0.07, 2.412, 0.238, 1.475, 0.403, 0.209, 0.078, 0.141, + 0.068, 0.553, 0.222, 0.578, 0.001, 0.647, 1.291, 0.291, 0.0001, 0.0001, 0.065, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 17.302, 19.772, 4.118, 0.84, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.198, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.104, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "se": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.476, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 10.534, 0.002, 0.233, 0.001, 0.001, 0.008, 0.001, 0.011, 0.255, 0.258, 0.0001, + 0.001, 1.05, 0.297, 1.247, 0.015, 0.373, 0.513, 0.317, 0.174, 0.148, 0.157, 0.145, 0.145, 0.159, 0.258, 0.106, + 0.008, 0.018, 0.002, 0.018, 0.002, 0.0001, 0.188, 0.166, 0.071, 0.251, 0.09, 0.093, 0.235, 0.162, 0.082, 0.134, + 0.245, 0.18, 0.186, 0.183, 0.112, 0.147, 0.004, 0.206, 0.487, 0.123, 0.053, 0.171, 0.019, 0.003, 0.015, 0.006, + 0.005, 0.0001, 0.005, 0.0001, 0.001, 0.0001, 10.038, 0.915, 0.217, 3.327, 5.602, 0.262, 2.678, 1.589, 6.671, + 1.512, 2.136, 5.043, 2.364, 3.492, 4.102, 0.745, 0.01, 2.956, 3.613, 3.601, 3.337, 2.349, 0.035, 0.018, 0.282, + 0.057, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.058, 0.044, 0.003, 0.004, 0.008, 0.009, 0.002, 0.003, 0.002, + 0.002, 0.001, 0.119, 0.035, 0.369, 0.001, 0.002, 0.002, 0.302, 0.004, 0.024, 0.002, 0.002, 0.006, 0.001, 0.007, + 0.006, 0.003, 0.005, 0.009, 0.024, 0.001, 0.003, 0.073, 3.336, 0.013, 0.002, 0.299, 0.044, 0.019, 0.052, 0.004, + 0.017, 0.001, 0.011, 0.001, 0.006, 0.001, 0.004, 0.019, 0.004, 0.042, 0.006, 0.01, 0.008, 0.063, 0.001, 0.053, + 0.001, 0.006, 0.009, 0.008, 0.006, 0.098, 0.001, 0.0001, 0.0001, 0.118, 3.226, 0.711, 1.0, 0.0001, 0.004, 0.002, + 0.001, 0.002, 0.001, 0.001, 0.0001, 0.008, 0.003, 0.027, 0.008, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, + 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.008, 0.055, 0.002, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sg": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.098, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.879, 0.044, 0.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.198, 0.211, + 0.0001, 0.0001, 0.85, 0.464, 1.499, 0.007, 0.524, 0.5, 0.381, 0.203, 0.246, 0.244, 0.244, 0.191, 0.262, 0.229, + 0.082, 0.038, 0.0001, 0.0001, 0.0001, 0.029, 0.0001, 0.282, 0.315, 0.126, 0.106, 0.101, 0.06, 0.092, 0.086, + 0.092, 0.093, 0.251, 0.348, 0.227, 0.266, 0.057, 0.128, 0.0001, 0.081, 0.346, 0.343, 0.013, 0.053, 0.416, 0.005, + 0.029, 0.062, 0.002, 0.0001, 0.002, 0.0001, 0.015, 0.0001, 5.706, 1.515, 0.218, 1.433, 4.537, 0.262, 2.208, + 0.762, 2.069, 0.092, 2.86, 1.7, 1.242, 5.365, 3.328, 0.599, 0.022, 1.81, 1.981, 3.619, 0.984, 0.189, 0.434, + 0.086, 1.565, 0.929, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.004, 0.029, 0.0001, 0.015, 0.0001, 0.0001, + 0.007, 0.004, 0.002, 0.007, 0.016, 0.004, 0.004, 0.022, 0.015, 0.018, 0.0001, 0.004, 0.007, 0.022, 0.0001, + 0.009, 0.004, 0.0001, 0.005, 0.0001, 0.016, 0.002, 0.0001, 0.002, 0.059, 0.007, 0.009, 1.785, 0.013, 1.12, + 0.007, 0.002, 0.044, 0.027, 0.112, 1.609, 0.647, 0.002, 0.026, 3.804, 0.577, 0.007, 0.004, 0.0001, 0.022, 0.564, + 0.0001, 1.689, 0.002, 0.005, 0.046, 0.002, 0.403, 0.176, 0.0001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 12.759, + 0.005, 0.07, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.024, 0.011, 0.007, 0.0001, 0.0001, 0.015, 0.004, 0.002, 0.0001, 0.002, 0.002, 0.004, 0.007, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "sh": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.387, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.061, 0.002, 0.275, 0.0001, 0.001, 0.015, 0.001, 0.014, 0.187, 0.187, 0.0001, + 0.002, 0.95, 0.147, 1.223, 0.02, 0.376, 0.495, 0.321, 0.161, 0.177, 0.142, 0.127, 0.123, 0.133, 0.217, 0.047, + 0.016, 0.003, 0.003, 0.003, 0.002, 0.0001, 0.169, 0.152, 0.152, 0.124, 0.074, 0.068, 0.115, 0.09, 0.132, 0.082, + 0.135, 0.104, 0.207, 0.208, 0.116, 0.297, 0.005, 0.117, 0.252, 0.137, 0.082, 0.102, 0.023, 0.008, 0.009, 0.058, + 0.012, 0.0001, 0.012, 0.0001, 0.003, 0.0001, 8.404, 0.811, 0.782, 2.282, 6.596, 0.226, 1.221, 0.511, 7.186, + 3.593, 2.512, 2.698, 2.143, 5.119, 6.434, 1.798, 0.011, 3.759, 3.618, 2.964, 3.066, 2.297, 0.032, 0.02, 0.068, + 1.245, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.106, 0.072, 0.05, 0.059, 0.003, 0.006, 0.013, 0.266, 0.014, 0.001, + 0.001, 0.001, 0.012, 0.537, 0.001, 0.001, 0.005, 0.13, 0.005, 0.01, 0.006, 0.001, 0.001, 0.002, 0.039, 0.019, + 0.011, 0.012, 0.016, 0.006, 0.015, 0.006, 0.037, 0.532, 0.005, 0.005, 0.003, 0.001, 0.001, 0.002, 0.003, 0.013, + 0.001, 0.004, 0.001, 0.013, 0.001, 0.001, 0.155, 0.023, 0.063, 0.029, 0.039, 0.108, 0.009, 0.019, 0.119, 0.002, + 0.045, 0.036, 0.04, 0.092, 0.525, 0.041, 0.0001, 0.0001, 0.038, 0.074, 0.943, 0.945, 0.0001, 0.0001, 0.009, + 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.013, 0.006, 0.916, 0.332, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.045, 0.0001, 0.0001, 0.002, 0.001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "si": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.314, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 5.928, 0.001, 0.061, 0.001, 0.001, 0.005, 0.0001, 0.009, 0.059, 0.059, 0.0001, + 0.001, 0.185, 0.034, 0.404, 0.009, 0.086, 0.094, 0.056, 0.028, 0.026, 0.03, 0.026, 0.025, 0.029, 0.049, 0.012, + 0.004, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.015, 0.008, 0.015, 0.008, 0.007, 0.006, 0.005, 0.007, 0.015, 0.002, + 0.003, 0.006, 0.01, 0.006, 0.006, 0.01, 0.001, 0.006, 0.015, 0.013, 0.004, 0.004, 0.005, 0.001, 0.001, 0.001, + 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 0.173, 0.028, 0.067, 0.071, 0.23, 0.039, 0.038, 0.081, 0.157, + 0.003, 0.016, 0.086, 0.051, 0.142, 0.142, 0.042, 0.002, 0.132, 0.124, 0.159, 0.054, 0.019, 0.027, 0.007, 0.032, + 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.252, 0.201, 0.275, 1.149, 0.707, 0.497, 0.106, 0.13, 0.003, + 0.08, 2.719, 0.062, 0.013, 0.472, 0.0001, 1.466, 0.446, 0.166, 2.231, 0.489, 1.129, 0.007, 0.144, 0.0001, 0.039, + 0.612, 2.039, 0.034, 0.759, 0.19, 0.015, 0.026, 0.094, 0.008, 0.192, 0.001, 0.005, 0.01, 0.001, 0.537, 0.012, + 0.162, 0.001, 0.275, 0.003, 1.26, 0.067, 0.843, 0.165, 1.921, 0.001, 0.089, 0.809, 0.008, 15.577, 14.437, 1.305, + 0.017, 1.681, 1.481, 0.0001, 0.796, 0.0001, 0.001, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 29.588, 0.0001, 0.504, 0.001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sm": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.213, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 19.463, 0.008, 0.168, 0.0001, 0.003, 0.014, 0.002, 0.885, 0.148, 0.148, 0.0001, + 0.001, 1.0, 0.173, 0.914, 0.009, 0.254, 0.312, 0.179, 0.14, 0.095, 0.115, 0.095, 0.086, 0.112, 0.168, 0.033, + 0.027, 0.006, 0.002, 0.006, 0.005, 0.0001, 0.462, 0.087, 0.119, 0.039, 0.23, 0.233, 0.074, 0.06, 0.345, 0.031, + 0.147, 0.149, 0.348, 0.135, 0.431, 0.236, 0.003, 0.115, 0.459, 0.28, 0.072, 0.088, 0.128, 0.02, 0.007, 0.009, + 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 15.436, 0.147, 0.251, 0.268, 7.552, 1.798, 1.939, 0.261, 7.65, + 0.014, 0.507, 6.117, 2.84, 3.141, 6.14, 1.094, 0.011, 1.189, 2.656, 4.384, 4.707, 0.608, 0.084, 0.018, 0.145, + 0.038, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.05, 0.151, 0.0001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.002, + 0.001, 0.001, 0.003, 0.002, 0.017, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.02, 0.001, 0.001, 0.0001, 0.001, + 0.039, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.011, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.006, 0.001, 0.028, 0.001, 0.004, 0.001, 0.001, 0.003, 0.003, 0.001, 0.003, 0.002, 0.002, 0.0001, + 0.001, 0.002, 0.001, 0.002, 0.086, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.033, 0.176, 0.042, + 0.0001, 0.0001, 0.0001, 0.001, 0.085, 0.001, 0.0001, 0.0001, 0.007, 0.0001, 0.006, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, + 0.046, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "sn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.006, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.427, 0.001, 0.194, 0.0001, 0.001, 0.007, 0.003, 0.024, 0.281, 0.281, 0.0001, + 0.005, 0.597, 0.124, 0.956, 0.038, 0.114, 0.113, 0.073, 0.04, 0.036, 0.036, 0.026, 0.025, 0.034, 0.053, 0.08, + 0.124, 0.002, 0.009, 0.002, 0.006, 0.0001, 0.169, 0.097, 0.234, 0.083, 0.107, 0.043, 0.1, 0.097, 0.095, 0.037, + 0.196, 0.037, 0.454, 0.178, 0.024, 0.119, 0.003, 0.094, 0.231, 0.097, 0.036, 0.089, 0.031, 0.003, 0.009, 0.113, + 0.039, 0.0001, 0.038, 0.0001, 0.002, 0.0001, 12.237, 1.335, 1.505, 2.374, 5.54, 0.412, 1.524, 3.199, 8.126, + 0.115, 3.86, 0.667, 3.205, 6.578, 4.667, 1.202, 0.019, 4.537, 2.41, 2.721, 5.562, 2.325, 2.211, 0.043, 1.41, + 2.325, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.012, 0.003, 0.001, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.017, + 0.001, 0.004, 0.001, 0.004, 0.0001, 0.001, 0.001, 0.01, 0.005, 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.0001, + 0.001, 0.016, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.009, 0.004, 0.001, 0.001, 0.001, 0.001, 0.003, + 0.003, 0.003, 0.004, 0.008, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.004, 0.002, 0.002, 0.002, 0.001, 0.001, + 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.011, 0.016, 0.003, + 0.002, 0.0001, 0.0001, 0.0001, 0.037, 0.008, 0.027, 0.001, 0.001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, + 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "so": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.235, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.454, 0.003, 0.106, 0.0001, 0.001, 0.01, 0.006, 0.044, 0.175, 0.179, 0.001, + 0.006, 0.698, 0.181, 0.663, 0.023, 0.173, 0.237, 0.118, 0.074, 0.068, 0.076, 0.069, 0.062, 0.061, 0.116, 0.103, + 0.039, 0.006, 0.095, 0.008, 0.006, 0.001, 0.277, 0.176, 0.197, 0.21, 0.058, 0.067, 0.135, 0.123, 0.156, 0.069, + 0.122, 0.08, 0.279, 0.092, 0.046, 0.025, 0.078, 0.077, 0.341, 0.096, 0.053, 0.009, 0.145, 0.085, 0.037, 0.009, + 0.058, 0.001, 0.058, 0.0001, 0.009, 0.001, 20.28, 1.752, 0.781, 4.408, 3.807, 0.467, 1.801, 2.804, 6.156, 0.344, + 2.692, 2.981, 1.937, 3.517, 5.007, 0.065, 0.666, 2.59, 2.645, 1.488, 3.47, 0.033, 1.517, 1.277, 3.257, 0.024, + 0.006, 0.007, 0.006, 0.0001, 0.0001, 0.044, 0.021, 0.016, 0.015, 0.092, 0.046, 0.041, 0.026, 0.037, 0.007, + 0.048, 0.005, 0.002, 0.004, 0.027, 0.011, 0.01, 0.009, 0.012, 0.004, 0.002, 0.001, 0.001, 0.002, 0.003, 0.016, + 0.0001, 0.0001, 0.009, 0.011, 0.002, 0.005, 0.026, 0.005, 0.004, 0.02, 0.008, 0.009, 0.004, 0.102, 0.029, 0.015, + 0.023, 0.008, 0.009, 0.018, 0.009, 0.021, 0.011, 0.034, 0.006, 0.02, 0.009, 0.011, 0.006, 0.006, 0.005, 0.024, + 0.019, 0.018, 0.004, 0.003, 0.001, 0.004, 0.0001, 0.0001, 0.03, 0.015, 0.007, 0.003, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, + 0.36, 0.404, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.045, 0.0001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.034, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sq": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.871, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.83, 0.005, 0.212, 0.0001, 0.001, 0.008, 0.002, 0.025, 0.142, 0.143, 0.001, + 0.002, 0.876, 0.197, 0.817, 0.021, 0.247, 0.322, 0.187, 0.096, 0.094, 0.095, 0.084, 0.083, 0.096, 0.185, 0.067, + 0.019, 0.003, 0.004, 0.003, 0.004, 0.0001, 0.232, 0.164, 0.084, 0.121, 0.088, 0.104, 0.113, 0.084, 0.118, 0.051, + 0.274, 0.113, 0.216, 0.178, 0.042, 0.229, 0.027, 0.103, 0.291, 0.126, 0.044, 0.092, 0.017, 0.024, 0.009, 0.037, + 0.024, 0.0001, 0.024, 0.0001, 0.005, 0.001, 5.42, 0.732, 0.432, 2.174, 7.144, 0.635, 1.01, 2.972, 6.09, 2.066, + 2.05, 2.101, 2.386, 4.875, 2.895, 1.724, 0.557, 5.177, 3.826, 5.956, 2.462, 1.012, 0.037, 0.057, 0.423, 0.487, + 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.107, 0.006, 0.004, 0.005, 0.003, 0.002, 0.002, 0.017, 0.002, 0.002, + 0.001, 0.01, 0.001, 0.002, 0.002, 0.001, 0.001, 0.008, 0.001, 0.019, 0.002, 0.001, 0.001, 0.001, 0.003, 0.015, + 0.001, 0.001, 0.032, 0.031, 0.002, 0.003, 0.048, 0.005, 0.005, 0.002, 0.005, 0.002, 0.002, 0.098, 0.005, 0.011, + 0.001, 5.762, 0.002, 0.004, 0.002, 0.002, 0.006, 0.006, 0.012, 0.004, 0.005, 0.003, 0.003, 0.002, 0.003, 0.003, + 0.003, 0.004, 0.006, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.063, 5.926, 0.008, 0.006, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.023, 0.009, 0.015, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.007, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.106, 0.002, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "srn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.777, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 18.537, 0.004, 0.236, 0.0001, 0.0001, 0.009, 0.0001, 0.081, 0.222, 0.175, + 0.0001, 0.0001, 0.673, 0.268, 1.397, 0.005, 0.412, 0.368, 0.15, 0.085, 0.102, 0.103, 0.102, 0.071, 0.07, 0.14, + 0.041, 0.016, 0.015, 0.002, 0.015, 0.0001, 0.0001, 0.384, 0.184, 0.068, 0.478, 0.061, 0.057, 0.098, 0.039, + 0.172, 0.08, 0.05, 0.052, 0.288, 0.1, 0.075, 0.116, 0.004, 0.117, 0.271, 0.146, 0.008, 0.023, 0.047, 0.004, + 0.014, 0.007, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 8.95, 2.176, 0.221, 2.431, 7.818, 1.651, 1.874, + 0.226, 8.782, 0.064, 2.479, 1.698, 2.095, 8.318, 4.117, 1.376, 0.003, 4.52, 3.577, 2.919, 3.347, 0.156, 1.329, + 0.018, 1.038, 0.054, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.042, 0.007, 0.007, 0.002, 0.003, 0.002, 0.003, + 0.006, 0.003, 0.001, 0.002, 0.001, 0.006, 0.003, 0.002, 0.005, 0.004, 0.002, 0.001, 0.035, 0.002, 0.002, 0.002, + 0.006, 0.002, 0.002, 0.002, 0.002, 0.002, 0.007, 0.002, 0.002, 0.024, 0.012, 0.002, 0.005, 0.004, 0.007, 0.002, + 0.002, 0.012, 0.012, 0.006, 0.009, 0.002, 0.021, 0.005, 0.003, 0.003, 0.003, 0.034, 0.007, 0.002, 0.002, 0.002, + 0.0001, 0.005, 0.007, 0.019, 0.009, 0.005, 0.003, 0.004, 0.012, 0.0001, 0.0001, 0.029, 0.098, 0.021, 0.025, + 0.002, 0.002, 0.002, 0.005, 0.001, 0.003, 0.0001, 0.0001, 0.01, 0.004, 0.009, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.053, + 0.0001, 0.0001, 0.016, 0.016, 0.0001, 0.01, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "ss": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.873, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 10.454, 0.015, 0.301, 0.001, 0.003, 0.01, 0.003, 0.035, 0.203, 0.202, 0.001, + 0.0001, 0.685, 0.328, 0.962, 0.019, 0.22, 0.221, 0.137, 0.048, 0.066, 0.07, 0.054, 0.061, 0.082, 0.144, 0.105, + 0.052, 0.007, 0.003, 0.008, 0.003, 0.0001, 0.231, 0.18, 0.097, 0.094, 0.111, 0.055, 0.072, 0.058, 0.259, 0.082, + 0.196, 0.342, 0.348, 0.356, 0.028, 0.088, 0.003, 0.097, 0.319, 0.164, 0.113, 0.024, 0.061, 0.025, 0.043, 0.044, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 10.793, 2.656, 0.706, 1.31, 8.505, 1.004, 2.081, 2.919, 7.091, + 0.258, 4.271, 5.701, 2.568, 6.606, 3.595, 0.825, 0.028, 0.782, 3.437, 3.569, 4.546, 0.696, 2.323, 0.017, 1.567, + 0.734, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.037, 0.016, 0.007, 0.01, 0.014, 0.008, 0.007, 0.004, 0.009, + 0.007, 0.013, 0.004, 0.003, 0.014, 0.015, 0.004, 0.003, 0.006, 0.003, 0.008, 0.006, 0.002, 0.007, 0.004, 0.002, + 0.004, 0.007, 0.002, 0.01, 0.003, 0.007, 0.003, 0.09, 0.039, 0.013, 0.006, 0.01, 0.005, 0.005, 0.023, 0.007, + 0.024, 0.007, 0.009, 0.005, 0.109, 0.006, 0.007, 0.018, 0.014, 0.009, 0.035, 0.024, 0.01, 0.007, 0.005, 0.015, + 0.006, 0.031, 0.01, 0.005, 0.01, 0.008, 0.005, 0.0001, 0.0001, 0.085, 0.273, 0.013, 0.008, 0.0001, 0.0001, + 0.0001, 0.005, 0.001, 0.002, 0.002, 0.0001, 0.003, 0.002, 0.061, 0.022, 0.001, 0.0001, 0.0001, 0.003, 0.002, + 0.003, 0.059, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.042, 0.021, 0.034, 0.0001, 0.001, 0.002, + 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "st": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.411, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.42, 0.002, 0.079, 0.0001, 0.001, 0.016, 0.003, 0.083, 0.165, 0.167, 0.001, + 0.001, 0.789, 0.143, 0.973, 0.021, 0.355, 0.325, 0.221, 0.104, 0.116, 0.113, 0.108, 0.098, 0.108, 0.15, 0.061, + 0.016, 0.007, 0.005, 0.006, 0.001, 0.0001, 0.408, 0.587, 0.149, 0.148, 0.115, 0.088, 0.067, 0.172, 0.071, 0.055, + 0.339, 0.212, 0.509, 0.175, 0.046, 0.141, 0.01, 0.115, 0.317, 0.165, 0.126, 0.071, 0.047, 0.0001, 0.019, 0.026, + 0.011, 0.0001, 0.01, 0.0001, 0.005, 0.0001, 12.26, 2.144, 0.403, 1.165, 9.234, 0.827, 1.837, 3.801, 3.704, + 0.349, 2.878, 4.66, 2.188, 4.177, 7.024, 1.54, 0.085, 2.344, 4.067, 4.22, 1.114, 0.282, 1.372, 0.049, 0.996, + 0.173, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.013, 0.01, 0.009, 0.0001, 0.005, 0.007, 0.001, 0.001, 0.001, + 0.002, 0.001, 0.001, 0.0001, 0.013, 0.003, 0.001, 0.009, 0.001, 0.001, 0.004, 0.005, 0.0001, 0.0001, 0.002, + 0.001, 0.01, 0.006, 0.004, 0.004, 0.003, 0.0001, 0.0001, 0.049, 0.052, 0.003, 0.003, 0.006, 0.002, 0.001, 0.006, + 0.002, 0.022, 0.037, 0.001, 0.003, 0.01, 0.0001, 0.001, 0.004, 0.002, 0.001, 0.03, 0.056, 0.001, 0.001, 0.001, + 0.004, 0.001, 0.002, 0.007, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.046, 0.167, 0.019, 0.086, 0.0001, + 0.003, 0.001, 0.01, 0.001, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.007, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.008, 0.013, 0.0001, 0.001, + 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "stq": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.516, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.229, 0.003, 0.416, 0.007, 0.001, 0.015, 0.001, 0.047, 0.208, 0.207, 0.008, + 0.003, 0.814, 0.425, 1.065, 0.021, 0.376, 0.623, 0.234, 0.148, 0.183, 0.183, 0.241, 0.167, 0.231, 0.214, 0.089, + 0.019, 0.072, 0.007, 0.069, 0.006, 0.0001, 0.293, 0.408, 0.089, 0.454, 0.155, 0.334, 0.214, 0.273, 0.205, 0.248, + 0.241, 0.264, 0.372, 0.199, 0.14, 0.214, 0.005, 0.245, 0.798, 0.226, 0.158, 0.049, 0.246, 0.003, 0.006, 0.016, + 0.02, 0.0001, 0.02, 0.0001, 0.001, 0.0001, 3.929, 0.935, 0.799, 3.858, 10.176, 1.298, 1.131, 1.308, 4.615, + 0.883, 2.156, 2.674, 1.358, 6.685, 4.841, 0.816, 0.012, 4.246, 3.53, 4.621, 4.666, 0.159, 1.055, 0.042, 0.141, + 0.124, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.049, 0.004, 0.003, 0.001, 0.07, 0.001, 0.001, 0.001, 0.001, + 0.002, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.004, 0.002, 0.001, 0.003, 0.001, 0.009, + 0.014, 0.001, 0.002, 0.008, 0.004, 0.005, 0.004, 0.021, 0.009, 0.015, 0.001, 2.394, 0.001, 0.001, 0.002, 0.004, + 0.014, 0.003, 0.002, 0.001, 0.007, 0.002, 0.002, 0.004, 0.002, 0.026, 0.006, 0.003, 0.001, 0.134, 0.001, 0.003, + 0.002, 0.004, 0.004, 0.245, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.038, 2.918, 0.006, 0.011, 0.0001, 0.0001, + 0.0001, 0.004, 0.001, 0.002, 0.001, 0.0001, 0.013, 0.006, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.048, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "su": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.293, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.195, 0.001, 0.272, 0.0001, 0.001, 0.006, 0.001, 0.02, 0.129, 0.129, 0.0001, + 0.002, 1.05, 0.168, 1.046, 0.037, 0.48, 0.412, 0.411, 0.202, 0.173, 0.175, 0.161, 0.145, 0.144, 0.197, 0.036, + 0.015, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.394, 0.22, 0.151, 0.149, 0.042, 0.047, 0.094, 0.073, 0.227, 0.16, + 0.402, 0.071, 0.278, 0.12, 0.097, 0.305, 0.014, 0.09, 0.368, 0.175, 0.05, 0.031, 0.057, 0.016, 0.027, 0.009, + 0.008, 0.0001, 0.008, 0.0001, 0.005, 0.0001, 13.373, 1.612, 0.819, 2.725, 4.093, 0.314, 2.685, 1.583, 5.788, + 0.997, 2.729, 2.341, 2.09, 7.706, 2.801, 1.889, 0.016, 3.889, 3.272, 4.14, 4.781, 0.134, 0.635, 0.029, 0.708, + 0.032, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.025, 0.005, 0.003, 0.004, 0.006, 0.004, 0.004, 0.002, 0.004, + 0.073, 0.003, 0.001, 0.001, 0.004, 0.007, 0.003, 0.003, 0.002, 0.003, 0.007, 0.008, 0.001, 0.001, 0.001, 0.001, + 0.004, 0.001, 0.001, 0.004, 0.004, 0.001, 0.001, 0.047, 0.002, 0.001, 0.002, 0.004, 0.002, 0.002, 0.006, 0.003, + 2.276, 0.003, 0.002, 0.001, 0.002, 0.007, 0.002, 0.004, 0.005, 0.002, 0.002, 0.001, 0.001, 0.002, 0.001, 0.002, + 0.003, 0.002, 0.001, 0.002, 0.033, 0.001, 0.033, 0.0001, 0.0001, 0.051, 2.355, 0.003, 0.004, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.02, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.007, 0.025, 0.004, 0.001, + 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.032, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "sw": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.454, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.93, 0.002, 0.217, 0.002, 0.001, 0.01, 0.003, 0.027, 0.171, 0.171, 0.001, + 0.001, 0.703, 0.109, 0.942, 0.015, 0.41, 0.383, 0.266, 0.126, 0.108, 0.126, 0.108, 0.107, 0.119, 0.201, 0.062, + 0.024, 0.003, 0.004, 0.003, 0.003, 0.0001, 0.226, 0.167, 0.122, 0.086, 0.058, 0.057, 0.065, 0.116, 0.13, 0.09, + 0.638, 0.08, 0.504, 0.137, 0.044, 0.113, 0.006, 0.074, 0.173, 0.147, 0.165, 0.059, 0.218, 0.013, 0.04, 0.023, + 0.04, 0.0001, 0.04, 0.001, 0.001, 0.001, 16.478, 1.326, 0.611, 1.343, 3.374, 0.678, 1.131, 2.383, 9.629, 0.827, + 4.598, 2.609, 3.253, 5.284, 3.187, 0.805, 0.008, 1.616, 2.094, 2.468, 4.443, 0.427, 3.161, 0.026, 2.095, 1.273, + 0.001, 0.006, 0.001, 0.0001, 0.0001, 0.04, 0.005, 0.004, 0.002, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, + 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.013, 0.002, 0.001, 0.001, 0.001, 0.002, 0.006, 0.001, + 0.001, 0.009, 0.008, 0.001, 0.004, 0.009, 0.003, 0.002, 0.002, 0.003, 0.001, 0.001, 0.005, 0.003, 0.009, 0.001, + 0.002, 0.001, 0.002, 0.001, 0.002, 0.005, 0.009, 0.009, 0.004, 0.002, 0.003, 0.004, 0.001, 0.004, 0.003, 0.003, + 0.003, 0.006, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.018, 0.029, 0.009, 0.005, 0.0001, 0.0001, 0.0001, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.014, 0.007, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.005, 0.012, + 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.038, 0.0001, 0.0001, 0.002, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "szl": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.884, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.63, 0.002, 0.452, 0.0001, 0.0001, 0.012, 0.001, 0.026, 0.296, 0.296, 0.001, + 0.001, 1.094, 0.318, 1.181, 0.015, 0.332, 0.469, 0.289, 0.138, 0.131, 0.151, 0.118, 0.131, 0.157, 0.273, 0.087, + 0.014, 0.006, 0.003, 0.006, 0.0001, 0.0001, 0.207, 0.209, 0.155, 0.118, 0.048, 0.111, 0.139, 0.08, 0.122, 0.125, + 0.213, 0.123, 0.287, 0.122, 0.062, 0.309, 0.005, 0.156, 0.329, 0.126, 0.154, 0.05, 0.233, 0.034, 0.017, 0.083, + 0.004, 0.0001, 0.004, 0.0001, 0.006, 0.001, 5.741, 0.894, 2.016, 2.128, 5.35, 0.327, 1.279, 0.968, 3.438, 2.841, + 2.633, 2.099, 2.293, 3.364, 5.857, 1.423, 0.012, 3.389, 2.85, 2.58, 2.277, 0.102, 3.144, 0.017, 3.623, 2.205, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.191, 0.035, 0.624, 0.044, 0.945, 0.014, 0.009, 0.333, 0.008, 0.003, + 0.006, 0.005, 0.012, 0.221, 0.005, 0.196, 0.006, 0.005, 0.003, 0.168, 0.01, 0.003, 0.005, 0.005, 0.005, 0.109, + 0.059, 0.562, 0.005, 0.005, 0.004, 0.006, 0.062, 0.111, 0.006, 0.016, 0.01, 0.004, 0.004, 0.012, 0.011, 0.03, + 0.005, 0.012, 0.003, 0.012, 0.008, 1.67, 0.032, 0.015, 0.058, 0.035, 0.048, 0.018, 0.012, 0.004, 0.02, 0.013, + 0.335, 0.026, 0.282, 0.022, 0.098, 0.006, 0.0001, 0.0001, 0.109, 0.208, 0.455, 5.073, 0.0001, 0.001, 0.0001, + 0.008, 0.003, 0.003, 0.004, 0.0001, 0.015, 0.008, 0.161, 0.06, 0.003, 0.002, 0.0001, 0.003, 0.001, 0.009, 0.025, + 0.019, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.011, 0.01, 0.176, 0.006, 0.001, 0.005, 0.003, 0.002, + 0.001, 0.001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ta": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.357, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 3.862, 0.001, 0.077, 0.0001, 0.001, 0.006, 0.001, 0.007, 0.055, 0.056, 0.0001, + 0.001, 0.234, 0.03, 0.384, 0.005, 0.084, 0.106, 0.063, 0.029, 0.028, 0.034, 0.027, 0.032, 0.031, 0.052, 0.017, + 0.006, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.008, 0.004, 0.008, 0.004, 0.004, 0.003, 0.005, 0.004, 0.006, 0.002, + 0.003, 0.003, 0.005, 0.004, 0.003, 0.008, 0.0001, 0.004, 0.008, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, + 0.0001, 0.006, 0.0001, 0.006, 0.0001, 0.002, 0.0001, 0.062, 0.006, 0.017, 0.014, 0.042, 0.007, 0.009, 0.018, + 0.038, 0.001, 0.006, 0.024, 0.018, 0.035, 0.032, 0.011, 0.001, 0.036, 0.022, 0.032, 0.017, 0.005, 0.004, 0.002, + 0.01, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.122, 2.149, 0.144, 0.01, 0.0001, 0.297, 0.436, 0.597, + 0.764, 0.136, 0.24, 0.226, 0.005, 5.298, 0.158, 0.027, 0.013, 0.0001, 0.078, 0.014, 0.0001, 2.36, 0.0001, + 0.0001, 0.001, 0.171, 0.627, 0.0001, 0.037, 0.002, 0.021, 1.319, 0.014, 0.0001, 0.001, 0.32, 2.012, 0.001, + 0.001, 0.0001, 0.539, 0.989, 1.521, 0.0001, 0.0001, 0.001, 23.215, 10.185, 1.322, 0.801, 1.028, 0.757, 0.189, + 0.942, 0.0001, 0.015, 0.06, 0.015, 0.0001, 0.0001, 0.0001, 0.0001, 1.18, 2.177, 0.0001, 0.0001, 0.016, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 31.245, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001 + ], + "tcy": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.391, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 4.751, 0.001, 0.026, 0.0001, 0.0001, 0.002, 0.0001, 0.028, 0.048, 0.047, 0.0001, + 0.001, 0.244, 0.028, 0.533, 0.012, 0.014, 0.02, 0.01, 0.005, 0.005, 0.007, 0.006, 0.004, 0.008, 0.009, 0.009, + 0.003, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 0.001, 0.001, 0.02, 0.002, 0.008, 0.006, 0.018, 0.002, 0.005, + 0.006, 0.017, 0.0001, 0.003, 0.009, 0.008, 0.014, 0.015, 0.008, 0.0001, 0.013, 0.012, 0.015, 0.006, 0.002, + 0.005, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.354, 1.789, 1.221, 0.031, 0.0001, 0.268, + 1.686, 0.484, 0.152, 0.21, 0.745, 0.196, 0.087, 4.125, 0.064, 0.014, 0.014, 0.0001, 0.109, 0.011, 0.001, 1.28, + 0.033, 0.613, 0.012, 0.007, 0.23, 0.003, 0.404, 0.002, 0.011, 0.433, 0.058, 1.007, 0.002, 0.198, 1.312, 0.064, + 1.397, 0.124, 1.439, 0.012, 1.248, 0.035, 0.624, 0.105, 0.769, 0.62, 1.755, 0.0001, 22.872, 9.408, 0.0001, + 0.629, 0.164, 0.121, 0.665, 0.124, 0.0001, 0.0001, 0.003, 0.0001, 1.377, 1.63, 0.0001, 0.0001, 0.05, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 30.955, 0.0001, 0.194, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001 + ], + "te": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.34, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 4.746, 0.003, 0.051, 0.0001, 0.001, 0.003, 0.002, 0.007, 0.042, 0.043, 0.0001, + 0.001, 0.336, 0.028, 0.611, 0.018, 0.129, 0.152, 0.069, 0.038, 0.034, 0.073, 0.03, 0.032, 0.034, 0.047, 0.02, + 0.007, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.008, 0.004, 0.006, 0.005, 0.003, 0.003, 0.002, 0.002, 0.006, 0.001, + 0.002, 0.003, 0.005, 0.003, 0.002, 0.005, 0.0001, 0.003, 0.008, 0.005, 0.003, 0.002, 0.002, 0.001, 0.0001, + 0.0001, 0.006, 0.0001, 0.007, 0.0001, 0.005, 0.0001, 0.053, 0.008, 0.019, 0.022, 0.056, 0.009, 0.01, 0.021, + 0.046, 0.001, 0.004, 0.022, 0.015, 0.038, 0.038, 0.014, 0.0001, 0.036, 0.036, 0.045, 0.017, 0.006, 0.006, 0.002, + 0.007, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.485, 1.801, 1.898, 0.051, 0.0001, 0.236, 0.427, 0.575, + 0.238, 0.222, 0.152, 0.685, 0.105, 2.799, 0.055, 0.027, 0.006, 0.0001, 0.047, 0.007, 0.005, 1.329, 0.049, 0.668, + 0.014, 0.002, 0.428, 0.004, 0.25, 0.001, 0.004, 0.537, 0.039, 0.598, 0.002, 0.137, 0.864, 0.099, 0.843, 0.149, + 1.628, 0.0001, 0.909, 0.085, 0.267, 0.128, 0.942, 0.804, 25.531, 7.165, 1.487, 0.074, 0.0001, 0.877, 0.211, + 0.153, 0.855, 0.145, 0.0001, 0.001, 0.0001, 0.0001, 2.169, 2.359, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.736, 0.0001, + 0.069, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "tet": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.506, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.056, 0.014, 0.345, 0.0001, 0.004, 0.018, 0.001, 0.455, 0.383, 0.382, 0.001, + 0.004, 1.067, 0.53, 0.968, 0.029, 0.443, 0.39, 0.316, 0.132, 0.112, 0.137, 0.105, 0.106, 0.119, 0.181, 0.186, + 0.018, 0.015, 0.005, 0.015, 0.003, 0.0001, 0.338, 0.226, 0.145, 0.169, 0.132, 0.156, 0.098, 0.111, 0.215, 0.061, + 0.136, 0.43, 0.301, 0.181, 0.101, 0.266, 0.01, 0.137, 0.345, 0.37, 0.107, 0.065, 0.041, 0.021, 0.008, 0.014, + 0.01, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 11.569, 1.502, 0.408, 2.068, 6.067, 0.587, 0.66, 2.225, 7.509, 0.16, + 2.246, 2.814, 2.311, 6.307, 4.401, 1.282, 0.035, 4.022, 4.063, 3.545, 4.826, 0.518, 0.1, 0.064, 0.126, 0.341, + 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.318, 0.081, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.015, 0.001, 0.0001, 0.0001, 0.001, 0.004, + 0.275, 0.001, 0.0001, 0.014, 0.013, 0.001, 0.002, 0.021, 0.254, 0.002, 0.025, 0.0001, 0.0001, 0.003, 0.02, + 0.002, 0.389, 0.006, 0.001, 0.001, 0.167, 0.001, 0.001, 0.002, 0.048, 0.071, 0.284, 0.01, 0.003, 0.001, 0.0001, + 0.001, 0.001, 0.076, 0.003, 0.014, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.1, 1.362, 0.004, 0.006, 0.0001, + 0.0001, 0.0001, 0.009, 0.011, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 0.006, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.316, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "tg": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.272, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.893, 0.001, 0.026, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.324, 0.326, 0.0001, + 0.001, 0.765, 0.105, 0.581, 0.006, 0.139, 0.257, 0.13, 0.073, 0.063, 0.072, 0.065, 0.068, 0.082, 0.185, 0.026, + 0.048, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.026, 0.01, 0.018, 0.007, 0.005, 0.01, 0.006, 0.007, 0.018, 0.002, + 0.005, 0.008, 0.009, 0.006, 0.004, 0.009, 0.001, 0.007, 0.015, 0.007, 0.003, 0.006, 0.004, 0.006, 0.002, 0.002, + 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.081, 0.01, 0.03, 0.023, 0.086, 0.012, 0.015, 0.021, 0.065, + 0.002, 0.009, 0.037, 0.017, 0.055, 0.061, 0.017, 0.001, 0.07, 0.039, 0.054, 0.023, 0.01, 0.007, 0.003, 0.013, + 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.968, 1.483, 1.764, 1.455, 0.398, 0.384, 0.008, 0.116, 0.704, + 0.002, 0.17, 0.01, 0.024, 0.035, 0.045, 0.663, 0.178, 0.263, 0.119, 0.126, 0.303, 0.007, 0.009, 0.022, 0.136, + 0.003, 0.143, 0.343, 0.148, 0.063, 0.071, 0.071, 0.134, 0.159, 0.101, 0.347, 0.121, 0.05, 0.002, 0.026, 0.059, + 0.003, 0.003, 0.057, 0.003, 0.035, 0.012, 0.164, 5.899, 1.075, 1.071, 1.816, 2.336, 1.339, 0.082, 0.882, 4.885, + 0.258, 1.014, 1.438, 1.445, 2.22, 3.885, 0.208, 0.0001, 0.0001, 0.132, 0.006, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.001, 30.166, 10.131, 1.965, 0.481, 0.0001, 0.0001, + 0.0001, 0.0001, 0.024, 0.016, 0.001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.209, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ti": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.164, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.862, 0.026, 0.05, 0.0001, 0.0001, 0.012, 0.0001, 0.044, 0.1, 0.1, 0.0001, + 0.0001, 0.075, 0.114, 0.14, 0.02, 0.098, 0.121, 0.073, 0.033, 0.026, 0.04, 0.027, 0.03, 0.029, 0.042, 0.024, + 0.004, 0.001, 0.013, 0.001, 0.007, 0.0001, 0.018, 0.013, 0.015, 0.007, 0.006, 0.007, 0.011, 0.013, 0.022, 0.004, + 0.004, 0.024, 0.018, 0.012, 0.005, 0.015, 0.004, 0.01, 0.013, 0.022, 0.007, 0.009, 0.006, 0.002, 0.004, 0.002, + 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.329, 0.063, 0.099, 0.16, 0.451, 0.14, 0.111, 0.211, 0.297, + 0.027, 0.053, 0.155, 0.097, 0.283, 0.275, 0.071, 0.007, 0.228, 0.261, 0.255, 0.122, 0.059, 0.08, 0.007, 0.069, + 0.014, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.358, 0.069, 0.074, 0.236, 0.007, 0.331, 0.023, 0.001, 9.303, + 5.576, 6.47, 5.805, 1.549, 3.066, 0.251, 0.003, 0.505, 0.172, 0.135, 1.034, 0.015, 2.293, 0.054, 0.001, 0.75, + 0.233, 0.32, 0.51, 0.12, 1.725, 0.08, 0.002, 0.83, 0.546, 0.753, 1.425, 0.111, 2.053, 0.138, 0.011, 0.764, + 0.373, 0.244, 0.731, 0.034, 1.854, 0.258, 0.004, 1.053, 0.166, 0.551, 0.69, 0.031, 2.007, 0.179, 0.005, 0.189, + 0.048, 0.045, 0.156, 0.011, 0.447, 0.067, 0.002, 0.0001, 0.0001, 0.386, 0.04, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.027, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, + 0.006, 0.008, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 27.967, 0.209, 0.0001, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "tk": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.842, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 10.847, 0.005, 0.052, 0.0001, 0.001, 0.008, 0.001, 0.006, 0.121, 0.125, 0.004, + 0.002, 0.691, 0.455, 1.024, 0.011, 0.191, 0.306, 0.153, 0.096, 0.091, 0.095, 0.077, 0.079, 0.095, 0.155, 0.055, + 0.012, 0.028, 0.003, 0.028, 0.005, 0.0001, 0.227, 0.204, 0.012, 0.086, 0.083, 0.04, 0.177, 0.112, 0.174, 0.027, + 0.109, 0.037, 0.173, 0.054, 0.141, 0.071, 0.001, 0.074, 0.173, 0.153, 0.029, 0.028, 0.04, 0.045, 0.029, 0.016, + 0.01, 0.0001, 0.01, 0.001, 0.003, 0.0001, 8.711, 1.574, 0.069, 3.499, 5.666, 0.119, 2.22, 0.895, 5.266, 0.476, + 2.165, 5.087, 2.1, 4.83, 1.754, 1.161, 0.002, 5.326, 1.953, 2.216, 1.612, 0.014, 0.863, 0.003, 4.905, 0.889, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.208, 0.022, 0.019, 0.011, 0.017, 0.007, 0.003, 0.027, 1.247, 0.001, + 0.0001, 0.008, 0.005, 0.003, 0.002, 0.006, 0.003, 0.005, 0.002, 0.04, 0.02, 0.001, 0.017, 0.002, 0.001, 0.002, + 0.001, 0.001, 0.068, 0.139, 0.083, 1.114, 0.015, 0.004, 0.009, 0.002, 0.694, 0.003, 0.003, 0.67, 0.001, 0.002, + 0.0001, 0.027, 0.0001, 0.192, 0.001, 0.002, 0.056, 0.114, 0.02, 0.061, 0.013, 0.043, 0.813, 0.006, 0.038, 0.007, + 0.016, 0.096, 0.984, 2.385, 0.053, 0.019, 0.0001, 0.0001, 0.268, 5.753, 0.012, 2.464, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.324, 0.111, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.054, 0.182, 0.0001, 0.005, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "tl": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.527, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.015, 0.006, 0.416, 0.001, 0.001, 0.006, 0.002, 0.043, 0.2, 0.202, 0.001, + 0.002, 0.702, 0.264, 0.789, 0.017, 0.219, 0.272, 0.17, 0.08, 0.075, 0.082, 0.072, 0.075, 0.087, 0.155, 0.061, + 0.022, 0.066, 0.004, 0.066, 0.002, 0.0001, 0.555, 0.199, 0.186, 0.134, 0.118, 0.059, 0.112, 0.181, 0.214, 0.066, + 0.204, 0.127, 0.268, 0.176, 0.063, 0.292, 0.011, 0.11, 0.398, 0.188, 0.06, 0.045, 0.055, 0.008, 0.035, 0.014, + 0.016, 0.0001, 0.015, 0.001, 0.003, 0.0001, 16.44, 1.457, 0.382, 1.246, 2.379, 0.123, 6.741, 1.192, 6.121, + 0.033, 2.118, 3.173, 2.569, 9.845, 3.868, 2.142, 0.019, 2.313, 4.125, 3.402, 2.226, 0.121, 0.559, 0.032, 2.131, + 0.078, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.038, 0.008, 0.005, 0.004, 0.004, 0.003, 0.002, 0.002, 0.004, + 0.002, 0.002, 0.002, 0.003, 0.007, 0.003, 0.002, 0.004, 0.004, 0.002, 0.014, 0.006, 0.001, 0.002, 0.001, 0.002, + 0.008, 0.001, 0.002, 0.013, 0.007, 0.002, 0.002, 0.028, 0.01, 0.003, 0.002, 0.004, 0.002, 0.002, 0.004, 0.003, + 0.01, 0.002, 0.004, 0.002, 0.008, 0.002, 0.002, 0.005, 0.01, 0.003, 0.007, 0.003, 0.003, 0.002, 0.002, 0.006, + 0.003, 0.004, 0.003, 0.005, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.029, 0.045, 0.007, 0.011, 0.001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.012, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.005, 0.008, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.012, 0.037, 0.005, 0.001, 0.003, + 0.002, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "tn": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.716, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 17.981, 0.003, 0.08, 0.013, 0.001, 0.009, 0.002, 0.01, 0.075, 0.075, 0.0001, + 0.0001, 0.66, 0.106, 0.757, 0.034, 0.2, 0.226, 0.113, 0.036, 0.039, 0.039, 0.04, 0.035, 0.043, 0.09, 0.021, + 0.015, 0.01, 0.005, 0.011, 0.004, 0.0001, 0.148, 0.357, 0.071, 0.097, 0.07, 0.054, 0.125, 0.028, 0.051, 0.019, + 0.166, 0.104, 0.374, 0.087, 0.085, 0.102, 0.001, 0.088, 0.173, 0.113, 0.019, 0.017, 0.023, 0.006, 0.007, 0.021, + 0.023, 0.0001, 0.022, 0.0001, 0.004, 0.0001, 12.488, 2.445, 0.191, 1.643, 9.389, 0.795, 4.171, 1.899, 3.702, + 0.312, 2.67, 5.097, 2.631, 4.499, 8.158, 1.075, 0.008, 1.917, 4.118, 4.684, 0.837, 0.048, 2.161, 0.014, 0.955, + 0.029, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.0001, + 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.034, 0.011, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.036, 0.008, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "to": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.293, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.821, 0.001, 0.44, 0.0001, 0.0001, 0.001, 0.005, 0.111, 0.238, 0.237, 0.002, + 0.0001, 0.847, 0.076, 1.066, 0.045, 0.084, 0.141, 0.063, 0.039, 0.037, 0.032, 0.036, 0.05, 0.065, 0.067, 0.09, + 0.023, 0.003, 0.011, 0.005, 0.027, 0.0001, 0.126, 0.034, 0.039, 0.011, 0.049, 0.193, 0.01, 0.178, 0.123, 0.01, + 0.599, 0.145, 0.204, 0.188, 0.245, 0.136, 0.001, 0.012, 0.185, 0.547, 0.059, 0.124, 0.026, 0.001, 0.005, 0.001, + 0.004, 0.0001, 0.005, 0.0001, 0.002, 0.001, 10.579, 0.223, 0.423, 0.627, 6.707, 1.724, 1.525, 3.199, 6.545, + 0.014, 3.573, 2.547, 1.814, 3.859, 6.712, 1.277, 0.01, 0.909, 1.504, 3.555, 4.441, 0.529, 0.312, 0.02, 0.255, + 0.009, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.028, 0.432, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.082, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.183, 0.003, 0.0001, + 0.0001, 0.001, 0.011, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.057, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.0001, 0.0001, 0.002, 0.001, 0.078, 0.0001, 0.015, 0.0001, 0.0001, 0.013, 0.0001, 0.001, 0.005, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 4.517, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.022, 0.094, 0.659, 0.119, 0.0001, 0.0001, 0.0001, 0.0001, 4.513, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "tpi": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.506, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.422, 0.004, 0.225, 0.0001, 0.0001, 0.006, 0.0001, 0.033, 0.226, 0.227, 0.001, + 0.0001, 0.976, 0.07, 1.357, 0.011, 0.339, 0.409, 0.202, 0.102, 0.113, 0.106, 0.09, 0.101, 0.134, 0.258, 0.112, + 0.01, 0.016, 0.001, 0.016, 0.001, 0.0001, 0.28, 0.281, 0.358, 0.108, 0.184, 0.096, 0.132, 0.102, 0.251, 0.103, + 0.247, 0.515, 0.27, 0.273, 0.17, 0.405, 0.016, 0.129, 0.696, 0.311, 0.02, 0.133, 0.076, 0.006, 0.097, 0.011, + 0.006, 0.0001, 0.006, 0.0001, 0.003, 0.0001, 9.267, 1.534, 0.295, 1.028, 5.418, 0.186, 3.091, 0.44, 8.286, 0.1, + 1.968, 5.697, 3.075, 7.815, 5.428, 2.623, 0.013, 2.618, 3.22, 3.51, 1.911, 0.537, 0.798, 0.013, 0.388, 0.104, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.026, 0.016, 0.007, 0.003, 0.007, 0.001, 0.002, 0.003, 0.001, 0.001, + 0.001, 0.002, 0.006, 0.002, 0.001, 0.001, 0.004, 0.002, 0.001, 0.01, 0.002, 0.002, 0.002, 0.003, 0.001, 0.004, + 0.001, 0.005, 0.009, 0.009, 0.003, 0.002, 0.021, 0.037, 0.001, 0.006, 0.0001, 0.001, 0.001, 0.002, 0.002, 0.013, + 0.005, 0.003, 0.004, 0.024, 0.002, 0.002, 0.006, 0.026, 0.007, 0.298, 0.002, 0.005, 0.003, 0.003, 0.01, 0.004, + 0.011, 0.015, 0.005, 0.005, 0.003, 0.004, 0.0001, 0.0001, 0.019, 0.408, 0.007, 0.009, 0.0001, 0.001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.02, 0.011, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.004, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.012, 0.021, 0.009, 0.003, 0.009, 0.003, + 0.001, 0.001, 0.002, 0.004, 0.003, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ts": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.117, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.445, 0.004, 0.183, 0.0001, 0.0001, 0.006, 0.001, 0.136, 0.107, 0.107, 0.0001, + 0.0001, 0.868, 0.158, 0.838, 0.021, 0.152, 0.161, 0.081, 0.037, 0.038, 0.052, 0.045, 0.043, 0.056, 0.092, 0.041, + 0.025, 0.03, 0.001, 0.03, 0.006, 0.0001, 0.18, 0.088, 0.068, 0.084, 0.075, 0.029, 0.061, 0.137, 0.055, 0.032, + 0.132, 0.116, 0.387, 0.232, 0.02, 0.062, 0.002, 0.075, 0.171, 0.121, 0.04, 0.219, 0.021, 0.119, 0.045, 0.021, + 0.003, 0.0001, 0.003, 0.0001, 0.002, 0.005, 13.463, 1.384, 0.275, 1.092, 4.958, 0.572, 1.347, 3.614, 7.958, + 0.047, 4.285, 4.291, 2.768, 5.921, 3.615, 0.489, 0.025, 2.056, 2.585, 2.874, 4.929, 1.994, 3.082, 0.68, 2.172, + 0.64, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.055, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.005, 0.001, 0.0001, 0.0001, + 0.001, 0.0001, 0.031, 0.0001, 0.001, 0.008, 0.008, 0.0001, 0.0001, 0.05, 0.004, 0.002, 0.001, 0.0001, 0.0001, + 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.001, 0.003, 0.0001, 0.002, 0.001, 0.005, 0.002, 0.011, 0.002, + 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.002, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.051, 0.023, + 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.018, 0.006, 0.002, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.054, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "tt": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.086, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.219, 0.001, 0.085, 0.0001, 0.0001, 0.04, 0.0001, 0.002, 0.22, 0.221, 0.0001, + 0.008, 0.529, 0.164, 0.713, 0.007, 0.223, 0.276, 0.185, 0.093, 0.09, 0.084, 0.067, 0.069, 0.089, 0.159, 0.097, + 0.008, 0.002, 0.001, 0.002, 0.003, 0.0001, 0.01, 0.009, 0.017, 0.009, 0.006, 0.003, 0.002, 0.003, 0.017, 0.001, + 0.009, 0.003, 0.013, 0.003, 0.003, 0.004, 0.005, 0.005, 0.013, 0.017, 0.009, 0.006, 0.002, 0.01, 0.003, 0.001, + 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.245, 0.051, 0.015, 0.059, 0.152, 0.017, 0.027, 0.019, 0.108, + 0.002, 0.051, 0.14, 0.059, 0.158, 0.057, 0.025, 0.035, 0.149, 0.073, 0.108, 0.056, 0.01, 0.015, 0.014, 0.048, + 0.025, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.852, 1.726, 1.824, 1.398, 0.151, 0.194, 0.076, 0.605, 0.638, + 0.004, 0.1, 2.623, 0.236, 0.061, 0.057, 0.479, 0.123, 0.129, 0.053, 0.062, 0.279, 0.075, 0.02, 0.174, 0.096, + 1.916, 0.222, 0.025, 0.1, 0.049, 0.069, 0.128, 0.159, 0.146, 0.119, 0.43, 0.164, 0.055, 0.003, 0.065, 0.036, + 0.325, 0.0001, 0.038, 0.001, 0.013, 0.042, 0.429, 4.958, 1.044, 0.394, 1.429, 0.959, 3.011, 0.048, 0.384, 1.557, + 0.433, 1.901, 3.01, 1.056, 3.108, 1.043, 0.407, 0.0001, 0.0001, 0.106, 0.225, 0.139, 0.034, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.004, 0.0001, 0.003, 0.001, 26.093, 12.748, 1.127, 2.265, 0.0001, 0.0001, + 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.275, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "tum": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.34, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.852, 0.004, 0.573, 0.003, 0.004, 0.004, 0.017, 0.083, 0.308, 0.306, 0.001, + 0.0001, 1.303, 0.412, 1.2, 0.024, 0.557, 0.476, 0.366, 0.176, 0.172, 0.213, 0.206, 0.176, 0.165, 0.191, 0.118, + 0.025, 0.012, 0.007, 0.012, 0.0001, 0.001, 0.268, 0.377, 0.217, 0.158, 0.11, 0.095, 0.125, 0.123, 0.134, 0.277, + 0.29, 0.111, 0.727, 0.21, 0.076, 0.143, 0.01, 0.116, 0.269, 0.294, 0.069, 0.067, 0.069, 0.003, 0.068, 0.042, + 0.008, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 10.116, 1.728, 1.817, 1.937, 5.125, 1.225, 1.488, 3.251, 6.548, + 0.159, 2.454, 2.854, 2.514, 5.282, 4.292, 2.074, 0.028, 2.715, 2.7, 3.62, 4.127, 0.602, 1.862, 0.051, 1.299, + 0.758, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.102, 0.017, 0.014, 0.014, 0.01, 0.006, 0.008, 0.005, 0.003, + 0.001, 0.007, 0.006, 0.02, 0.058, 0.017, 0.003, 0.008, 0.005, 0.001, 0.016, 0.005, 0.005, 0.003, 0.004, 0.009, + 0.043, 0.004, 0.001, 0.008, 0.005, 0.006, 0.002, 0.103, 0.006, 0.008, 0.007, 0.001, 0.005, 0.009, 0.025, 0.006, + 0.01, 0.003, 0.011, 0.006, 0.004, 0.0001, 0.003, 0.016, 0.015, 0.003, 0.014, 0.008, 0.112, 0.003, 0.014, 0.012, + 0.008, 0.012, 0.012, 0.008, 0.009, 0.01, 0.003, 0.0001, 0.0001, 0.101, 0.045, 0.006, 0.195, 0.001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.063, 0.038, 0.001, 0.001, 0.001, 0.006, 0.003, + 0.007, 0.053, 0.034, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.016, 0.022, 0.093, 0.0001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.012, 0.008, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "tw": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.984, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.303, 0.001, 0.389, 0.0001, 0.001, 0.0001, 0.004, 0.077, 0.488, 0.486, 0.0001, + 0.0001, 0.756, 0.118, 1.791, 0.025, 0.73, 0.614, 0.579, 0.248, 0.221, 0.18, 0.206, 0.176, 0.192, 0.286, 0.065, + 0.035, 0.004, 0.0001, 0.004, 0.01, 0.0001, 0.602, 0.283, 0.296, 0.116, 0.311, 0.173, 0.2, 0.1, 0.303, 0.048, + 0.367, 0.187, 0.399, 0.306, 0.149, 0.189, 0.019, 0.18, 0.508, 0.305, 0.203, 0.099, 0.096, 0.049, 0.077, 0.01, + 0.003, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 8.315, 0.995, 0.605, 1.602, 5.365, 0.628, 0.659, 0.955, 4.58, + 0.091, 2.249, 1.426, 1.892, 5.378, 5.608, 0.884, 0.03, 3.156, 2.583, 1.888, 2.004, 0.328, 1.708, 0.075, 2.441, + 0.168, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.083, 0.035, 0.035, 0.017, 0.032, 0.015, 0.093, 0.059, 0.023, + 0.016, 0.025, 0.022, 0.019, 0.022, 0.029, 0.012, 0.046, 0.013, 0.009, 0.017, 0.855, 0.004, 0.017, 0.017, 0.006, + 0.004, 0.012, 1.236, 0.017, 0.012, 0.01, 0.004, 0.081, 0.046, 0.012, 0.012, 0.086, 0.028, 0.017, 0.054, 0.03, + 0.075, 0.019, 0.012, 0.016, 0.036, 0.009, 0.019, 0.074, 0.048, 0.057, 0.049, 0.013, 2.039, 0.016, 0.03, 0.109, + 0.023, 0.064, 0.039, 0.051, 0.048, 0.068, 0.015, 0.0001, 0.0001, 0.075, 0.196, 0.058, 0.036, 0.106, 0.0001, + 0.001, 1.812, 0.004, 0.0001, 0.001, 0.0001, 2.053, 0.006, 0.306, 0.086, 0.0001, 0.0001, 0.0001, 0.012, 0.003, + 0.267, 0.158, 0.09, 0.007, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.209, 0.016, 0.044, 0.0001, 0.016, 0.052, + 0.016, 0.023, 0.012, 0.003, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ty": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.596, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.482, 0.002, 0.148, 0.0001, 0.0001, 0.0001, 0.001, 0.103, 0.185, 0.187, + 0.0001, 0.0001, 0.459, 0.229, 1.457, 0.013, 0.217, 0.354, 0.181, 0.099, 0.109, 0.09, 0.093, 0.094, 0.097, 0.295, + 0.032, 0.014, 0.002, 0.001, 0.023, 0.0001, 0.0001, 0.336, 0.259, 0.191, 0.056, 0.549, 0.206, 0.061, 0.142, + 0.109, 0.062, 0.031, 0.131, 0.411, 0.099, 0.644, 0.477, 0.008, 0.194, 0.401, 0.951, 0.146, 0.18, 0.019, 0.004, + 0.015, 0.007, 0.008, 0.0001, 0.01, 0.0001, 0.003, 0.0001, 9.536, 0.253, 0.42, 0.705, 6.452, 0.803, 0.335, 1.722, + 7.016, 0.092, 0.277, 1.311, 1.613, 3.693, 4.012, 0.994, 0.04, 4.455, 1.038, 5.804, 2.543, 0.371, 0.019, 0.027, + 0.146, 0.201, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.052, 0.908, 0.007, 0.002, 0.007, 0.001, 0.0001, 0.003, + 0.006, 0.001, 0.003, 0.002, 0.002, 1.282, 0.0001, 0.001, 0.007, 0.0001, 0.043, 0.549, 0.01, 0.0001, 0.0001, + 0.003, 0.114, 1.916, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.19, 0.144, 0.074, 0.002, 0.002, 0.003, + 0.003, 0.022, 0.06, 0.039, 0.051, 0.598, 0.116, 0.035, 0.003, 0.018, 0.003, 0.029, 0.506, 0.059, 0.005, 0.003, + 0.0001, 0.001, 0.002, 0.008, 0.013, 0.037, 0.005, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.033, 1.417, 1.711, + 1.627, 0.0001, 0.0001, 0.0001, 0.008, 0.01, 0.005, 0.002, 0.001, 0.0001, 0.0001, 0.009, 0.006, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, + 2.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "tyv": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.67, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.942, 0.005, 0.141, 0.0001, 0.0001, 0.004, 0.001, 0.003, 0.097, 0.1, 0.0001, + 0.001, 0.649, 0.583, 0.64, 0.009, 0.087, 0.151, 0.08, 0.042, 0.04, 0.04, 0.033, 0.032, 0.035, 0.099, 0.046, + 0.011, 0.008, 0.002, 0.008, 0.008, 0.0001, 0.007, 0.002, 0.003, 0.002, 0.002, 0.002, 0.001, 0.002, 0.022, + 0.0001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.003, 0.003, 0.001, 0.006, 0.002, 0.011, + 0.001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.081, 0.005, 0.006, 0.008, 0.025, 0.002, 0.005, + 0.006, 0.02, 0.002, 0.007, 0.012, 0.016, 0.015, 0.021, 0.013, 0.003, 0.017, 0.01, 0.014, 0.01, 0.002, 0.004, + 0.007, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.263, 0.883, 1.755, 1.893, 0.056, 0.377, 0.045, + 1.004, 0.604, 0.005, 0.051, 2.643, 0.086, 0.75, 0.036, 0.173, 0.125, 0.135, 0.03, 0.065, 0.108, 0.011, 0.018, + 0.005, 0.038, 0.005, 0.129, 0.036, 0.079, 0.041, 0.11, 0.022, 0.066, 0.107, 0.147, 0.782, 0.015, 0.082, 0.008, + 0.088, 0.054, 0.476, 0.001, 0.089, 0.001, 0.039, 0.018, 0.892, 5.51, 0.98, 0.415, 1.888, 1.904, 2.436, 0.478, + 0.679, 2.249, 0.486, 1.593, 2.459, 0.684, 3.034, 1.582, 0.744, 0.0001, 0.0001, 0.143, 0.011, 0.004, 0.002, + 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.003, 0.01, 0.001, 0.011, 0.002, 28.453, 13.514, 1.663, 0.515, 0.0001, + 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.001, 0.094, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "udm": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.306, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.09, 0.004, 0.114, 0.0001, 0.0001, 0.008, 0.0001, 0.002, 0.237, 0.238, 0.002, + 0.001, 0.557, 0.317, 0.775, 0.018, 0.183, 0.302, 0.16, 0.086, 0.075, 0.092, 0.071, 0.074, 0.085, 0.189, 0.048, + 0.012, 0.017, 0.014, 0.016, 0.001, 0.0001, 0.018, 0.008, 0.012, 0.004, 0.003, 0.003, 0.003, 0.003, 0.016, 0.004, + 0.004, 0.006, 0.014, 0.003, 0.019, 0.021, 0.0001, 0.006, 0.011, 0.006, 0.003, 0.006, 0.001, 0.009, 0.001, 0.001, + 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.242, 0.027, 0.103, 0.053, 0.195, 0.007, 0.026, 0.039, 0.148, + 0.005, 0.015, 0.074, 0.03, 0.111, 0.083, 0.028, 0.002, 0.108, 0.083, 0.059, 0.078, 0.015, 0.004, 0.004, 0.02, + 0.008, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 2.622, 2.823, 2.068, 1.727, 0.105, 0.092, 0.121, 0.28, 0.404, + 0.054, 0.451, 2.424, 1.272, 0.932, 0.131, 0.626, 0.166, 0.634, 0.123, 0.164, 0.252, 0.027, 0.006, 0.023, 0.083, + 0.009, 0.22, 0.069, 0.124, 0.088, 0.082, 0.223, 0.15, 0.209, 0.107, 0.132, 0.033, 0.405, 0.01, 0.179, 0.05, + 0.004, 0.001, 0.088, 0.001, 0.03, 0.018, 0.022, 2.886, 0.44, 0.8, 0.564, 1.075, 2.236, 0.315, 1.165, 1.904, + 0.34, 1.795, 2.214, 1.337, 2.854, 2.759, 0.664, 0.0001, 0.0001, 0.24, 0.028, 0.005, 0.005, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.023, 0.0001, 0.001, 0.0001, 25.262, 16.34, 0.005, 0.714, 0.0001, 0.005, 0.001, + 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.006, 0.277, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ug": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.4, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 6.843, 0.005, 0.045, 0.0001, 0.0001, 0.006, 0.0001, 0.05, 0.059, 0.061, 0.001, + 0.001, 0.064, 0.182, 0.431, 0.006, 0.116, 0.137, 0.086, 0.058, 0.051, 0.055, 0.044, 0.042, 0.045, 0.072, 0.055, + 0.007, 0.018, 0.009, 0.017, 0.0001, 0.0001, 0.014, 0.005, 0.004, 0.003, 0.002, 0.001, 0.002, 0.002, 0.011, + 0.008, 0.009, 0.003, 0.013, 0.002, 0.002, 0.005, 0.001, 0.002, 0.015, 0.014, 0.019, 0.001, 0.002, 0.002, 0.003, + 0.0001, 0.003, 0.001, 0.003, 0.0001, 0.008, 0.0001, 0.198, 0.04, 0.041, 0.081, 0.144, 0.022, 0.07, 0.096, 0.317, + 0.009, 0.06, 0.138, 0.069, 0.164, 0.09, 0.038, 0.044, 0.138, 0.091, 0.118, 0.088, 0.011, 0.018, 0.015, 0.072, + 0.022, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.146, 0.075, 1.421, 1.142, 2.553, 1.322, 3.07, 1.622, 1.224, + 6.252, 1.181, 0.454, 0.501, 0.027, 0.124, 0.02, 0.545, 0.041, 0.008, 0.046, 0.025, 2.705, 0.02, 0.099, 0.121, + 0.09, 0.015, 0.082, 0.041, 0.012, 0.015, 0.06, 0.068, 0.006, 0.005, 0.06, 0.019, 0.028, 1.456, 3.601, 1.011, + 0.28, 1.856, 0.056, 0.228, 0.623, 0.346, 2.099, 0.163, 2.119, 0.524, 1.075, 0.873, 0.045, 0.014, 0.035, 0.226, + 0.052, 1.208, 0.825, 0.077, 0.089, 1.1, 0.024, 0.0001, 0.0001, 0.118, 0.051, 0.009, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.765, 0.262, 0.112, 0.09, 0.0001, 0.0001, 0.0001, + 0.001, 14.938, 17.649, 1.694, 5.905, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.067, 0.002, 0.002, 0.006, + 0.003, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 1.731, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "ur": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.979, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.161, 0.002, 0.04, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.157, 0.157, 0.0001, + 0.001, 0.081, 0.085, 0.055, 0.007, 0.121, 0.179, 0.119, 0.082, 0.072, 0.073, 0.068, 0.065, 0.07, 0.096, 0.098, + 0.002, 0.004, 0.003, 0.004, 0.0001, 0.0001, 0.02, 0.016, 0.035, 0.016, 0.006, 0.007, 0.013, 0.009, 0.011, 0.009, + 0.012, 0.015, 0.025, 0.011, 0.007, 0.016, 0.003, 0.012, 0.029, 0.016, 0.005, 0.006, 0.007, 0.001, 0.005, 0.003, + 0.004, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.265, 0.03, 0.059, 0.059, 0.181, 0.032, 0.039, 0.075, 0.194, + 0.006, 0.027, 0.102, 0.048, 0.197, 0.175, 0.037, 0.004, 0.142, 0.109, 0.147, 0.083, 0.021, 0.026, 0.005, 0.049, + 0.011, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.055, 2.387, 0.534, 0.013, 1.581, 2.193, 2.297, 0.009, 2.712, + 0.004, 0.024, 0.012, 4.725, 0.004, 0.025, 0.025, 0.036, 0.091, 1.735, 0.008, 0.507, 0.001, 0.001, 0.002, 0.02, + 0.012, 0.0001, 0.005, 0.005, 0.004, 0.001, 0.005, 0.009, 0.069, 0.224, 0.005, 0.08, 0.002, 0.401, 5.353, 1.186, + 2.395, 1.412, 0.054, 0.699, 0.376, 0.232, 1.576, 0.068, 2.734, 0.325, 1.531, 0.466, 0.218, 0.1, 0.222, 0.073, + 1.112, 0.88, 0.012, 0.002, 0.002, 1.074, 0.003, 0.0001, 0.0001, 0.008, 0.011, 0.003, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 18.028, 10.547, 4.494, 8.618, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.001, 0.049, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.043, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "uz": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.321, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.468, 0.001, 0.189, 0.0001, 0.0001, 0.012, 0.0001, 0.019, 0.383, 0.392, 0.002, + 0.002, 1.018, 0.346, 1.56, 0.012, 0.451, 0.539, 0.363, 0.217, 0.199, 0.207, 0.182, 0.168, 0.187, 0.31, 0.029, + 0.042, 0.003, 0.005, 0.003, 0.002, 0.0001, 0.288, 0.177, 0.127, 0.096, 0.051, 0.092, 0.103, 0.072, 0.123, 0.042, + 0.115, 0.075, 0.277, 0.092, 0.158, 0.088, 0.099, 0.095, 0.293, 0.135, 0.08, 0.063, 0.021, 0.043, 0.077, 0.019, + 0.006, 0.0001, 0.006, 0.001, 0.001, 0.005, 11.395, 1.621, 0.663, 2.97, 1.946, 0.469, 2.488, 2.791, 9.732, 0.446, + 2.32, 4.562, 2.354, 4.897, 4.652, 0.487, 1.34, 4.598, 3.575, 3.341, 2.208, 1.083, 0.027, 0.322, 2.128, 0.799, + 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.456, 0.006, 0.008, 0.004, 0.002, 0.001, 0.001, 0.001, 0.003, 0.002, + 0.0001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.165, 0.164, 0.0001, 0.001, 0.001, 0.064, + 0.017, 0.001, 0.002, 0.019, 0.002, 0.019, 0.002, 0.169, 0.003, 0.003, 0.0001, 0.002, 0.0001, 0.0001, 0.002, + 0.007, 0.014, 0.0001, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.04, 0.006, 0.006, 0.01, 0.015, 0.009, 0.006, 0.002, + 0.016, 0.002, 0.006, 0.916, 0.127, 0.009, 0.012, 0.002, 0.0001, 0.0001, 0.192, 0.06, 0.002, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 1.018, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.124, 0.036, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.449, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "ve": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.731, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.522, 0.012, 0.078, 0.0001, 0.0001, 0.001, 0.0001, 0.009, 0.159, 0.16, 0.0001, + 0.001, 0.539, 0.225, 1.016, 0.019, 0.145, 0.2, 0.126, 0.043, 0.046, 0.05, 0.05, 0.043, 0.035, 0.051, 0.043, + 0.011, 0.01, 0.003, 0.01, 0.007, 0.001, 0.246, 0.066, 0.041, 0.13, 0.054, 0.04, 0.046, 0.163, 0.081, 0.023, + 0.129, 0.141, 0.422, 0.243, 0.021, 0.074, 0.002, 0.073, 0.154, 0.414, 0.061, 0.436, 0.032, 0.007, 0.055, 0.059, + 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 13.088, 1.237, 0.128, 2.934, 4.075, 0.966, 1.256, 7.989, 6.478, + 0.01, 1.611, 2.964, 2.428, 5.855, 4.328, 0.793, 0.003, 1.372, 2.898, 2.532, 4.835, 2.93, 2.215, 0.021, 0.876, + 1.698, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.04, 0.003, 0.001, 0.0001, 0.002, 0.021, 0.0001, 0.001, 0.0001, + 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.005, 0.137, 0.0001, 0.0001, 0.0001, 0.001, + 0.005, 0.006, 0.001, 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.002, 0.001, 0.008, 0.001, 0.0001, 0.0001, 0.007, + 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.008, 0.049, 0.003, 0.004, 0.0001, 0.0001, + 0.001, 0.0001, 0.157, 0.074, 0.001, 0.002, 0.0001, 0.026, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.017, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.002, 0.006, 0.003, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, + 0.231, 0.039, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001 + ], + "vec": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.253, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.683, 0.003, 0.435, 0.0001, 0.0001, 0.011, 0.001, 0.612, 0.188, 0.187, 0.0001, + 0.002, 0.962, 0.099, 0.799, 0.015, 0.255, 0.324, 0.176, 0.103, 0.099, 0.11, 0.096, 0.095, 0.113, 0.179, 0.07, + 0.031, 0.016, 0.004, 0.016, 0.001, 0.0001, 0.22, 0.135, 0.257, 0.11, 0.212, 0.092, 0.123, 0.029, 0.211, 0.028, + 0.03, 0.164, 0.197, 0.115, 0.055, 0.192, 0.012, 0.112, 0.28, 0.113, 0.043, 0.127, 0.024, 0.034, 0.008, 0.022, + 0.006, 0.0001, 0.006, 0.0001, 0.006, 0.0001, 9.014, 0.584, 2.527, 3.084, 9.08, 0.695, 1.267, 0.67, 6.478, 0.14, + 0.121, 3.361, 1.486, 5.29, 5.96, 1.776, 0.156, 4.436, 3.403, 4.054, 1.601, 1.042, 0.044, 0.834, 0.071, 0.222, + 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.081, 0.084, 1.282, 0.004, 0.002, 0.002, 0.001, 0.002, 0.002, 0.001, + 0.001, 0.002, 0.003, 0.004, 0.001, 0.001, 0.002, 0.013, 0.001, 0.01, 0.002, 0.001, 0.001, 0.008, 0.004, 0.058, + 0.055, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.74, 0.012, 0.002, 0.002, 0.005, 0.001, 0.002, 0.041, 0.204, 0.163, + 0.002, 0.004, 0.188, 0.007, 0.001, 0.002, 0.019, 0.005, 0.113, 0.084, 0.004, 0.003, 0.003, 0.001, 0.003, 0.085, + 0.013, 0.006, 0.006, 0.01, 0.027, 0.003, 0.0001, 0.0001, 0.074, 1.6, 0.013, 1.389, 0.061, 0.0001, 0.005, 0.002, + 0.001, 0.001, 0.001, 0.0001, 0.014, 0.007, 0.012, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.004, + 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.013, 0.075, 0.002, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "vep": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.78, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.379, 0.003, 0.471, 0.0001, 0.001, 0.103, 0.0001, 0.568, 0.495, 0.495, 0.0001, + 0.017, 1.052, 0.379, 1.489, 0.012, 0.568, 0.707, 0.478, 0.223, 0.214, 0.232, 0.198, 0.192, 0.203, 0.325, 0.211, + 0.045, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.203, 0.112, 0.053, 0.077, 0.109, 0.05, 0.072, 0.067, 0.085, 0.066, + 0.318, 0.157, 0.187, 0.127, 0.087, 0.197, 0.001, 0.106, 0.305, 0.17, 0.046, 0.359, 0.008, 0.005, 0.004, 0.023, + 0.011, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 7.907, 0.771, 0.299, 4.189, 5.699, 0.182, 1.123, 1.305, 7.031, + 1.198, 2.907, 3.562, 2.965, 5.97, 3.852, 1.33, 0.003, 2.724, 3.29, 3.069, 2.779, 1.746, 0.01, 0.004, 0.024, + 0.95, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.243, 0.042, 0.031, 0.026, 0.016, 0.009, 0.007, 0.007, 0.018, + 0.003, 0.008, 0.014, 0.04, 0.228, 0.004, 0.014, 0.011, 0.008, 0.007, 0.006, 0.198, 0.004, 0.004, 0.004, 0.004, + 0.01, 0.011, 0.006, 0.059, 0.006, 0.007, 0.007, 0.049, 0.512, 0.005, 0.004, 1.459, 0.005, 0.005, 0.012, 0.007, + 0.009, 0.006, 0.076, 0.003, 0.005, 0.006, 0.008, 0.087, 0.02, 0.049, 0.021, 0.019, 0.048, 0.155, 0.011, 0.041, + 0.019, 0.037, 0.102, 0.539, 0.049, 0.808, 0.016, 0.0001, 0.0001, 0.208, 2.197, 0.255, 1.283, 0.0001, 0.0001, + 0.0001, 0.018, 0.007, 0.013, 0.002, 0.001, 0.025, 0.012, 0.469, 0.173, 0.003, 0.003, 0.001, 0.006, 0.006, 0.011, + 0.026, 0.019, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.026, 0.012, 0.203, 0.002, 0.001, 0.003, 0.002, + 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "vls": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.228, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.739, 0.003, 0.38, 0.0001, 0.0001, 0.005, 0.003, 0.744, 0.196, 0.195, 0.001, + 0.001, 0.727, 0.325, 0.943, 0.009, 0.279, 0.491, 0.2, 0.128, 0.127, 0.144, 0.128, 0.137, 0.161, 0.217, 0.083, + 0.01, 0.008, 0.003, 0.008, 0.002, 0.0001, 0.184, 0.236, 0.118, 0.332, 0.112, 0.115, 0.126, 0.103, 0.261, 0.107, + 0.122, 0.141, 0.163, 0.108, 0.113, 0.118, 0.004, 0.127, 0.191, 0.088, 0.03, 0.223, 0.122, 0.006, 0.022, 0.104, + 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 4.751, 0.962, 1.1, 3.988, 12.635, 0.533, 2.162, 1.118, 4.159, + 0.386, 1.909, 2.864, 1.62, 7.645, 4.865, 1.022, 0.013, 4.762, 3.511, 4.63, 2.292, 1.812, 1.033, 0.041, 0.74, + 0.83, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.13, 0.003, 0.003, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, + 0.001, 0.008, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.015, 0.0001, 0.0001, 0.0001, + 0.025, 0.093, 0.0001, 0.0001, 0.002, 0.002, 0.001, 0.001, 0.016, 0.003, 0.001, 0.001, 0.002, 0.001, 0.001, + 0.004, 0.09, 0.034, 0.493, 0.075, 0.001, 0.002, 0.001, 0.006, 0.006, 0.003, 0.004, 0.004, 0.299, 0.002, 0.003, + 0.001, 0.002, 0.001, 0.002, 0.002, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.02, 1.045, 0.002, 0.004, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.007, 0.004, 0.008, 0.003, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.13, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "vo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.865, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 14.101, 0.0001, 0.089, 0.0001, 0.177, 0.768, 0.0001, 0.013, 0.471, 0.471, + 0.0001, 0.0001, 1.958, 0.301, 1.263, 0.002, 1.009, 1.484, 1.145, 0.885, 0.977, 0.988, 0.827, 0.571, 0.867, + 0.731, 0.368, 0.112, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.099, 0.202, 0.186, 0.179, 0.034, 0.122, 0.068, + 0.069, 0.028, 0.029, 0.035, 0.486, 0.223, 0.193, 0.038, 0.198, 0.004, 0.074, 0.506, 0.089, 0.221, 0.126, 0.048, + 0.001, 0.008, 0.039, 0.004, 0.001, 0.005, 0.0001, 0.0001, 0.0001, 5.558, 2.077, 0.284, 2.834, 4.622, 1.332, + 0.379, 0.28, 4.679, 0.128, 1.147, 4.377, 2.51, 5.854, 4.077, 1.175, 0.015, 1.237, 3.788, 2.427, 1.276, 0.657, + 0.06, 0.029, 0.621, 0.304, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.73, 0.001, 0.0001, 0.005, 0.073, 0.0001, + 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.033, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.623, 0.0001, 0.0001, 0.045, 0.0001, 0.038, 0.009, 0.001, 0.006, 0.006, + 0.01, 2.184, 0.0001, 0.0001, 0.003, 0.022, 0.052, 0.002, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.27, 0.001, + 0.247, 0.003, 0.014, 0.006, 1.503, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 1.216, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.516, 5.121, 0.006, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.73, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "wa": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.065, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 16.234, 0.018, 0.387, 0.0001, 0.0001, 0.001, 0.005, 1.403, 0.391, 0.397, 0.0001, + 0.006, 1.323, 0.328, 1.748, 0.02, 0.212, 0.344, 0.172, 0.086, 0.07, 0.086, 0.076, 0.078, 0.098, 0.148, 0.393, + 0.059, 0.003, 0.003, 0.006, 0.012, 0.0001, 0.126, 0.117, 0.176, 0.177, 0.152, 0.211, 0.071, 0.055, 0.154, 0.041, + 0.016, 0.325, 0.219, 0.065, 0.097, 0.121, 0.003, 0.069, 0.125, 0.076, 0.016, 0.053, 0.079, 0.005, 0.007, 0.005, + 0.103, 0.0001, 0.103, 0.0001, 0.0001, 0.0001, 4.343, 0.71, 2.121, 3.465, 9.326, 0.692, 0.491, 0.929, 5.047, + 0.968, 0.844, 3.108, 1.647, 4.913, 4.614, 1.529, 0.028, 3.303, 5.504, 4.286, 1.947, 1.135, 0.682, 0.179, 1.059, + 0.366, 0.0001, 0.075, 0.0001, 0.0001, 0.0001, 0.076, 0.002, 0.002, 0.001, 0.001, 0.022, 0.001, 0.008, 0.005, + 0.003, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.005, 0.0001, 0.0001, 0.0001, + 0.0001, 0.065, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.001, 0.371, 0.002, 0.017, 0.001, 0.001, 0.706, 0.003, + 0.089, 0.451, 0.662, 0.205, 0.03, 0.001, 0.001, 0.639, 0.002, 0.006, 0.002, 0.002, 0.001, 0.243, 0.004, 0.001, + 0.001, 0.001, 0.001, 0.002, 0.257, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.478, 3.239, 0.002, 0.003, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.08, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "war": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.118, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 12.933, 0.0001, 1.377, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.008, 0.008, + 0.0001, 0.0001, 0.432, 0.073, 1.214, 0.001, 0.079, 0.266, 0.062, 0.046, 0.041, 0.046, 0.05, 0.055, 0.111, 0.217, + 0.037, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 1.082, 0.154, 0.38, 0.175, 0.141, 0.098, 0.127, 0.173, + 0.102, 0.057, 0.046, 0.208, 0.316, 0.091, 0.096, 0.293, 0.004, 0.105, 0.232, 0.146, 0.033, 0.038, 0.367, 0.012, + 0.008, 0.019, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.129, 0.835, 2.123, 1.488, 5.092, 0.584, 3.71, + 3.47, 8.491, 0.033, 1.376, 3.841, 1.504, 9.228, 3.14, 2.313, 0.025, 2.807, 5.239, 2.428, 2.957, 0.216, 0.413, + 0.116, 1.506, 0.106, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, + 0.001, 0.001, 0.001, 0.001, 0.0001, 0.002, 0.004, 0.019, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.004, 0.003, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.006, 0.002, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.06, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "wo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.906, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 18.371, 0.007, 0.083, 0.0001, 0.0001, 0.002, 0.0001, 0.048, 0.243, 0.244, + 0.0001, 0.001, 1.526, 0.299, 0.6, 0.011, 0.077, 0.162, 0.075, 0.048, 0.048, 0.043, 0.038, 0.041, 0.05, 0.065, + 0.149, 0.021, 0.001, 0.005, 0.001, 0.009, 0.0001, 0.248, 0.196, 0.082, 0.079, 0.037, 0.083, 0.06, 0.026, 0.08, + 0.079, 0.082, 0.102, 0.179, 0.109, 0.049, 0.052, 0.005, 0.054, 0.208, 0.113, 0.015, 0.012, 0.059, 0.037, 0.106, + 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 10.502, 2.142, 1.408, 2.296, 5.004, 0.815, 2.647, 0.171, + 6.017, 1.265, 2.73, 3.516, 3.296, 5.064, 5.377, 0.616, 0.08, 2.151, 1.518, 2.39, 4.356, 0.021, 1.494, 1.066, + 2.37, 0.019, 0.002, 0.0001, 0.004, 0.0001, 0.0001, 0.102, 0.006, 0.003, 0.003, 0.01, 0.005, 0.004, 0.003, 0.005, + 0.001, 0.005, 0.02, 0.001, 0.001, 0.008, 0.002, 0.005, 0.039, 0.003, 0.026, 0.001, 0.001, 0.0001, 0.001, 0.001, + 0.041, 0.001, 0.0001, 0.016, 0.015, 0.0001, 0.0001, 0.641, 0.001, 0.002, 0.004, 0.002, 0.001, 0.001, 0.012, + 0.011, 0.402, 0.004, 0.775, 0.001, 0.002, 0.001, 0.002, 0.004, 0.912, 0.013, 0.056, 0.002, 0.002, 0.001, 0.002, + 0.003, 0.003, 0.002, 0.013, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.028, 2.826, 0.002, 0.019, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.004, 0.002, 0.016, 0.018, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.007, 0.033, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.096, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "wuu": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.208, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.344, 0.001, 0.064, 0.0001, 0.0001, 0.012, 0.001, 0.005, 0.037, 0.032, 0.001, + 0.002, 0.029, 0.05, 0.042, 0.019, 0.267, 0.364, 0.21, 0.108, 0.106, 0.12, 0.107, 0.1, 0.123, 0.181, 0.013, + 0.001, 0.013, 0.002, 0.013, 0.001, 0.0001, 0.027, 0.021, 0.029, 0.015, 0.013, 0.01, 0.014, 0.013, 0.018, 0.007, + 0.011, 0.017, 0.022, 0.016, 0.01, 0.023, 0.002, 0.017, 0.03, 0.019, 0.009, 0.006, 0.008, 0.002, 0.003, 0.002, + 0.03, 0.0001, 0.03, 0.0001, 0.003, 0.0001, 0.184, 0.024, 0.041, 0.051, 0.161, 0.019, 0.037, 0.056, 0.143, 0.005, + 0.024, 0.082, 0.047, 0.138, 0.118, 0.028, 0.006, 0.111, 0.081, 0.088, 0.07, 0.016, 0.015, 0.01, 0.024, 0.008, + 0.001, 0.002, 0.001, 0.001, 0.0001, 2.843, 1.238, 1.324, 0.655, 0.418, 1.022, 0.586, 0.937, 1.267, 1.305, 0.731, + 1.421, 2.335, 0.988, 0.859, 1.016, 1.143, 0.568, 0.436, 0.439, 0.836, 0.673, 0.873, 1.003, 0.932, 0.655, 0.691, + 1.033, 1.591, 0.82, 0.469, 0.875, 0.536, 0.577, 0.431, 0.453, 0.911, 0.859, 0.578, 0.722, 0.777, 0.496, 1.371, + 0.496, 0.553, 1.219, 0.891, 1.125, 1.185, 0.888, 0.563, 0.66, 0.876, 0.472, 0.61, 0.726, 3.021, 1.231, 1.855, + 1.189, 2.708, 1.052, 0.869, 1.001, 0.0001, 0.0001, 0.059, 0.019, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.005, + 0.002, 0.002, 0.002, 0.0001, 0.011, 0.004, 0.02, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.011, + 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.068, 0.005, 0.208, 1.565, 4.388, 9.361, 5.679, 3.099, + 2.882, 2.131, 0.002, 0.004, 0.008, 0.002, 0.0001, 1.953, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "xal": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.016, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 7.801, 0.002, 0.076, 0.0001, 0.0001, 0.005, 0.0001, 0.002, 0.134, 0.134, 0.001, + 0.003, 0.529, 0.574, 0.918, 0.006, 0.214, 0.423, 0.268, 0.17, 0.177, 0.128, 0.129, 0.128, 0.121, 0.185, 0.028, + 0.007, 0.006, 0.001, 0.006, 0.006, 0.0001, 0.005, 0.004, 0.004, 0.001, 0.002, 0.002, 0.002, 0.002, 0.006, 0.001, + 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.005, 0.003, 0.001, 0.002, 0.003, 0.004, 0.001, 0.001, + 0.005, 0.0001, 0.006, 0.0001, 0.005, 0.0001, 0.064, 0.016, 0.035, 0.026, 0.079, 0.017, 0.024, 0.144, 0.059, + 0.003, 0.012, 0.04, 0.028, 0.059, 0.05, 0.015, 0.002, 0.048, 0.045, 0.048, 0.035, 0.008, 0.009, 0.006, 0.012, + 0.006, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 2.512, 1.678, 1.585, 1.178, 0.036, 0.859, 0.336, 0.487, 0.211, + 0.008, 0.012, 0.272, 0.319, 0.492, 0.054, 0.135, 0.09, 0.152, 0.041, 0.073, 0.19, 0.017, 0.022, 0.69, 0.054, + 1.446, 0.115, 0.043, 0.168, 0.153, 0.159, 0.053, 0.055, 0.105, 0.151, 0.242, 0.028, 0.118, 0.031, 0.02, 0.093, + 0.554, 0.004, 0.02, 0.002, 0.072, 0.031, 0.849, 3.75, 1.252, 0.825, 1.816, 2.139, 1.256, 0.115, 0.387, 2.666, + 0.446, 0.987, 3.364, 1.079, 4.101, 2.147, 0.166, 0.0001, 0.0001, 0.041, 0.006, 0.002, 0.0001, 0.001, 0.0001, + 0.0001, 0.038, 0.0001, 0.0001, 0.004, 0.0001, 0.007, 0.004, 27.749, 10.017, 2.264, 1.98, 0.0001, 0.003, 0.001, + 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.035, 0.127, 0.0001, 0.0001, 0.004, + 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "xh": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.827, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 11.133, 0.013, 0.259, 0.004, 0.001, 0.009, 0.002, 0.046, 0.125, 0.123, 0.001, + 0.005, 0.846, 0.831, 0.912, 0.026, 0.163, 0.218, 0.112, 0.059, 0.052, 0.058, 0.048, 0.051, 0.067, 0.118, 0.048, + 0.023, 0.018, 0.006, 0.018, 0.006, 0.0001, 0.218, 0.122, 0.114, 0.05, 0.111, 0.054, 0.063, 0.043, 0.32, 0.057, + 0.15, 0.086, 0.186, 0.216, 0.074, 0.101, 0.011, 0.057, 0.136, 0.094, 0.198, 0.022, 0.071, 0.041, 0.042, 0.046, + 0.076, 0.001, 0.076, 0.0001, 0.013, 0.0001, 10.703, 2.404, 0.805, 1.231, 8.068, 0.529, 2.029, 3.142, 7.484, + 0.244, 4.325, 4.529, 2.518, 6.863, 5.226, 0.943, 0.434, 1.064, 2.867, 2.574, 4.687, 0.307, 2.513, 0.353, 2.341, + 2.213, 0.002, 0.028, 0.002, 0.0001, 0.0001, 0.043, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.004, 0.012, 0.003, + 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.004, 0.01, 0.003, 0.0001, 0.0001, 0.001, + 0.003, 0.018, 0.0001, 0.0001, 0.005, 0.005, 0.0001, 0.001, 0.1, 0.005, 0.001, 0.004, 0.001, 0.0001, 0.0001, + 0.003, 0.001, 0.007, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, + 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.101, 0.03, 0.014, 0.003, + 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.049, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001 + ], + "xmf": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.601, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 4.701, 0.001, 0.058, 0.0001, 0.0001, 0.01, 0.0001, 0.002, 0.121, 0.121, 0.0001, + 0.001, 0.458, 0.166, 0.464, 0.005, 0.164, 0.192, 0.121, 0.06, 0.056, 0.064, 0.055, 0.055, 0.065, 0.102, 0.028, + 0.018, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.008, 0.006, 0.008, 0.007, 0.003, 0.004, 0.003, 0.003, 0.027, + 0.001, 0.002, 0.006, 0.007, 0.003, 0.003, 0.005, 0.0001, 0.004, 0.007, 0.009, 0.002, 0.008, 0.003, 0.01, 0.001, + 0.0001, 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.0001, 0.041, 0.006, 0.016, 0.012, 0.042, 0.004, 0.007, 0.012, + 0.032, 0.001, 0.006, 0.021, 0.011, 0.029, 0.03, 0.007, 0.001, 0.029, 0.023, 0.023, 0.015, 0.005, 0.003, 0.002, + 0.006, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.172, 0.003, 0.002, 30.333, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 4.083, 0.506, 0.555, 0.957, 2.283, 0.421, 0.156, 0.803, + 3.59, 0.653, 1.19, 1.236, 1.788, 2.02, 0.312, 0.098, 2.097, 1.217, 0.638, 1.469, 0.698, 0.389, 0.172, 0.093, + 1.339, 0.152, 0.183, 0.083, 0.259, 0.102, 0.41, 0.184, 0.054, 0.009, 0.013, 0.002, 0.001, 0.003, 0.001, 0.323, + 0.062, 0.002, 0.002, 0.002, 0.002, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.043, 0.004, 0.001, 0.001, 0.007, + 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.011, 0.002, 0.023, 0.008, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 30.332, 0.17, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "yi": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.709, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.298, 0.002, 0.186, 0.0001, 0.001, 0.004, 0.006, 0.121, 0.075, 0.076, 0.0001, + 0.0001, 0.466, 0.059, 0.46, 0.006, 0.099, 0.114, 0.062, 0.037, 0.035, 0.037, 0.03, 0.03, 0.038, 0.064, 0.034, + 0.015, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.003, 0.003, 0.004, 0.003, 0.002, 0.002, 0.002, 0.002, 0.002, 0.001, + 0.001, 0.002, 0.003, 0.002, 0.002, 0.002, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.0001, + 0.0001, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.02, 0.003, 0.006, 0.007, 0.022, 0.003, 0.004, 0.006, + 0.017, 0.0001, 0.003, 0.01, 0.006, 0.015, 0.021, 0.004, 0.006, 0.015, 0.011, 0.018, 0.013, 0.002, 0.003, 0.001, + 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.004, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 5.002, 1.068, 1.228, 1.611, 0.814, 3.904, 1.071, + 0.178, 2.364, 5.673, 0.275, 0.347, 1.459, 0.389, 1.018, 2.472, 1.73, 1.057, 4.356, 0.098, 1.356, 0.06, 0.547, + 0.832, 3.227, 0.975, 0.239, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.02, 0.006, 0.026, 0.005, 0.016, 0.005, 0.002, + 0.163, 0.104, 0.003, 0.002, 0.002, 0.041, 0.002, 0.022, 0.034, 0.0001, 0.0001, 0.015, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.029, 0.011, 0.0001, 0.0001, + 0.0001, 0.0001, 0.372, 43.367, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001 + ], + "yo": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.162, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 13.013, 0.002, 0.102, 0.0001, 0.001, 0.004, 0.001, 0.025, 0.251, 0.249, 0.0001, + 0.001, 0.499, 0.259, 1.047, 0.013, 0.386, 0.744, 0.471, 0.336, 0.305, 0.301, 0.323, 0.299, 0.314, 0.417, 0.09, + 0.08, 0.008, 0.009, 0.008, 0.006, 0.0001, 0.462, 0.171, 0.128, 0.102, 0.134, 0.101, 0.156, 0.11, 0.251, 0.116, + 0.194, 0.108, 0.188, 0.187, 0.263, 0.133, 0.007, 0.102, 0.27, 0.148, 0.037, 0.042, 0.07, 0.006, 0.044, 0.016, + 0.007, 0.0001, 0.008, 0.0001, 0.001, 0.001, 4.068, 1.959, 0.507, 1.515, 3.958, 0.547, 1.326, 0.747, 4.508, + 1.331, 1.562, 2.445, 1.011, 4.469, 3.265, 1.008, 0.02, 3.063, 1.958, 2.732, 1.408, 0.219, 0.852, 0.039, 0.732, + 0.092, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.678, 1.441, 0.002, 0.002, 0.064, 0.002, 0.001, 0.002, 0.025, + 0.003, 0.001, 0.001, 0.172, 1.046, 0.0001, 0.0001, 0.001, 0.001, 0.032, 0.052, 0.002, 0.0001, 0.0001, 0.0001, + 0.018, 0.066, 0.002, 0.001, 0.007, 0.006, 0.0001, 0.001, 1.085, 1.316, 0.01, 0.17, 0.004, 0.001, 0.001, 0.003, + 0.307, 0.812, 0.001, 0.003, 1.559, 1.199, 0.001, 0.002, 0.003, 0.004, 0.287, 0.374, 0.003, 0.002, 0.006, 0.001, + 0.038, 1.787, 1.887, 1.09, 0.005, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.021, 7.862, 0.009, 0.075, 0.0001, + 0.008, 0.0001, 0.001, 0.001, 0.001, 1.898, 0.0001, 0.005, 0.002, 0.012, 0.004, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 2.718, 0.12, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "za": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.779, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 9.452, 0.003, 0.07, 0.0001, 0.001, 0.016, 0.002, 0.054, 0.186, 0.179, 0.001, + 0.0001, 0.82, 0.089, 0.74, 0.012, 0.236, 0.344, 0.171, 0.097, 0.104, 0.109, 0.078, 0.094, 0.113, 0.172, 0.091, + 0.029, 0.001, 0.001, 0.002, 0.003, 0.0001, 0.117, 0.253, 0.245, 0.236, 0.047, 0.096, 0.232, 0.128, 0.101, 0.031, + 0.049, 0.109, 0.142, 0.114, 0.031, 0.114, 0.005, 0.051, 0.316, 0.07, 0.028, 0.136, 0.041, 0.012, 0.157, 0.02, + 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 4.452, 1.127, 1.557, 2.16, 5.66, 0.54, 3.525, 2.807, 4.357, 1.245, + 0.519, 1.215, 1.057, 5.149, 2.46, 0.332, 0.75, 1.554, 1.842, 1.639, 2.859, 0.55, 1.169, 0.375, 1.034, 2.115, + 0.002, 0.0001, 0.002, 0.001, 0.0001, 1.059, 0.53, 0.446, 0.215, 0.472, 0.297, 0.257, 0.268, 0.372, 0.375, 0.213, + 0.338, 0.751, 0.361, 0.284, 0.332, 0.27, 0.144, 0.117, 0.272, 0.266, 0.278, 0.305, 0.293, 0.26, 0.335, 0.49, + 0.247, 0.537, 0.19, 0.142, 0.27, 0.209, 0.19, 0.122, 0.13, 0.301, 0.259, 0.231, 0.235, 0.283, 0.134, 0.154, + 0.156, 0.162, 0.375, 0.302, 0.377, 0.293, 0.227, 0.124, 0.201, 0.231, 0.092, 0.229, 0.184, 0.748, 0.296, 0.646, + 0.455, 0.756, 0.262, 0.268, 0.277, 0.0001, 0.0001, 0.072, 0.167, 0.018, 0.011, 0.0001, 0.002, 0.0001, 0.002, + 0.001, 0.001, 0.001, 0.0001, 0.006, 0.002, 0.014, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, + 0.01, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.022, 0.008, 0.114, 0.555, 1.309, 2.559, 1.698, 1.364, + 0.916, 0.712, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.518, 0.001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "zea": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.532, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 15.056, 0.008, 0.162, 0.0001, 0.0001, 0.007, 0.001, 1.415, 0.162, 0.162, 0.0001, + 0.0001, 1.0, 0.532, 1.127, 0.004, 0.395, 0.563, 0.389, 0.394, 0.405, 0.319, 0.329, 0.24, 0.265, 0.382, 0.062, + 0.076, 0.002, 0.003, 0.001, 0.008, 0.0001, 0.28, 0.228, 0.122, 0.346, 0.208, 0.185, 0.11, 0.117, 0.317, 0.071, + 0.084, 0.154, 0.152, 0.245, 0.188, 0.145, 0.004, 0.099, 0.307, 0.104, 0.026, 0.15, 0.089, 0.002, 0.005, 0.114, + 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 4.665, 0.916, 0.779, 3.731, 13.123, 0.39, 1.695, 1.202, 4.867, + 0.455, 1.861, 2.604, 1.621, 7.033, 3.935, 1.063, 0.011, 4.601, 3.105, 3.908, 1.82, 1.832, 0.958, 0.04, 0.135, + 0.573, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.482, 0.005, 0.003, 0.002, 0.003, 0.002, 0.001, 0.001, 0.002, + 0.005, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.005, 0.003, 0.001, 0.0001, 0.001, + 0.021, 0.432, 0.001, 0.001, 0.01, 0.009, 0.003, 0.005, 0.009, 0.008, 0.021, 0.001, 0.002, 0.001, 0.003, 0.005, + 0.09, 0.052, 0.453, 0.056, 0.009, 0.006, 0.003, 0.006, 0.115, 0.002, 0.14, 0.027, 0.252, 0.001, 0.064, 0.0001, + 0.002, 0.002, 0.002, 0.006, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.239, 1.084, 0.009, 0.01, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.008, 0.003, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.002, 0.007, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.481, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ], + "zu": [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.261, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 10.94, 0.004, 0.267, 0.001, 0.002, 0.016, 0.003, 0.041, 0.181, 0.181, 0.001, + 0.001, 0.907, 0.49, 0.797, 0.099, 0.343, 0.379, 0.279, 0.134, 0.118, 0.116, 0.102, 0.097, 0.11, 0.223, 0.065, + 0.035, 0.134, 0.003, 0.135, 0.005, 0.0001, 0.296, 0.147, 0.142, 0.093, 0.11, 0.08, 0.077, 0.065, 0.3, 0.114, + 0.141, 0.151, 0.361, 0.387, 0.067, 0.128, 0.012, 0.082, 0.239, 0.152, 0.188, 0.039, 0.182, 0.012, 0.045, 0.07, + 0.138, 0.0001, 0.139, 0.0001, 0.001, 0.0001, 10.325, 2.215, 0.829, 1.627, 7.521, 0.687, 2.042, 3.525, 7.719, + 0.199, 3.874, 4.421, 2.406, 6.494, 4.881, 0.951, 0.342, 1.361, 3.011, 2.552, 4.691, 0.394, 2.227, 0.134, 1.688, + 1.779, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.08, 0.007, 0.001, 0.001, 0.002, 0.0001, 0.014, 0.002, 0.002, + 0.001, 0.0001, 0.001, 0.003, 0.005, 0.001, 0.002, 0.002, 0.014, 0.001, 0.01, 0.003, 0.0001, 0.001, 0.001, 0.002, + 0.06, 0.0001, 0.001, 0.003, 0.003, 0.001, 0.0001, 0.084, 0.004, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.004, + 0.002, 0.005, 0.003, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.004, 0.003, 0.003, 0.005, 0.002, 0.002, 0.001, 0.006, + 0.005, 0.002, 0.003, 0.005, 0.002, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.089, 0.024, 0.004, 0.007, 0.0001, + 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.029, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.005, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.091, 0.001, 0.0001, + 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 + ] }); /** diff --git a/src/core/lib/PGP.mjs b/src/core/lib/PGP.mjs index cbb31b92..51a73d0e 100644 --- a/src/core/lib/PGP.mjs +++ b/src/core/lib/PGP.mjs @@ -20,7 +20,7 @@ const promisify = es6promisify.default ? es6promisify.default.promisify : es6pro * Progress callback */ export const ASP = kbpgp.ASP({ - "progress_hook": info => { + "progress_hook": (info) => { let msg = ""; switch (info.what) { @@ -46,8 +46,7 @@ export const ASP = kbpgp.ASP({ msg = `Stage: ${info.what}`; } - if (isWorkerEnvironment()) - self.sendStatusMessage(msg); + if (isWorkerEnvironment()) self.sendStatusMessage(msg); } }); @@ -62,18 +61,18 @@ export function getSubkeySize(keySize) { 1024: 1024, 2048: 1024, 4096: 2048, - 256: 256, - 384: 256, + 256: 256, + 384: 256 }[keySize]; } /** -* Import private key and unlock if necessary -* -* @param {string} privateKey -* @param {string} [passphrase] -* @returns {Object} -*/ + * Import private key and unlock if necessary + * + * @param {string} privateKey + * @param {string} [passphrase] + * @returns {Object} + */ export async function importPrivateKey(privateKey, passphrase) { try { const key = await promisify(kbpgp.KeyManager.import_from_armored_pgp)({ @@ -103,7 +102,7 @@ export async function importPrivateKey(privateKey, passphrase) { * @param {string} publicKey * @returns {Object} */ -export async function importPublicKey (publicKey) { +export async function importPublicKey(publicKey) { try { const key = await promisify(kbpgp.KeyManager.import_from_armored_pgp)({ armored: publicKey, diff --git a/src/core/lib/Protobuf.mjs b/src/core/lib/Protobuf.mjs index e131d3a5..05847439 100644 --- a/src/core/lib/Protobuf.mjs +++ b/src/core/lib/Protobuf.mjs @@ -13,7 +13,6 @@ import protobuf from "protobufjs"; * @license Apache-2.0 */ class Protobuf { - /** * Protobuf constructor * @@ -140,10 +139,10 @@ class Protobuf { static updateMainMessageName() { const messageNames = []; const fieldTypes = []; - this.parsedProto.root.nestedArray.forEach(block => { + this.parsedProto.root.nestedArray.forEach((block) => { if (block instanceof protobuf.Type) { messageNames.push(block.name); - this.parsedProto.root.nested[block.name].fieldsArray.forEach(field => { + this.parsedProto.root.nested[block.name].fieldsArray.forEach((field) => { fieldTypes.push(field.type); }); } @@ -195,7 +194,6 @@ class Protobuf { } else { return packageDecode; } - } catch (error) { if (message) { throw new Error("Input " + error); @@ -216,7 +214,14 @@ class Protobuf { if (block instanceof protobuf.Type) { for (const [fieldName, fieldData] of Object.entries(block.fields)) { schemaRoot.nested[block.name].remove(block.fields[fieldName]); - schemaRoot.nested[block.name].add(new protobuf.Field(`${fieldName} (${fieldData.type})`, fieldData.id, fieldData.type, fieldData.rule)); + schemaRoot.nested[block.name].add( + new protobuf.Field( + `${fieldName} (${fieldData.type})`, + fieldData.id, + fieldData.type, + fieldData.rule + ) + ); } } } @@ -244,7 +249,7 @@ class Protobuf { if (Array.isArray(value)) { const fieldInstances = []; for (const instance of Object.keys(value)) { - if (typeof(value[instance]) !== "string") { + if (typeof value[instance] !== "string") { fieldInstances.push(this.showRawTypes(value[instance], fieldType)); } else { fieldInstances.push(value[instance]); @@ -252,12 +257,12 @@ class Protobuf { } outputFieldValue = fieldInstances; - // Single submessage + // Single submessage } else { outputFieldValue = this.showRawTypes(value, fieldType); } - // Non-submessage field + // Non-submessage field } else { outputFieldType = fieldType; outputFieldValue = value; @@ -281,7 +286,7 @@ class Protobuf { // Define message data using raw decode output and schema const schemaFieldProperties = {}; const schemaFieldNames = Object.keys(schemaMessage.fields); - schemaFieldNames.forEach(field => schemaFieldProperties[schemaMessage.fields[field].id] = field); + schemaFieldNames.forEach((field) => (schemaFieldProperties[schemaMessage.fields[field].id] = field)); // Loop over each field present in the raw decode output for (const fieldName in rawDecodedMessage) { @@ -314,9 +319,9 @@ class Protobuf { // Squash multiple submessage instances into one submessage if (Array.isArray(rawSubMessages)) { - rawSubMessages.forEach(subMessageInstance => { + rawSubMessages.forEach((subMessageInstance) => { const instanceFields = Object.entries(subMessageInstance); - instanceFields.forEach(subField => { + instanceFields.forEach((subField) => { rawDecodedSubMessage[subField[0]] = subField[1]; }); }); @@ -327,7 +332,8 @@ class Protobuf { // Treat submessage as own message and compare its fields rawDecodedSubMessage = Protobuf.compareFields(rawDecodedSubMessage, schemaSubMessage); if (Object.entries(rawDecodedSubMessage).length !== 0) { - rawDecodedMessage[`${schemaFieldName} (${subMessageType}) has missing fields`] = rawDecodedSubMessage; + rawDecodedMessage[`${schemaFieldName} (${subMessageType}) has missing fields`] + = rawDecodedSubMessage; } } delete rawDecodedMessage[fieldName]; @@ -392,11 +398,11 @@ class Protobuf { // Get the field key/values const key = field.key; const value = field.value; - object[key] = Object.prototype.hasOwnProperty.call(object, key) ? - object[key] instanceof Array ? - object[key].concat([value]) : - [object[key], value] : - value; + object[key] = Object.prototype.hasOwnProperty.call(object, key) + ? object[key] instanceof Array + ? object[key].concat([value]) + : [object[key], value] + : value; return object; } @@ -412,7 +418,7 @@ class Protobuf { const type = header.type; const key = header.key; - if (typeof(this.fieldTypes[key]) !== "object") { + if (typeof this.fieldTypes[key] !== "object") { this.fieldTypes[key] = type; } @@ -472,11 +478,12 @@ class Protobuf { let shift = -3; let fieldNumber = 0; do { - fieldNumber += shift < 28 ? - shift === -3 ? - (this.data[this.offset] & this.NUMBER) >> -shift : - (this.data[this.offset] & this.VALUE) << shift : - (this.data[this.offset] & this.VALUE) * Math.pow(2, shift); + fieldNumber + += shift < 28 + ? shift === -3 + ? (this.data[this.offset] & this.NUMBER) >> -shift + : (this.data[this.offset] & this.VALUE) << shift + : (this.data[this.offset] & this.VALUE) * Math.pow(2, shift); shift += 7; } while ((this.data[this.offset++] & this.MSB) === this.MSB); return fieldNumber; @@ -495,9 +502,10 @@ class Protobuf { let shift = 0; // Keep reading while upper bit set do { - value += shift < 28 ? - (this.data[this.offset] & this.VALUE) << shift : - (this.data[this.offset] & this.VALUE) * Math.pow(2, shift); + value + += shift < 28 + ? (this.data[this.offset] & this.VALUE) << shift + : (this.data[this.offset] & this.VALUE) * Math.pow(2, shift); shift += 7; } while ((this.data[this.offset++] & this.MSB) === this.MSB); return value; @@ -511,8 +519,16 @@ class Protobuf { */ _uint64() { // Read off a Uint64 with little-endian - const lowerHalf = this.data[this.offset++] + (this.data[this.offset++] * 0x100) + (this.data[this.offset++] * 0x10000) + this.data[this.offset++] * 0x1000000; - const upperHalf = this.data[this.offset++] + (this.data[this.offset++] * 0x100) + (this.data[this.offset++] * 0x10000) + this.data[this.offset++] * 0x1000000; + const lowerHalf + = this.data[this.offset++] + + this.data[this.offset++] * 0x100 + + this.data[this.offset++] * 0x10000 + + this.data[this.offset++] * 0x1000000; + const upperHalf + = this.data[this.offset++] + + this.data[this.offset++] * 0x100 + + this.data[this.offset++] * 0x10000 + + this.data[this.offset++] * 0x1000000; return upperHalf * 0x100000000 + lowerHalf; } @@ -533,8 +549,7 @@ class Protobuf { field = pbObject._parse(); // Set field types object - this.fieldTypes[fieldNum] = {...this.fieldTypes[fieldNum], ...pbObject.fieldTypes}; - + this.fieldTypes[fieldNum] = { ...this.fieldTypes[fieldNum], ...pbObject.fieldTypes }; } catch (err) { // Otherwise treat as bytes field = Utils.byteArrayToChars(fieldBytes); diff --git a/src/core/lib/Protocol.mjs b/src/core/lib/Protocol.mjs index 57d2374a..69819cce 100644 --- a/src/core/lib/Protocol.mjs +++ b/src/core/lib/Protocol.mjs @@ -7,7 +7,7 @@ */ import BigNumber from "bignumber.js"; -import {toHexFast} from "../lib/Hex.mjs"; +import { toHexFast } from "../lib/Hex.mjs"; /** * Recursively displays a JSON object as an HTML table @@ -15,7 +15,7 @@ import {toHexFast} from "../lib/Hex.mjs"; * @param {Object} obj * @returns string */ -export function objToTable(obj, nested=false) { +export function objToTable(obj, nested = false) { let html = ``; @@ -27,10 +27,8 @@ export function objToTable(obj, nested=false) { for (const key in obj) { html += ``; - if (typeof obj[key] === "object") - html += ``; - else - html += ``; + if (typeof obj[key] === "object") html += ``; + else html += ``; html += ""; } html += "
${key}${objToTable(obj[key], true)}${obj[key]}${objToTable(obj[key], true)}${obj[key]}
"; diff --git a/src/core/lib/PublicKey.mjs b/src/core/lib/PublicKey.mjs index ea931d7e..bcecf9dd 100644 --- a/src/core/lib/PublicKey.mjs +++ b/src/core/lib/PublicKey.mjs @@ -35,7 +35,6 @@ export function formatDnObj(dnObj, indent) { return output.slice(0, -1); } - /** * Formats byte strings by adding line breaks and delimiters. * @@ -58,5 +57,5 @@ export function formatByteStr(byteStr, length, indent) { } } - return output.slice(0, output.length-1); + return output.slice(0, output.length - 1); } diff --git a/src/core/lib/QRCode.mjs b/src/core/lib/QRCode.mjs index 842ebd55..f11f1f5b 100644 --- a/src/core/lib/QRCode.mjs +++ b/src/core/lib/QRCode.mjs @@ -30,7 +30,7 @@ export async function parseQrCode(input, normalise) { try { if (normalise) { image.rgba(false); - image.background(0xFFFFFFFF); + image.background(0xffffffff); image.normalize(); image.greyscale(); image = await image.getBufferAsync(jimp.MIME_JPEG); diff --git a/src/core/lib/RSA.mjs b/src/core/lib/RSA.mjs index 9037379c..dcf03fba 100644 --- a/src/core/lib/RSA.mjs +++ b/src/core/lib/RSA.mjs @@ -13,5 +13,5 @@ export const MD_ALGORITHMS = { "MD5": forge.md.md5, "SHA-256": forge.md.sha256, "SHA-384": forge.md.sha384, - "SHA-512": forge.md.sha512, + "SHA-512": forge.md.sha512 }; diff --git a/src/core/lib/Rotate.mjs b/src/core/lib/Rotate.mjs index 8d70fb25..30620b73 100644 --- a/src/core/lib/Rotate.mjs +++ b/src/core/lib/Rotate.mjs @@ -8,7 +8,6 @@ * @todo Support for UTF16 */ - /** * Runs rotation operations across the input data. * @@ -29,7 +28,6 @@ export function rot(data, amount, algo) { return result; } - /** * Rotate right bitwise op. * @@ -49,10 +47,9 @@ export function rotr(b) { */ export function rotl(b) { const bit = (b >> 7) & 1; - return ((b << 1) | bit) & 0xFF; + return ((b << 1) | bit) & 0xff; } - /** * Rotates a byte array to the right by a specific amount as a whole, so that bits are wrapped * from the end of the array to the beginning. @@ -70,14 +67,13 @@ export function rotrCarry(data, amount) { for (let i = 0; i < data.length; i++) { const oldByte = data[i] >>> 0; newByte = (oldByte >> amount) | carryBits; - carryBits = (oldByte & (Math.pow(2, amount)-1)) << (8-amount); + carryBits = (oldByte & (Math.pow(2, amount) - 1)) << (8 - amount); result.push(newByte); } result[0] |= carryBits; return result; } - /** * Rotates a byte array to the left by a specific amount as a whole, so that bits are wrapped * from the beginning of the array to the end. @@ -92,12 +88,12 @@ export function rotlCarry(data, amount) { newByte; amount = amount % 8; - for (let i = data.length-1; i >= 0; i--) { + for (let i = data.length - 1; i >= 0; i--) { const oldByte = data[i]; - newByte = ((oldByte << amount) | carryBits) & 0xFF; - carryBits = (oldByte >> (8-amount)) & (Math.pow(2, amount)-1); - result[i] = (newByte); + newByte = ((oldByte << amount) | carryBits) & 0xff; + carryBits = (oldByte >> (8 - amount)) & (Math.pow(2, amount) - 1); + result[i] = newByte; } - result[data.length-1] = result[data.length-1] | carryBits; + result[data.length - 1] = result[data.length - 1] | carryBits; return result; } diff --git a/src/core/lib/SIGABA.mjs b/src/core/lib/SIGABA.mjs index 09951c4f..bd7ec36e 100644 --- a/src/core/lib/SIGABA.mjs +++ b/src/core/lib/SIGABA.mjs @@ -10,27 +10,27 @@ * A set of randomised example SIGABA cipher/control rotors (these rotors are interchangeable). Cipher and control rotors can be referred to as C and R rotors respectively. */ export const CR_ROTORS = [ - {name: "Example 1", value: "SRGWANHPJZFXVIDQCEUKBYOLMT"}, - {name: "Example 2", value: "THQEFSAZVKJYULBODCPXNIMWRG"}, - {name: "Example 3", value: "XDTUYLEVFNQZBPOGIRCSMHWKAJ"}, - {name: "Example 4", value: "LOHDMCWUPSTNGVXYFJREQIKBZA"}, - {name: "Example 5", value: "ERXWNZQIJYLVOFUMSGHTCKPBDA"}, - {name: "Example 6", value: "FQECYHJIOUMDZVPSLKRTGWXBAN"}, - {name: "Example 7", value: "TBYIUMKZDJSOPEWXVANHLCFQGR"}, - {name: "Example 8", value: "QZUPDTFNYIAOMLEBWJXCGHKRSV"}, - {name: "Example 9", value: "CZWNHEMPOVXLKRSIDGJFYBTQAU"}, - {name: "Example 10", value: "ENPXJVKYQBFZTICAGMOHWRLDUS"} + { name: "Example 1", value: "SRGWANHPJZFXVIDQCEUKBYOLMT" }, + { name: "Example 2", value: "THQEFSAZVKJYULBODCPXNIMWRG" }, + { name: "Example 3", value: "XDTUYLEVFNQZBPOGIRCSMHWKAJ" }, + { name: "Example 4", value: "LOHDMCWUPSTNGVXYFJREQIKBZA" }, + { name: "Example 5", value: "ERXWNZQIJYLVOFUMSGHTCKPBDA" }, + { name: "Example 6", value: "FQECYHJIOUMDZVPSLKRTGWXBAN" }, + { name: "Example 7", value: "TBYIUMKZDJSOPEWXVANHLCFQGR" }, + { name: "Example 8", value: "QZUPDTFNYIAOMLEBWJXCGHKRSV" }, + { name: "Example 9", value: "CZWNHEMPOVXLKRSIDGJFYBTQAU" }, + { name: "Example 10", value: "ENPXJVKYQBFZTICAGMOHWRLDUS" } ]; /** * A set of randomised example SIGABA index rotors (may be referred to as I rotors). */ export const I_ROTORS = [ - {name: "Example 1", value: "6201348957"}, - {name: "Example 2", value: "6147253089"}, - {name: "Example 3", value: "8239647510"}, - {name: "Example 4", value: "7194835260"}, - {name: "Example 5", value: "4873205916"} + { name: "Example 1", value: "6201348957" }, + { name: "Example 2", value: "6147253089" }, + { name: "Example 3", value: "8239647510" }, + { name: "Example 4", value: "7194835260" }, + { name: "Example 5", value: "4873205916" } ]; export const NUMBERS = "0123456789".split(""); @@ -43,8 +43,8 @@ export const NUMBERS = "0123456789".split(""); */ export function convToUpperCase(letter) { const charCode = letter.charCodeAt(); - if (97<=charCode && charCode<=122) { - return String.fromCharCode(charCode-32); + if (97 <= charCode && charCode <= 122) { + return String.fromCharCode(charCode - 32); } return letter; } @@ -53,7 +53,6 @@ export function convToUpperCase(letter) { * The SIGABA machine consisting of the 3 rotor banks: cipher, control and index banks. */ export class SigabaMachine { - /** * SigabaMachine constructor * @@ -137,14 +136,12 @@ export class SigabaMachine { } return plaintext; } - } /** * The cipher rotor bank consists of 5 cipher rotors in either a forward or reversed orientation. */ export class CipherBank { - /** * CipherBank constructor * @@ -187,7 +184,7 @@ export class CipherBank { * @param {number[]} indexInputs - the inputs from the index rotors */ step(indexInputs) { - const logicDict = {0: [0, 9], 1: [7, 8], 2: [5, 6], 3: [3, 4], 4: [1, 2]}; + const logicDict = { 0: [0, 9], 1: [7, 8], 2: [5, 6], 3: [3, 4], 4: [1, 2] }; const rotorsToMove = []; for (const key in logicDict) { const item = logicDict[key]; @@ -202,14 +199,12 @@ export class CipherBank { rotor.step(); } } - } /** * The control rotor bank consists of 5 control rotors in either a forward or reversed orientation. Signals to the control rotor bank always go from right-to-left. */ export class ControlBank { - /** * ControlBank constructor. The rotors have been reversed as signals go from right-to-left through the control rotors. * @@ -239,7 +234,7 @@ export class ControlBank { */ getOutputs() { const outputs = [this.crypt("F"), this.crypt("G"), this.crypt("H"), this.crypt("I")]; - const logicDict = {1: "B", 2: "C", 3: "DE", 4: "FGH", 5: "IJK", 6: "LMNO", 7: "PQRST", 8: "UVWXYZ", 9: "A"}; + const logicDict = { 1: "B", 2: "C", 3: "DE", 4: "FGH", 5: "IJK", 6: "LMNO", 7: "PQRST", 8: "UVWXYZ", 9: "A" }; const numberOutputs = []; for (const key in logicDict) { const item = logicDict[key]; @@ -257,7 +252,9 @@ export class ControlBank { * Steps the control rotors. Only 3 of the control rotors step: one after every encryption, one after every 26, and one after every 26 squared. */ step() { - const MRotor = this.rotors[1], FRotor = this.rotors[2], SRotor = this.rotors[3]; + const MRotor = this.rotors[1], + FRotor = this.rotors[2], + SRotor = this.rotors[3]; // 14 is the offset of "O" from "A" - the next rotor steps once the previous rotor reaches "O" if (FRotor.state === 14) { if (MRotor.state === 14) { @@ -278,14 +275,12 @@ export class ControlBank { this.step(); return outputs; } - } /** * The index rotor bank consists of 5 index rotors all placed in the forwards orientation. */ export class IndexBank { - /** * IndexBank constructor * @@ -321,14 +316,12 @@ export class IndexBank { } return outputs; } - } /** * Rotor class */ export class Rotor { - /** * Rotor constructor * @@ -350,12 +343,12 @@ export class Rotor { * @returns {number[]} */ getNumMapping(wireSetting, rev) { - if (rev===false) { + if (rev === false) { return wireSetting; } else { const length = wireSetting.length; const tempMapping = new Array(length); - for (let i=0; i this.state-length; i--) { - let res = i%length; - if (res<0) { + for (let i = this.state; i > this.state - length; i--) { + let res = i % length; + if (res < 0) { res += length; } posMapping.push(res); @@ -418,14 +411,12 @@ export class Rotor { this.posMapping.splice(0, 0, lastNum); this.state = this.posMapping[0]; } - } /** * A CRRotor is a cipher (C) or control (R) rotor. These rotors are identical and interchangeable. A C or R rotor consists of 26 contacts, one for each letter, and may be put into either a forwards of reversed orientation. */ export class CRRotor extends Rotor { - /** * CRRotor constructor * @@ -433,7 +424,7 @@ export class CRRotor extends Rotor { * @param {char} key - initial state of rotor * @param {bool} rev - true if reversed, false if not */ - constructor(wireSetting, key, rev=false) { + constructor(wireSetting, key, rev = false) { wireSetting = wireSetting.split("").map(CRRotor.letterToNum); super(wireSetting, CRRotor.letterToNum(key), rev); } @@ -445,7 +436,7 @@ export class CRRotor extends Rotor { * @returns {number} */ static letterToNum(letter) { - return letter.charCodeAt()-65; + return letter.charCodeAt() - 65; } /** @@ -455,7 +446,7 @@ export class CRRotor extends Rotor { * @returns {char} */ static numToLetter(num) { - return String.fromCharCode(num+65); + return String.fromCharCode(num + 65); } /** @@ -470,14 +461,12 @@ export class CRRotor extends Rotor { const outPos = this.cryptNum(inputPos, direction); return CRRotor.numToLetter(outPos); } - } /** * An IRotor is an index rotor, which consists of 10 contacts each numbered from 0 to 9. Unlike C and R rotors, they cannot be put in the reversed orientation. The index rotors do not step at any point during encryption or decryption. */ export class IRotor extends Rotor { - /** * IRotor constructor * @@ -498,5 +487,4 @@ export class IRotor extends Rotor { crypt(inputPos) { return this.cryptNum(inputPos, "leftToRight"); } - } diff --git a/src/core/lib/SM4.mjs b/src/core/lib/SM4.mjs index 5f5846a2..0af158bc 100644 --- a/src/core/lib/SM4.mjs +++ b/src/core/lib/SM4.mjs @@ -23,34 +23,28 @@ const BLOCKSIZE = 16; /** The S box, 256 8-bit values */ const Sbox = [ - 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, - 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, - 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, - 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, - 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8, - 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35, - 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, - 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, - 0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, - 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, - 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f, - 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, - 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, - 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, - 0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, - 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48 + 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, 0x2b, 0x67, 0x9a, + 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, + 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, + 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, + 0xe6, 0x85, 0x4f, 0xa8, 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, + 0x35, 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, 0xd4, 0x00, + 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, 0xea, 0xbf, 0x8a, 0xd2, 0x40, + 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, + 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, + 0xab, 0x0d, 0x53, 0x4e, 0x6f, 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, + 0x5b, 0x51, 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, 0x0a, + 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, 0x89, 0x69, 0x97, 0x4a, + 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, + 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48 ]; /** "Fixed parameter CK" used in key expansion */ const CK = [ - 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, - 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, - 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, - 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, - 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, - 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, - 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, - 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 + 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, 0xe0e7eef5, + 0xfc030a11, 0x181f262d, 0x343b4249, 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, 0xc0c7ced5, 0xdce3eaf1, + 0xf8ff060d, 0x141b2229, 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, + 0xf4fb0209, 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 ]; /** "System parameter FK" */ @@ -73,8 +67,11 @@ function ROL(i, n) { */ function transformL(b) { /* Replace each of the 4 bytes in b with the value at its offset in the Sbox */ - b = (Sbox[(b >>> 24) & 0xFF] << 24) | (Sbox[(b >>> 16) & 0xFF] << 16) | - (Sbox[(b >>> 8) & 0xFF] << 8) | Sbox[b & 0xFF]; + b + = (Sbox[(b >>> 24) & 0xff] << 24) + | (Sbox[(b >>> 16) & 0xff] << 16) + | (Sbox[(b >>> 8) & 0xff] << 8) + | Sbox[b & 0xff]; /* circular rotate and xor */ return b ^ ROL(b, 2) ^ ROL(b, 10) ^ ROL(b, 18) ^ ROL(b, 24); } @@ -86,8 +83,11 @@ function transformL(b) { */ function transformLprime(b) { /* Replace each of the 4 bytes in b with the value at its offset in the Sbox */ - b = (Sbox[(b >>> 24) & 0xFF] << 24) | (Sbox[(b >>> 16) & 0xFF] << 16) | - (Sbox[(b >>> 8) & 0xFF] << 8) | Sbox[b & 0xFF]; + b + = (Sbox[(b >>> 24) & 0xff] << 24) + | (Sbox[(b >>> 16) & 0xff] << 16) + | (Sbox[(b >>> 8) & 0xff] << 8) + | Sbox[b & 0xff]; return b ^ ROL(b, 13) ^ ROL(b, 23); /* circular rotate and XOR */ } @@ -95,7 +95,7 @@ function transformLprime(b) { * Initialize the round key */ function initSM4RoundKey(rawkey) { - const K = rawkey.map((a, i) => a ^ FK[i]); /* K = rawkey ^ FK */ + const K = rawkey.map((a, i) => a ^ FK[i]); /* K = rawkey ^ FK */ const roundKey = []; for (let i = 0; i < 32; i++) roundKey[i] = K[i + 4] = K[i] ^ transformLprime(K[i + 1] ^ K[i + 2] ^ K[i + 3] ^ CK[i]); @@ -110,8 +110,7 @@ function initSM4RoundKey(rawkey) { * @returns {byteArray} - The cipher text. */ function encryptBlockSM4(X, roundKey) { - for (let i = 0; i < NROUNDS; i++) - X[i + 4] = X[i] ^ transformL(X[i + 1] ^ X[i + 2] ^ X[i + 3] ^ roundKey[i]); + for (let i = 0; i < NROUNDS; i++) X[i + 4] = X[i] ^ transformL(X[i + 1] ^ X[i + 2] ^ X[i + 3] ^ roundKey[i]); return [X[35], X[34], X[33], X[32]]; } @@ -122,7 +121,7 @@ function encryptBlockSM4(X, roundKey) { * @param {byteArray} bArray - the array of bytes * @param {integer} offset - starting offset in the array; 15 bytes must follow it. */ -function bytesToInts(bArray, offs=0) { +function bytesToInts(bArray, offs = 0) { let offset = offs; const A = (bArray[offset] << 24) | (bArray[offset + 1] << 16) | (bArray[offset + 2] << 8) | bArray[offset + 3]; offset += 4; @@ -141,10 +140,10 @@ function bytesToInts(bArray, offs=0) { function intsToBytes(ints) { const bArr = []; for (let i = 0; i < ints.length; i++) { - bArr.push((ints[i] >> 24) & 0xFF); - bArr.push((ints[i] >> 16) & 0xFF); - bArr.push((ints[i] >> 8) & 0xFF); - bArr.push(ints[i] & 0xFF); + bArr.push((ints[i] >> 24) & 0xff); + bArr.push((ints[i] >> 16) & 0xff); + bArr.push((ints[i] >> 8) & 0xff); + bArr.push(ints[i] & 0xff); } return bArr; } @@ -159,25 +158,22 @@ function intsToBytes(ints) { * @param {boolean} noPadding - Don't add PKCS#7 padding if set. * @returns {byteArray} - The cipher text. */ -export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { +export function encryptSM4(message, key, iv, mode = "ECB", noPadding = false) { const messageLength = message.length; - if (messageLength === 0) - return []; + if (messageLength === 0) return []; const roundKey = initSM4RoundKey(bytesToInts(key, 0)); /* Pad with PKCS#7 if requested for ECB/CBC else add zeroes (which are sliced off at the end) */ let padByte = 0; - let nPadding = 16 - (message.length & 0xF); + let nPadding = 16 - (message.length & 0xf); if (mode === "ECB" || mode === "CBC") { if (noPadding) { if (nPadding !== 16) throw new OperationError(`No padding requested in ${mode} mode but input is not a 16-byte multiple.`); nPadding = 0; - } else - padByte = nPadding; + } else padByte = nPadding; } - for (let i = 0; i < nPadding; i++) - message.push(padByte); + for (let i = 0; i < nPadding; i++) message.push(padByte); const cipherText = []; switch (mode) { @@ -189,8 +185,10 @@ export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { iv = bytesToInts(iv, 0); for (let i = 0; i < message.length; i += BLOCKSIZE) { const block = bytesToInts(message, i); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; iv = encryptBlockSM4(block, roundKey); Array.prototype.push.apply(cipherText, intsToBytes(iv)); } @@ -200,8 +198,10 @@ export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { for (let i = 0; i < message.length; i += BLOCKSIZE) { iv = encryptBlockSM4(iv, roundKey); const block = bytesToInts(message, i); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; Array.prototype.push.apply(cipherText, intsToBytes(block)); iv = block; } @@ -211,8 +211,10 @@ export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { for (let i = 0; i < message.length; i += BLOCKSIZE) { iv = encryptBlockSM4(iv, roundKey); const block = bytesToInts(message, i); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; Array.prototype.push.apply(cipherText, intsToBytes(block)); } break; @@ -220,19 +222,20 @@ export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { iv = bytesToInts(iv, 0); for (let i = 0; i < message.length; i += BLOCKSIZE) { let iv2 = [...iv]; /* containing the IV + counter */ - iv2[3] += (i >> 4);/* Using a 32 bit counter here. 64 Gb encrypts should be enough for everyone. */ + iv2[3] += i >> 4; /* Using a 32 bit counter here. 64 Gb encrypts should be enough for everyone. */ iv2 = encryptBlockSM4(iv2, roundKey); const block = bytesToInts(message, i); - block[0] ^= iv2[0]; block[1] ^= iv2[1]; - block[2] ^= iv2[2]; block[3] ^= iv2[3]; + block[0] ^= iv2[0]; + block[1] ^= iv2[1]; + block[2] ^= iv2[2]; + block[3] ^= iv2[3]; Array.prototype.push.apply(cipherText, intsToBytes(block)); } break; default: - throw new OperationError("Invalid block cipher mode: "+mode); + throw new OperationError("Invalid block cipher mode: " + mode); } - if (mode !== "ECB" && mode !== "CBC") - return cipherText.slice(0, messageLength); + if (mode !== "ECB" && mode !== "CBC") return cipherText.slice(0, messageLength); return cipherText; } @@ -246,34 +249,40 @@ export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { * @param {boolean] ignorePadding - If true, ignore padding issues in ECB/CBC mode. * @returns {byteArray} - The cipher text. */ -export function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) { +export function decryptSM4(cipherText, key, iv, mode = "ECB", ignorePadding = false) { const originalLength = cipherText.length; - if (originalLength === 0) - return []; + if (originalLength === 0) return []; let roundKey = initSM4RoundKey(bytesToInts(key, 0)); if (mode === "ECB" || mode === "CBC") { /* Init decryption key */ roundKey = roundKey.reverse(); - if ((originalLength & 0xF) !== 0 && !ignorePadding) - throw new OperationError(`With ECB or CBC modes, the input must be divisible into 16 byte blocks. (${cipherText.length & 0xF} bytes extra)`); - } else { /* Pad dummy bytes for other modes, chop them off at the end */ - while ((cipherText.length & 0xF) !== 0) - cipherText.push(0); + if ((originalLength & 0xf) !== 0 && !ignorePadding) + throw new OperationError( + `With ECB or CBC modes, the input must be divisible into 16 byte blocks. (${cipherText.length & 0xf} bytes extra)` + ); + } else { + /* Pad dummy bytes for other modes, chop them off at the end */ + while ((cipherText.length & 0xf) !== 0) cipherText.push(0); } const clearText = []; switch (mode) { case "ECB": for (let i = 0; i < cipherText.length; i += BLOCKSIZE) - Array.prototype.push.apply(clearText, intsToBytes(encryptBlockSM4(bytesToInts(cipherText, i), roundKey))); + Array.prototype.push.apply( + clearText, + intsToBytes(encryptBlockSM4(bytesToInts(cipherText, i), roundKey)) + ); break; case "CBC": iv = bytesToInts(iv, 0); for (let i = 0; i < cipherText.length; i += BLOCKSIZE) { const block = encryptBlockSM4(bytesToInts(cipherText, i), roundKey); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; Array.prototype.push.apply(clearText, intsToBytes(block)); iv = bytesToInts(cipherText, i); } @@ -283,8 +292,10 @@ export function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) for (let i = 0; i < cipherText.length; i += BLOCKSIZE) { iv = encryptBlockSM4(iv, roundKey); const block = bytesToInts(cipherText, i); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; Array.prototype.push.apply(clearText, intsToBytes(block)); iv = bytesToInts(cipherText, i); } @@ -294,8 +305,10 @@ export function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) for (let i = 0; i < cipherText.length; i += BLOCKSIZE) { iv = encryptBlockSM4(iv, roundKey); const block = bytesToInts(cipherText, i); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; Array.prototype.push.apply(clearText, intsToBytes(block)); } break; @@ -303,11 +316,13 @@ export function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) iv = bytesToInts(iv, 0); for (let i = 0; i < cipherText.length; i += BLOCKSIZE) { let iv2 = [...iv]; /* containing the IV + counter */ - iv2[3] += (i >> 4);/* Using a 32 bit counter here. 64 Gb encrypts should be enough for everyone. */ + iv2[3] += i >> 4; /* Using a 32 bit counter here. 64 Gb encrypts should be enough for everyone. */ iv2 = encryptBlockSM4(iv2, roundKey); const block = bytesToInts(cipherText, i); - block[0] ^= iv2[0]; block[1] ^= iv2[1]; - block[2] ^= iv2[2]; block[3] ^= iv2[3]; + block[0] ^= iv2[0]; + block[1] ^= iv2[1]; + block[2] ^= iv2[2]; + block[3] ^= iv2[3]; Array.prototype.push.apply(clearText, intsToBytes(block)); } break; @@ -316,16 +331,12 @@ export function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) } /* Check PKCS#7 padding */ if (mode === "ECB" || mode === "CBC") { - if (ignorePadding) - return clearText; + if (ignorePadding) return clearText; const padByte = clearText[clearText.length - 1]; - if (padByte > 16) - throw new OperationError("Invalid PKCS#7 padding."); + if (padByte > 16) throw new OperationError("Invalid PKCS#7 padding."); for (let i = 0; i < padByte; i++) - if (clearText[clearText.length -i - 1] !== padByte) - throw new OperationError("Invalid PKCS#7 padding."); + if (clearText[clearText.length - i - 1] !== padByte) throw new OperationError("Invalid PKCS#7 padding."); return clearText.slice(0, clearText.length - padByte); } return clearText.slice(0, originalLength); } - diff --git a/src/core/lib/Sort.mjs b/src/core/lib/Sort.mjs index c8998f61..4e58f270 100644 --- a/src/core/lib/Sort.mjs +++ b/src/core/lib/Sort.mjs @@ -18,7 +18,6 @@ export function caseInsensitiveSort(a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); } - /** * Comparison operation for sorting of IPv4 addresses. * @@ -59,7 +58,8 @@ export function numericSort(a, b) { const ret = a_[i].localeCompare(b_[i]); // Compare strings if (ret !== 0) return ret; } - if (!isNaN(a_[i]) && !isNaN(b_[i])) { // Compare numbers + if (!isNaN(a_[i]) && !isNaN(b_[i])) { + // Compare numbers if (a_[i] - b_[i] !== 0) return a_[i] - b_[i]; } } @@ -79,12 +79,12 @@ export function hexadecimalSort(a, b) { let a_ = a.split(/([^\da-f]+)/i), b_ = b.split(/([^\da-f]+)/i); - a_ = a_.map(v => { + a_ = a_.map((v) => { const t = parseInt(v, 16); return isNaN(t) ? v : t; }); - b_ = b_.map(v => { + b_ = b_.map((v) => { const t = parseInt(v, 16); return isNaN(t) ? v : t; }); @@ -96,7 +96,8 @@ export function hexadecimalSort(a, b) { const ret = a_[i].localeCompare(b_[i]); // Compare strings if (ret !== 0) return ret; } - if (!isNaN(a_[i]) && !isNaN(b_[i])) { // Compare numbers + if (!isNaN(a_[i]) && !isNaN(b_[i])) { + // Compare numbers if (a_[i] - b_[i] !== 0) return a_[i] - b_[i]; } } @@ -114,4 +115,3 @@ export function hexadecimalSort(a, b) { export function lengthSort(a, b) { return a.length - b.length; } - diff --git a/src/core/lib/Stream.mjs b/src/core/lib/Stream.mjs index 18ce71c3..e0f87ab4 100644 --- a/src/core/lib/Stream.mjs +++ b/src/core/lib/Stream.mjs @@ -13,7 +13,6 @@ * as various data types. */ export default class Stream { - /** * Stream constructor. * @@ -32,12 +31,10 @@ export default class Stream { * @param {number} [numBytes=null] * @returns {Uint8Array} */ - getBytes(numBytes=null) { + getBytes(numBytes = null) { if (this.position > this.length) return undefined; - const newPosition = numBytes !== null ? - this.position + numBytes : - this.length; + const newPosition = numBytes !== null ? this.position + numBytes : this.length; const bytes = this.bytes.slice(this.position, newPosition); this.position = newPosition; this.bitPos = 0; @@ -51,7 +48,7 @@ export default class Stream { * @param {number} [numBytes=-1] * @returns {string} */ - readString(numBytes=-1) { + readString(numBytes = -1) { if (this.position > this.length) return undefined; if (numBytes === -1) numBytes = this.length - this.position; @@ -74,7 +71,7 @@ export default class Stream { * @param {string} [endianness="be"] * @returns {number} */ - readInt(numBytes, endianness="be") { + readInt(numBytes, endianness = "be") { if (this.position > this.length) return undefined; let val = 0; @@ -101,7 +98,7 @@ export default class Stream { * @param {string} [endianness="be"] * @returns {number} */ - readBits(numBits, endianness="be") { + readBits(numBits, endianness = "be") { if (this.position > this.length) return undefined; let bitBuf = 0, @@ -115,20 +112,16 @@ export default class Stream { // Not enough bits yet while (bitBufLen < numBits) { - if (endianness === "be") - bitBuf = (bitBuf << bitBufLen) | this.bytes[this.position++]; - else - bitBuf |= this.bytes[this.position++] << bitBufLen; + if (endianness === "be") bitBuf = (bitBuf << bitBufLen) | this.bytes[this.position++]; + else bitBuf |= this.bytes[this.position++] << bitBufLen; bitBufLen += 8; } // Reverse back to numBits if (bitBufLen > numBits) { const excess = bitBufLen - numBits; - if (endianness === "be") - bitBuf >>>= excess; - else - bitBuf &= (1 << numBits) - 1; + if (endianness === "be") bitBuf >>>= excess; + else bitBuf &= (1 << numBits) - 1; bitBufLen -= excess; this.position--; this.bitPos = 8 - excess; @@ -143,9 +136,7 @@ export default class Stream { * @returns {number} The bit mask */ function bitMask(bitPos) { - return endianness === "be" ? - (1 << (8 - bitPos)) - 1 : - 256 - (1 << bitPos); + return endianness === "be" ? (1 << (8 - bitPos)) - 1 : 256 - (1 << bitPos); } } @@ -184,7 +175,7 @@ export default class Stream { } const length = val.length; - const initial = val[length-1]; + const initial = val[length - 1]; this.position = length; // Get the skip table. @@ -193,12 +184,12 @@ export default class Stream { while (this.position < this.length) { // Until we hit the final element of val in the stream. - while ((this.position < this.length) && (this.bytes[this.position++] !== initial)); + while (this.position < this.length && this.bytes[this.position++] !== initial); found = true; // Loop through the elements comparing them to val. - for (let x = length-1; x >= 0; x--) { + for (let x = length - 1; x >= 0; x--) { if (this.bytes[this.position - length + x] !== val[x]) { found = false; @@ -214,7 +205,6 @@ export default class Stream { } } - /** * Consume bytes if they match the supplied value. * @@ -319,9 +309,8 @@ export default class Stream { * @param {number} [finish=this.position] * @returns {Uint8Array} */ - carve(start=0, finish=this.position) { + carve(start = 0, finish = this.position) { if (this.bitPos > 0) finish++; return this.bytes.slice(start, finish); } - } diff --git a/src/core/lib/TLVParser.mjs b/src/core/lib/TLVParser.mjs index cb8432c1..55769b4e 100644 --- a/src/core/lib/TLVParser.mjs +++ b/src/core/lib/TLVParser.mjs @@ -17,7 +17,6 @@ const defaults = { * TLVParser library */ export default class TLVParser { - /** * TLVParser constructor * diff --git a/src/core/lib/Typex.mjs b/src/core/lib/Typex.mjs index 39bdee5d..d0b88101 100644 --- a/src/core/lib/Typex.mjs +++ b/src/core/lib/Typex.mjs @@ -15,28 +15,45 @@ import Utils from "../Utils.mjs"; * randomised. */ export const ROTORS = [ - {name: "Example 1", value: "MCYLPQUVRXGSAOWNBJEZDTFKHI { + wiring = wiring.replace(/./g, (x) => { return reversed[Enigma.a2i(x)]; }); try { diff --git a/src/core/lib/Zlib.mjs b/src/core/lib/Zlib.mjs index 780fd3d7..61b367c6 100644 --- a/src/core/lib/Zlib.mjs +++ b/src/core/lib/Zlib.mjs @@ -13,7 +13,7 @@ const Zlib = zlibAndGzip.Zlib; export const COMPRESSION_TYPE = ["Dynamic Huffman Coding", "Fixed Huffman Coding", "None (Store)"]; export const INFLATE_BUFFER_TYPE = ["Adaptive", "Block"]; export const ZLIB_COMPRESSION_TYPE_LOOKUP = { - "Fixed Huffman Coding": Zlib.Deflate.CompressionType.FIXED, + "Fixed Huffman Coding": Zlib.Deflate.CompressionType.FIXED, "Dynamic Huffman Coding": Zlib.Deflate.CompressionType.DYNAMIC, - "None (Store)": Zlib.Deflate.CompressionType.NONE, + "None (Store)": Zlib.Deflate.CompressionType.NONE }; diff --git a/src/core/operations/A1Z26CipherDecode.mjs b/src/core/operations/A1Z26CipherDecode.mjs index 0b097c2b..4b090202 100644 --- a/src/core/operations/A1Z26CipherDecode.mjs +++ b/src/core/operations/A1Z26CipherDecode.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * A1Z26 Cipher Decode operation */ class A1Z26CipherDecode extends Operation { - /** * A1Z26CipherDecode constructor */ @@ -22,7 +21,8 @@ class A1Z26CipherDecode extends Operation { this.name = "A1Z26 Cipher Decode"; this.module = "Ciphers"; - this.description = "Converts alphabet order numbers into their corresponding alphabet character.

e.g. 1 becomes a and 2 becomes b."; + this.description + = "Converts alphabet order numbers into their corresponding alphabet character.

e.g. 1 becomes a and 2 becomes b."; this.infoURL = ""; this.inputType = "string"; this.outputType = "string"; @@ -35,34 +35,34 @@ class A1Z26CipherDecode extends Operation { ]; this.checks = [ { - pattern: "^\\s*([12]?[0-9] )+[12]?[0-9]\\s*$", - flags: "", - args: ["Space"] + pattern: "^\\s*([12]?[0-9] )+[12]?[0-9]\\s*$", + flags: "", + args: ["Space"] }, { - pattern: "^\\s*([12]?[0-9],)+[12]?[0-9]\\s*$", - flags: "", - args: ["Comma"] + pattern: "^\\s*([12]?[0-9],)+[12]?[0-9]\\s*$", + flags: "", + args: ["Comma"] }, { - pattern: "^\\s*([12]?[0-9];)+[12]?[0-9]\\s*$", - flags: "", - args: ["Semi-colon"] + pattern: "^\\s*([12]?[0-9];)+[12]?[0-9]\\s*$", + flags: "", + args: ["Semi-colon"] }, { - pattern: "^\\s*([12]?[0-9]:)+[12]?[0-9]\\s*$", - flags: "", - args: ["Colon"] + pattern: "^\\s*([12]?[0-9]:)+[12]?[0-9]\\s*$", + flags: "", + args: ["Colon"] }, { - pattern: "^\\s*([12]?[0-9]\\n)+[12]?[0-9]\\s*$", - flags: "", - args: ["Line feed"] + pattern: "^\\s*([12]?[0-9]\\n)+[12]?[0-9]\\s*$", + flags: "", + args: ["Line feed"] }, { - pattern: "^\\s*([12]?[0-9]\\r\\n)+[12]?[0-9]\\s*$", - flags: "", - args: ["CRLF"] + pattern: "^\\s*([12]?[0-9]\\r\\n)+[12]?[0-9]\\s*$", + flags: "", + args: ["CRLF"] } ]; } @@ -89,7 +89,6 @@ class A1Z26CipherDecode extends Operation { } return latin1; } - } export default A1Z26CipherDecode; diff --git a/src/core/operations/A1Z26CipherEncode.mjs b/src/core/operations/A1Z26CipherEncode.mjs index fc562b9e..60b52030 100644 --- a/src/core/operations/A1Z26CipherEncode.mjs +++ b/src/core/operations/A1Z26CipherEncode.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * A1Z26 Cipher Encode operation */ class A1Z26CipherEncode extends Operation { - /** * A1Z26CipherEncode constructor */ @@ -21,7 +20,8 @@ class A1Z26CipherEncode extends Operation { this.name = "A1Z26 Cipher Encode"; this.module = "Ciphers"; - this.description = "Converts alphabet characters into their corresponding alphabet order number.

e.g. a becomes 1 and b becomes 2.

Non-alphabet characters are dropped."; + this.description + = "Converts alphabet characters into their corresponding alphabet order number.

e.g. a becomes 1 and b becomes 2.

Non-alphabet characters are dropped."; this.infoURL = ""; this.inputType = "string"; this.outputType = "string"; @@ -55,7 +55,6 @@ class A1Z26CipherEncode extends Operation { } return output.slice(0, -delim.length); } - } export default A1Z26CipherEncode; diff --git a/src/core/operations/ADD.mjs b/src/core/operations/ADD.mjs index 78580688..511a1729 100644 --- a/src/core/operations/ADD.mjs +++ b/src/core/operations/ADD.mjs @@ -12,7 +12,6 @@ import { bitOp, add, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs"; * ADD operation */ class ADD extends Operation { - /** * ADD constructor */ @@ -71,7 +70,6 @@ class ADD extends Operation { highlightReverse(pos, args) { return pos; } - } export default ADD; diff --git a/src/core/operations/AESDecrypt.mjs b/src/core/operations/AESDecrypt.mjs index e24a5119..39504529 100644 --- a/src/core/operations/AESDecrypt.mjs +++ b/src/core/operations/AESDecrypt.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * AES Decrypt operation */ class AESDecrypt extends Operation { - /** * AESDecrypt constructor */ @@ -22,7 +21,8 @@ class AESDecrypt extends Operation { this.name = "AES Decrypt"; this.module = "Ciphers"; - this.description = "Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.

Key: The following algorithms will be used based on the size of the key:
  • 16 bytes = AES-128
  • 24 bytes = AES-192
  • 32 bytes = AES-256


IV: The Initialization Vector should be 16 bytes long. If not entered, it will default to 16 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default.

GCM Tag: This field is ignored unless 'GCM' mode is used."; + this.description + = "Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.

Key: The following algorithms will be used based on the size of the key:
  • 16 bytes = AES-128
  • 24 bytes = AES-192
  • 32 bytes = AES-256


IV: The Initialization Vector should be 16 bytes long. If not entered, it will default to 16 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default.

GCM Tag: This field is ignored unless 'GCM' mode is used."; this.infoURL = "https://wikipedia.org/wiki/Advanced_Encryption_Standard"; this.inputType = "string"; this.outputType = "string"; @@ -134,7 +134,7 @@ The following algorithms will be used based on the size of the key: /* Allow for a "no padding" mode */ if (noPadding) { - decipher.mode.unpad = function(output, options) { + decipher.mode.unpad = function (output, options) { return true; }; } @@ -153,7 +153,6 @@ The following algorithms will be used based on the size of the key: throw new OperationError("Unable to decrypt input with these parameters."); } } - } export default AESDecrypt; diff --git a/src/core/operations/AESEncrypt.mjs b/src/core/operations/AESEncrypt.mjs index 7b52ff03..fbe30f8d 100644 --- a/src/core/operations/AESEncrypt.mjs +++ b/src/core/operations/AESEncrypt.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * AES Encrypt operation */ class AESEncrypt extends Operation { - /** * AESEncrypt constructor */ @@ -22,7 +21,8 @@ class AESEncrypt extends Operation { this.name = "AES Encrypt"; this.module = "Ciphers"; - this.description = "Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.

Key: The following algorithms will be used based on the size of the key:
  • 16 bytes = AES-128
  • 24 bytes = AES-192
  • 32 bytes = AES-256
You can generate a password-based key using one of the KDF operations.

IV: The Initialization Vector should be 16 bytes long. If not entered, it will default to 16 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used."; + this.description + = "Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.

Key: The following algorithms will be used based on the size of the key:
  • 16 bytes = AES-128
  • 24 bytes = AES-192
  • 32 bytes = AES-256
You can generate a password-based key using one of the KDF operations.

IV: The Initialization Vector should be 16 bytes long. If not entered, it will default to 16 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used."; this.infoURL = "https://wikipedia.org/wiki/Advanced_Encryption_Standard"; this.inputType = "string"; this.outputType = "string"; @@ -124,19 +124,16 @@ The following algorithms will be used based on the size of the key: if (outputType === "Hex") { if (mode === "GCM") { - return cipher.output.toHex() + "\n\n" + - "Tag: " + cipher.mode.tag.toHex(); + return cipher.output.toHex() + "\n\n" + "Tag: " + cipher.mode.tag.toHex(); } return cipher.output.toHex(); } else { if (mode === "GCM") { - return cipher.output.getBytes() + "\n\n" + - "Tag: " + cipher.mode.tag.getBytes(); + return cipher.output.getBytes() + "\n\n" + "Tag: " + cipher.mode.tag.getBytes(); } return cipher.output.getBytes(); } } - } export default AESEncrypt; diff --git a/src/core/operations/AESKeyUnwrap.mjs b/src/core/operations/AESKeyUnwrap.mjs index 1558847a..ccc8c6f4 100644 --- a/src/core/operations/AESKeyUnwrap.mjs +++ b/src/core/operations/AESKeyUnwrap.mjs @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * AES Key Unwrap operation */ class AESKeyUnwrap extends Operation { - /** * AESKeyUnwrap constructor */ @@ -23,7 +22,8 @@ class AESKeyUnwrap extends Operation { this.name = "AES Key Unwrap"; this.module = "Ciphers"; - this.description = "Decryptor for a key wrapping algorithm defined in RFC3394, which is used to protect keys in untrusted storage or communications, using AES.

This algorithm uses an AES key (KEK: key-encryption key) and a 64-bit IV to decrypt 64-bit blocks."; + this.description + = "Decryptor for a key wrapping algorithm defined in RFC3394, which is used to protect keys in untrusted storage or communications, using AES.

This algorithm uses an AES key (KEK: key-encryption key) and a 64-bit IV to decrypt 64-bit blocks."; this.infoURL = "https://wikipedia.org/wiki/Key_wrap"; this.inputType = "string"; this.outputType = "string"; @@ -49,7 +49,7 @@ class AESKeyUnwrap extends Operation { "name": "Output", "type": "option", "value": ["Hex", "Raw"] - }, + } ]; } @@ -90,8 +90,8 @@ class AESKeyUnwrap extends Operation { } let cntLower = R.length >>> 0; let cntUpper = (R.length / ((1 << 30) * 4)) >>> 0; - cntUpper = cntUpper * 6 + ((cntLower * 6 / ((1 << 30) * 4)) >>> 0); - cntLower = cntLower * 6 >>> 0; + cntUpper = cntUpper * 6 + (((cntLower * 6) / ((1 << 30) * 4)) >>> 0); + cntLower = (cntLower * 6) >>> 0; for (let j = 5; j >= 0; j--) { for (let i = R.length - 1; i >= 0; i--) { const aBuffer = Utils.strToArrayBuffer(A); @@ -122,7 +122,6 @@ class AESKeyUnwrap extends Operation { } return P; } - } export default AESKeyUnwrap; diff --git a/src/core/operations/AESKeyWrap.mjs b/src/core/operations/AESKeyWrap.mjs index 38867156..4e9ea5ab 100644 --- a/src/core/operations/AESKeyWrap.mjs +++ b/src/core/operations/AESKeyWrap.mjs @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * AES Key Wrap operation */ class AESKeyWrap extends Operation { - /** * AESKeyWrap constructor */ @@ -23,7 +22,8 @@ class AESKeyWrap extends Operation { this.name = "AES Key Wrap"; this.module = "Ciphers"; - this.description = "A key wrapping algorithm defined in RFC3394, which is used to protect keys in untrusted storage or communications, using AES.

This algorithm uses an AES key (KEK: key-encryption key) and a 64-bit IV to encrypt 64-bit blocks."; + this.description + = "A key wrapping algorithm defined in RFC3394, which is used to protect keys in untrusted storage or communications, using AES.

This algorithm uses an AES key (KEK: key-encryption key) and a 64-bit IV to encrypt 64-bit blocks."; this.infoURL = "https://wikipedia.org/wiki/Key_wrap"; this.inputType = "string"; this.outputType = "string"; @@ -49,7 +49,7 @@ class AESKeyWrap extends Operation { "name": "Output", "type": "option", "value": ["Hex", "Raw"] - }, + } ]; } @@ -82,7 +82,8 @@ class AESKeyWrap extends Operation { for (let i = 0; i < inputData.length; i += 8) { R.push(inputData.substring(i, i + 8)); } - let cntLower = 1, cntUpper = 0; + let cntLower = 1, + cntUpper = 0; for (let j = 0; j < 6; j++) { for (let i = 0; i < R.length; i++) { cipher.start(); @@ -109,7 +110,6 @@ class AESKeyWrap extends Operation { } return C; } - } export default AESKeyWrap; diff --git a/src/core/operations/AMFDecode.mjs b/src/core/operations/AMFDecode.mjs index 50a0d551..744021d8 100644 --- a/src/core/operations/AMFDecode.mjs +++ b/src/core/operations/AMFDecode.mjs @@ -12,7 +12,6 @@ import { AMF0, AMF3 } from "@astronautlabs/amf"; * AMF Decode operation */ class AMFDecode extends Operation { - /** * AMFDecode constructor */ @@ -21,7 +20,8 @@ class AMFDecode extends Operation { this.name = "AMF Decode"; this.module = "Encodings"; - this.description = "Action Message Format (AMF) is a binary format used to serialize object graphs such as ActionScript objects and XML, or send messages between an Adobe Flash client and a remote service, usually a Flash Media Server or third party alternatives."; + this.description + = "Action Message Format (AMF) is a binary format used to serialize object graphs such as ActionScript objects and XML, or send messages between an Adobe Flash client and a remote service, usually a Flash Media Server or third party alternatives."; this.infoURL = "https://wikipedia.org/wiki/Action_Message_Format"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -46,7 +46,6 @@ class AMFDecode extends Operation { const encoded = new Uint8Array(input); return handler.Value.deserialize(encoded); } - } export default AMFDecode; diff --git a/src/core/operations/AMFEncode.mjs b/src/core/operations/AMFEncode.mjs index c21ba7dc..cbfa850a 100644 --- a/src/core/operations/AMFEncode.mjs +++ b/src/core/operations/AMFEncode.mjs @@ -12,7 +12,6 @@ import { AMF0, AMF3 } from "@astronautlabs/amf"; * AMF Encode operation */ class AMFEncode extends Operation { - /** * AMFEncode constructor */ @@ -21,7 +20,8 @@ class AMFEncode extends Operation { this.name = "AMF Encode"; this.module = "Encodings"; - this.description = "Action Message Format (AMF) is a binary format used to serialize object graphs such as ActionScript objects and XML, or send messages between an Adobe Flash client and a remote service, usually a Flash Media Server or third party alternatives."; + this.description + = "Action Message Format (AMF) is a binary format used to serialize object graphs such as ActionScript objects and XML, or send messages between an Adobe Flash client and a remote service, usually a Flash Media Server or third party alternatives."; this.infoURL = "https://wikipedia.org/wiki/Action_Message_Format"; this.inputType = "JSON"; this.outputType = "ArrayBuffer"; @@ -46,7 +46,6 @@ class AMFEncode extends Operation { const output = handler.Value.any(input).serialize(); return output.buffer; } - } export default AMFEncode; diff --git a/src/core/operations/AND.mjs b/src/core/operations/AND.mjs index 6bbc8366..dae9ce85 100644 --- a/src/core/operations/AND.mjs +++ b/src/core/operations/AND.mjs @@ -12,7 +12,6 @@ import { bitOp, and, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs"; * AND operation */ class AND extends Operation { - /** * AND constructor */ @@ -71,7 +70,6 @@ class AND extends Operation { highlightReverse(pos, args) { return pos; } - } export default AND; diff --git a/src/core/operations/AddLineNumbers.mjs b/src/core/operations/AddLineNumbers.mjs index c1c6159a..6f325fa3 100644 --- a/src/core/operations/AddLineNumbers.mjs +++ b/src/core/operations/AddLineNumbers.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Add line numbers operation */ class AddLineNumbers extends Operation { - /** * AddLineNumbers constructor */ @@ -36,11 +35,10 @@ class AddLineNumbers extends Operation { let output = ""; for (let n = 0; n < lines.length; n++) { - output += (n+1).toString().padStart(width, " ") + " " + lines[n] + "\n"; + output += (n + 1).toString().padStart(width, " ") + " " + lines[n] + "\n"; } - return output.slice(0, output.length-1); + return output.slice(0, output.length - 1); } - } export default AddLineNumbers; diff --git a/src/core/operations/AddTextToImage.mjs b/src/core/operations/AddTextToImage.mjs index 084c92ec..75226293 100644 --- a/src/core/operations/AddTextToImage.mjs +++ b/src/core/operations/AddTextToImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Add Text To Image operation */ class AddTextToImage extends Operation { - /** * AddTextToImage constructor */ @@ -24,7 +23,8 @@ class AddTextToImage extends Operation { this.name = "Add Text To Image"; this.module = "Image"; - this.description = "Adds text onto an image.

Text can be horizontally or vertically aligned, or the position can be manually specified.
Variants of the Roboto font face are available in any size or colour."; + this.description + = "Adds text onto an image.

Text can be horizontally or vertically aligned, or the position can be manually specified.
Variants of the Roboto font face are available in any size or colour."; this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -64,12 +64,7 @@ class AddTextToImage extends Operation { { name: "Font face", type: "option", - value: [ - "Roboto", - "Roboto Black", - "Roboto Mono", - "Roboto Slab" - ] + value: ["Roboto", "Roboto Black", "Roboto Mono", "Roboto Slab"] }, { name: "Red", @@ -132,8 +127,7 @@ class AddTextToImage extends Operation { throw new OperationError(`Error loading image. (${err})`); } try { - if (isWorkerEnvironment()) - self.sendStatusMessage("Adding text to image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Adding text to image..."); const fontsMap = {}; const fonts = [ @@ -143,14 +137,12 @@ class AddTextToImage extends Operation { import(/* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoSlab72White.fnt") ]; - await Promise.all(fonts) - .then(fonts => { - fontsMap.Roboto = fonts[0]; - fontsMap["Roboto Black"] = fonts[1]; - fontsMap["Roboto Mono"] = fonts[2]; - fontsMap["Roboto Slab"] = fonts[3]; - }); - + await Promise.all(fonts).then((fonts) => { + fontsMap.Roboto = fonts[0]; + fontsMap["Roboto Black"] = fonts[1]; + fontsMap["Roboto Mono"] = fonts[2]; + fontsMap["Roboto Slab"] = fonts[3]; + }); // Make Webpack load the png font images await Promise.all([ @@ -165,7 +157,7 @@ class AddTextToImage extends Operation { // LoadFont needs an absolute url, so append the font name to self.docURL const jimpFont = await jimp.loadFont(self.docURL + "/" + font.default); - jimpFont.pages.forEach(function(page) { + jimpFont.pages.forEach(function (page) { if (page.bitmap) { // Adjust the RGB values of the image pages to change the font colour. const pageWidth = page.bitmap.width; @@ -180,10 +172,10 @@ class AddTextToImage extends Operation { const newAlpha = page.bitmap.data[idx + 3] - (255 - alpha); // Make sure the bitmap values don't go below 0 as that makes jimp very unhappy - page.bitmap.data[idx] = (newRed > 0) ? newRed : 0; - page.bitmap.data[idx + 1] = (newGreen > 0) ? newGreen : 0; - page.bitmap.data[idx + 2] = (newBlue > 0) ? newBlue : 0; - page.bitmap.data[idx + 3] = (newAlpha > 0) ? newAlpha : 0; + page.bitmap.data[idx] = newRed > 0 ? newRed : 0; + page.bitmap.data[idx + 1] = newGreen > 0 ? newGreen : 0; + page.bitmap.data[idx + 2] = newBlue > 0 ? newBlue : 0; + page.bitmap.data[idx + 3] = newAlpha > 0 ? newAlpha : 0; } } } @@ -210,7 +202,7 @@ class AddTextToImage extends Operation { xPos = 0; break; case "Center": - xPos = (image.getWidth() / 2) - (textImage.getWidth() / 2); + xPos = image.getWidth() / 2 - textImage.getWidth() / 2; break; case "Right": xPos = image.getWidth() - textImage.getWidth(); @@ -222,7 +214,7 @@ class AddTextToImage extends Operation { yPos = 0; break; case "Middle": - yPos = (image.getHeight() / 2) - (textImage.getHeight() / 2); + yPos = image.getHeight() / 2 - textImage.getHeight() / 2; break; case "Bottom": yPos = image.getHeight() - textImage.getHeight(); @@ -261,7 +253,6 @@ class AddTextToImage extends Operation { return ``; } - } export default AddTextToImage; diff --git a/src/core/operations/Adler32Checksum.mjs b/src/core/operations/Adler32Checksum.mjs index 80e6e340..7773ab71 100644 --- a/src/core/operations/Adler32Checksum.mjs +++ b/src/core/operations/Adler32Checksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Adler-32 Checksum operation */ class Adler32Checksum extends Operation { - /** * Adler32Checksum constructor */ @@ -20,7 +19,8 @@ class Adler32Checksum extends Operation { this.name = "Adler-32 Checksum"; this.module = "Crypto"; - this.description = "Adler-32 is a checksum algorithm which was invented by Mark Adler in 1995, and is a modification of the Fletcher checksum. Compared to a cyclic redundancy check of the same length, it trades reliability for speed (preferring the latter).

Adler-32 is more reliable than Fletcher-16, and slightly less reliable than Fletcher-32."; + this.description + = "Adler-32 is a checksum algorithm which was invented by Mark Adler in 1995, and is a modification of the Fletcher checksum. Compared to a cyclic redundancy check of the same length, it trades reliability for speed (preferring the latter).

Adler-32 is more reliable than Fletcher-16, and slightly less reliable than Fletcher-32."; this.infoURL = "https://wikipedia.org/wiki/Adler-32"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -48,7 +48,6 @@ class Adler32Checksum extends Operation { return Utils.hex(((b << 16) | a) >>> 0, 8); } - } export default Adler32Checksum; diff --git a/src/core/operations/AffineCipherDecode.mjs b/src/core/operations/AffineCipherDecode.mjs index 869f231a..3f0a2294 100644 --- a/src/core/operations/AffineCipherDecode.mjs +++ b/src/core/operations/AffineCipherDecode.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Affine Cipher Decode operation */ class AffineCipherDecode extends Operation { - /** * AffineCipherDecode constructor */ @@ -21,7 +20,8 @@ class AffineCipherDecode extends Operation { this.name = "Affine Cipher Decode"; this.module = "Ciphers"; - this.description = "The Affine cipher is a type of monoalphabetic substitution cipher. To decrypt, each letter in an alphabet is mapped to its numeric equivalent, decrypted by a mathematical function, and converted back to a letter."; + this.description + = "The Affine cipher is a type of monoalphabetic substitution cipher. To decrypt, each letter in an alphabet is mapped to its numeric equivalent, decrypted by a mathematical function, and converted back to a letter."; this.infoURL = "https://wikipedia.org/wiki/Affine_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -66,7 +66,8 @@ class AffineCipherDecode extends Operation { output += alphabet[Utils.mod((alphabet.indexOf(input[i]) - b) * aModInv, 26)]; } else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) { // Same as above, accounting for uppercase - output += alphabet[Utils.mod((alphabet.indexOf(input[i].toLowerCase()) - b) * aModInv, 26)].toUpperCase(); + output + += alphabet[Utils.mod((alphabet.indexOf(input[i].toLowerCase()) - b) * aModInv, 26)].toUpperCase(); } else { // Non-alphabetic characters output += input[i]; @@ -100,7 +101,6 @@ class AffineCipherDecode extends Operation { highlightReverse(pos, args) { return pos; } - } export default AffineCipherDecode; diff --git a/src/core/operations/AffineCipherEncode.mjs b/src/core/operations/AffineCipherEncode.mjs index a9462ae8..a847a707 100644 --- a/src/core/operations/AffineCipherEncode.mjs +++ b/src/core/operations/AffineCipherEncode.mjs @@ -11,7 +11,6 @@ import { affineEncode } from "../lib/Ciphers.mjs"; * Affine Cipher Encode operation */ class AffineCipherEncode extends Operation { - /** * AffineCipherEncode constructor */ @@ -20,7 +19,8 @@ class AffineCipherEncode extends Operation { this.name = "Affine Cipher Encode"; this.module = "Ciphers"; - this.description = "The Affine cipher is a type of monoalphabetic substitution cipher, wherein each letter in an alphabet is mapped to its numeric equivalent, encrypted using simple mathematical function, (ax + b) % 26, and converted back to a letter."; + this.description + = "The Affine cipher is a type of monoalphabetic substitution cipher, wherein each letter in an alphabet is mapped to its numeric equivalent, encrypted using simple mathematical function, (ax + b) % 26, and converted back to a letter."; this.infoURL = "https://wikipedia.org/wiki/Affine_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -72,7 +72,6 @@ class AffineCipherEncode extends Operation { highlightReverse(pos, args) { return pos; } - } export default AffineCipherEncode; diff --git a/src/core/operations/AnalyseHash.mjs b/src/core/operations/AnalyseHash.mjs index 72c80840..a4e92c08 100644 --- a/src/core/operations/AnalyseHash.mjs +++ b/src/core/operations/AnalyseHash.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Analyse hash operation */ class AnalyseHash extends Operation { - /** * AnalyseHash constructor */ @@ -20,7 +19,8 @@ class AnalyseHash extends Operation { this.name = "Analyse hash"; this.module = "Crypto"; - this.description = "Tries to determine information about a given hash and suggests which algorithm may have been used to generate it based on its length."; + this.description + = "Tries to determine information about a given hash and suggests which algorithm may have been used to generate it based on its length."; this.infoURL = "https://wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions"; this.inputType = "string"; this.outputType = "string"; @@ -44,56 +44,36 @@ class AnalyseHash extends Operation { throw new OperationError("Invalid hash"); } - output += "Hash length: " + input.length + "\n" + - "Byte length: " + byteLength + "\n" + - "Bit length: " + bitLength + "\n\n" + - "Based on the length, this hash could have been generated by one of the following hashing functions:\n"; + output + += "Hash length: " + + input.length + + "\n" + + "Byte length: " + + byteLength + + "\n" + + "Bit length: " + + bitLength + + "\n\n" + + "Based on the length, this hash could have been generated by one of the following hashing functions:\n"; switch (bitLength) { case 4: - possibleHashFunctions = [ - "Fletcher-4", - "Luhn algorithm", - "Verhoeff algorithm", - ]; + possibleHashFunctions = ["Fletcher-4", "Luhn algorithm", "Verhoeff algorithm"]; break; case 8: - possibleHashFunctions = [ - "Fletcher-8", - ]; + possibleHashFunctions = ["Fletcher-8"]; break; case 16: - possibleHashFunctions = [ - "BSD checksum", - "CRC-16", - "SYSV checksum", - "Fletcher-16" - ]; + possibleHashFunctions = ["BSD checksum", "CRC-16", "SYSV checksum", "Fletcher-16"]; break; case 32: - possibleHashFunctions = [ - "CRC-32", - "Fletcher-32", - "Adler-32", - ]; + possibleHashFunctions = ["CRC-32", "Fletcher-32", "Adler-32"]; break; case 64: - possibleHashFunctions = [ - "CRC-64", - "RIPEMD-64", - "SipHash", - ]; + possibleHashFunctions = ["CRC-64", "RIPEMD-64", "SipHash"]; break; case 128: - possibleHashFunctions = [ - "MD5", - "MD4", - "MD2", - "HAVAL-128", - "RIPEMD-128", - "Snefru", - "Tiger-128", - ]; + possibleHashFunctions = ["MD5", "MD4", "MD2", "HAVAL-128", "RIPEMD-128", "Snefru", "Tiger-128"]; break; case 160: possibleHashFunctions = [ @@ -103,23 +83,14 @@ class AnalyseHash extends Operation { "HAS-160", "HAVAL-160", "RIPEMD-160", - "Tiger-160", + "Tiger-160" ]; break; case 192: - possibleHashFunctions = [ - "Tiger", - "HAVAL-192", - ]; + possibleHashFunctions = ["Tiger", "HAVAL-192"]; break; case 224: - possibleHashFunctions = [ - "SHA-224", - "SHA3-224", - "ECOH-224", - "FSB-224", - "HAVAL-224", - ]; + possibleHashFunctions = ["SHA-224", "SHA3-224", "ECOH-224", "FSB-224", "HAVAL-224"]; break; case 256: possibleHashFunctions = [ @@ -133,21 +104,14 @@ class AnalyseHash extends Operation { "HAVAL-256", "PANAMA", "RIPEMD-256", - "Snefru", + "Snefru" ]; break; case 320: - possibleHashFunctions = [ - "RIPEMD-320", - ]; + possibleHashFunctions = ["RIPEMD-320"]; break; case 384: - possibleHashFunctions = [ - "SHA-384", - "SHA3-384", - "ECOH-384", - "FSB-384", - ]; + possibleHashFunctions = ["SHA-384", "SHA3-384", "ECOH-384", "FSB-384"]; break; case 512: possibleHashFunctions = [ @@ -161,24 +125,19 @@ class AnalyseHash extends Operation { "MD6", "Spectral Hash", "SWIFFT", - "Whirlpool", + "Whirlpool" ]; break; case 1024: - possibleHashFunctions = [ - "Fowler-Noll-Vo", - ]; + possibleHashFunctions = ["Fowler-Noll-Vo"]; break; default: - possibleHashFunctions = [ - "Unknown" - ]; + possibleHashFunctions = ["Unknown"]; break; } return output + possibleHashFunctions.join("\n"); } - } export default AnalyseHash; diff --git a/src/core/operations/Argon2.mjs b/src/core/operations/Argon2.mjs index 4feb881c..f7c49656 100644 --- a/src/core/operations/Argon2.mjs +++ b/src/core/operations/Argon2.mjs @@ -13,7 +13,6 @@ import argon2 from "argon2-browser"; * Argon2 operation */ class Argon2 extends Operation { - /** * Argon2 constructor */ @@ -22,7 +21,8 @@ class Argon2 extends Operation { this.name = "Argon2"; this.module = "Crypto"; - this.description = "Argon2 is a key derivation function that was selected as the winner of the Password Hashing Competition in July 2015. It was designed by Alex Biryukov, Daniel Dinu, and Dmitry Khovratovich from the University of Luxembourg.

Enter the password in the input to generate its hash."; + this.description + = "Argon2 is a key derivation function that was selected as the winner of the Password Hashing Competition in July 2015. It was designed by Alex Biryukov, Daniel Dinu, and Dmitry Khovratovich from the University of Luxembourg.

Enter the password in the input to generate its hash."; this.infoURL = "https://wikipedia.org/wiki/Argon2"; this.inputType = "string"; this.outputType = "string"; @@ -95,7 +95,7 @@ class Argon2 extends Operation { mem, parallelism, hashLen, - type, + type }); switch (outFormat) { @@ -111,7 +111,6 @@ class Argon2 extends Operation { throw new OperationError(`Error: ${err.message}`); } } - } export default Argon2; diff --git a/src/core/operations/Argon2Compare.mjs b/src/core/operations/Argon2Compare.mjs index 68e48ed0..3812f939 100644 --- a/src/core/operations/Argon2Compare.mjs +++ b/src/core/operations/Argon2Compare.mjs @@ -11,7 +11,6 @@ import argon2 from "argon2-browser"; * Argon2 compare operation */ class Argon2Compare extends Operation { - /** * Argon2Compare constructor */ @@ -20,7 +19,8 @@ class Argon2Compare extends Operation { this.name = "Argon2 compare"; this.module = "Crypto"; - this.description = "Tests whether the input matches the given Argon2 hash. To test multiple possible passwords, use the 'Fork' operation."; + this.description + = "Tests whether the input matches the given Argon2 hash. To test multiple possible passwords, use the 'Fork' operation."; this.infoURL = "https://wikipedia.org/wiki/Argon2"; this.inputType = "string"; this.outputType = "string"; @@ -52,7 +52,6 @@ class Argon2Compare extends Operation { return "No match"; } } - } export default Argon2Compare; diff --git a/src/core/operations/AtbashCipher.mjs b/src/core/operations/AtbashCipher.mjs index 5635b5b9..ae9b3355 100644 --- a/src/core/operations/AtbashCipher.mjs +++ b/src/core/operations/AtbashCipher.mjs @@ -11,7 +11,6 @@ import { affineEncode } from "../lib/Ciphers.mjs"; * Atbash Cipher operation */ class AtbashCipher extends Operation { - /** * AtbashCipher constructor */ @@ -20,7 +19,8 @@ class AtbashCipher extends Operation { this.name = "Atbash Cipher"; this.module = "Ciphers"; - this.description = "Atbash is a mono-alphabetic substitution cipher originally used to encode the Hebrew alphabet. It has been modified here for use with the Latin alphabet."; + this.description + = "Atbash is a mono-alphabetic substitution cipher originally used to encode the Hebrew alphabet. It has been modified here for use with the Latin alphabet."; this.infoURL = "https://wikipedia.org/wiki/Atbash"; this.inputType = "string"; this.outputType = "string"; @@ -61,7 +61,6 @@ class AtbashCipher extends Operation { highlightReverse(pos, args) { return pos; } - } export default AtbashCipher; diff --git a/src/core/operations/AvroToJSON.mjs b/src/core/operations/AvroToJSON.mjs index 497a3872..03334903 100644 --- a/src/core/operations/AvroToJSON.mjs +++ b/src/core/operations/AvroToJSON.mjs @@ -12,7 +12,6 @@ import avro from "avsc"; * Avro to JSON operation */ class AvroToJSON extends Operation { - /** * AvroToJSON constructor */ @@ -60,7 +59,9 @@ class AvroToJSON extends Operation { }) .on("end", function () { if (forceJSON) { - resolve(result.length === 1 ? JSON.stringify(result[0], null, 4) : JSON.stringify(result, null, 4)); + resolve( + result.length === 1 ? JSON.stringify(result[0], null, 4) : JSON.stringify(result, null, 4) + ); } else { const data = result.reduce((result, current) => result + JSON.stringify(current) + "\n", ""); resolve(data); diff --git a/src/core/operations/BLAKE2b.mjs b/src/core/operations/BLAKE2b.mjs index 6218f7f0..1f0c9cb8 100644 --- a/src/core/operations/BLAKE2b.mjs +++ b/src/core/operations/BLAKE2b.mjs @@ -14,7 +14,6 @@ import { toBase64 } from "../lib/Base64.mjs"; * BLAKE2b operation */ class BLAKE2b extends Operation { - /** * BLAKE2b constructor */ @@ -34,11 +33,13 @@ class BLAKE2b extends Operation { "name": "Size", "type": "option", "value": ["512", "384", "256", "160", "128"] - }, { + }, + { "name": "Output Encoding", "type": "option", "value": ["Hex", "Base64", "Raw"] - }, { + }, + { "name": "Key", "type": "toggleString", "value": "", @@ -58,7 +59,9 @@ class BLAKE2b extends Operation { if (key.length === 0) { key = null; } else if (key.length > 64) { - throw new OperationError(["Key cannot be greater than 64 bytes", "It is currently " + key.length + " bytes."].join("\n")); + throw new OperationError( + ["Key cannot be greater than 64 bytes", "It is currently " + key.length + " bytes."].join("\n") + ); } input = new Uint8Array(input); @@ -73,7 +76,6 @@ class BLAKE2b extends Operation { return new OperationError("Unsupported Output Type"); } } - } export default BLAKE2b; diff --git a/src/core/operations/BLAKE2s.mjs b/src/core/operations/BLAKE2s.mjs index 8f84e041..b2ff3d15 100644 --- a/src/core/operations/BLAKE2s.mjs +++ b/src/core/operations/BLAKE2s.mjs @@ -14,7 +14,6 @@ import { toBase64 } from "../lib/Base64.mjs"; * BLAKE2s Operation */ class BLAKE2s extends Operation { - /** * BLAKE2s constructor */ @@ -34,7 +33,8 @@ class BLAKE2s extends Operation { "name": "Size", "type": "option", "value": ["256", "160", "128"] - }, { + }, + { "name": "Output Encoding", "type": "option", "value": ["Hex", "Base64", "Raw"] @@ -59,7 +59,9 @@ class BLAKE2s extends Operation { if (key.length === 0) { key = null; } else if (key.length > 32) { - throw new OperationError(["Key cannot be greater than 32 bytes", "It is currently " + key.length + " bytes."].join("\n")); + throw new OperationError( + ["Key cannot be greater than 32 bytes", "It is currently " + key.length + " bytes."].join("\n") + ); } input = new Uint8Array(input); @@ -74,7 +76,6 @@ class BLAKE2s extends Operation { return new OperationError("Unsupported Output Type"); } } - } export default BLAKE2s; diff --git a/src/core/operations/BSONDeserialise.mjs b/src/core/operations/BSONDeserialise.mjs index cb46b357..2226cf77 100644 --- a/src/core/operations/BSONDeserialise.mjs +++ b/src/core/operations/BSONDeserialise.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * BSON deserialise operation */ class BSONDeserialise extends Operation { - /** * BSONDeserialise constructor */ @@ -21,7 +20,8 @@ class BSONDeserialise extends Operation { this.name = "BSON deserialise"; this.module = "Serialise"; - this.description = "BSON is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures, associative arrays (called objects or documents in MongoDB), and various data types of specific interest to MongoDB. The name 'BSON' is based on the term JSON and stands for 'Binary JSON'.

Input data should be in a raw bytes format."; + this.description + = "BSON is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures, associative arrays (called objects or documents in MongoDB), and various data types of specific interest to MongoDB. The name 'BSON' is based on the term JSON and stands for 'Binary JSON'.

Input data should be in a raw bytes format."; this.infoURL = "https://wikipedia.org/wiki/BSON"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -43,7 +43,6 @@ class BSONDeserialise extends Operation { throw new OperationError(err.toString()); } } - } export default BSONDeserialise; diff --git a/src/core/operations/BSONSerialise.mjs b/src/core/operations/BSONSerialise.mjs index 25eed876..241abbad 100644 --- a/src/core/operations/BSONSerialise.mjs +++ b/src/core/operations/BSONSerialise.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * BSON serialise operation */ class BSONSerialise extends Operation { - /** * BSONSerialise constructor */ @@ -21,7 +20,8 @@ class BSONSerialise extends Operation { this.name = "BSON serialise"; this.module = "Serialise"; - this.description = "BSON is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures, associative arrays (called objects or documents in MongoDB), and various data types of specific interest to MongoDB. The name 'BSON' is based on the term JSON and stands for 'Binary JSON'.

Input data should be valid JSON."; + this.description + = "BSON is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures, associative arrays (called objects or documents in MongoDB), and various data types of specific interest to MongoDB. The name 'BSON' is based on the term JSON and stands for 'Binary JSON'.

Input data should be valid JSON."; this.infoURL = "https://wikipedia.org/wiki/BSON"; this.inputType = "string"; this.outputType = "ArrayBuffer"; @@ -43,7 +43,6 @@ class BSONSerialise extends Operation { throw new OperationError(err.toString()); } } - } export default BSONSerialise; diff --git a/src/core/operations/BaconCipherDecode.mjs b/src/core/operations/BaconCipherDecode.mjs index 40eba6bb..919110fe 100644 --- a/src/core/operations/BaconCipherDecode.mjs +++ b/src/core/operations/BaconCipherDecode.mjs @@ -7,7 +7,11 @@ import Operation from "../Operation.mjs"; import { BACON_ALPHABETS, - BACON_TRANSLATION_CASE, BACON_TRANSLATION_AMNZ, BACON_TRANSLATIONS, BACON_CLEARER_MAP, BACON_NORMALIZE_MAP, + BACON_TRANSLATION_CASE, + BACON_TRANSLATION_AMNZ, + BACON_TRANSLATIONS, + BACON_CLEARER_MAP, + BACON_NORMALIZE_MAP, swapZeroAndOne } from "../lib/Bacon.mjs"; @@ -23,7 +27,8 @@ class BaconCipherDecode extends Operation { this.name = "Bacon Cipher Decode"; this.module = "Default"; - this.description = "Bacon's cipher or the Baconian cipher is a method of steganography devised by Francis Bacon in 1605. A message is concealed in the presentation of text, rather than its content."; + this.description + = "Bacon's cipher or the Baconian cipher is a method of steganography devised by Francis Bacon in 1605. A message is concealed in the presentation of text, rather than its content."; this.infoURL = "https://wikipedia.org/wiki/Bacon%27s_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -46,44 +51,44 @@ class BaconCipherDecode extends Operation { ]; this.checks = [ { - pattern: "^\\s*([01]{5}\\s?)+$", - flags: "", - args: ["Standard (I=J and U=V)", "0/1", false] + pattern: "^\\s*([01]{5}\\s?)+$", + flags: "", + args: ["Standard (I=J and U=V)", "0/1", false] }, { - pattern: "^\\s*([01]{5}\\s?)+$", - flags: "", - args: ["Standard (I=J and U=V)", "0/1", true] + pattern: "^\\s*([01]{5}\\s?)+$", + flags: "", + args: ["Standard (I=J and U=V)", "0/1", true] }, { - pattern: "^\\s*([AB]{5}\\s?)+$", - flags: "", - args: ["Standard (I=J and U=V)", "A/B", false] + pattern: "^\\s*([AB]{5}\\s?)+$", + flags: "", + args: ["Standard (I=J and U=V)", "A/B", false] }, { - pattern: "^\\s*([AB]{5}\\s?)+$", - flags: "", - args: ["Standard (I=J and U=V)", "A/B", true] + pattern: "^\\s*([AB]{5}\\s?)+$", + flags: "", + args: ["Standard (I=J and U=V)", "A/B", true] }, { - pattern: "^\\s*([01]{5}\\s?)+$", - flags: "", - args: ["Complete", "0/1", false] + pattern: "^\\s*([01]{5}\\s?)+$", + flags: "", + args: ["Complete", "0/1", false] }, { - pattern: "^\\s*([01]{5}\\s?)+$", - flags: "", - args: ["Complete", "0/1", true] + pattern: "^\\s*([01]{5}\\s?)+$", + flags: "", + args: ["Complete", "0/1", true] }, { - pattern: "^\\s*([AB]{5}\\s?)+$", - flags: "", - args: ["Complete", "A/B", false] + pattern: "^\\s*([AB]{5}\\s?)+$", + flags: "", + args: ["Complete", "A/B", false] }, { - pattern: "^\\s*([AB]{5}\\s?)+$", - flags: "", - args: ["Complete", "A/B", true] + pattern: "^\\s*([AB]{5}\\s?)+$", + flags: "", + args: ["Complete", "A/B", true] } ]; } diff --git a/src/core/operations/BaconCipherEncode.mjs b/src/core/operations/BaconCipherEncode.mjs index 3eb66b57..c04348fd 100644 --- a/src/core/operations/BaconCipherEncode.mjs +++ b/src/core/operations/BaconCipherEncode.mjs @@ -7,7 +7,8 @@ import Operation from "../Operation.mjs"; import { BACON_ALPHABETS, - BACON_TRANSLATIONS_FOR_ENCODING, BACON_TRANSLATION_AB, + BACON_TRANSLATIONS_FOR_ENCODING, + BACON_TRANSLATION_AB, swapZeroAndOne } from "../lib/Bacon.mjs"; @@ -23,7 +24,8 @@ class BaconCipherEncode extends Operation { this.name = "Bacon Cipher Encode"; this.module = "Default"; - this.description = "Bacon's cipher or the Baconian cipher is a method of steganography devised by Francis Bacon in 1605. A message is concealed in the presentation of text, rather than its content."; + this.description + = "Bacon's cipher or the Baconian cipher is a method of steganography devised by Francis Bacon in 1605. A message is concealed in the presentation of text, rather than its content."; this.infoURL = "https://wikipedia.org/wiki/Bacon%27s_cipher"; this.inputType = "string"; this.outputType = "string"; diff --git a/src/core/operations/Bcrypt.mjs b/src/core/operations/Bcrypt.mjs index 53b8a92e..75817c0e 100644 --- a/src/core/operations/Bcrypt.mjs +++ b/src/core/operations/Bcrypt.mjs @@ -12,7 +12,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Bcrypt operation */ class Bcrypt extends Operation { - /** * Bcrypt constructor */ @@ -21,7 +20,8 @@ class Bcrypt extends Operation { this.name = "Bcrypt"; this.module = "Crypto"; - this.description = "bcrypt is a password hashing function designed by Niels Provos and David Mazi\xe8res, based on the Blowfish cipher, and presented at USENIX in 1999. Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count (rounds) can be increased to make it slower, so it remains resistant to brute-force search attacks even with increasing computation power.

Enter the password in the input to generate its hash."; + this.description + = "bcrypt is a password hashing function designed by Niels Provos and David Mazi\xe8res, based on the Blowfish cipher, and presented at USENIX in 1999. Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count (rounds) can be increased to make it slower, so it remains resistant to brute-force search attacks even with increasing computation power.

Enter the password in the input to generate its hash."; this.infoURL = "https://wikipedia.org/wiki/Bcrypt"; this.inputType = "string"; this.outputType = "string"; @@ -43,14 +43,11 @@ class Bcrypt extends Operation { const rounds = args[0]; const salt = await bcrypt.genSalt(rounds); - return await bcrypt.hash(input, salt, null, p => { + return await bcrypt.hash(input, salt, null, (p) => { // Progress callback - if (isWorkerEnvironment()) - self.sendStatusMessage(`Progress: ${(p * 100).toFixed(0)}%`); + if (isWorkerEnvironment()) self.sendStatusMessage(`Progress: ${(p * 100).toFixed(0)}%`); }); - } - } export default Bcrypt; diff --git a/src/core/operations/BcryptCompare.mjs b/src/core/operations/BcryptCompare.mjs index 8d9a6937..11f8168f 100644 --- a/src/core/operations/BcryptCompare.mjs +++ b/src/core/operations/BcryptCompare.mjs @@ -8,12 +8,10 @@ import Operation from "../Operation.mjs"; import bcrypt from "bcryptjs"; import { isWorkerEnvironment } from "../Utils.mjs"; - /** * Bcrypt compare operation */ class BcryptCompare extends Operation { - /** * BcryptCompare constructor */ @@ -22,7 +20,8 @@ class BcryptCompare extends Operation { this.name = "Bcrypt compare"; this.module = "Crypto"; - this.description = "Tests whether the input matches the given bcrypt hash. To test multiple possible passwords, use the 'Fork' operation."; + this.description + = "Tests whether the input matches the given bcrypt hash. To test multiple possible passwords, use the 'Fork' operation."; this.infoURL = "https://wikipedia.org/wiki/Bcrypt"; this.inputType = "string"; this.outputType = "string"; @@ -43,16 +42,13 @@ class BcryptCompare extends Operation { async run(input, args) { const hash = args[0]; - const match = await bcrypt.compare(input, hash, null, p => { + const match = await bcrypt.compare(input, hash, null, (p) => { // Progress callback - if (isWorkerEnvironment()) - self.sendStatusMessage(`Progress: ${(p * 100).toFixed(0)}%`); + if (isWorkerEnvironment()) self.sendStatusMessage(`Progress: ${(p * 100).toFixed(0)}%`); }); return match ? "Match: " + input : "No match"; - } - } export default BcryptCompare; diff --git a/src/core/operations/BcryptParse.mjs b/src/core/operations/BcryptParse.mjs index 600a7dc3..f70b402d 100644 --- a/src/core/operations/BcryptParse.mjs +++ b/src/core/operations/BcryptParse.mjs @@ -12,7 +12,6 @@ import bcrypt from "bcryptjs"; * Bcrypt parse operation */ class BcryptParse extends Operation { - /** * BcryptParse constructor */ @@ -21,7 +20,8 @@ class BcryptParse extends Operation { this.name = "Bcrypt parse"; this.module = "Crypto"; - this.description = "Parses a bcrypt hash to determine the number of rounds used, the salt, and the password hash."; + this.description + = "Parses a bcrypt hash to determine the number of rounds used, the salt, and the password hash."; this.infoURL = "https://wikipedia.org/wiki/Bcrypt"; this.inputType = "string"; this.outputType = "string"; @@ -43,7 +43,6 @@ Full hash: ${input}`; throw new OperationError("Error: " + err.toString()); } } - } export default BcryptParse; diff --git a/src/core/operations/BifidCipherDecode.mjs b/src/core/operations/BifidCipherDecode.mjs index 29318a32..2720fd2f 100644 --- a/src/core/operations/BifidCipherDecode.mjs +++ b/src/core/operations/BifidCipherDecode.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Bifid Cipher Decode operation */ class BifidCipherDecode extends Operation { - /** * BifidCipherDecode constructor */ @@ -21,7 +20,8 @@ class BifidCipherDecode extends Operation { this.name = "Bifid Cipher Decode"; this.module = "Ciphers"; - this.description = "The Bifid cipher is a cipher which uses a Polybius square in conjunction with transposition, which can be fairly difficult to decipher without knowing the alphabet keyword."; + this.description + = "The Bifid cipher is a cipher which uses a Polybius square in conjunction with transposition, which can be fairly difficult to decipher without knowing the alphabet keyword."; this.infoURL = "https://wikipedia.org/wiki/Bifid_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -56,35 +56,36 @@ class BifidCipherDecode extends Operation { const polybius = genPolybiusSquare(keywordStr); - input.replace("J", "I").split("").forEach((letter) => { - const alpInd = alpha.split("").indexOf(letter.toLocaleUpperCase()) >= 0; - let polInd; + input + .replace("J", "I") + .split("") + .forEach((letter) => { + const alpInd = alpha.split("").indexOf(letter.toLocaleUpperCase()) >= 0; + let polInd; - if (alpInd) { - for (let i = 0; i < 5; i++) { - polInd = polybius[i].indexOf(letter.toLocaleUpperCase()); - if (polInd >= 0) { - trans += `${i}${polInd}`; + if (alpInd) { + for (let i = 0; i < 5; i++) { + polInd = polybius[i].indexOf(letter.toLocaleUpperCase()); + if (polInd >= 0) { + trans += `${i}${polInd}`; + } } - } - if (alpha.split("").indexOf(letter) >= 0) { - structure.push(true); - } else if (alpInd) { - structure.push(false); + if (alpha.split("").indexOf(letter) >= 0) { + structure.push(true); + } else if (alpInd) { + structure.push(false); + } + } else { + structure.push(letter); } - } else { - structure.push(letter); - } - }); + }); - structure.forEach(pos => { + structure.forEach((pos) => { if (typeof pos === "boolean") { - const coords = [trans[count], trans[count+trans.length/2]]; + const coords = [trans[count], trans[count + trans.length / 2]]; - output += pos ? - polybius[coords[0]][coords[1]] : - polybius[coords[0]][coords[1]].toLocaleLowerCase(); + output += pos ? polybius[coords[0]][coords[1]] : polybius[coords[0]][coords[1]].toLocaleLowerCase(); count++; } else { output += pos; @@ -119,7 +120,6 @@ class BifidCipherDecode extends Operation { highlightReverse(pos, args) { return pos; } - } export default BifidCipherDecode; diff --git a/src/core/operations/BifidCipherEncode.mjs b/src/core/operations/BifidCipherEncode.mjs index db38a3f2..e2d8956d 100644 --- a/src/core/operations/BifidCipherEncode.mjs +++ b/src/core/operations/BifidCipherEncode.mjs @@ -12,7 +12,6 @@ import { genPolybiusSquare } from "../lib/Ciphers.mjs"; * Bifid Cipher Encode operation */ class BifidCipherEncode extends Operation { - /** * BifidCipherEncode constructor */ @@ -21,7 +20,8 @@ class BifidCipherEncode extends Operation { this.name = "Bifid Cipher Encode"; this.module = "Ciphers"; - this.description = "The Bifid cipher is a cipher which uses a Polybius square in conjunction with transposition, which can be fairly difficult to decipher without knowing the alphabet keyword."; + this.description + = "The Bifid cipher is a cipher which uses a Polybius square in conjunction with transposition, which can be fairly difficult to decipher without knowing the alphabet keyword."; this.infoURL = "https://wikipedia.org/wiki/Bifid_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -52,44 +52,44 @@ class BifidCipherEncode extends Operation { let output = "", count = 0; - if (!/^[A-Z]+$/.test(keywordStr) && keyword.length > 0) throw new OperationError("The key must consist only of letters in the English alphabet"); const polybius = genPolybiusSquare(keywordStr); - input.replace("J", "I").split("").forEach(letter => { - const alpInd = alpha.split("").indexOf(letter.toLocaleUpperCase()) >= 0; - let polInd; + input + .replace("J", "I") + .split("") + .forEach((letter) => { + const alpInd = alpha.split("").indexOf(letter.toLocaleUpperCase()) >= 0; + let polInd; - if (alpInd) { - for (let i = 0; i < 5; i++) { - polInd = polybius[i].indexOf(letter.toLocaleUpperCase()); - if (polInd >= 0) { - xCo.push(polInd); - yCo.push(i); + if (alpInd) { + for (let i = 0; i < 5; i++) { + polInd = polybius[i].indexOf(letter.toLocaleUpperCase()); + if (polInd >= 0) { + xCo.push(polInd); + yCo.push(i); + } } - } - if (alpha.split("").indexOf(letter) >= 0) { - structure.push(true); - } else if (alpInd) { - structure.push(false); + if (alpha.split("").indexOf(letter) >= 0) { + structure.push(true); + } else if (alpInd) { + structure.push(false); + } + } else { + structure.push(letter); } - } else { - structure.push(letter); - } - }); + }); const trans = `${yCo.join("")}${xCo.join("")}`; - structure.forEach(pos => { + structure.forEach((pos) => { if (typeof pos === "boolean") { - const coords = trans.substr(2*count, 2).split(""); + const coords = trans.substr(2 * count, 2).split(""); - output += pos ? - polybius[coords[0]][coords[1]] : - polybius[coords[0]][coords[1]].toLocaleLowerCase(); + output += pos ? polybius[coords[0]][coords[1]] : polybius[coords[0]][coords[1]].toLocaleLowerCase(); count++; } else { output += pos; @@ -124,7 +124,6 @@ class BifidCipherEncode extends Operation { highlightReverse(pos, args) { return pos; } - } export default BifidCipherEncode; diff --git a/src/core/operations/BitShiftLeft.mjs b/src/core/operations/BitShiftLeft.mjs index cd9f4568..4e89acbc 100644 --- a/src/core/operations/BitShiftLeft.mjs +++ b/src/core/operations/BitShiftLeft.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Bit shift left operation */ class BitShiftLeft extends Operation { - /** * BitShiftLeft constructor */ @@ -41,7 +40,7 @@ class BitShiftLeft extends Operation { const amount = args[0]; input = new Uint8Array(input); - return input.map(b => { + return input.map((b) => { return (b << amount) & 0xff; }).buffer; } @@ -71,7 +70,6 @@ class BitShiftLeft extends Operation { highlightReverse(pos, args) { return pos; } - } export default BitShiftLeft; diff --git a/src/core/operations/BitShiftRight.mjs b/src/core/operations/BitShiftRight.mjs index 2d70849e..2c1c2f3d 100644 --- a/src/core/operations/BitShiftRight.mjs +++ b/src/core/operations/BitShiftRight.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Bit shift right operation */ class BitShiftRight extends Operation { - /** * BitShiftRight constructor */ @@ -19,7 +18,8 @@ class BitShiftRight extends Operation { this.name = "Bit shift right"; this.module = "Default"; - this.description = "Shifts the bits in each byte towards the right by the specified amount.

Logical shifts replace the leftmost bits with zeros.
Arithmetic shifts preserve the most significant bit (MSB) of the original byte keeping the sign the same (positive or negative)."; + this.description + = "Shifts the bits in each byte towards the right by the specified amount.

Logical shifts replace the leftmost bits with zeros.
Arithmetic shifts preserve the most significant bit (MSB) of the original byte keeping the sign the same (positive or negative)."; this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -48,7 +48,7 @@ class BitShiftRight extends Operation { mask = type === "Logical shift" ? 0 : 0x80; input = new Uint8Array(input); - return input.map(b => { + return input.map((b) => { return (b >>> amount) ^ (b & mask); }).buffer; } @@ -78,7 +78,6 @@ class BitShiftRight extends Operation { highlightReverse(pos, args) { return pos; } - } export default BitShiftRight; diff --git a/src/core/operations/BlowfishDecrypt.mjs b/src/core/operations/BlowfishDecrypt.mjs index f7dc8d17..9bfe2b83 100644 --- a/src/core/operations/BlowfishDecrypt.mjs +++ b/src/core/operations/BlowfishDecrypt.mjs @@ -14,7 +14,6 @@ import { Blowfish } from "../lib/Blowfish.mjs"; * Blowfish Decrypt operation */ class BlowfishDecrypt extends Operation { - /** * BlowfishDecrypt constructor */ @@ -23,7 +22,8 @@ class BlowfishDecrypt extends Operation { this.name = "Blowfish Decrypt"; this.module = "Ciphers"; - this.description = "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes."; + this.description + = "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes."; this.infoURL = "https://wikipedia.org/wiki/Blowfish_(cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -79,7 +79,7 @@ Blowfish uses a key length of 8 bytes (64 bits).`); input = Utils.convertToByteString(input, inputType); const decipher = Blowfish.createDecipher(key, mode); - decipher.start({iv: iv}); + decipher.start({ iv: iv }); decipher.update(forge.util.createBuffer(input)); const result = decipher.finish(); @@ -89,7 +89,6 @@ Blowfish uses a key length of 8 bytes (64 bits).`); throw new OperationError("Unable to decrypt input with these parameters."); } } - } export default BlowfishDecrypt; diff --git a/src/core/operations/BlowfishEncrypt.mjs b/src/core/operations/BlowfishEncrypt.mjs index 2cf3672b..05e6d432 100644 --- a/src/core/operations/BlowfishEncrypt.mjs +++ b/src/core/operations/BlowfishEncrypt.mjs @@ -14,7 +14,6 @@ import { Blowfish } from "../lib/Blowfish.mjs"; * Blowfish Encrypt operation */ class BlowfishEncrypt extends Operation { - /** * BlowfishEncrypt constructor */ @@ -23,7 +22,8 @@ class BlowfishEncrypt extends Operation { this.name = "Blowfish Encrypt"; this.module = "Ciphers"; - this.description = "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes."; + this.description + = "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes."; this.infoURL = "https://wikipedia.org/wiki/Blowfish_(cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -79,7 +79,7 @@ Blowfish uses a key length of 8 bytes (64 bits).`); input = Utils.convertToByteString(input, inputType); const cipher = Blowfish.createCipher(key, mode); - cipher.start({iv: iv}); + cipher.start({ iv: iv }); cipher.update(forge.util.createBuffer(input)); cipher.finish(); @@ -89,7 +89,6 @@ Blowfish uses a key length of 8 bytes (64 bits).`); return cipher.output.getBytes(); } } - } export default BlowfishEncrypt; diff --git a/src/core/operations/BlurImage.mjs b/src/core/operations/BlurImage.mjs index 51082e54..2c7fb28e 100644 --- a/src/core/operations/BlurImage.mjs +++ b/src/core/operations/BlurImage.mjs @@ -16,7 +16,6 @@ import jimp from "jimp"; * Blur Image operation */ class BlurImage extends Operation { - /** * BlurImage constructor */ @@ -25,7 +24,8 @@ class BlurImage extends Operation { this.name = "Blur Image"; this.module = "Image"; - this.description = "Applies a blur effect to the image.

Gaussian blur is much slower than fast blur, but produces better results."; + this.description + = "Applies a blur effect to the image.

Gaussian blur is much slower than fast blur, but produces better results."; this.infoURL = "https://wikipedia.org/wiki/Gaussian_blur"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -66,13 +66,11 @@ class BlurImage extends Operation { try { switch (blurType) { case "Fast": - if (isWorkerEnvironment()) - self.sendStatusMessage("Fast blurring image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Fast blurring image..."); image.blur(blurAmount); break; case "Gaussian": - if (isWorkerEnvironment()) - self.sendStatusMessage("Gaussian blurring image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Gaussian blurring image..."); image = gaussianBlur(image, blurAmount); break; } @@ -106,7 +104,6 @@ class BlurImage extends Operation { return ``; } - } export default BlurImage; diff --git a/src/core/operations/Bombe.mjs b/src/core/operations/Bombe.mjs index a635b430..ee25509d 100644 --- a/src/core/operations/Bombe.mjs +++ b/src/core/operations/Bombe.mjs @@ -27,7 +27,8 @@ class Bombe extends Operation { this.name = "Bombe"; this.module = "Bletchley"; - this.description = "Emulation of the Bombe machine used at Bletchley Park to attack Enigma, based on work by Polish and British cryptanalysts.

To run this you need to have a 'crib', which is some known plaintext for a chunk of the target ciphertext, and know the rotors used. (See the 'Bombe (multiple runs)' operation if you don't know the rotors.) The machine will suggest possible configurations of the Enigma. Each suggestion has the rotor start positions (left to right) and known plugboard pairs.

Choosing a crib: First, note that Enigma cannot encrypt a letter to itself, which allows you to rule out some positions for possible cribs. Secondly, the Bombe does not simulate the Enigma's middle rotor stepping. The longer your crib, the more likely a step happened within it, which will prevent the attack working. However, other than that, longer cribs are generally better. The attack produces a 'menu' which maps ciphertext letters to plaintext, and the goal is to produce 'loops': for example, with ciphertext ABC and crib CAB, we have the mappings A<->C, B<->A, and C<->B, which produces a loop A-B-C-A. The more loops, the better the crib. The operation will output this: if your menu has too few loops or is too short, a large number of incorrect outputs will usually be produced. Try a different crib. If the menu seems good but the right answer isn't produced, your crib may be wrong, or you may have overlapped the middle rotor stepping - try a different crib.

Output is not sufficient to fully decrypt the data. You will have to recover the rest of the plugboard settings by inspection. And the ring position is not taken into account: this affects when the middle rotor steps. If your output is correct for a bit, and then goes wrong, adjust the ring and start position on the right-hand rotor together until the output improves. If necessary, repeat for the middle rotor.

By default this operation runs the checking machine, a manual process to verify the quality of Bombe stops, on each stop, discarding stops which fail. If you want to see how many times the hardware actually stops for a given input, disable the checking machine.

More detailed descriptions of the Enigma, Typex and Bombe operations
can be found here."; + this.description + = "Emulation of the Bombe machine used at Bletchley Park to attack Enigma, based on work by Polish and British cryptanalysts.

To run this you need to have a 'crib', which is some known plaintext for a chunk of the target ciphertext, and know the rotors used. (See the 'Bombe (multiple runs)' operation if you don't know the rotors.) The machine will suggest possible configurations of the Enigma. Each suggestion has the rotor start positions (left to right) and known plugboard pairs.

Choosing a crib: First, note that Enigma cannot encrypt a letter to itself, which allows you to rule out some positions for possible cribs. Secondly, the Bombe does not simulate the Enigma's middle rotor stepping. The longer your crib, the more likely a step happened within it, which will prevent the attack working. However, other than that, longer cribs are generally better. The attack produces a 'menu' which maps ciphertext letters to plaintext, and the goal is to produce 'loops': for example, with ciphertext ABC and crib CAB, we have the mappings A<->C, B<->A, and C<->B, which produces a loop A-B-C-A. The more loops, the better the crib. The operation will output this: if your menu has too few loops or is too short, a large number of incorrect outputs will usually be produced. Try a different crib. If the menu seems good but the right answer isn't produced, your crib may be wrong, or you may have overlapped the middle rotor stepping - try a different crib.

Output is not sufficient to fully decrypt the data. You will have to recover the rest of the plugboard settings by inspection. And the ring position is not taken into account: this affects when the middle rotor steps. If your output is correct for a bit, and then goes wrong, adjust the ring and start position on the right-hand rotor together until the output improves. If necessary, repeat for the middle rotor.

By default this operation runs the checking machine, a manual process to verify the quality of Bombe stops, on each stop, discarding stops which fail. If you want to see how many times the hardware actually stops for a given input, disable the checking machine.

More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; this.infoURL = "https://wikipedia.org/wiki/Bombe"; this.inputType = "string"; this.outputType = "JSON"; @@ -117,7 +118,7 @@ class Bombe extends Operation { const offset = args[7]; const check = args[8]; const rotors = []; - for (let i=0; i<4; i++) { + for (let i = 0; i < 4; i++) { if (i === 0 && model === "3-rotor") { // No fourth rotor continue; @@ -156,7 +157,6 @@ class Bombe extends Operation { }; } - /** * Displays the Bombe results in an HTML table * @@ -167,7 +167,8 @@ class Bombe extends Operation { */ present(output) { let html = `Bombe run on menu with ${output.nLoops} loop${output.nLoops === 1 ? "" : "s"} (2+ desirable). Note: Rotor positions are listed left to right and start at the beginning of the crib, and ignore stepping and the ring setting. Some plugboard settings are determined. A decryption preview starting at the beginning of the crib and ignoring stepping is also provided.\n\n`; - html += "\n"; + html + += "
Rotor stops Partial plugboard Decryption preview
\n"; for (const [setting, stecker, decrypt] of output.result) { html += `\n`; } diff --git a/src/core/operations/Bzip2Compress.mjs b/src/core/operations/Bzip2Compress.mjs index 45dbfae6..cb00aa3b 100644 --- a/src/core/operations/Bzip2Compress.mjs +++ b/src/core/operations/Bzip2Compress.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Bzip2 Compress operation */ class Bzip2Compress extends Operation { - /** * Bzip2Compress constructor */ @@ -22,7 +21,8 @@ class Bzip2Compress extends Operation { this.name = "Bzip2 Compress"; this.module = "Compression"; - this.description = "Bzip2 is a compression library developed by Julian Seward (of GHC fame) that uses the Burrows-Wheeler algorithm. It only supports compressing single files and its compression is slow, however is more effective than Deflate (.gz & .zip)."; + this.description + = "Bzip2 is a compression library developed by Julian Seward (of GHC fame) that uses the Burrows-Wheeler algorithm. It only supports compressing single files and its compression is slow, however is more effective than Deflate (.gz & .zip)."; this.infoURL = "https://wikipedia.org/wiki/Bzip2"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -54,7 +54,7 @@ class Bzip2Compress extends Operation { } if (isWorkerEnvironment()) self.sendStatusMessage("Loading Bzip2..."); return new Promise((resolve, reject) => { - Bzip2().then(bzip2 => { + Bzip2().then((bzip2) => { if (isWorkerEnvironment()) self.sendStatusMessage("Compressing data..."); const inpArray = new Uint8Array(input); const bzip2cc = bzip2.compressBZ2(inpArray, blockSize, workFactor); @@ -67,7 +67,6 @@ class Bzip2Compress extends Operation { }); }); } - } export default Bzip2Compress; diff --git a/src/core/operations/Bzip2Decompress.mjs b/src/core/operations/Bzip2Decompress.mjs index fe419265..0b73ddea 100644 --- a/src/core/operations/Bzip2Decompress.mjs +++ b/src/core/operations/Bzip2Decompress.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Bzip2 Decompress operation */ class Bzip2Decompress extends Operation { - /** * Bzip2Decompress constructor */ @@ -54,7 +53,7 @@ class Bzip2Decompress extends Operation { } if (isWorkerEnvironment()) self.sendStatusMessage("Loading Bzip2..."); return new Promise((resolve, reject) => { - Bzip2().then(bzip2 => { + Bzip2().then((bzip2) => { if (isWorkerEnvironment()) self.sendStatusMessage("Decompressing data..."); const inpArray = new Uint8Array(input); const bzip2cc = bzip2.decompressBZ2(inpArray, small ? 1 : 0); @@ -67,7 +66,6 @@ class Bzip2Decompress extends Operation { }); }); } - } export default Bzip2Decompress; diff --git a/src/core/operations/CBORDecode.mjs b/src/core/operations/CBORDecode.mjs index f4bda7c0..b5e25ef0 100644 --- a/src/core/operations/CBORDecode.mjs +++ b/src/core/operations/CBORDecode.mjs @@ -11,7 +11,6 @@ import Cbor from "cbor"; * CBOR Decode operation */ class CBORDecode extends Operation { - /** * CBORDecode constructor */ @@ -20,7 +19,8 @@ class CBORDecode extends Operation { this.name = "CBOR Decode"; this.module = "Serialise"; - this.description = "Concise Binary Object Representation (CBOR) is a binary data serialization format loosely based on JSON. Like JSON it allows the transmission of data objects that contain name–value pairs, but in a more concise manner. This increases processing and transfer speeds at the cost of human readability. It is defined in IETF RFC 8949."; + this.description + = "Concise Binary Object Representation (CBOR) is a binary data serialization format loosely based on JSON. Like JSON it allows the transmission of data objects that contain name–value pairs, but in a more concise manner. This increases processing and transfer speeds at the cost of human readability. It is defined in IETF RFC 8949."; this.infoURL = "https://wikipedia.org/wiki/CBOR"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -35,7 +35,6 @@ class CBORDecode extends Operation { run(input, args) { return Cbor.decodeFirstSync(Buffer.from(input).toString("hex")); } - } export default CBORDecode; diff --git a/src/core/operations/CBOREncode.mjs b/src/core/operations/CBOREncode.mjs index c6e094a9..b9b4e5c8 100644 --- a/src/core/operations/CBOREncode.mjs +++ b/src/core/operations/CBOREncode.mjs @@ -11,7 +11,6 @@ import Cbor from "cbor"; * CBOR Encode operation */ class CBOREncode extends Operation { - /** * CBOREncode constructor */ @@ -20,7 +19,8 @@ class CBOREncode extends Operation { this.name = "CBOR Encode"; this.module = "Serialise"; - this.description = "Concise Binary Object Representation (CBOR) is a binary data serialization format loosely based on JSON. Like JSON it allows the transmission of data objects that contain name–value pairs, but in a more concise manner. This increases processing and transfer speeds at the cost of human readability. It is defined in IETF RFC 8949."; + this.description + = "Concise Binary Object Representation (CBOR) is a binary data serialization format loosely based on JSON. Like JSON it allows the transmission of data objects that contain name–value pairs, but in a more concise manner. This increases processing and transfer speeds at the cost of human readability. It is defined in IETF RFC 8949."; this.infoURL = "https://wikipedia.org/wiki/CBOR"; this.inputType = "JSON"; this.outputType = "ArrayBuffer"; @@ -35,7 +35,6 @@ class CBOREncode extends Operation { run(input, args) { return new Uint8Array(Cbor.encodeCanonical(input)).buffer; } - } export default CBOREncode; diff --git a/src/core/operations/CMAC.mjs b/src/core/operations/CMAC.mjs index d6491362..150879ed 100644 --- a/src/core/operations/CMAC.mjs +++ b/src/core/operations/CMAC.mjs @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * CMAC operation */ class CMAC extends Operation { - /** * CMAC constructor */ @@ -23,7 +22,8 @@ class CMAC extends Operation { this.name = "CMAC"; this.module = "Crypto"; - this.description = "CMAC is a block-cipher based message authentication code algorithm.

RFC4493 defines AES-CMAC that uses AES encryption with a 128-bit key.
NIST SP 800-38B suggests usages of AES with other key lengths and Triple DES."; + this.description + = "CMAC is a block-cipher based message authentication code algorithm.

RFC4493 defines AES-CMAC that uses AES encryption with a 128-bit key.
NIST SP 800-38B suggests usages of AES with other key lengths and Triple DES."; this.infoURL = "https://wikipedia.org/wiki/CMAC"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -51,34 +51,38 @@ class CMAC extends Operation { const key = Utils.convertToByteString(args[0].string, args[0].option); const algo = args[1]; - const info = (function() { + const info = (function () { switch (algo) { case "AES": if (key.length !== 16 && key.length !== 24 && key.length !== 32) { - throw new OperationError("The key for AES must be either 16, 24, or 32 bytes (currently " + key.length + " bytes)"); + throw new OperationError( + "The key for AES must be either 16, 24, or 32 bytes (currently " + key.length + " bytes)" + ); } return { "algorithm": "AES-ECB", "key": key, "blockSize": 16, - "Rb": new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x87]), + "Rb": new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x87]) }; case "Triple DES": if (key.length !== 16 && key.length !== 24) { - throw new OperationError("The key for Triple DES must be 16 or 24 bytes (currently " + key.length + " bytes)"); + throw new OperationError( + "The key for Triple DES must be 16 or 24 bytes (currently " + key.length + " bytes)" + ); } return { "algorithm": "3DES-ECB", "key": key.length === 16 ? key + key.substring(0, 8) : key, "blockSize": 8, - "Rb": new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0x1b]), + "Rb": new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0x1b]) }; default: throw new OperationError("Undefined encryption algorithm"); } })(); - const xor = function(a, b, out) { + const xor = function (a, b, out) { if (!out) out = new Uint8Array(a.length); for (let i = 0; i < a.length; i++) { out[i] = a[i] ^ b[i]; @@ -86,7 +90,7 @@ class CMAC extends Operation { return out; }; - const leftShift1 = function(a) { + const leftShift1 = function (a) { const out = new Uint8Array(a.length); let carry = 0; for (let i = a.length - 1; i >= 0; i--) { @@ -97,7 +101,7 @@ class CMAC extends Operation { }; const cipher = forge.cipher.createCipher(info.algorithm, info.key); - const encrypt = function(a, out) { + const encrypt = function (a, out) { if (!out) out = new Uint8Array(a.length); cipher.start(); cipher.update(forge.util.createBuffer(a)); @@ -116,7 +120,7 @@ class CMAC extends Operation { if (K1[0] & 0x80) xor(K2, info.Rb, K2); const n = Math.ceil(input.byteLength / info.blockSize); - const lastBlock = (function() { + const lastBlock = (function () { if (n === 0) { const data = new Uint8Array(K2); data[0] ^= 0x80; @@ -143,7 +147,6 @@ class CMAC extends Operation { const T = encrypt(Y); return toHexFast(T); } - } export default CMAC; diff --git a/src/core/operations/CRC16Checksum.mjs b/src/core/operations/CRC16Checksum.mjs index 035ee04b..4f225370 100644 --- a/src/core/operations/CRC16Checksum.mjs +++ b/src/core/operations/CRC16Checksum.mjs @@ -11,7 +11,6 @@ import JSCRC from "js-crc"; * CRC-16 Checksum operation */ class CRC16Checksum extends Operation { - /** * CRC16Checksum constructor */ @@ -20,7 +19,8 @@ class CRC16Checksum extends Operation { this.name = "CRC-16 Checksum"; this.module = "Crypto"; - this.description = "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961."; + this.description + = "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961."; this.infoURL = "https://wikipedia.org/wiki/Cyclic_redundancy_check"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -35,7 +35,6 @@ class CRC16Checksum extends Operation { run(input, args) { return JSCRC.crc16(input); } - } export default CRC16Checksum; diff --git a/src/core/operations/CRC32Checksum.mjs b/src/core/operations/CRC32Checksum.mjs index cfe84643..bd0be580 100644 --- a/src/core/operations/CRC32Checksum.mjs +++ b/src/core/operations/CRC32Checksum.mjs @@ -11,7 +11,6 @@ import JSCRC from "js-crc"; * CRC-32 Checksum operation */ class CRC32Checksum extends Operation { - /** * CRC32Checksum constructor */ @@ -20,7 +19,8 @@ class CRC32Checksum extends Operation { this.name = "CRC-32 Checksum"; this.module = "Crypto"; - this.description = "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961; the 32-bit CRC function of Ethernet and many other standards is the work of several researchers and was published in 1975."; + this.description + = "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961; the 32-bit CRC function of Ethernet and many other standards is the work of several researchers and was published in 1975."; this.infoURL = "https://wikipedia.org/wiki/Cyclic_redundancy_check"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -35,7 +35,6 @@ class CRC32Checksum extends Operation { run(input, args) { return JSCRC.crc32(input); } - } export default CRC32Checksum; diff --git a/src/core/operations/CRC8Checksum.mjs b/src/core/operations/CRC8Checksum.mjs index 193cadf9..56e64683 100644 --- a/src/core/operations/CRC8Checksum.mjs +++ b/src/core/operations/CRC8Checksum.mjs @@ -13,7 +13,6 @@ import { toHexFast } from "../lib/Hex.mjs"; * CRC-8 Checksum operation */ class CRC8Checksum extends Operation { - /** * CRC8Checksum constructor */ @@ -22,7 +21,8 @@ class CRC8Checksum extends Operation { this.name = "CRC-8 Checksum"; this.module = "Crypto"; - this.description = "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961."; + this.description + = "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961."; this.infoURL = "https://wikipedia.org/wiki/Cyclic_redundancy_check"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -112,7 +112,7 @@ class CRC8Checksum extends Operation { reverseBits(input, hashSize) { let reversedByte = 0; for (let i = hashSize - 1; i >= 0; i--) { - reversedByte |= ((input & 1) << i); + reversedByte |= (input & 1) << i; input >>= 1; } @@ -131,23 +131,23 @@ class CRC8Checksum extends Operation { case "CRC-8": return this.calculateCRC8(input, 0x7, 0x0, false, false, 0x0); case "CRC-8/CDMA2000": - return this.calculateCRC8(input, 0x9B, 0xFF, false, false, 0x0); + return this.calculateCRC8(input, 0x9b, 0xff, false, false, 0x0); case "CRC-8/DARC": return this.calculateCRC8(input, 0x39, 0x0, true, true, 0x0); case "CRC-8/DVB-S2": - return this.calculateCRC8(input, 0xD5, 0x0, false, false, 0x0); + return this.calculateCRC8(input, 0xd5, 0x0, false, false, 0x0); case "CRC-8/EBU": - return this.calculateCRC8(input, 0x1D, 0xFF, true, true, 0x0); + return this.calculateCRC8(input, 0x1d, 0xff, true, true, 0x0); case "CRC-8/I-CODE": - return this.calculateCRC8(input, 0x1D, 0xFD, false, false, 0x0); + return this.calculateCRC8(input, 0x1d, 0xfd, false, false, 0x0); case "CRC-8/ITU": return this.calculateCRC8(input, 0x7, 0x0, false, false, 0x55); case "CRC-8/MAXIM": return this.calculateCRC8(input, 0x31, 0x0, true, true, 0x0); case "CRC-8/ROHC": - return this.calculateCRC8(input, 0x7, 0xFF, true, true, 0x0); + return this.calculateCRC8(input, 0x7, 0xff, true, true, 0x0); case "CRC-8/WCDMA": - return this.calculateCRC8(input, 0x9B, 0x0, true, true, 0x0); + return this.calculateCRC8(input, 0x9b, 0x0, true, true, 0x0); default: throw new OperationError("Unknown checksum algorithm"); } diff --git a/src/core/operations/CSSBeautify.mjs b/src/core/operations/CSSBeautify.mjs index 3491b618..1186588a 100644 --- a/src/core/operations/CSSBeautify.mjs +++ b/src/core/operations/CSSBeautify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * CSS Beautify operation */ class CSSBeautify extends Operation { - /** * CSSBeautify constructor */ @@ -41,7 +40,6 @@ class CSSBeautify extends Operation { const indentStr = args[0]; return vkbeautify.css(input, indentStr); } - } export default CSSBeautify; diff --git a/src/core/operations/CSSMinify.mjs b/src/core/operations/CSSMinify.mjs index 3aa96bb1..dc00b755 100644 --- a/src/core/operations/CSSMinify.mjs +++ b/src/core/operations/CSSMinify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * CSS Minify operation */ class CSSMinify extends Operation { - /** * CSSMinify constructor */ @@ -41,7 +40,6 @@ class CSSMinify extends Operation { const preserveComments = args[0]; return vkbeautify.cssmin(input, preserveComments); } - } export default CSSMinify; diff --git a/src/core/operations/CSSSelector.mjs b/src/core/operations/CSSSelector.mjs index d6b8da11..9a38d6e3 100644 --- a/src/core/operations/CSSSelector.mjs +++ b/src/core/operations/CSSSelector.mjs @@ -13,7 +13,6 @@ import nwmatcher from "nwmatcher"; * CSS selector operation */ class CSSSelector extends Operation { - /** * CSSSelector constructor */ @@ -48,8 +47,7 @@ class CSSSelector extends Operation { run(input, args) { const [query, delimiter] = args, parser = new xmldom.DOMParser(); - let dom, - result; + let dom, result; if (!query.length || !input.length) { return ""; @@ -62,13 +60,13 @@ class CSSSelector extends Operation { } try { - const matcher = nwmatcher({document: dom}); + const matcher = nwmatcher({ document: dom }); result = matcher.select(query, dom); } catch (err) { throw new OperationError("Invalid CSS Selector. Details:\n" + err.message); } - const nodeToString = function(node) { + const nodeToString = function (node) { return node.toString(); /* xmldom does not return the outerHTML value. switch (node.nodeType) { @@ -81,11 +79,8 @@ class CSSSelector extends Operation { }*/ }; - return result - .map(nodeToString) - .join(delimiter); + return result.map(nodeToString).join(delimiter); } - } export default CSSSelector; diff --git a/src/core/operations/CSVToJSON.mjs b/src/core/operations/CSVToJSON.mjs index ca9f1ceb..54fcd0eb 100644 --- a/src/core/operations/CSVToJSON.mjs +++ b/src/core/operations/CSVToJSON.mjs @@ -12,7 +12,6 @@ import Utils from "../Utils.mjs"; * CSV to JSON operation */ class CSVToJSON extends Operation { - /** * CSVToJSON constructor */ @@ -62,7 +61,7 @@ class CSVToJSON extends Operation { switch (format) { case "Array of dictionaries": header = json[0]; - return json.slice(1).map(row => { + return json.slice(1).map((row) => { const obj = {}; header.forEach((h, i) => { obj[h] = row[i]; @@ -74,7 +73,6 @@ class CSVToJSON extends Operation { return json; } } - } export default CSVToJSON; diff --git a/src/core/operations/CTPH.mjs b/src/core/operations/CTPH.mjs index 6b6a487d..febb15a6 100644 --- a/src/core/operations/CTPH.mjs +++ b/src/core/operations/CTPH.mjs @@ -11,7 +11,6 @@ import ctphjs from "ctph.js"; * CTPH operation */ class CTPH extends Operation { - /** * CTPH constructor */ @@ -20,7 +19,8 @@ class CTPH extends Operation { this.name = "CTPH"; this.module = "Crypto"; - this.description = "Context Triggered Piecewise Hashing, also called Fuzzy Hashing, can match inputs that have homologies. Such inputs have sequences of identical bytes in the same order, although bytes in between these sequences may be different in both content and length.

CTPH was originally based on the work of Dr. Andrew Tridgell and a spam email detector called SpamSum. This method was adapted by Jesse Kornblum and published at the DFRWS conference in 2006 in a paper 'Identifying Almost Identical Files Using Context Triggered Piecewise Hashing'."; + this.description + = "Context Triggered Piecewise Hashing, also called Fuzzy Hashing, can match inputs that have homologies. Such inputs have sequences of identical bytes in the same order, although bytes in between these sequences may be different in both content and length.

CTPH was originally based on the work of Dr. Andrew Tridgell and a spam email detector called SpamSum. This method was adapted by Jesse Kornblum and published at the DFRWS conference in 2006 in a paper 'Identifying Almost Identical Files Using Context Triggered Piecewise Hashing'."; this.infoURL = "https://forensics.wiki/context_triggered_piecewise_hashing/"; this.inputType = "string"; this.outputType = "string"; @@ -35,7 +35,6 @@ class CTPH extends Operation { run(input, args) { return ctphjs.digest(input); } - } export default CTPH; diff --git a/src/core/operations/CaesarBoxCipher.mjs b/src/core/operations/CaesarBoxCipher.mjs index 680db900..d4ddcf1e 100644 --- a/src/core/operations/CaesarBoxCipher.mjs +++ b/src/core/operations/CaesarBoxCipher.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Caesar Box Cipher operation */ class CaesarBoxCipher extends Operation { - /** * CaesarBoxCipher constructor */ @@ -19,7 +18,8 @@ class CaesarBoxCipher extends Operation { this.name = "Caesar Box Cipher"; this.module = "Ciphers"; - this.description = "Caesar Box is a transposition cipher used in the Roman Empire, in which letters of the message are written in rows in a square (or a rectangle) and then, read by column."; + this.description + = "Caesar Box is a transposition cipher used in the Roman Empire, in which letters of the message are written in rows in a square (or a rectangle) and then, read by column."; this.infoURL = "https://www.dcode.fr/caesar-box-cipher"; this.inputType = "string"; this.outputType = "string"; @@ -40,9 +40,8 @@ class CaesarBoxCipher extends Operation { run(input, args) { const tableHeight = args[0]; const tableWidth = Math.ceil(input.length / tableHeight); - while (input.indexOf(" ") !== -1) - input = input.replace(" ", ""); - for (let i = 0; i < (tableHeight * tableWidth) - input.length; i++) { + while (input.indexOf(" ") !== -1) input = input.replace(" ", ""); + for (let i = 0; i < tableHeight * tableWidth - input.length; i++) { input += "\x00"; } let result = ""; @@ -55,7 +54,6 @@ class CaesarBoxCipher extends Operation { } return result; } - } export default CaesarBoxCipher; diff --git a/src/core/operations/CaretMdecode.mjs b/src/core/operations/CaretMdecode.mjs index 68c6dacb..fa99ed37 100644 --- a/src/core/operations/CaretMdecode.mjs +++ b/src/core/operations/CaretMdecode.mjs @@ -12,7 +12,6 @@ import Operation from "../Operation.mjs"; * https://gist.githubusercontent.com/JaHIY/3c91bbf7bea5661e6abfbd1349ee81a2/raw/c7b480e9ff24bcb8f5287a8a8a2dcb9bf5628506/decode_m_notation.cpp */ class CaretMdecode extends Operation { - /** * CaretMdecode constructor */ @@ -21,7 +20,8 @@ class CaretMdecode extends Operation { this.name = "Caret/M-decode"; this.module = "Default"; - this.description = "Decodes caret or M-encoded strings, i.e. ^M turns into a newline, M-^] turns into 0x9d. Sources such as `cat -v`.\n\nPlease be aware that when using `cat -v` ^_ (caret-underscore) will not be encoded, but represents a valid encoding (namely that of 0x1f)."; + this.description + = "Decodes caret or M-encoded strings, i.e. ^M turns into a newline, M-^] turns into 0x9d. Sources such as `cat -v`.\n\nPlease be aware that when using `cat -v` ^_ (caret-underscore) will not be encoded, but represents a valid encoding (namely that of 0x1f)."; this.infoURL = "https://en.wikipedia.org/wiki/Caret_notation"; this.inputType = "string"; this.outputType = "byteArray"; @@ -34,13 +34,11 @@ class CaretMdecode extends Operation { * @returns {byteArray} */ run(input, args) { - const bytes = []; let prev = ""; for (let i = 0; i < input.length; i++) { - const charCode = input.charCodeAt(i); const curChar = input.charAt(i); @@ -88,11 +86,9 @@ class CaretMdecode extends Operation { bytes.push(charCode); } } - } return bytes; } - } export default CaretMdecode; diff --git a/src/core/operations/CartesianProduct.mjs b/src/core/operations/CartesianProduct.mjs index 07ac575c..753c06bd 100644 --- a/src/core/operations/CartesianProduct.mjs +++ b/src/core/operations/CartesianProduct.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Set cartesian product operation */ class CartesianProduct extends Operation { - /** * Cartesian Product constructor */ @@ -20,7 +19,8 @@ class CartesianProduct extends Operation { this.name = "Cartesian Product"; this.module = "Default"; - this.description = "Calculates the cartesian product of multiple sets of data, returning all possible combinations."; + this.description + = "Calculates the cartesian product of multiple sets of data, returning all possible combinations."; this.infoURL = "https://wikipedia.org/wiki/Cartesian_product"; this.inputType = "string"; this.outputType = "string"; @@ -34,7 +34,7 @@ class CartesianProduct extends Operation { name: "Item delimiter", type: "binaryString", value: "," - }, + } ]; } @@ -46,8 +46,9 @@ class CartesianProduct extends Operation { */ validateSampleNumbers(sets) { if (!sets || sets.length < 2) { - throw new OperationError("Incorrect number of sets, perhaps you" + - " need to modify the sample delimiter or add more samples?"); + throw new OperationError( + "Incorrect number of sets, perhaps you" + " need to modify the sample delimiter or add more samples?" + ); } } @@ -65,23 +66,23 @@ class CartesianProduct extends Operation { this.validateSampleNumbers(sets); - return this.runCartesianProduct(...sets.map(s => s.split(this.itemDelimiter))); + return this.runCartesianProduct(...sets.map((s) => s.split(this.itemDelimiter))); } /** - * Return the cartesian product of the two inputted sets. - * - * @param {Object[]} a - * @param {Object[]} b - * @param {Object[]} c - * @returns {string} - */ + * Return the cartesian product of the two inputted sets. + * + * @param {Object[]} a + * @param {Object[]} b + * @param {Object[]} c + * @returns {string} + */ runCartesianProduct(a, b, ...c) { /** * https://stackoverflow.com/a/43053803/7200497 * @returns {Object[]} */ - const f = (a, b) => [].concat(...a.map(d => b.map(e => [].concat(d, e)))); + const f = (a, b) => [].concat(...a.map((d) => b.map((e) => [].concat(d, e)))); /** * https://stackoverflow.com/a/43053803/7200497 * @returns {Object[][]} @@ -89,7 +90,7 @@ class CartesianProduct extends Operation { const cartesian = (a, b, ...c) => (b ? cartesian(f(a, b), ...c) : a); return cartesian(a, b, ...c) - .map(set => `(${set.join(",")})`) + .map((set) => `(${set.join(",")})`) .join(this.itemDelimiter); } } diff --git a/src/core/operations/CetaceanCipherDecode.mjs b/src/core/operations/CetaceanCipherDecode.mjs index a50fe6b7..11b8332e 100644 --- a/src/core/operations/CetaceanCipherDecode.mjs +++ b/src/core/operations/CetaceanCipherDecode.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Cetacean Cipher Decode operation */ class CetaceanCipherDecode extends Operation { - /** * CetaceanCipherDecode constructor */ @@ -19,7 +18,8 @@ class CetaceanCipherDecode extends Operation { this.name = "Cetacean Cipher Decode"; this.module = "Ciphers"; - this.description = "Decode Cetacean Cipher input.

e.g. EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe becomes hi"; + this.description + = "Decode Cetacean Cipher input.

e.g. EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe becomes hi"; this.infoURL = "https://hitchhikers.fandom.com/wiki/Dolphins"; this.inputType = "string"; this.outputType = "string"; @@ -50,13 +50,11 @@ class CetaceanCipherDecode extends Operation { const byteArray = []; - for (let i = 0; i < binaryArray.length; i += 16) { + for (let i = 0; i < binaryArray.length; i += 16) { byteArray.push(binaryArray.slice(i, i + 16).join("")); } - return byteArray.map(byte => - String.fromCharCode(parseInt(byte, 2)) - ).join(""); + return byteArray.map((byte) => String.fromCharCode(parseInt(byte, 2))).join(""); } } diff --git a/src/core/operations/CetaceanCipherEncode.mjs b/src/core/operations/CetaceanCipherEncode.mjs index ec5f76d6..7ed981e2 100644 --- a/src/core/operations/CetaceanCipherEncode.mjs +++ b/src/core/operations/CetaceanCipherEncode.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {toBinary} from "../lib/Binary.mjs"; +import { toBinary } from "../lib/Binary.mjs"; /** * Cetacean Cipher Encode operation */ class CetaceanCipherEncode extends Operation { - /** * CetaceanCipherEncode constructor */ @@ -20,7 +19,8 @@ class CetaceanCipherEncode extends Operation { this.name = "Cetacean Cipher Encode"; this.module = "Ciphers"; - this.description = "Converts any input into Cetacean Cipher.

e.g. hi becomes EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe"; + this.description + = "Converts any input into Cetacean Cipher.

e.g. hi becomes EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe"; this.infoURL = "https://hitchhikers.fandom.com/wiki/Dolphins"; this.inputType = "string"; this.outputType = "string"; @@ -35,12 +35,12 @@ class CetaceanCipherEncode extends Operation { const result = []; const charArray = input.split(""); - charArray.map(character => { + charArray.map((character) => { if (character === " ") { result.push(character); } else { const binaryArray = toBinary(character.charCodeAt(0), "None", 16).split(""); - result.push(binaryArray.map(str => str === "1" ? "e" : "E").join("")); + result.push(binaryArray.map((str) => (str === "1" ? "e" : "E")).join("")); } }); diff --git a/src/core/operations/ChaCha.mjs b/src/core/operations/ChaCha.mjs index 166c1663..0adf5540 100644 --- a/src/core/operations/ChaCha.mjs +++ b/src/core/operations/ChaCha.mjs @@ -46,7 +46,7 @@ function chacha(key, nonce, counter, rounds) { * @returns {integer} */ function ROL32(x, n) { - return ((x << n) & 0xFFFFFFFF) | (x >>> (32 - n)); + return ((x << n) & 0xffffffff) | (x >>> (32 - n)); } /** @@ -60,25 +60,29 @@ function chacha(key, nonce, counter, rounds) { * @returns {integer} */ function quarterround(x, a, b, c, d) { - x[a] = ((x[a] + x[b]) & 0xFFFFFFFF); x[d] = ROL32(x[d] ^ x[a], 16); - x[c] = ((x[c] + x[d]) & 0xFFFFFFFF); x[b] = ROL32(x[b] ^ x[c], 12); - x[a] = ((x[a] + x[b]) & 0xFFFFFFFF); x[d] = ROL32(x[d] ^ x[a], 8); - x[c] = ((x[c] + x[d]) & 0xFFFFFFFF); x[b] = ROL32(x[b] ^ x[c], 7); + x[a] = (x[a] + x[b]) & 0xffffffff; + x[d] = ROL32(x[d] ^ x[a], 16); + x[c] = (x[c] + x[d]) & 0xffffffff; + x[b] = ROL32(x[b] ^ x[c], 12); + x[a] = (x[a] + x[b]) & 0xffffffff; + x[d] = ROL32(x[d] ^ x[a], 8); + x[c] = (x[c] + x[d]) & 0xffffffff; + x[b] = ROL32(x[b] ^ x[c], 7); } - for (let i = 0; i < rounds / 2; i++) { - quarterround(x, 0, 4, 8, 12); - quarterround(x, 1, 5, 9, 13); + for (let i = 0; i < rounds / 2; i++) { + quarterround(x, 0, 4, 8, 12); + quarterround(x, 1, 5, 9, 13); quarterround(x, 2, 6, 10, 14); quarterround(x, 3, 7, 11, 15); quarterround(x, 0, 5, 10, 15); quarterround(x, 1, 6, 11, 12); - quarterround(x, 2, 7, 8, 13); - quarterround(x, 3, 4, 9, 14); + quarterround(x, 2, 7, 8, 13); + quarterround(x, 3, 4, 9, 14); } for (let i = 0; i < 16; i++) { - x[i] = (x[i] + a[i]) & 0xFFFFFFFF; + x[i] = (x[i] + a[i]) & 0xffffffff; } let output = Array(); @@ -92,7 +96,6 @@ function chacha(key, nonce, counter, rounds) { * ChaCha operation */ class ChaCha extends Operation { - /** * ChaCha constructor */ @@ -101,7 +104,8 @@ class ChaCha extends Operation { this.name = "ChaCha"; this.module = "Default"; - this.description = "ChaCha is a stream cipher designed by Daniel J. Bernstein. It is a variant of the Salsa stream cipher. Several parameterizations exist; 'ChaCha' may refer to the original construction, or to the variant as described in RFC-8439. ChaCha is often used with Poly1305, in the ChaCha20-Poly1305 AEAD construction.

Key: ChaCha uses a key of 16 or 32 bytes (128 or 256 bits).

Nonce: ChaCha uses a nonce of 8 or 12 bytes (64 or 96 bits).

Counter: ChaCha uses a counter of 4 or 8 bytes (32 or 64 bits); together, the nonce and counter must add up to 16 bytes. The counter starts at zero at the start of the keystream, and is incremented at every 64 bytes."; + this.description + = "ChaCha is a stream cipher designed by Daniel J. Bernstein. It is a variant of the Salsa stream cipher. Several parameterizations exist; 'ChaCha' may refer to the original construction, or to the variant as described in RFC-8439. ChaCha is often used with Poly1305, in the ChaCha20-Poly1305 AEAD construction.

Key: ChaCha uses a key of 16 or 32 bytes (128 or 256 bits).

Nonce: ChaCha uses a nonce of 8 or 12 bytes (64 or 96 bits).

Counter: ChaCha uses a counter of 4 or 8 bytes (32 or 64 bits); together, the nonce and counter must add up to 16 bytes. The counter starts at zero at the start of the keystream, and is incremented at every 64 bytes."; this.infoURL = "https://wikipedia.org/wiki/Salsa20#ChaCha_variant"; this.inputType = "string"; this.outputType = "string"; @@ -228,7 +232,6 @@ ChaCha uses a nonce of 8 or 12 bytes (64 or 96 bits).`); return pos; } } - } export default ChaCha; diff --git a/src/core/operations/ChangeIPFormat.mjs b/src/core/operations/ChangeIPFormat.mjs index c9adc5d8..3fb67d1c 100644 --- a/src/core/operations/ChangeIPFormat.mjs +++ b/src/core/operations/ChangeIPFormat.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {fromHex} from "../lib/Hex.mjs"; +import { fromHex } from "../lib/Hex.mjs"; /** * Change IP format operation */ class ChangeIPFormat extends Operation { - /** * ChangeIPFormat constructor */ @@ -22,7 +21,8 @@ class ChangeIPFormat extends Operation { this.name = "Change IP format"; this.module = "Default"; - this.description = "Convert an IP address from one format to another, e.g. 172.20.23.54 to ac141736"; + this.description + = "Convert an IP address from one format to another, e.g. 172.20.23.54 to ac141736"; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -92,7 +92,7 @@ class ChangeIPFormat extends Operation { for (j = 0; j < baIp.length; j++) { ddIp += baIp[j] + "."; } - output += ddIp.slice(0, ddIp.length-1) + "\n"; + output += ddIp.slice(0, ddIp.length - 1) + "\n"; break; case "Decimal": decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0; @@ -114,7 +114,7 @@ class ChangeIPFormat extends Operation { } } - return output.slice(0, output.length-1); + return output.slice(0, output.length - 1); } /** @@ -126,13 +126,12 @@ class ChangeIPFormat extends Operation { fromNumber(value, radix) { const decimal = parseInt(value, radix); const baIp = []; - baIp.push(decimal >> 24 & 255); - baIp.push(decimal >> 16 & 255); - baIp.push(decimal >> 8 & 255); + baIp.push((decimal >> 24) & 255); + baIp.push((decimal >> 16) & 255); + baIp.push((decimal >> 8) & 255); baIp.push(decimal & 255); return baIp; } - } export default ChangeIPFormat; diff --git a/src/core/operations/ChiSquare.mjs b/src/core/operations/ChiSquare.mjs index f78574d6..be8826bd 100644 --- a/src/core/operations/ChiSquare.mjs +++ b/src/core/operations/ChiSquare.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Chi Square operation */ class ChiSquare extends Operation { - /** * ChiSquare constructor */ @@ -48,7 +47,6 @@ class ChiSquare extends Operation { return total; } - } export default ChiSquare; diff --git a/src/core/operations/CipherSaber2Decrypt.mjs b/src/core/operations/CipherSaber2Decrypt.mjs index 53d61468..4cdffd30 100644 --- a/src/core/operations/CipherSaber2Decrypt.mjs +++ b/src/core/operations/CipherSaber2Decrypt.mjs @@ -12,7 +12,6 @@ import Utils from "../Utils.mjs"; * CipherSaber2 Decrypt operation */ class CipherSaber2Decrypt extends Operation { - /** * CipherSaber2Decrypt constructor */ @@ -21,7 +20,8 @@ class CipherSaber2Decrypt extends Operation { this.name = "CipherSaber2 Decrypt"; this.module = "Crypto"; - this.description = "CipherSaber is a simple symmetric encryption protocol based on the RC4 stream cipher. It gives reasonably strong protection of message confidentiality, yet it's designed to be simple enough that even novice programmers can memorize the algorithm and implement it from scratch."; + this.description + = "CipherSaber is a simple symmetric encryption protocol based on the RC4 stream cipher. It gives reasonably strong protection of message confidentiality, yet it's designed to be simple enough that even novice programmers can memorize the algorithm and implement it from scratch."; this.infoURL = "https://wikipedia.org/wiki/CipherSaber"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -55,7 +55,6 @@ class CipherSaber2Decrypt extends Operation { input = input.slice(10); return new Uint8Array(result.concat(encode(tempIVP, key, rounds, input))).buffer; } - } export default CipherSaber2Decrypt; diff --git a/src/core/operations/CipherSaber2Encrypt.mjs b/src/core/operations/CipherSaber2Encrypt.mjs index dd86bd52..fb2893c1 100644 --- a/src/core/operations/CipherSaber2Encrypt.mjs +++ b/src/core/operations/CipherSaber2Encrypt.mjs @@ -13,7 +13,6 @@ import Utils from "../Utils.mjs"; * CipherSaber2 Encrypt operation */ class CipherSaber2Encrypt extends Operation { - /** * CipherSaber2Encrypt constructor */ @@ -22,7 +21,8 @@ class CipherSaber2Encrypt extends Operation { this.name = "CipherSaber2 Encrypt"; this.module = "Crypto"; - this.description = "CipherSaber is a simple symmetric encryption protocol based on the RC4 stream cipher. It gives reasonably strong protection of message confidentiality, yet it's designed to be simple enough that even novice programmers can memorize the algorithm and implement it from scratch."; + this.description + = "CipherSaber is a simple symmetric encryption protocol based on the RC4 stream cipher. It gives reasonably strong protection of message confidentiality, yet it's designed to be simple enough that even novice programmers can memorize the algorithm and implement it from scratch."; this.infoURL = "https://wikipedia.org/wiki/CipherSaber"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -54,12 +54,10 @@ class CipherSaber2Encrypt extends Operation { // Assign into initialisation vector based on cipher mode. const tempIVP = crypto.randomBytes(10); - for (let m = 0; m < 10; m++) - result.push(tempIVP[m]); + for (let m = 0; m < 10; m++) result.push(tempIVP[m]); return new Uint8Array(result.concat(encode(tempIVP, key, rounds, input))).buffer; } - } export default CipherSaber2Encrypt; diff --git a/src/core/operations/CitrixCTX1Decode.mjs b/src/core/operations/CitrixCTX1Decode.mjs index f002c8a2..52e2ec95 100644 --- a/src/core/operations/CitrixCTX1Decode.mjs +++ b/src/core/operations/CitrixCTX1Decode.mjs @@ -12,7 +12,6 @@ import cptable from "codepage"; * Citrix CTX1 Decode operation */ class CitrixCTX1Decode extends Operation { - /** * CitrixCTX1Decode constructor */ @@ -45,15 +44,14 @@ class CitrixCTX1Decode extends Operation { if (i + 2 >= revinput.length) { temp = 0; } else { - temp = ((revinput[i + 2] - 0x41) & 0xf) ^ (((revinput[i + 3]- 0x41) << 4) & 0xf0); + temp = ((revinput[i + 2] - 0x41) & 0xf) ^ (((revinput[i + 3] - 0x41) << 4) & 0xf0); } - temp = (((revinput[i] - 0x41) & 0xf) ^ (((revinput[i + 1] - 0x41) << 4) & 0xf0)) ^ 0xa5 ^ temp; + temp = ((revinput[i] - 0x41) & 0xf) ^ (((revinput[i + 1] - 0x41) << 4) & 0xf0) ^ 0xa5 ^ temp; result.push(temp); } // Decodes a utf-16le string return cptable.utils.decode(1200, result.reverse()); } - } export default CitrixCTX1Decode; diff --git a/src/core/operations/CitrixCTX1Encode.mjs b/src/core/operations/CitrixCTX1Encode.mjs index 3c0dfcdd..8639f3ae 100644 --- a/src/core/operations/CitrixCTX1Encode.mjs +++ b/src/core/operations/CitrixCTX1Encode.mjs @@ -11,7 +11,6 @@ import cptable from "codepage"; * Citrix CTX1 Encode operation */ class CitrixCTX1Encode extends Operation { - /** * CitrixCTX1Encode constructor */ @@ -44,7 +43,6 @@ class CitrixCTX1Encode extends Operation { return result; } - } export default CitrixCTX1Encode; diff --git a/src/core/operations/Colossus.mjs b/src/core/operations/Colossus.mjs index e9f00cf1..7bd39387 100644 --- a/src/core/operations/Colossus.mjs +++ b/src/core/operations/Colossus.mjs @@ -18,7 +18,6 @@ import { SWITCHES, VALID_ITA2 } from "../lib/Lorenz.mjs"; * Colossus operation */ class Colossus extends Operation { - /** * Colossus constructor */ @@ -26,7 +25,8 @@ class Colossus extends Operation { super(); this.name = "Colossus"; this.module = "Bletchley"; - this.description = "Colossus is the name of the world's first electronic computer. Ten Colossi were designed by Tommy Flowers and built at the Post Office Research Labs at Dollis Hill in 1943 during World War 2. They assisted with the breaking of the German Lorenz cipher attachment, a machine created to encipher communications between Hitler and his generals on the front lines.

To learn more, Virtual Colossus, an online, browser based simulation of a Colossus computer is available at virtualcolossus.co.uk.

A more detailed description of this operation can be found here."; + this.description + = "Colossus is the name of the world's first electronic computer. Ten Colossi were designed by Tommy Flowers and built at the Post Office Research Labs at Dollis Hill in 1943 during World War 2. They assisted with the breaking of the German Lorenz cipher attachment, a machine created to encipher communications between Hitler and his generals on the front lines.

To learn more, Virtual Colossus, an online, browser based simulation of a Colossus computer is available at virtualcolossus.co.uk.

A more detailed description of this operation can be found here."; this.infoURL = "https://wikipedia.org/wiki/Colossus_computer"; this.inputType = "string"; this.outputType = "JSON"; @@ -68,7 +68,10 @@ class Colossus extends Operation { { name: "Select Program", on: [7], - off: [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40] + off: [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 + ] }, { name: "Top Section - Conditional", @@ -78,11 +81,16 @@ class Colossus extends Operation { { name: "Bottom Section - Addition", on: [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], - off: [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] + off: [ + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 + ] }, { name: "Advanced", - on: [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], + on: [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 + ], off: [7] } ] @@ -90,7 +98,13 @@ class Colossus extends Operation { { name: "Program to run", type: "option", - value: ["", "Letter Count", "1+2=. (1+2 Break In, Find X1,X2)", "4=5=/1=2 (Given X1,X2 find X4,X5)", "/,5,U (Count chars to find X3)"] + value: [ + "", + "Letter Count", + "1+2=. (1+2 Break In, Find X1,X2)", + "4=5=/1=2 (Given X1,X2 find X4,X5)", + "/,5,U (Count chars to find X3)" + ] }, { name: "K Rack: Conditional", @@ -374,7 +388,7 @@ class Colossus extends Operation { const qbusin = { "Z": args[2], "Chi": args[3], - "Psi": args[4], + "Psi": args[4] }; const limitation = args[5]; @@ -383,7 +397,9 @@ class Colossus extends Operation { if (limitation.includes("Ψ1")) lm[1] = true; if (limitation.includes("P5")) lm[2] = true; const limit = { - X2: lm[0], S1: lm[1], P5: lm[2] + X2: lm[0], + S1: lm[1], + P5: lm[2] }; const KRackOpt = args[6]; @@ -394,10 +410,12 @@ class Colossus extends Operation { } const re = new RegExp("^$|^[.x]$"); - for (let qr=0;qr<3;qr++) { - for (let a=0;a<5;a++) { - if (!re.test(args[((qr*7)+(a+9))])) - throw new OperationError("Switch R"+(qr+1)+"-Q"+(a+1)+" can only be set to blank, . or x"); + for (let qr = 0; qr < 3; qr++) { + for (let a = 0; a < 5; a++) { + if (!re.test(args[qr * 7 + (a + 9)])) + throw new OperationError( + "Switch R" + (qr + 1) + "-Q" + (a + 1) + " can only be set to blank, . or x" + ); } } @@ -407,21 +425,20 @@ class Colossus extends Operation { // Q1,Q2,Q3,Q4,Q5,negate,counter1 const qbusswitches = { condition: [ - {Qswitches: [args[9], args[10], args[11], args[12], args[13]], Negate: args[14], Counter: args[15]}, - {Qswitches: [args[16], args[17], args[18], args[19], args[20]], Negate: args[21], Counter: args[22]}, - {Qswitches: [args[23], args[24], args[25], args[26], args[27]], Negate: args[28], Counter: args[29]} + { Qswitches: [args[9], args[10], args[11], args[12], args[13]], Negate: args[14], Counter: args[15] }, + { Qswitches: [args[16], args[17], args[18], args[19], args[20]], Negate: args[21], Counter: args[22] }, + { Qswitches: [args[23], args[24], args[25], args[26], args[27]], Negate: args[28], Counter: args[29] } ], condNegateAll: args[30], addition: [ - {Qswitches: [args[32], args[33], args[34], args[35], args[36]], Equals: args[37], C1: args[38]} + { Qswitches: [args[32], args[33], args[34], args[35], args[36]], Equals: args[37], C1: args[38] } ], addNegateAll: args[39], totalMotor: args[40] }; const settotal = parseInt(args[42], 10); - if (settotal < 0 || settotal > 9999) - throw new OperationError("Set Total must be between 0000 and 9999"); + if (settotal < 0 || settotal > 9999) throw new OperationError("Set Total must be between 0000 and 9999"); // null|fast|slow for each of S1-5,M1-2,X1-5 const control = { @@ -430,23 +447,32 @@ class Colossus extends Operation { }; // Start positions - if (args[52]<1 || args[52]>43) throw new OperationError("Ψ1 start must be between 1 and 43"); - if (args[53]<1 || args[53]>47) throw new OperationError("Ψ2 start must be between 1 and 47"); - if (args[54]<1 || args[54]>51) throw new OperationError("Ψ3 start must be between 1 and 51"); - if (args[55]<1 || args[55]>53) throw new OperationError("Ψ4 start must be between 1 and 53"); - if (args[56]<1 || args[57]>59) throw new OperationError("Ψ5 start must be between 1 and 59"); - if (args[51]<1 || args[51]>37) throw new OperationError("Μ37 start must be between 1 and 37"); - if (args[50]<1 || args[50]>61) throw new OperationError("Μ61 start must be between 1 and 61"); - if (args[45]<1 || args[45]>41) throw new OperationError("Χ1 start must be between 1 and 41"); - if (args[46]<1 || args[46]>31) throw new OperationError("Χ2 start must be between 1 and 31"); - if (args[47]<1 || args[47]>29) throw new OperationError("Χ3 start must be between 1 and 29"); - if (args[48]<1 || args[48]>26) throw new OperationError("Χ4 start must be between 1 and 26"); - if (args[49]<1 || args[49]>23) throw new OperationError("Χ5 start must be between 1 and 23"); + if (args[52] < 1 || args[52] > 43) throw new OperationError("Ψ1 start must be between 1 and 43"); + if (args[53] < 1 || args[53] > 47) throw new OperationError("Ψ2 start must be between 1 and 47"); + if (args[54] < 1 || args[54] > 51) throw new OperationError("Ψ3 start must be between 1 and 51"); + if (args[55] < 1 || args[55] > 53) throw new OperationError("Ψ4 start must be between 1 and 53"); + if (args[56] < 1 || args[57] > 59) throw new OperationError("Ψ5 start must be between 1 and 59"); + if (args[51] < 1 || args[51] > 37) throw new OperationError("Μ37 start must be between 1 and 37"); + if (args[50] < 1 || args[50] > 61) throw new OperationError("Μ61 start must be between 1 and 61"); + if (args[45] < 1 || args[45] > 41) throw new OperationError("Χ1 start must be between 1 and 41"); + if (args[46] < 1 || args[46] > 31) throw new OperationError("Χ2 start must be between 1 and 31"); + if (args[47] < 1 || args[47] > 29) throw new OperationError("Χ3 start must be between 1 and 29"); + if (args[48] < 1 || args[48] > 26) throw new OperationError("Χ4 start must be between 1 and 26"); + if (args[49] < 1 || args[49] > 23) throw new OperationError("Χ5 start must be between 1 and 23"); const starts = { - X1: args[45], X2: args[46], X3: args[47], X4: args[48], X5: args[49], - M61: args[50], M37: args[51], - S1: args[52], S2: args[53], S3: args[54], S4: args[55], S5: args[56] + X1: args[45], + X2: args[46], + X3: args[47], + X4: args[48], + X5: args[49], + M61: args[50], + M37: args[51], + S1: args[52], + S2: args[53], + S3: args[54], + S4: args[55], + S5: args[56] }; const colossus = new ColossusComputer(input, pattern, qbusin, qbusswitches, control, starts, settotal, limit); @@ -463,7 +489,6 @@ class Colossus extends Operation { * @returns {Object[]} */ selectProgram(progname, args) { - // Basic Letter Count if (progname === "Letter Count") { // Set Conditional R1 : count every character into counter 1 @@ -571,7 +596,8 @@ class Colossus extends Operation { let html = "Colossus Printer\n\n"; html += output.printout + "\n\n"; html += "Colossus Counters\n\n"; - html += "
Rotor stops Partial plugboard Decryption preview
${setting} ${stecker} ${decrypt}
\n"; + html + += "
C1 C2 C3 C4 C5
\n"; html += ""; for (const ct of output.counters) { html += `\n`; @@ -580,7 +606,6 @@ class Colossus extends Operation { html += "
C1 C2 C3 C4 C5
${ct}
"; return html; } - } export default Colossus; diff --git a/src/core/operations/Comment.mjs b/src/core/operations/Comment.mjs index af74cf48..1b01b05f 100644 --- a/src/core/operations/Comment.mjs +++ b/src/core/operations/Comment.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Comment operation */ class Comment extends Operation { - /** * Comment constructor */ @@ -20,7 +19,8 @@ class Comment extends Operation { this.name = "Comment"; this.flowControl = true; this.module = "Default"; - this.description = "Provides a place to write comments within the flow of the recipe. This operation has no computational effect."; + this.description + = "Provides a place to write comments within the flow of the recipe. This operation has no computational effect."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -42,7 +42,6 @@ class Comment extends Operation { run(state) { return state; } - } export default Comment; diff --git a/src/core/operations/CompareCTPHHashes.mjs b/src/core/operations/CompareCTPHHashes.mjs index 91956220..27e8d736 100644 --- a/src/core/operations/CompareCTPHHashes.mjs +++ b/src/core/operations/CompareCTPHHashes.mjs @@ -6,7 +6,7 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {HASH_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { HASH_DELIM_OPTIONS } from "../lib/Delim.mjs"; import ctphjs from "ctph.js"; import OperationError from "../errors/OperationError.mjs"; @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * Compare CTPH hashes operation */ class CompareCTPHHashes extends Operation { - /** * CompareCTPHHashes constructor */ @@ -23,7 +22,8 @@ class CompareCTPHHashes extends Operation { this.name = "Compare CTPH hashes"; this.module = "Crypto"; - this.description = "Compares two Context Triggered Piecewise Hashing (CTPH) fuzzy hashes to determine the similarity between them on a scale of 0 to 100."; + this.description + = "Compares two Context Triggered Piecewise Hashing (CTPH) fuzzy hashes to determine the similarity between them on a scale of 0 to 100."; this.infoURL = "https://forensics.wiki/context_triggered_piecewise_hashing/"; this.inputType = "string"; this.outputType = "Number"; @@ -46,7 +46,6 @@ class CompareCTPHHashes extends Operation { if (samples.length !== 2) throw new OperationError("Incorrect number of samples."); return ctphjs.similarity(samples[0], samples[1]); } - } export default CompareCTPHHashes; diff --git a/src/core/operations/CompareSSDEEPHashes.mjs b/src/core/operations/CompareSSDEEPHashes.mjs index 9937d7e6..5fa5392f 100644 --- a/src/core/operations/CompareSSDEEPHashes.mjs +++ b/src/core/operations/CompareSSDEEPHashes.mjs @@ -6,7 +6,7 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {HASH_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { HASH_DELIM_OPTIONS } from "../lib/Delim.mjs"; import ssdeepjs from "ssdeep.js"; import OperationError from "../errors/OperationError.mjs"; @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * Compare SSDEEP hashes operation */ class CompareSSDEEPHashes extends Operation { - /** * CompareSSDEEPHashes constructor */ @@ -23,7 +22,8 @@ class CompareSSDEEPHashes extends Operation { this.name = "Compare SSDEEP hashes"; this.module = "Crypto"; - this.description = "Compares two SSDEEP fuzzy hashes to determine the similarity between them on a scale of 0 to 100."; + this.description + = "Compares two SSDEEP fuzzy hashes to determine the similarity between them on a scale of 0 to 100."; this.infoURL = "https://forensics.wiki/ssdeep/"; this.inputType = "string"; this.outputType = "Number"; @@ -46,7 +46,6 @@ class CompareSSDEEPHashes extends Operation { if (samples.length !== 2) throw new OperationError("Incorrect number of samples."); return ssdeepjs.similarity(samples[0], samples[1]); } - } export default CompareSSDEEPHashes; diff --git a/src/core/operations/ConditionalJump.mjs b/src/core/operations/ConditionalJump.mjs index 74bf1d21..c9910747 100644 --- a/src/core/operations/ConditionalJump.mjs +++ b/src/core/operations/ConditionalJump.mjs @@ -12,7 +12,6 @@ import { getLabelIndex } from "../lib/FlowControl.mjs"; * Conditional Jump operation */ class ConditionalJump extends Operation { - /** * ConditionalJump constructor */ @@ -22,7 +21,8 @@ class ConditionalJump extends Operation { this.name = "Conditional Jump"; this.flowControl = true; this.module = "Default"; - this.description = "Conditionally jump forwards or backwards to the specified Label based on whether the data matches the specified regular expression."; + this.description + = "Conditionally jump forwards or backwards to the specified Label based on whether the data matches the specified regular expression."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -58,8 +58,8 @@ class ConditionalJump extends Operation { * @returns {Object} The updated state of the recipe. */ async run(state) { - const ings = state.opList[state.progress].ingValues, - dish = state.dish, + const ings = state.opList[state.progress].ingValues, + dish = state.dish, [regexStr, invert, label, maxJumps] = ings, jmpIndex = getLabelIndex(label, state); @@ -71,7 +71,7 @@ class ConditionalJump extends Operation { if (regexStr !== "") { const str = await dish.get(Dish.STRING); const strMatch = str.search(regexStr) > -1; - if (!invert && strMatch || invert && !strMatch) { + if ((!invert && strMatch) || (invert && !strMatch)) { state.progress = jmpIndex; state.numJumps++; } else { @@ -81,7 +81,6 @@ class ConditionalJump extends Operation { return state; } - } export default ConditionalJump; diff --git a/src/core/operations/ContainImage.mjs b/src/core/operations/ContainImage.mjs index 09717a28..ed2f49a9 100644 --- a/src/core/operations/ContainImage.mjs +++ b/src/core/operations/ContainImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Contain Image operation */ class ContainImage extends Operation { - /** * ContainImage constructor */ @@ -24,7 +23,8 @@ class ContainImage extends Operation { this.name = "Contain Image"; this.module = "Image"; - this.description = "Scales an image to the specified width and height, maintaining the aspect ratio. The image may be letterboxed."; + this.description + = "Scales an image to the specified width and height, maintaining the aspect ratio. The image may be letterboxed."; this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -45,33 +45,19 @@ class ContainImage extends Operation { { name: "Horizontal align", type: "option", - value: [ - "Left", - "Center", - "Right" - ], + value: ["Left", "Center", "Right"], defaultIndex: 1 }, { name: "Vertical align", type: "option", - value: [ - "Top", - "Middle", - "Bottom" - ], + value: ["Top", "Middle", "Bottom"], defaultIndex: 1 }, { name: "Resizing algorithm", type: "option", - value: [ - "Nearest Neighbour", - "Bilinear", - "Bicubic", - "Hermite", - "Bezier" - ], + value: ["Nearest Neighbour", "Bilinear", "Bicubic", "Hermite", "Bezier"], defaultIndex: 1 }, { @@ -118,12 +104,11 @@ class ContainImage extends Operation { throw new OperationError(`Error loading image. (${err})`); } try { - if (isWorkerEnvironment()) - self.sendStatusMessage("Containing image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Containing image..."); image.contain(width, height, alignMap[hAlign] | alignMap[vAlign], resizeMap[alg]); if (opaqueBg) { - const newImage = await jimp.read(width, height, 0x000000FF); + const newImage = await jimp.read(width, height, 0x000000ff); newImage.blit(image, 0, 0); image = newImage; } @@ -156,7 +141,6 @@ class ContainImage extends Operation { return ``; } - } export default ContainImage; diff --git a/src/core/operations/ConvertArea.mjs b/src/core/operations/ConvertArea.mjs index 4cce31b1..62ba4368 100644 --- a/src/core/operations/ConvertArea.mjs +++ b/src/core/operations/ConvertArea.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Convert area operation */ class ConvertArea extends Operation { - /** * ConvertArea constructor */ @@ -48,66 +47,104 @@ class ConvertArea extends Operation { input = input.times(AREA_FACTOR[inputUnits]); return input.div(AREA_FACTOR[outputUnits]); } - } - const AREA_UNITS = [ - "[Metric]", "Square metre (sq m)", "Square kilometre (sq km)", "Centiare (ca)", "Deciare (da)", "Are (a)", "Decare (daa)", "Hectare (ha)", "[/Metric]", - "[Imperial]", "Square inch (sq in)", "Square foot (sq ft)", "Square yard (sq yd)", "Square mile (sq mi)", "Perch (sq per)", "Rood (ro)", "International acre (ac)", "[/Imperial]", - "[US customary units]", "US survey acre (ac)", "US survey square mile (sq mi)", "US survey township", "[/US customary units]", - "[Nuclear physics]", "Yoctobarn (yb)", "Zeptobarn (zb)", "Attobarn (ab)", "Femtobarn (fb)", "Picobarn (pb)", "Nanobarn (nb)", "Microbarn (μb)", "Millibarn (mb)", "Barn (b)", "Kilobarn (kb)", "Megabarn (Mb)", "Outhouse", "Shed", "Planck area", "[/Nuclear physics]", - "[Comparisons]", "Washington D.C.", "Isle of Wight", "Wales", "Texas", "[/Comparisons]", + "[Metric]", + "Square metre (sq m)", + "Square kilometre (sq km)", + "Centiare (ca)", + "Deciare (da)", + "Are (a)", + "Decare (daa)", + "Hectare (ha)", + "[/Metric]", + "[Imperial]", + "Square inch (sq in)", + "Square foot (sq ft)", + "Square yard (sq yd)", + "Square mile (sq mi)", + "Perch (sq per)", + "Rood (ro)", + "International acre (ac)", + "[/Imperial]", + "[US customary units]", + "US survey acre (ac)", + "US survey square mile (sq mi)", + "US survey township", + "[/US customary units]", + "[Nuclear physics]", + "Yoctobarn (yb)", + "Zeptobarn (zb)", + "Attobarn (ab)", + "Femtobarn (fb)", + "Picobarn (pb)", + "Nanobarn (nb)", + "Microbarn (μb)", + "Millibarn (mb)", + "Barn (b)", + "Kilobarn (kb)", + "Megabarn (Mb)", + "Outhouse", + "Shed", + "Planck area", + "[/Nuclear physics]", + "[Comparisons]", + "Washington D.C.", + "Isle of Wight", + "Wales", + "Texas", + "[/Comparisons]" ]; -const AREA_FACTOR = { // Multiples of a square metre +const AREA_FACTOR = { + // Multiples of a square metre // Metric - "Square metre (sq m)": 1, + "Square metre (sq m)": 1, "Square kilometre (sq km)": 1e6, - "Centiare (ca)": 1, - "Deciare (da)": 10, - "Are (a)": 100, - "Decare (daa)": 1e3, - "Hectare (ha)": 1e4, + "Centiare (ca)": 1, + "Deciare (da)": 10, + "Are (a)": 100, + "Decare (daa)": 1e3, + "Hectare (ha)": 1e4, // Imperial - "Square inch (sq in)": 0.00064516, - "Square foot (sq ft)": 0.09290304, - "Square yard (sq yd)": 0.83612736, - "Square mile (sq mi)": 2589988.110336, - "Perch (sq per)": 42.21, - "Rood (ro)": 1011, - "International acre (ac)": 4046.8564224, + "Square inch (sq in)": 0.00064516, + "Square foot (sq ft)": 0.09290304, + "Square yard (sq yd)": 0.83612736, + "Square mile (sq mi)": 2589988.110336, + "Perch (sq per)": 42.21, + "Rood (ro)": 1011, + "International acre (ac)": 4046.8564224, // US customary units - "US survey acre (ac)": 4046.87261, + "US survey acre (ac)": 4046.87261, "US survey square mile (sq mi)": 2589998.470305239, - "US survey township": 93239944.9309886, + "US survey township": 93239944.9309886, // Nuclear physics - "Yoctobarn (yb)": 1e-52, - "Zeptobarn (zb)": 1e-49, - "Attobarn (ab)": 1e-46, - "Femtobarn (fb)": 1e-43, - "Picobarn (pb)": 1e-40, - "Nanobarn (nb)": 1e-37, - "Microbarn (μb)": 1e-34, - "Millibarn (mb)": 1e-31, - "Barn (b)": 1e-28, - "Kilobarn (kb)": 1e-25, - "Megabarn (Mb)": 1e-22, + "Yoctobarn (yb)": 1e-52, + "Zeptobarn (zb)": 1e-49, + "Attobarn (ab)": 1e-46, + "Femtobarn (fb)": 1e-43, + "Picobarn (pb)": 1e-40, + "Nanobarn (nb)": 1e-37, + "Microbarn (μb)": 1e-34, + "Millibarn (mb)": 1e-31, + "Barn (b)": 1e-28, + "Kilobarn (kb)": 1e-25, + "Megabarn (Mb)": 1e-22, - "Planck area": 2.6e-70, - "Shed": 1e-52, - "Outhouse": 1e-34, + "Planck area": 2.6e-70, + "Shed": 1e-52, + "Outhouse": 1e-34, // Comparisons - "Washington D.C.": 176119191.502848, - "Isle of Wight": 380000000, - "Wales": 20779000000, - "Texas": 696241000000, + "Washington D.C.": 176119191.502848, + "Isle of Wight": 380000000, + "Wales": 20779000000, + "Texas": 696241000000 }; - export default ConvertArea; diff --git a/src/core/operations/ConvertCoordinateFormat.mjs b/src/core/operations/ConvertCoordinateFormat.mjs index f1e1b20f..15371934 100644 --- a/src/core/operations/ConvertCoordinateFormat.mjs +++ b/src/core/operations/ConvertCoordinateFormat.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {FORMATS, convertCoordinates} from "../lib/ConvertCoordinates.mjs"; +import { FORMATS, convertCoordinates } from "../lib/ConvertCoordinates.mjs"; /** * Convert co-ordinate format operation */ class ConvertCoordinateFormat extends Operation { - /** * ConvertCoordinateFormat constructor */ @@ -20,7 +19,8 @@ class ConvertCoordinateFormat extends Operation { this.name = "Convert co-ordinate format"; this.module = "Hashing"; - this.description = "Converts geographical coordinates between different formats.

Supported formats:
  • Degrees Minutes Seconds (DMS)
  • Degrees Decimal Minutes (DDM)
  • Decimal Degrees (DD)
  • Geohash
  • Military Grid Reference System (MGRS)
  • Ordnance Survey National Grid (OSNG)
  • Universal Transverse Mercator (UTM)

The operation can try to detect the input co-ordinate format and delimiter automatically, but this may not always work correctly."; + this.description + = "Converts geographical coordinates between different formats.

Supported formats:
  • Degrees Minutes Seconds (DMS)
  • Degrees Decimal Minutes (DDM)
  • Decimal Degrees (DD)
  • Geohash
  • Military Grid Reference System (MGRS)
  • Ordnance Survey National Grid (OSNG)
  • Universal Transverse Mercator (UTM)

The operation can try to detect the input co-ordinate format and delimiter automatically, but this may not always work correctly."; this.infoURL = "https://wikipedia.org/wiki/Geographic_coordinate_conversion"; this.inputType = "string"; this.outputType = "string"; @@ -33,15 +33,7 @@ class ConvertCoordinateFormat extends Operation { { "name": "Input Delimiter", "type": "option", - "value": [ - "Auto", - "Direction Preceding", - "Direction Following", - "\\n", - "Comma", - "Semi-colon", - "Colon" - ] + "value": ["Auto", "Direction Preceding", "Direction Following", "\\n", "Comma", "Semi-colon", "Colon"] }, { "name": "Output Format", @@ -51,22 +43,12 @@ class ConvertCoordinateFormat extends Operation { { "name": "Output Delimiter", "type": "option", - "value": [ - "Space", - "\\n", - "Comma", - "Semi-colon", - "Colon" - ] + "value": ["Space", "\\n", "Comma", "Semi-colon", "Colon"] }, { "name": "Include Compass Directions", "type": "option", - "value": [ - "None", - "Before", - "After" - ] + "value": ["None", "Before", "After"] }, { "name": "Precision", diff --git a/src/core/operations/ConvertDataUnits.mjs b/src/core/operations/ConvertDataUnits.mjs index 0335e852..f1adbae4 100644 --- a/src/core/operations/ConvertDataUnits.mjs +++ b/src/core/operations/ConvertDataUnits.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Convert data units operation */ class ConvertDataUnits extends Operation { - /** * ConvertDataUnits constructor */ @@ -48,44 +47,85 @@ class ConvertDataUnits extends Operation { input = input.times(DATA_FACTOR[inputUnits]); return input.div(DATA_FACTOR[outputUnits]); } - } const DATA_UNITS = [ - "Bits (b)", "Nibbles", "Octets", "Bytes (B)", - "[Binary bits (2^n)]", "Kibibits (Kib)", "Mebibits (Mib)", "Gibibits (Gib)", "Tebibits (Tib)", "Pebibits (Pib)", "Exbibits (Eib)", "Zebibits (Zib)", "Yobibits (Yib)", "[/Binary bits (2^n)]", - "[Decimal bits (10^n)]", "Decabits", "Hectobits", "Kilobits (Kb)", "Megabits (Mb)", "Gigabits (Gb)", "Terabits (Tb)", "Petabits (Pb)", "Exabits (Eb)", "Zettabits (Zb)", "Yottabits (Yb)", "[/Decimal bits (10^n)]", - "[Binary bytes (8 x 2^n)]", "Kibibytes (KiB)", "Mebibytes (MiB)", "Gibibytes (GiB)", "Tebibytes (TiB)", "Pebibytes (PiB)", "Exbibytes (EiB)", "Zebibytes (ZiB)", "Yobibytes (YiB)", "[/Binary bytes (8 x 2^n)]", - "[Decimal bytes (8 x 10^n)]", "Kilobytes (KB)", "Megabytes (MB)", "Gigabytes (GB)", "Terabytes (TB)", "Petabytes (PB)", "Exabytes (EB)", "Zettabytes (ZB)", "Yottabytes (YB)", "[/Decimal bytes (8 x 10^n)]" + "Bits (b)", + "Nibbles", + "Octets", + "Bytes (B)", + "[Binary bits (2^n)]", + "Kibibits (Kib)", + "Mebibits (Mib)", + "Gibibits (Gib)", + "Tebibits (Tib)", + "Pebibits (Pib)", + "Exbibits (Eib)", + "Zebibits (Zib)", + "Yobibits (Yib)", + "[/Binary bits (2^n)]", + "[Decimal bits (10^n)]", + "Decabits", + "Hectobits", + "Kilobits (Kb)", + "Megabits (Mb)", + "Gigabits (Gb)", + "Terabits (Tb)", + "Petabits (Pb)", + "Exabits (Eb)", + "Zettabits (Zb)", + "Yottabits (Yb)", + "[/Decimal bits (10^n)]", + "[Binary bytes (8 x 2^n)]", + "Kibibytes (KiB)", + "Mebibytes (MiB)", + "Gibibytes (GiB)", + "Tebibytes (TiB)", + "Pebibytes (PiB)", + "Exbibytes (EiB)", + "Zebibytes (ZiB)", + "Yobibytes (YiB)", + "[/Binary bytes (8 x 2^n)]", + "[Decimal bytes (8 x 10^n)]", + "Kilobytes (KB)", + "Megabytes (MB)", + "Gigabytes (GB)", + "Terabytes (TB)", + "Petabytes (PB)", + "Exabytes (EB)", + "Zettabytes (ZB)", + "Yottabytes (YB)", + "[/Decimal bytes (8 x 10^n)]" ]; -const DATA_FACTOR = { // Multiples of a bit - "Bits (b)": 1, - "Nibbles": 4, - "Octets": 8, - "Bytes (B)": 8, +const DATA_FACTOR = { + // Multiples of a bit + "Bits (b)": 1, + "Nibbles": 4, + "Octets": 8, + "Bytes (B)": 8, // Binary bits (2^n) - "Kibibits (Kib)": 1024, - "Mebibits (Mib)": 1048576, - "Gibibits (Gib)": 1073741824, - "Tebibits (Tib)": 1099511627776, - "Pebibits (Pib)": 1125899906842624, - "Exbibits (Eib)": 1152921504606846976, - "Zebibits (Zib)": 1180591620717411303424, - "Yobibits (Yib)": 1208925819614629174706176, + "Kibibits (Kib)": 1024, + "Mebibits (Mib)": 1048576, + "Gibibits (Gib)": 1073741824, + "Tebibits (Tib)": 1099511627776, + "Pebibits (Pib)": 1125899906842624, + "Exbibits (Eib)": 1152921504606846976, + "Zebibits (Zib)": 1180591620717411303424, + "Yobibits (Yib)": 1208925819614629174706176, // Decimal bits (10^n) - "Decabits": 10, - "Hectobits": 100, - "Kilobits (Kb)": 1e3, - "Megabits (Mb)": 1e6, - "Gigabits (Gb)": 1e9, - "Terabits (Tb)": 1e12, - "Petabits (Pb)": 1e15, - "Exabits (Eb)": 1e18, - "Zettabits (Zb)": 1e21, - "Yottabits (Yb)": 1e24, + "Decabits": 10, + "Hectobits": 100, + "Kilobits (Kb)": 1e3, + "Megabits (Mb)": 1e6, + "Gigabits (Gb)": 1e9, + "Terabits (Tb)": 1e12, + "Petabits (Pb)": 1e15, + "Exabits (Eb)": 1e18, + "Zettabits (Zb)": 1e21, + "Yottabits (Yb)": 1e24, // Binary bytes (8 x 2^n) "Kibibytes (KiB)": 8192, @@ -98,15 +138,14 @@ const DATA_FACTOR = { // Multiples of a bit "Yobibytes (YiB)": 9671406556917033397649408, // Decimal bytes (8 x 10^n) - "Kilobytes (KB)": 8e3, - "Megabytes (MB)": 8e6, - "Gigabytes (GB)": 8e9, - "Terabytes (TB)": 8e12, - "Petabytes (PB)": 8e15, - "Exabytes (EB)": 8e18, + "Kilobytes (KB)": 8e3, + "Megabytes (MB)": 8e6, + "Gigabytes (GB)": 8e9, + "Terabytes (TB)": 8e12, + "Petabytes (PB)": 8e15, + "Exabytes (EB)": 8e18, "Zettabytes (ZB)": 8e21, - "Yottabytes (YB)": 8e24, + "Yottabytes (YB)": 8e24 }; - export default ConvertDataUnits; diff --git a/src/core/operations/ConvertDistance.mjs b/src/core/operations/ConvertDistance.mjs index 1a5fc8af..132cb889 100644 --- a/src/core/operations/ConvertDistance.mjs +++ b/src/core/operations/ConvertDistance.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Convert distance operation */ class ConvertDistance extends Operation { - /** * ConvertDistance constructor */ @@ -48,49 +47,79 @@ class ConvertDistance extends Operation { input = input.times(DISTANCE_FACTOR[inputUnits]); return input.div(DISTANCE_FACTOR[outputUnits]); } - } const DISTANCE_UNITS = [ - "[Metric]", "Nanometres (nm)", "Micrometres (µm)", "Millimetres (mm)", "Centimetres (cm)", "Metres (m)", "Kilometers (km)", "[/Metric]", - "[Imperial]", "Thou (th)", "Inches (in)", "Feet (ft)", "Yards (yd)", "Chains (ch)", "Furlongs (fur)", "Miles (mi)", "Leagues (lea)", "[/Imperial]", - "[Maritime]", "Fathoms (ftm)", "Cables", "Nautical miles", "[/Maritime]", - "[Comparisons]", "Cars (4m)", "Buses (8.4m)", "American football fields (91m)", "Football pitches (105m)", "[/Comparisons]", - "[Astronomical]", "Earth-to-Moons", "Earth's equators", "Astronomical units (au)", "Light-years (ly)", "Parsecs (pc)", "[/Astronomical]", + "[Metric]", + "Nanometres (nm)", + "Micrometres (µm)", + "Millimetres (mm)", + "Centimetres (cm)", + "Metres (m)", + "Kilometers (km)", + "[/Metric]", + "[Imperial]", + "Thou (th)", + "Inches (in)", + "Feet (ft)", + "Yards (yd)", + "Chains (ch)", + "Furlongs (fur)", + "Miles (mi)", + "Leagues (lea)", + "[/Imperial]", + "[Maritime]", + "Fathoms (ftm)", + "Cables", + "Nautical miles", + "[/Maritime]", + "[Comparisons]", + "Cars (4m)", + "Buses (8.4m)", + "American football fields (91m)", + "Football pitches (105m)", + "[/Comparisons]", + "[Astronomical]", + "Earth-to-Moons", + "Earth's equators", + "Astronomical units (au)", + "Light-years (ly)", + "Parsecs (pc)", + "[/Astronomical]" ]; -const DISTANCE_FACTOR = { // Multiples of a metre - "Nanometres (nm)": 1e-9, - "Micrometres (µm)": 1e-6, - "Millimetres (mm)": 1e-3, - "Centimetres (cm)": 1e-2, - "Metres (m)": 1, - "Kilometers (km)": 1e3, +const DISTANCE_FACTOR = { + // Multiples of a metre + "Nanometres (nm)": 1e-9, + "Micrometres (µm)": 1e-6, + "Millimetres (mm)": 1e-3, + "Centimetres (cm)": 1e-2, + "Metres (m)": 1, + "Kilometers (km)": 1e3, - "Thou (th)": 0.0000254, - "Inches (in)": 0.0254, - "Feet (ft)": 0.3048, - "Yards (yd)": 0.9144, - "Chains (ch)": 20.1168, - "Furlongs (fur)": 201.168, - "Miles (mi)": 1609.344, - "Leagues (lea)": 4828.032, + "Thou (th)": 0.0000254, + "Inches (in)": 0.0254, + "Feet (ft)": 0.3048, + "Yards (yd)": 0.9144, + "Chains (ch)": 20.1168, + "Furlongs (fur)": 201.168, + "Miles (mi)": 1609.344, + "Leagues (lea)": 4828.032, - "Fathoms (ftm)": 1.853184, - "Cables": 185.3184, - "Nautical miles": 1853.184, + "Fathoms (ftm)": 1.853184, + "Cables": 185.3184, + "Nautical miles": 1853.184, - "Cars (4m)": 4, - "Buses (8.4m)": 8.4, + "Cars (4m)": 4, + "Buses (8.4m)": 8.4, "American football fields (91m)": 91, "Football pitches (105m)": 105, - "Earth-to-Moons": 380000000, - "Earth's equators": 40075016.686, + "Earth-to-Moons": 380000000, + "Earth's equators": 40075016.686, "Astronomical units (au)": 149597870700, - "Light-years (ly)": 9460730472580800, - "Parsecs (pc)": 3.0856776e16 + "Light-years (ly)": 9460730472580800, + "Parsecs (pc)": 3.0856776e16 }; - export default ConvertDistance; diff --git a/src/core/operations/ConvertImageFormat.mjs b/src/core/operations/ConvertImageFormat.mjs index 9f8cdd91..634897b8 100644 --- a/src/core/operations/ConvertImageFormat.mjs +++ b/src/core/operations/ConvertImageFormat.mjs @@ -14,7 +14,6 @@ import jimp from "jimp"; * Convert Image Format operation */ class ConvertImageFormat extends Operation { - /** * ConvertImageFormat constructor */ @@ -23,7 +22,8 @@ class ConvertImageFormat extends Operation { this.name = "Convert Image Format"; this.module = "Image"; - this.description = "Converts an image between different formats. Supported formats:
  • Joint Photographic Experts Group (JPEG)
  • Portable Network Graphics (PNG)
  • Bitmap (BMP)
  • Tagged Image File Format (TIFF)

Note: GIF files are supported for input, but cannot be outputted."; + this.description + = "Converts an image between different formats. Supported formats:
  • Joint Photographic Experts Group (JPEG)
  • Portable Network Graphics (PNG)
  • Bitmap (BMP)
  • Tagged Image File Format (TIFF)

Note: GIF files are supported for input, but cannot be outputted."; this.infoURL = "https://wikipedia.org/wiki/Image_file_formats"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -32,12 +32,7 @@ class ConvertImageFormat extends Operation { { name: "Output Format", type: "option", - value: [ - "JPEG", - "PNG", - "BMP", - "TIFF" - ] + value: ["JPEG", "PNG", "BMP", "TIFF"] }, { name: "JPEG Quality", @@ -49,14 +44,7 @@ class ConvertImageFormat extends Operation { { name: "PNG Filter Type", type: "option", - value: [ - "Auto", - "None", - "Sub", - "Up", - "Average", - "Paeth" - ] + value: ["Auto", "None", "Sub", "Up", "Average", "Paeth"] }, { name: "PNG Deflate Level", @@ -137,7 +125,6 @@ class ConvertImageFormat extends Operation { return ``; } - } export default ConvertImageFormat; diff --git a/src/core/operations/ConvertMass.mjs b/src/core/operations/ConvertMass.mjs index 712884ed..a08bef4f 100644 --- a/src/core/operations/ConvertMass.mjs +++ b/src/core/operations/ConvertMass.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Convert mass operation */ class ConvertMass extends Operation { - /** * ConvertMass constructor */ @@ -48,77 +47,148 @@ class ConvertMass extends Operation { input = input.times(MASS_FACTOR[inputUnits]); return input.div(MASS_FACTOR[outputUnits]); } - } - const MASS_UNITS = [ - "[Metric]", "Yoctogram (yg)", "Zeptogram (zg)", "Attogram (ag)", "Femtogram (fg)", "Picogram (pg)", "Nanogram (ng)", "Microgram (μg)", "Milligram (mg)", "Centigram (cg)", "Decigram (dg)", "Gram (g)", "Decagram (dag)", "Hectogram (hg)", "Kilogram (kg)", "Megagram (Mg)", "Tonne (t)", "Gigagram (Gg)", "Teragram (Tg)", "Petagram (Pg)", "Exagram (Eg)", "Zettagram (Zg)", "Yottagram (Yg)", "[/Metric]", - "[Imperial Avoirdupois]", "Grain (gr)", "Dram (dr)", "Ounce (oz)", "Pound (lb)", "Nail", "Stone (st)", "Quarter (gr)", "Tod", "US hundredweight (cwt)", "Imperial hundredweight (cwt)", "US ton (t)", "Imperial ton (t)", "[/Imperial Avoirdupois]", - "[Imperial Troy]", "Grain (gr)", "Pennyweight (dwt)", "Troy dram (dr t)", "Troy ounce (oz t)", "Troy pound (lb t)", "Mark", "[/Imperial Troy]", - "[Archaic]", "Wey", "Wool wey", "Suffolk wey", "Wool sack", "Coal sack", "Load", "Last", "Flax or feather last", "Gunpowder last", "Picul", "Rice last", "[/Archaic]", - "[Comparisons]", "Big Ben (14 tonnes)", "Blue whale (180 tonnes)", "International Space Station (417 tonnes)", "Space Shuttle (2,041 tonnes)", "RMS Titanic (52,000 tonnes)", "Great Pyramid of Giza (6,000,000 tonnes)", "Earth's oceans (1.4 yottagrams)", "[/Comparisons]", - "[Astronomical]", "A teaspoon of neutron star (5,500 million tonnes)", "Lunar mass (ML)", "Earth mass (M⊕)", "Jupiter mass (MJ)", "Solar mass (M☉)", "Sagittarius A* (7.5 x 10^36 kgs-ish)", "Milky Way galaxy (1.2 x 10^42 kgs)", "The observable universe (1.45 x 10^53 kgs)", "[/Astronomical]", + "[Metric]", + "Yoctogram (yg)", + "Zeptogram (zg)", + "Attogram (ag)", + "Femtogram (fg)", + "Picogram (pg)", + "Nanogram (ng)", + "Microgram (μg)", + "Milligram (mg)", + "Centigram (cg)", + "Decigram (dg)", + "Gram (g)", + "Decagram (dag)", + "Hectogram (hg)", + "Kilogram (kg)", + "Megagram (Mg)", + "Tonne (t)", + "Gigagram (Gg)", + "Teragram (Tg)", + "Petagram (Pg)", + "Exagram (Eg)", + "Zettagram (Zg)", + "Yottagram (Yg)", + "[/Metric]", + "[Imperial Avoirdupois]", + "Grain (gr)", + "Dram (dr)", + "Ounce (oz)", + "Pound (lb)", + "Nail", + "Stone (st)", + "Quarter (gr)", + "Tod", + "US hundredweight (cwt)", + "Imperial hundredweight (cwt)", + "US ton (t)", + "Imperial ton (t)", + "[/Imperial Avoirdupois]", + "[Imperial Troy]", + "Grain (gr)", + "Pennyweight (dwt)", + "Troy dram (dr t)", + "Troy ounce (oz t)", + "Troy pound (lb t)", + "Mark", + "[/Imperial Troy]", + "[Archaic]", + "Wey", + "Wool wey", + "Suffolk wey", + "Wool sack", + "Coal sack", + "Load", + "Last", + "Flax or feather last", + "Gunpowder last", + "Picul", + "Rice last", + "[/Archaic]", + "[Comparisons]", + "Big Ben (14 tonnes)", + "Blue whale (180 tonnes)", + "International Space Station (417 tonnes)", + "Space Shuttle (2,041 tonnes)", + "RMS Titanic (52,000 tonnes)", + "Great Pyramid of Giza (6,000,000 tonnes)", + "Earth's oceans (1.4 yottagrams)", + "[/Comparisons]", + "[Astronomical]", + "A teaspoon of neutron star (5,500 million tonnes)", + "Lunar mass (ML)", + "Earth mass (M⊕)", + "Jupiter mass (MJ)", + "Solar mass (M☉)", + "Sagittarius A* (7.5 x 10^36 kgs-ish)", + "Milky Way galaxy (1.2 x 10^42 kgs)", + "The observable universe (1.45 x 10^53 kgs)", + "[/Astronomical]" ]; -const MASS_FACTOR = { // Multiples of a gram +const MASS_FACTOR = { + // Multiples of a gram // Metric - "Yoctogram (yg)": 1e-24, - "Zeptogram (zg)": 1e-21, - "Attogram (ag)": 1e-18, - "Femtogram (fg)": 1e-15, - "Picogram (pg)": 1e-12, - "Nanogram (ng)": 1e-9, - "Microgram (μg)": 1e-6, - "Milligram (mg)": 1e-3, - "Centigram (cg)": 1e-2, - "Decigram (dg)": 1e-1, - "Gram (g)": 1, - "Decagram (dag)": 10, - "Hectogram (hg)": 100, - "Kilogram (kg)": 1000, - "Megagram (Mg)": 1e6, - "Tonne (t)": 1e6, - "Gigagram (Gg)": 1e9, - "Teragram (Tg)": 1e12, - "Petagram (Pg)": 1e15, - "Exagram (Eg)": 1e18, - "Zettagram (Zg)": 1e21, - "Yottagram (Yg)": 1e24, + "Yoctogram (yg)": 1e-24, + "Zeptogram (zg)": 1e-21, + "Attogram (ag)": 1e-18, + "Femtogram (fg)": 1e-15, + "Picogram (pg)": 1e-12, + "Nanogram (ng)": 1e-9, + "Microgram (μg)": 1e-6, + "Milligram (mg)": 1e-3, + "Centigram (cg)": 1e-2, + "Decigram (dg)": 1e-1, + "Gram (g)": 1, + "Decagram (dag)": 10, + "Hectogram (hg)": 100, + "Kilogram (kg)": 1000, + "Megagram (Mg)": 1e6, + "Tonne (t)": 1e6, + "Gigagram (Gg)": 1e9, + "Teragram (Tg)": 1e12, + "Petagram (Pg)": 1e15, + "Exagram (Eg)": 1e18, + "Zettagram (Zg)": 1e21, + "Yottagram (Yg)": 1e24, // Imperial Avoirdupois - "Grain (gr)": 64.79891e-3, - "Dram (dr)": 1.7718451953125, - "Ounce (oz)": 28.349523125, - "Pound (lb)": 453.59237, - "Nail": 3175.14659, - "Stone (st)": 6.35029318e3, - "Quarter (gr)": 12700.58636, - "Tod": 12700.58636, + "Grain (gr)": 64.79891e-3, + "Dram (dr)": 1.7718451953125, + "Ounce (oz)": 28.349523125, + "Pound (lb)": 453.59237, + "Nail": 3175.14659, + "Stone (st)": 6.35029318e3, + "Quarter (gr)": 12700.58636, + "Tod": 12700.58636, "US hundredweight (cwt)": 45.359237e3, "Imperial hundredweight (cwt)": 50.80234544e3, - "US ton (t)": 907.18474e3, - "Imperial ton (t)": 1016.0469088e3, + "US ton (t)": 907.18474e3, + "Imperial ton (t)": 1016.0469088e3, // Imperial Troy - "Pennyweight (dwt)": 1.55517384, - "Troy dram (dr t)": 3.8879346, - "Troy ounce (oz t)": 31.1034768, - "Troy pound (lb t)": 373.2417216, - "Mark": 248.8278144, + "Pennyweight (dwt)": 1.55517384, + "Troy dram (dr t)": 3.8879346, + "Troy ounce (oz t)": 31.1034768, + "Troy pound (lb t)": 373.2417216, + "Mark": 248.8278144, // Archaic - "Wey": 76.5e3, - "Wool wey": 101.7e3, - "Suffolk wey": 161.5e3, - "Wool sack": 153000, - "Coal sack": 50.80234544e3, - "Load": 918000, - "Last": 1836000, + "Wey": 76.5e3, + "Wool wey": 101.7e3, + "Suffolk wey": 161.5e3, + "Wool sack": 153000, + "Coal sack": 50.80234544e3, + "Load": 918000, + "Last": 1836000, "Flax or feather last": 770e3, - "Gunpowder last": 1090e3, - "Picul": 60.478982e3, - "Rice last": 1200e3, + "Gunpowder last": 1090e3, + "Picul": 60.478982e3, + "Rice last": 1200e3, // Comparisons "Big Ben (14 tonnes)": 14e6, @@ -131,14 +201,13 @@ const MASS_FACTOR = { // Multiples of a gram // Astronomical "A teaspoon of neutron star (5,500 million tonnes)": 5.5e15, - "Lunar mass (ML)": 7.342e25, - "Earth mass (M⊕)": 5.97219e27, - "Jupiter mass (MJ)": 1.8981411476999997e30, - "Solar mass (M☉)": 1.98855e33, + "Lunar mass (ML)": 7.342e25, + "Earth mass (M⊕)": 5.97219e27, + "Jupiter mass (MJ)": 1.8981411476999997e30, + "Solar mass (M☉)": 1.98855e33, "Sagittarius A* (7.5 x 10^36 kgs-ish)": 7.5e39, "Milky Way galaxy (1.2 x 10^42 kgs)": 1.2e45, - "The observable universe (1.45 x 10^53 kgs)": 1.45e56, + "The observable universe (1.45 x 10^53 kgs)": 1.45e56 }; - export default ConvertMass; diff --git a/src/core/operations/ConvertSpeed.mjs b/src/core/operations/ConvertSpeed.mjs index 7fc6718d..76b55833 100644 --- a/src/core/operations/ConvertSpeed.mjs +++ b/src/core/operations/ConvertSpeed.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Convert speed operation */ class ConvertSpeed extends Operation { - /** * ConvertSpeed constructor */ @@ -48,50 +47,78 @@ class ConvertSpeed extends Operation { input = input.times(SPEED_FACTOR[inputUnits]); return input.div(SPEED_FACTOR[outputUnits]); } - } const SPEED_UNITS = [ - "[Metric]", "Metres per second (m/s)", "Kilometres per hour (km/h)", "[/Metric]", - "[Imperial]", "Miles per hour (mph)", "Knots (kn)", "[/Imperial]", - "[Comparisons]", "Human hair growth rate", "Bamboo growth rate", "World's fastest snail", "Usain Bolt's top speed", "Jet airliner cruising speed", "Concorde", "SR-71 Blackbird", "Space Shuttle", "International Space Station", "[/Comparisons]", - "[Scientific]", "Sound in standard atmosphere", "Sound in water", "Lunar escape velocity", "Earth escape velocity", "Earth's solar orbit", "Solar system's Milky Way orbit", "Milky Way relative to the cosmic microwave background", "Solar escape velocity", "Neutron star escape velocity (0.3c)", "Light in a diamond (0.4136c)", "Signal in an optical fibre (0.667c)", "Light (c)", "[/Scientific]", + "[Metric]", + "Metres per second (m/s)", + "Kilometres per hour (km/h)", + "[/Metric]", + "[Imperial]", + "Miles per hour (mph)", + "Knots (kn)", + "[/Imperial]", + "[Comparisons]", + "Human hair growth rate", + "Bamboo growth rate", + "World's fastest snail", + "Usain Bolt's top speed", + "Jet airliner cruising speed", + "Concorde", + "SR-71 Blackbird", + "Space Shuttle", + "International Space Station", + "[/Comparisons]", + "[Scientific]", + "Sound in standard atmosphere", + "Sound in water", + "Lunar escape velocity", + "Earth escape velocity", + "Earth's solar orbit", + "Solar system's Milky Way orbit", + "Milky Way relative to the cosmic microwave background", + "Solar escape velocity", + "Neutron star escape velocity (0.3c)", + "Light in a diamond (0.4136c)", + "Signal in an optical fibre (0.667c)", + "Light (c)", + "[/Scientific]" ]; -const SPEED_FACTOR = { // Multiples of m/s +const SPEED_FACTOR = { + // Multiples of m/s // Metric - "Metres per second (m/s)": 1, - "Kilometres per hour (km/h)": 0.2778, + "Metres per second (m/s)": 1, + "Kilometres per hour (km/h)": 0.2778, // Imperial - "Miles per hour (mph)": 0.44704, - "Knots (kn)": 0.5144, + "Miles per hour (mph)": 0.44704, + "Knots (kn)": 0.5144, // Comparisons - "Human hair growth rate": 4.8e-9, - "Bamboo growth rate": 1.4e-5, - "World's fastest snail": 0.00275, - "Usain Bolt's top speed": 12.42, - "Jet airliner cruising speed": 250, - "Concorde": 603, - "SR-71 Blackbird": 981, - "Space Shuttle": 1400, - "International Space Station": 7700, + "Human hair growth rate": 4.8e-9, + "Bamboo growth rate": 1.4e-5, + "World's fastest snail": 0.00275, + "Usain Bolt's top speed": 12.42, + "Jet airliner cruising speed": 250, + "Concorde": 603, + "SR-71 Blackbird": 981, + "Space Shuttle": 1400, + "International Space Station": 7700, // Scientific - "Sound in standard atmosphere": 340.3, - "Sound in water": 1500, - "Lunar escape velocity": 2375, - "Earth escape velocity": 11200, - "Earth's solar orbit": 29800, - "Solar system's Milky Way orbit": 200000, + "Sound in standard atmosphere": 340.3, + "Sound in water": 1500, + "Lunar escape velocity": 2375, + "Earth escape velocity": 11200, + "Earth's solar orbit": 29800, + "Solar system's Milky Way orbit": 200000, "Milky Way relative to the cosmic microwave background": 552000, - "Solar escape velocity": 617700, + "Solar escape velocity": 617700, "Neutron star escape velocity (0.3c)": 100000000, - "Light in a diamond (0.4136c)": 124000000, + "Light in a diamond (0.4136c)": 124000000, "Signal in an optical fibre (0.667c)": 200000000, - "Light (c)": 299792458, + "Light (c)": 299792458 }; - export default ConvertSpeed; diff --git a/src/core/operations/ConvertToNATOAlphabet.mjs b/src/core/operations/ConvertToNATOAlphabet.mjs index ee3b50c9..bde6d482 100644 --- a/src/core/operations/ConvertToNATOAlphabet.mjs +++ b/src/core/operations/ConvertToNATOAlphabet.mjs @@ -31,7 +31,7 @@ class ConvertToNATOAlphabet extends Operation { * @returns {string} */ run(input, args) { - return input.replace(/[a-z0-9,/.]/ig, letter => { + return input.replace(/[a-z0-9,/.]/gi, (letter) => { return lookup[letter.toUpperCase()]; }); } @@ -76,7 +76,7 @@ const lookup = { "9": "Nine ", ",": "Comma ", "/": "Fraction bar ", - ".": "Full stop ", + ".": "Full stop " }; export default ConvertToNATOAlphabet; diff --git a/src/core/operations/CountOccurrences.mjs b/src/core/operations/CountOccurrences.mjs index 36ee33a8..87b1c9a3 100644 --- a/src/core/operations/CountOccurrences.mjs +++ b/src/core/operations/CountOccurrences.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Count occurrences operation */ class CountOccurrences extends Operation { - /** * CountOccurrences constructor */ @@ -59,7 +58,6 @@ class CountOccurrences extends Operation { return 0; } } - } export default CountOccurrences; diff --git a/src/core/operations/CoverImage.mjs b/src/core/operations/CoverImage.mjs index 07838ecf..9ac8764b 100644 --- a/src/core/operations/CoverImage.mjs +++ b/src/core/operations/CoverImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Cover Image operation */ class CoverImage extends Operation { - /** * CoverImage constructor */ @@ -24,7 +23,8 @@ class CoverImage extends Operation { this.name = "Cover Image"; this.module = "Image"; - this.description = "Scales the image to the given width and height, keeping the aspect ratio. The image may be clipped."; + this.description + = "Scales the image to the given width and height, keeping the aspect ratio. The image may be clipped."; this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -45,33 +45,19 @@ class CoverImage extends Operation { { name: "Horizontal align", type: "option", - value: [ - "Left", - "Center", - "Right" - ], + value: ["Left", "Center", "Right"], defaultIndex: 1 }, { name: "Vertical align", type: "option", - value: [ - "Top", - "Middle", - "Bottom" - ], + value: ["Top", "Middle", "Bottom"], defaultIndex: 1 }, { name: "Resizing algorithm", type: "option", - value: [ - "Nearest Neighbour", - "Bilinear", - "Bicubic", - "Hermite", - "Bezier" - ], + value: ["Nearest Neighbour", "Bilinear", "Bicubic", "Hermite", "Bezier"], defaultIndex: 1 } ]; @@ -113,8 +99,7 @@ class CoverImage extends Operation { throw new OperationError(`Error loading image. (${err})`); } try { - if (isWorkerEnvironment()) - self.sendStatusMessage("Covering image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Covering image..."); image.cover(width, height, alignMap[hAlign] | alignMap[vAlign], resizeMap[alg]); let imageBuffer; if (image.getMIME() === "image/gif") { @@ -144,7 +129,6 @@ class CoverImage extends Operation { return ``; } - } export default CoverImage; diff --git a/src/core/operations/CropImage.mjs b/src/core/operations/CropImage.mjs index 8b480080..3fe93bff 100644 --- a/src/core/operations/CropImage.mjs +++ b/src/core/operations/CropImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Crop Image operation */ class CropImage extends Operation { - /** * CropImage constructor */ @@ -24,7 +23,8 @@ class CropImage extends Operation { this.name = "Crop Image"; this.module = "Image"; - this.description = "Crops an image to the specified region, or automatically crops edges.

Autocrop
Automatically crops same-colour borders from the image.

Autocrop tolerance
A percentage value for the tolerance of colour difference between pixels.

Only autocrop frames
Only crop real frames (all sides must have the same border)

Symmetric autocrop
Force autocrop to be symmetric (top/bottom and left/right are cropped by the same amount)

Autocrop keep border
The number of pixels of border to leave around the image."; + this.description + = "Crops an image to the specified region, or automatically crops edges.

Autocrop
Automatically crops same-colour borders from the image.

Autocrop tolerance
A percentage value for the tolerance of colour difference between pixels.

Only autocrop frames
Only crop real frames (all sides must have the same border)

Symmetric autocrop
Force autocrop to be symmetric (top/bottom and left/right are cropped by the same amount)

Autocrop keep border
The number of pixels of border to leave around the image."; this.infoURL = "https://wikipedia.org/wiki/Cropping_(image)"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -104,11 +104,10 @@ class CropImage extends Operation { throw new OperationError(`Error loading image. (${err})`); } try { - if (isWorkerEnvironment()) - self.sendStatusMessage("Cropping image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Cropping image..."); if (autocrop) { image.autocrop({ - tolerance: (autoTolerance / 100), + tolerance: autoTolerance / 100, cropOnlyFrames: autoFrames, cropSymmetric: autoSymmetric, leaveBorder: autoBorder @@ -145,7 +144,6 @@ class CropImage extends Operation { return ``; } - } export default CropImage; diff --git a/src/core/operations/DESDecrypt.mjs b/src/core/operations/DESDecrypt.mjs index 856aa065..ea5cac9c 100644 --- a/src/core/operations/DESDecrypt.mjs +++ b/src/core/operations/DESDecrypt.mjs @@ -13,7 +13,6 @@ import forge from "node-forge"; * DES Decrypt operation */ class DESDecrypt extends Operation { - /** * DESDecrypt constructor */ @@ -22,7 +21,8 @@ class DESDecrypt extends Operation { this.name = "DES Decrypt"; this.module = "Ciphers"; - this.description = "DES is a previously dominant algorithm for encryption, and was published as an official U.S. Federal Information Processing Standard (FIPS). It is now considered to be insecure due to its small key size.

Key: DES uses a key length of 8 bytes (64 bits).
Triple DES uses a key length of 24 bytes (192 bits).

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default."; + this.description + = "DES is a previously dominant algorithm for encryption, and was published as an official U.S. Federal Information Processing Standard (FIPS). It is now considered to be insecure due to its small key size.

Key: DES uses a key length of 8 bytes (64 bits).
Triple DES uses a key length of 24 bytes (192 bits).

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default."; this.infoURL = "https://wikipedia.org/wiki/Data_Encryption_Standard"; this.inputType = "string"; this.outputType = "string"; @@ -67,7 +67,7 @@ class DESDecrypt extends Operation { iv = Utils.convertToByteArray(args[1].string, args[1].option), mode = args[2].substring(0, 3), noPadding = args[2].endsWith("NoPadding"), - [,,, inputType, outputType] = args; + [, , , inputType, outputType] = args; if (key.length !== 8) { throw new OperationError(`Invalid key length: ${key.length} bytes @@ -88,12 +88,12 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); /* Allow for a "no padding" mode */ if (noPadding) { - decipher.mode.unpad = function(output, options) { + decipher.mode.unpad = function (output, options) { return true; }; } - decipher.start({iv: iv}); + decipher.start({ iv: iv }); decipher.update(forge.util.createBuffer(input)); const result = decipher.finish(); @@ -103,7 +103,6 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); throw new OperationError("Unable to decrypt input with these parameters."); } } - } export default DESDecrypt; diff --git a/src/core/operations/DESEncrypt.mjs b/src/core/operations/DESEncrypt.mjs index 9472abe8..8a63f4dd 100644 --- a/src/core/operations/DESEncrypt.mjs +++ b/src/core/operations/DESEncrypt.mjs @@ -13,7 +13,6 @@ import forge from "node-forge"; * DES Encrypt operation */ class DESEncrypt extends Operation { - /** * DESEncrypt constructor */ @@ -22,7 +21,8 @@ class DESEncrypt extends Operation { this.name = "DES Encrypt"; this.module = "Ciphers"; - this.description = "DES is a previously dominant algorithm for encryption, and was published as an official U.S. Federal Information Processing Standard (FIPS). It is now considered to be insecure due to its small key size.

Key: DES uses a key length of 8 bytes (64 bits).
Triple DES uses a key length of 24 bytes (192 bits).

You can generate a password-based key using one of the KDF operations.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used."; + this.description + = "DES is a previously dominant algorithm for encryption, and was published as an official U.S. Federal Information Processing Standard (FIPS). It is now considered to be insecure due to its small key size.

Key: DES uses a key length of 8 bytes (64 bits).
Triple DES uses a key length of 24 bytes (192 bits).

You can generate a password-based key using one of the KDF operations.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used."; this.infoURL = "https://wikipedia.org/wiki/Data_Encryption_Standard"; this.inputType = "string"; this.outputType = "string"; @@ -65,7 +65,7 @@ class DESEncrypt extends Operation { run(input, args) { const key = Utils.convertToByteString(args[0].string, args[0].option), iv = Utils.convertToByteArray(args[1].string, args[1].option), - [,, mode, inputType, outputType] = args; + [, , mode, inputType, outputType] = args; if (key.length !== 8) { throw new OperationError(`Invalid key length: ${key.length} bytes @@ -83,13 +83,12 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); input = Utils.convertToByteString(input, inputType); const cipher = forge.cipher.createCipher("DES-" + mode, key); - cipher.start({iv: iv}); + cipher.start({ iv: iv }); cipher.update(forge.util.createBuffer(input)); cipher.finish(); return outputType === "Hex" ? cipher.output.toHex() : cipher.output.getBytes(); } - } export default DESEncrypt; diff --git a/src/core/operations/DNSOverHTTPS.mjs b/src/core/operations/DNSOverHTTPS.mjs index 87381226..c06a0846 100644 --- a/src/core/operations/DNSOverHTTPS.mjs +++ b/src/core/operations/DNSOverHTTPS.mjs @@ -10,7 +10,6 @@ import OperationError from "../errors/OperationError.mjs"; * DNS over HTTPS operation */ class DNSOverHTTPS extends Operation { - /** * DNSOverHTTPS constructor */ @@ -98,25 +97,29 @@ class DNSOverHTTPS extends Operation { try { url = new URL(resolver); } catch (error) { - throw new OperationError(error.toString() + - "\n\nThis error could be caused by one of the following:\n" + - " - An invalid Resolver URL\n"); + throw new OperationError( + error.toString() + + "\n\nThis error could be caused by one of the following:\n" + + " - An invalid Resolver URL\n" + ); } - const params = {name: input, type: requestType, cd: DNSSEC}; + const params = { name: input, type: requestType, cd: DNSSEC }; url.search = new URLSearchParams(params); - return fetch(url, {headers: {"accept": "application/dns-json"}}).then(response => { - return response.json(); - }).then(data => { - if (justAnswer) { - return extractData(data.Answer); - } - return data; - }).catch(e => { - throw new OperationError(`Error making request to ${url}\n${e.toString()}`); - }); - + return fetch(url, { headers: { "accept": "application/dns-json" } }) + .then((response) => { + return response.json(); + }) + .then((data) => { + if (justAnswer) { + return extractData(data.Answer); + } + return data; + }) + .catch((e) => { + throw new OperationError(`Error making request to ${url}\n${e.toString()}`); + }); } } @@ -128,11 +131,11 @@ class DNSOverHTTPS extends Operation { * @returns {JSON} */ function extractData(data) { - if (typeof(data) == "undefined") { + if (typeof data == "undefined") { return []; } else { const dataValues = []; - data.forEach(element => { + data.forEach((element) => { dataValues.push(element.data); }); return dataValues; diff --git a/src/core/operations/DechunkHTTPResponse.mjs b/src/core/operations/DechunkHTTPResponse.mjs index da2eb437..f66c8639 100644 --- a/src/core/operations/DechunkHTTPResponse.mjs +++ b/src/core/operations/DechunkHTTPResponse.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Dechunk HTTP response operation */ class DechunkHTTPResponse extends Operation { - /** * DechunkHTTPResponse constructor */ @@ -26,9 +25,9 @@ class DechunkHTTPResponse extends Operation { this.args = []; this.checks = [ { - pattern: "^[0-9A-F]+\r\n", - flags: "i", - args: [] + pattern: "^[0-9A-F]+\r\n", + flags: "i", + args: [] } ]; } @@ -52,7 +51,6 @@ class DechunkHTTPResponse extends Operation { } return chunks.join("") + input; } - } export default DechunkHTTPResponse; diff --git a/src/core/operations/DecodeNetBIOSName.mjs b/src/core/operations/DecodeNetBIOSName.mjs index c726f5d8..72eeadbc 100644 --- a/src/core/operations/DecodeNetBIOSName.mjs +++ b/src/core/operations/DecodeNetBIOSName.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Decode NetBIOS Name operation */ class DecodeNetBIOSName extends Operation { - /** * DecodeNetBIOSName constructor */ @@ -19,7 +18,8 @@ class DecodeNetBIOSName extends Operation { this.name = "Decode NetBIOS Name"; this.module = "Default"; - this.description = "NetBIOS names as seen across the client interface to NetBIOS are exactly 16 bytes long. Within the NetBIOS-over-TCP protocols, a longer representation is used.

There are two levels of encoding. The first level maps a NetBIOS name into a domain system name. The second level maps the domain system name into the 'compressed' representation required for interaction with the domain name system.

This operation decodes the first level of encoding. See RFC 1001 for full details."; + this.description + = "NetBIOS names as seen across the client interface to NetBIOS are exactly 16 bytes long. Within the NetBIOS-over-TCP protocols, a longer representation is used.

There are two levels of encoding. The first level maps a NetBIOS name into a domain system name. The second level maps the domain system name into the 'compressed' representation required for interaction with the domain name system.

This operation decodes the first level of encoding. See RFC 1001 for full details."; this.infoURL = "https://wikipedia.org/wiki/NetBIOS"; this.inputType = "byteArray"; this.outputType = "byteArray"; @@ -32,9 +32,9 @@ class DecodeNetBIOSName extends Operation { ]; this.checks = [ { - pattern: "^\\s*\\S{32}$", - flags: "", - args: [65] + pattern: "^\\s*\\S{32}$", + flags: "", + args: [65] } ]; } @@ -48,10 +48,9 @@ class DecodeNetBIOSName extends Operation { const output = [], offset = args[0]; - if (input.length <= 32 && (input.length % 2) === 0) { + if (input.length <= 32 && input.length % 2 === 0) { for (let i = 0; i < input.length; i += 2) { - output.push((((input[i] & 0xff) - offset) << 4) | - (((input[i + 1] & 0xff) - offset) & 0xf)); + output.push((((input[i] & 0xff) - offset) << 4) | (((input[i + 1] & 0xff) - offset) & 0xf)); } for (let i = output.length - 1; i > 0; i--) { if (output[i] === 32) output.splice(i, i); @@ -61,7 +60,6 @@ class DecodeNetBIOSName extends Operation { return output; } - } export default DecodeNetBIOSName; diff --git a/src/core/operations/DecodeText.mjs b/src/core/operations/DecodeText.mjs index 0fc9d2b5..45b06919 100644 --- a/src/core/operations/DecodeText.mjs +++ b/src/core/operations/DecodeText.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import cptable from "codepage"; -import {CHR_ENC_CODE_PAGES} from "../lib/ChrEnc.mjs"; +import { CHR_ENC_CODE_PAGES } from "../lib/ChrEnc.mjs"; /** * Decode text operation */ class DecodeText extends Operation { - /** * DecodeText constructor */ @@ -26,8 +25,10 @@ class DecodeText extends Operation { "

", "Supported charsets are:", "
    ", - Object.keys(CHR_ENC_CODE_PAGES).map(e => `
  • ${e}
  • `).join("\n"), - "
", + Object.keys(CHR_ENC_CODE_PAGES) + .map((e) => `
  • ${e}
  • `) + .join("\n"), + "" ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Character_encoding"; this.inputType = "ArrayBuffer"; @@ -50,7 +51,6 @@ class DecodeText extends Operation { const format = CHR_ENC_CODE_PAGES[args[0]]; return cptable.utils.decode(format, new Uint8Array(input)); } - } export default DecodeText; diff --git a/src/core/operations/DefangIPAddresses.mjs b/src/core/operations/DefangIPAddresses.mjs index a869f114..5f54a94a 100644 --- a/src/core/operations/DefangIPAddresses.mjs +++ b/src/core/operations/DefangIPAddresses.mjs @@ -6,12 +6,10 @@ import Operation from "../Operation.mjs"; - /** * Defang IP Addresses operation */ class DefangIPAddresses extends Operation { - /** * DefangIPAddresses constructor */ @@ -20,7 +18,8 @@ class DefangIPAddresses extends Operation { this.name = "Defang IP Addresses"; this.module = "Default"; - this.description = "Takes a IPv4 or IPv6 address and 'Defangs' it, meaning the IP becomes invalid, removing the risk of accidentally utilising it as an IP address."; + this.description + = "Takes a IPv4 or IPv6 address and 'Defangs' it, meaning the IP becomes invalid, removing the risk of accidentally utilising it as an IP address."; this.infoURL = "https://isc.sans.edu/forums/diary/Defang+all+the+things/22744/"; this.inputType = "string"; this.outputType = "string"; @@ -44,11 +43,11 @@ class DefangIPAddresses extends Operation { * @returns {string} */ run(input, args) { - input = input.replace(IPV4_REGEX, x => { + input = input.replace(IPV4_REGEX, (x) => { return x.replace(/\./g, "[.]"); }); - input = input.replace(IPV6_REGEX, x => { + input = input.replace(IPV6_REGEX, (x) => { return x.replace(/:/g, "[:]"); }); @@ -58,14 +57,18 @@ class DefangIPAddresses extends Operation { export default DefangIPAddresses; - /** * IPV4 regular expression */ -const IPV4_REGEX = new RegExp("(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", "g"); - +const IPV4_REGEX = new RegExp( + "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", + "g" +); /** * IPV6 regular expression */ -const IPV6_REGEX = new RegExp("((?=.*::)(?!.*::.+::)(::)?([\\dA-Fa-f]{1,4}:(:|\\b)|){5}|([\\dA-Fa-f]{1,4}:){6})((([\\dA-Fa-f]{1,4}((?!\\3)::|:\\b|(?![\\dA-Fa-f])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})", "g"); +const IPV6_REGEX = new RegExp( + "((?=.*::)(?!.*::.+::)(::)?([\\dA-Fa-f]{1,4}:(:|\\b)|){5}|([\\dA-Fa-f]{1,4}:){6})((([\\dA-Fa-f]{1,4}((?!\\3)::|:\\b|(?![\\dA-Fa-f])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})", + "g" +); diff --git a/src/core/operations/DefangURL.mjs b/src/core/operations/DefangURL.mjs index aa783c32..76af4b7c 100644 --- a/src/core/operations/DefangURL.mjs +++ b/src/core/operations/DefangURL.mjs @@ -6,13 +6,12 @@ */ import Operation from "../Operation.mjs"; -import {URL_REGEX, DOMAIN_REGEX} from "../lib/Extract.mjs"; +import { URL_REGEX, DOMAIN_REGEX } from "../lib/Extract.mjs"; /** * DefangURL operation */ class DefangURL extends Operation { - /** * DefangURL constructor */ @@ -21,7 +20,8 @@ class DefangURL extends Operation { this.name = "Defang URL"; this.module = "Default"; - this.description = "Takes a Universal Resource Locator (URL) and 'Defangs' it; meaning the URL becomes invalid, neutralising the risk of accidentally clicking on a malicious link.

    This is often used when dealing with malicious links or IOCs.

    Works well when combined with the 'Extract URLs' operation."; + this.description + = "Takes a Universal Resource Locator (URL) and 'Defangs' it; meaning the URL becomes invalid, neutralising the risk of accidentally clicking on a malicious link.

    This is often used when dealing with malicious links or IOCs.

    Works well when combined with the 'Extract URLs' operation."; this.infoURL = "https://isc.sans.edu/forums/diary/Defang+all+the+things/22744/"; this.inputType = "string"; this.outputType = "string"; @@ -59,15 +59,15 @@ class DefangURL extends Operation { switch (process) { case "Valid domains and full URLs": - input = input.replace(URL_REGEX, x => { + input = input.replace(URL_REGEX, (x) => { return defangURL(x, dots, http, slashes); }); - input = input.replace(DOMAIN_REGEX, x => { + input = input.replace(DOMAIN_REGEX, (x) => { return defangURL(x, dots, http, slashes); }); break; case "Only full URLs": - input = input.replace(URL_REGEX, x => { + input = input.replace(URL_REGEX, (x) => { return defangURL(x, dots, http, slashes); }); break; @@ -78,10 +78,8 @@ class DefangURL extends Operation { return input; } - } - /** * Defangs a given URL * diff --git a/src/core/operations/DeriveEVPKey.mjs b/src/core/operations/DeriveEVPKey.mjs index 5885f892..2d089968 100644 --- a/src/core/operations/DeriveEVPKey.mjs +++ b/src/core/operations/DeriveEVPKey.mjs @@ -12,7 +12,6 @@ import CryptoJS from "crypto-js"; * Derive EVP key operation */ class DeriveEVPKey extends Operation { - /** * DeriveEVPKey constructor */ @@ -21,7 +20,8 @@ class DeriveEVPKey extends Operation { this.name = "Derive EVP key"; this.module = "Ciphers"; - this.description = "This operation performs a password-based key derivation function (PBKDF) used extensively in OpenSSL. In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.

    A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.

    If you leave the salt argument empty, a random salt will be generated."; + this.description + = "This operation performs a password-based key derivation function (PBKDF) used extensively in OpenSSL. In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.

    A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.

    If you leave the salt argument empty, a random salt will be generated."; this.infoURL = "https://wikipedia.org/wiki/Key_derivation_function"; this.inputType = "string"; this.outputType = "string"; @@ -67,15 +67,15 @@ class DeriveEVPKey extends Operation { iterations = args[2], hasher = args[3], salt = Utils.convertToByteString(args[4].string, args[4].option), - key = CryptoJS.EvpKDF(passphrase, salt, { // lgtm [js/insufficient-password-hash] + key = CryptoJS.EvpKDF(passphrase, salt, { + // lgtm [js/insufficient-password-hash] keySize: keySize, hasher: CryptoJS.algo[hasher], - iterations: iterations, + iterations: iterations }); return key.toString(CryptoJS.enc.Hex); } - } export default DeriveEVPKey; @@ -106,7 +106,7 @@ CryptoJS.kdf.OpenSSL.execute = function (password, keySize, ivSize, salt) { // Generate random salt if no salt specified and not set to false // This line changed from `if (!salt) {` to the following if (salt === undefined || salt === null) { - salt = CryptoJS.lib.WordArray.random(64/8); + salt = CryptoJS.lib.WordArray.random(64 / 8); } // Derive key and IV @@ -120,7 +120,6 @@ CryptoJS.kdf.OpenSSL.execute = function (password, keySize, ivSize, salt) { return CryptoJS.lib.CipherParams.create({ key: key, iv: iv, salt: salt }); }; - /** * Override for the CryptoJS Hex encoding parser to remove whitespace before attempting to parse * the hex string. diff --git a/src/core/operations/DeriveHKDFKey.mjs b/src/core/operations/DeriveHKDFKey.mjs index 3c594015..112d46a2 100644 --- a/src/core/operations/DeriveHKDFKey.mjs +++ b/src/core/operations/DeriveHKDFKey.mjs @@ -13,7 +13,6 @@ import CryptoApi from "crypto-api/src/crypto-api.mjs"; * Derive HKDF Key operation */ class DeriveHKDFKey extends Operation { - /** * DeriveHKDFKey constructor */ @@ -22,7 +21,8 @@ class DeriveHKDFKey extends Operation { this.name = "Derive HKDF key"; this.module = "Crypto"; - this.description = "A simple Hashed Message Authenticaton Code (HMAC)-based key derivation function (HKDF), defined in RFC5869."; + this.description + = "A simple Hashed Message Authenticaton Code (HMAC)-based key derivation function (HKDF), defined in RFC5869."; this.infoURL = "https://wikipedia.org/wiki/HKDF"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -89,7 +89,7 @@ class DeriveHKDFKey extends Operation { "type": "number", "value": 16, "min": 0 - }, + } ]; } @@ -112,10 +112,10 @@ class DeriveHKDFKey extends Operation { throw new OperationError("L must be non-negative"); } if (L > 255 * HashLen) { - throw new OperationError("L too large (maximum length for " + args[2] + " is " + (255 * HashLen) + ")"); + throw new OperationError("L too large (maximum length for " + args[2] + " is " + 255 * HashLen + ")"); } - const hmacHash = function(key, data) { + const hmacHash = function (key, data) { hasher.reset(); const mac = CryptoApi.getHmac(key, hasher); mac.update(data); @@ -132,7 +132,6 @@ class DeriveHKDFKey extends Operation { } return CryptoApi.encoder.toHex(result.substring(0, L)); } - } export default DeriveHKDFKey; diff --git a/src/core/operations/DerivePBKDF2Key.mjs b/src/core/operations/DerivePBKDF2Key.mjs index 98385dad..34c243f3 100644 --- a/src/core/operations/DerivePBKDF2Key.mjs +++ b/src/core/operations/DerivePBKDF2Key.mjs @@ -12,7 +12,6 @@ import forge from "node-forge"; * Derive PBKDF2 key operation */ class DerivePBKDF2Key extends Operation { - /** * DerivePBKDF2Key constructor */ @@ -21,7 +20,8 @@ class DerivePBKDF2Key extends Operation { this.name = "Derive PBKDF2 key"; this.module = "Ciphers"; - this.description = "PBKDF2 is a password-based key derivation function. It is part of RSA Laboratories' Public-Key Cryptography Standards (PKCS) series, specifically PKCS #5 v2.0, also published as Internet Engineering Task Force's RFC 2898.

    In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.

    A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.

    If you leave the salt argument empty, a random salt will be generated."; + this.description + = "PBKDF2 is a password-based key derivation function. It is part of RSA Laboratories' Public-Key Cryptography Standards (PKCS) series, specifically PKCS #5 v2.0, also published as Internet Engineering Task Force's RFC 2898.

    In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.

    A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.

    If you leave the salt argument empty, a random salt will be generated."; this.infoURL = "https://wikipedia.org/wiki/PBKDF2"; this.inputType = "string"; this.outputType = "string"; @@ -66,13 +66,11 @@ class DerivePBKDF2Key extends Operation { keySize = args[1], iterations = args[2], hasher = args[3], - salt = Utils.convertToByteString(args[4].string, args[4].option) || - forge.random.getBytesSync(keySize), + salt = Utils.convertToByteString(args[4].string, args[4].option) || forge.random.getBytesSync(keySize), derivedKey = forge.pkcs5.pbkdf2(passphrase, salt, iterations, keySize / 8, hasher.toLowerCase()); return forge.util.bytesToHex(derivedKey); } - } export default DerivePBKDF2Key; diff --git a/src/core/operations/DetectFileType.mjs b/src/core/operations/DetectFileType.mjs index 58d13c31..2fac3110 100644 --- a/src/core/operations/DetectFileType.mjs +++ b/src/core/operations/DetectFileType.mjs @@ -5,21 +5,28 @@ */ import Operation from "../Operation.mjs"; -import {detectFileType} from "../lib/FileType.mjs"; -import {FILE_SIGNATURES} from "../lib/FileSignatures.mjs"; +import { detectFileType } from "../lib/FileType.mjs"; +import { FILE_SIGNATURES } from "../lib/FileSignatures.mjs"; // Concat all supported extensions into a single flat list -const exts = [].concat.apply([], Object.keys(FILE_SIGNATURES).map(cat => - [].concat.apply([], FILE_SIGNATURES[cat].map(sig => - sig.extension.split(",") - )) -)).unique().sort().join(", "); +const exts = [].concat + .apply( + [], + Object.keys(FILE_SIGNATURES).map((cat) => + [].concat.apply( + [], + FILE_SIGNATURES[cat].map((sig) => sig.extension.split(",")) + ) + ) + ) + .unique() + .sort() + .join(", "); /** * Detect File Type operation */ class DetectFileType extends Operation { - /** * DetectFileType constructor */ @@ -28,12 +35,14 @@ class DetectFileType extends Operation { this.name = "Detect File Type"; this.module = "Default"; - this.description = "Attempts to guess the MIME (Multipurpose Internet Mail Extensions) type of the data based on 'magic bytes'.

    Currently supports the following file types: " + - exts + "."; + this.description + = "Attempts to guess the MIME (Multipurpose Internet Mail Extensions) type of the data based on 'magic bytes'.

    Currently supports the following file types: " + + exts + + "."; this.infoURL = "https://wikipedia.org/wiki/List_of_file_signatures"; this.inputType = "ArrayBuffer"; this.outputType = "string"; - this.args = Object.keys(FILE_SIGNATURES).map(cat => { + this.args = Object.keys(FILE_SIGNATURES).map((cat) => { return { name: cat, type: "boolean", @@ -60,7 +69,7 @@ class DetectFileType extends Operation { if (!types.length) { return "Unknown file type. Have you tried checking the entropy of this data to determine whether it might be encrypted or compressed?"; } else { - const results = types.map(type => { + const results = types.map((type) => { let output = `File type: ${type.name} Extension: ${type.extension} MIME type: ${type.mime}\n`; @@ -75,7 +84,6 @@ MIME type: ${type.mime}\n`; return results.join("\n"); } } - } export default DetectFileType; diff --git a/src/core/operations/Diff.mjs b/src/core/operations/Diff.mjs index 9f180f86..8c816943 100644 --- a/src/core/operations/Diff.mjs +++ b/src/core/operations/Diff.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * Diff operation */ class Diff extends Operation { - /** * Diff constructor */ @@ -22,7 +21,8 @@ class Diff extends Operation { this.name = "Diff"; this.module = "Diff"; - this.description = "Compares two inputs (separated by the specified delimiter) and highlights the differences between them."; + this.description + = "Compares two inputs (separated by the specified delimiter) and highlights the differences between them."; this.infoURL = "https://wikipedia.org/wiki/File_comparison"; this.inputType = "string"; this.outputType = "html"; @@ -67,14 +67,7 @@ class Diff extends Operation { * @returns {html} */ run(input, args) { - const [ - sampleDelim, - diffBy, - showAdded, - showRemoved, - showSubtraction, - ignoreWhitespace - ] = args, + const [sampleDelim, diffBy, showAdded, showRemoved, showSubtraction, ignoreWhitespace] = args, samples = input.split(sampleDelim); let output = "", diff; @@ -83,7 +76,9 @@ class Diff extends Operation { const jsdiff = JsDiff.default ? JsDiff.default : JsDiff; if (!samples || samples.length !== 2) { - throw new OperationError("Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?"); + throw new OperationError( + "Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?" + ); } switch (diffBy) { @@ -129,7 +124,6 @@ class Diff extends Operation { return output; } - } export default Diff; diff --git a/src/core/operations/DisassembleX86.mjs b/src/core/operations/DisassembleX86.mjs index bdaf348a..68a9dee9 100644 --- a/src/core/operations/DisassembleX86.mjs +++ b/src/core/operations/DisassembleX86.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Disassemble x86 operation */ class DisassembleX86 extends Operation { - /** * DisassembleX86 constructor */ @@ -21,7 +20,8 @@ class DisassembleX86 extends Operation { this.name = "Disassemble x86"; this.module = "Shellcode"; - this.description = "Disassembly is the process of translating machine language into assembly language.

    This operation supports 64-bit, 32-bit and 16-bit code written for Intel or AMD x86 processors. It is particularly useful for reverse engineering shellcode.

    Input should be in hexadecimal."; + this.description + = "Disassembly is the process of translating machine language into assembly language.

    This operation supports 64-bit, 32-bit and 16-bit code written for Intel or AMD x86 processors. It is particularly useful for reverse engineering shellcode.

    Input should be in hexadecimal."; this.infoURL = "https://wikipedia.org/wiki/X86"; this.inputType = "string"; this.outputType = "string"; @@ -34,15 +34,7 @@ class DisassembleX86 extends Operation { { "name": "Compatibility", "type": "option", - "value": [ - "Full x86 architecture", - "Knights Corner", - "Larrabee", - "Cyrix", - "Geode", - "Centaur", - "X86/486" - ] + "value": ["Full x86 architecture", "Knights Corner", "Larrabee", "Cyrix", "Geode", "Centaur", "X86/486"] }, { "name": "Code Segment (CS)", @@ -75,14 +67,7 @@ class DisassembleX86 extends Operation { * @throws {OperationError} if invalid mode value */ run(input, args) { - const [ - mode, - compatibility, - codeSegment, - offset, - showInstructionHex, - showInstructionPos - ] = args; + const [mode, compatibility, codeSegment, offset, showInstructionHex, showInstructionPos] = args; switch (mode) { case "64": @@ -128,7 +113,6 @@ class DisassembleX86 extends Operation { disassemble.LoadBinCode(input.replace(/\s/g, "")); return disassemble.LDisassemble(); } - } export default DisassembleX86; diff --git a/src/core/operations/DitherImage.mjs b/src/core/operations/DitherImage.mjs index 6aef72dc..ca65f9f1 100644 --- a/src/core/operations/DitherImage.mjs +++ b/src/core/operations/DitherImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Image Dither operation */ class DitherImage extends Operation { - /** * DitherImage constructor */ @@ -49,8 +48,7 @@ class DitherImage extends Operation { throw new OperationError(`Error loading image. (${err})`); } try { - if (isWorkerEnvironment()) - self.sendStatusMessage("Applying dither to image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Applying dither to image..."); image.dither565(); let imageBuffer; @@ -81,7 +79,6 @@ class DitherImage extends Operation { return ``; } - } export default DitherImage; diff --git a/src/core/operations/Divide.mjs b/src/core/operations/Divide.mjs index 108c175b..8c0de7f5 100644 --- a/src/core/operations/Divide.mjs +++ b/src/core/operations/Divide.mjs @@ -10,12 +10,10 @@ import Operation from "../Operation.mjs"; import { div, createNumArray } from "../lib/Arithmetic.mjs"; import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; - /** * Divide operation */ class Divide extends Operation { - /** * Divide constructor */ @@ -24,14 +22,15 @@ class Divide extends Operation { this.name = "Divide"; this.module = "Default"; - this.description = "Divides a list of numbers. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 becomes 2.5"; + this.description + = "Divides a list of numbers. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 becomes 2.5"; this.inputType = "string"; this.outputType = "BigNumber"; this.args = [ { "name": "Delimiter", "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, + "value": ARITHMETIC_DELIM_OPTIONS } ]; } @@ -45,7 +44,6 @@ class Divide extends Operation { const val = div(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Divide; diff --git a/src/core/operations/DropBytes.mjs b/src/core/operations/DropBytes.mjs index 9ea105f8..a2877a94 100644 --- a/src/core/operations/DropBytes.mjs +++ b/src/core/operations/DropBytes.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Drop bytes operation */ class DropBytes extends Operation { - /** * DropBytes constructor */ @@ -19,7 +18,8 @@ class DropBytes extends Operation { this.name = "Drop bytes"; this.module = "Default"; - this.description = "Cuts a slice of the specified number of bytes out of the data. Negative values are allowed."; + this.description + = "Cuts a slice of the specified number of bytes out of the data. Negative values are allowed."; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; this.args = [ @@ -54,11 +54,13 @@ class DropBytes extends Operation { const applyToEachLine = args[2]; if (!applyToEachLine) { - if (start < 0) { // Take from the end + if (start < 0) { + // Take from the end start = input.byteLength + start; } - if (length < 0) { // Flip start point + if (length < 0) { + // Flip start point start = start + length; if (start < 0) { start = input.byteLength + start; @@ -96,11 +98,13 @@ class DropBytes extends Operation { s = start, l = length; for (i = 0; i < lines.length; i++) { - if (s < 0) { // Take from the end + if (s < 0) { + // Take from the end s = lines[i].length + s; } - if (l < 0) { // Flip start point + if (l < 0) { + // Flip start point s = s + l; if (s < 0) { s = lines[i].length + s; @@ -110,14 +114,13 @@ class DropBytes extends Operation { } } - output = output.concat(lines[i].slice(0, s).concat(lines[i].slice(s+l, lines[i].length))); + output = output.concat(lines[i].slice(0, s).concat(lines[i].slice(s + l, lines[i].length))); output.push(0x0a); s = start; l = length; } - return new Uint8Array(output.slice(0, output.length-1)).buffer; + return new Uint8Array(output.slice(0, output.length - 1)).buffer; } - } export default DropBytes; diff --git a/src/core/operations/ELFInfo.mjs b/src/core/operations/ELFInfo.mjs index 815d3cf1..374d349f 100644 --- a/src/core/operations/ELFInfo.mjs +++ b/src/core/operations/ELFInfo.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * ELF Info operation */ class ELFInfo extends Operation { - /** * ELFInfo constructor */ @@ -22,7 +21,8 @@ class ELFInfo extends Operation { this.name = "ELF Info"; this.module = "Default"; - this.description = "Implements readelf-like functionality. This operation will extract the ELF Header, Program Headers, Section Headers and Symbol Table for an ELF file."; + this.description + = "Implements readelf-like functionality. This operation will extract the ELF Header, Program Headers, Section Headers and Symbol Table for an ELF file."; this.infoURL = "https://www.wikipedia.org/wiki/Executable_and_Linkable_Format"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -113,8 +113,7 @@ class ELFInfo extends Operation { const ehResult = []; const magic = stream.getBytes(4); - if (magic.join("") !== [0x7f, 0x45, 0x4c, 0x46].join("")) - throw new OperationError("Invalid ELF"); + if (magic.join("") !== [0x7f, 0x45, 0x4c, 0x46].join("")) throw new OperationError("Invalid ELF"); ehResult.push("Magic:".padEnd(align) + `${Utils.byteArrayToChars(magic)}`); @@ -155,22 +154,22 @@ class ELFInfo extends Operation { case 0x09: ABI = "FreeBSD"; break; - case 0x0A: + case 0x0a: ABI = "Tru64"; break; - case 0x0B: + case 0x0b: ABI = "Novell Modesto"; break; - case 0x0C: + case 0x0c: ABI = "OpenBSD"; break; - case 0x0D: + case 0x0d: ABI = "OpenVMS"; break; - case 0x0E: + case 0x0e: ABI = "NonStop Kernel"; break; - case 0x0F: + case 0x0f: ABI = "AROS"; break; case 0x10: @@ -189,8 +188,7 @@ class ELFInfo extends Operation { // Linux Kernel does not use ABI Version. const abiVersion = stream.readInt(1).toString(); - if (ABI !== "Linux") - ehResult.push("ABI Version:".padEnd(align) + abiVersion); + if (ABI !== "Linux") ehResult.push("ABI Version:".padEnd(align) + abiVersion); stream.moveForwardsBy(7); @@ -211,16 +209,16 @@ class ELFInfo extends Operation { case 0x0004: eType = "Core File"; break; - case 0xFE00: + case 0xfe00: eType = "LOOS"; break; - case 0xFEFF: + case 0xfeff: eType = "HIOS"; break; - case 0xFF00: + case 0xff00: eType = "LOPROC"; break; - case 0xFFFF: + case 0xffff: eType = "HIPROC"; break; default: @@ -260,28 +258,28 @@ class ELFInfo extends Operation { case 0x0009: ISA = "IBM System/370"; break; - case 0x000A: + case 0x000a: ISA = "MIPS RS3000 Little-endian"; break; - case 0x000B: - case 0x000C: - case 0x000D: - case 0x000E: + case 0x000b: + case 0x000c: + case 0x000d: + case 0x000e: case 0x0018: case 0x0019: - case 0x001A: - case 0x001B: - case 0x001C: - case 0x001D: - case 0x001E: - case 0x001F: + case 0x001a: + case 0x001b: + case 0x001c: + case 0x001d: + case 0x001e: + case 0x001f: case 0x0020: case 0x0021: case 0x0022: case 0x0023: ISA = "Reserved for future use"; break; - case 0x000F: + case 0x000f: ISA = "Hewlett-Packard PA-RISC"; break; case 0x0011: @@ -323,22 +321,22 @@ class ELFInfo extends Operation { case 0x0029: ISA = "Digital Alpha"; break; - case 0x002A: + case 0x002a: ISA = "SuperH"; break; - case 0x002B: + case 0x002b: ISA = "SPARC Version 9"; break; - case 0x002C: + case 0x002c: ISA = "Siemens TriCore embedded processor"; break; - case 0x002D: + case 0x002d: ISA = "Argonaut RISC Core"; break; - case 0x002E: + case 0x002e: ISA = "Hitachi H8/300"; break; - case 0x002F: + case 0x002f: ISA = "Hitachi H8/300H"; break; case 0x0030: @@ -371,22 +369,22 @@ class ELFInfo extends Operation { case 0x0039: ISA = "Denso NDR1 microprocessor"; break; - case 0x003A: + case 0x003a: ISA = "Motorola Star*Core processor"; break; - case 0x003B: + case 0x003b: ISA = "Toyota ME16 processor"; break; - case 0x003C: + case 0x003c: ISA = "STMicroelectronics ST100 processor"; break; - case 0x003D: + case 0x003d: ISA = "Advanced Logic Corp. TinyJ embedded processor family"; break; - case 0x003E: + case 0x003e: ISA = "AMD x86-64"; break; - case 0x003F: + case 0x003f: ISA = "Sony DSP Processor"; break; case 0x0040: @@ -419,22 +417,22 @@ class ELFInfo extends Operation { case 0x0049: ISA = "Silicon Graphics SVx"; break; - case 0x004A: + case 0x004a: ISA = "STMicroelectronics ST19 8-bit microcontroller"; break; - case 0x004B: + case 0x004b: ISA = "Digital VAX"; break; - case 0x004C: + case 0x004c: ISA = "Axis Communications 32-bit embedded processor"; break; - case 0x004D: + case 0x004d: ISA = "Infineon Technologies 32-bit embedded processor"; break; - case 0x004E: + case 0x004e: ISA = "Element 14 64-bit DSP Processor"; break; - case 0x004F: + case 0x004f: ISA = "LSI Logic 16-bit DSP Processor"; break; case 0x0050: @@ -467,22 +465,22 @@ class ELFInfo extends Operation { case 0x0059: ISA = "Matsushita MN10300"; break; - case 0x005A: + case 0x005a: ISA = "Matsushita MN10200"; break; - case 0x005B: + case 0x005b: ISA = "picoJava"; break; - case 0x005C: + case 0x005c: ISA = "OpenRISC 32-bit embedded processor"; break; - case 0x005D: + case 0x005d: ISA = "ARC Cores Tangent-A5"; break; - case 0x005E: + case 0x005e: ISA = "Tensilica Xtensa Architecture"; break; - case 0x005F: + case 0x005f: ISA = "Alphamosaic VideoCore processor"; break; case 0x0060: @@ -500,19 +498,19 @@ class ELFInfo extends Operation { case 0x0064: ISA = "STMicroelectronics (www.st.com) ST200 microcontroller"; break; - case 0x008C: + case 0x008c: ISA = "TMS320C6000 Family"; break; - case 0x00AF: + case 0x00af: ISA = "MCST Elbrus e2k"; break; - case 0x00B7: + case 0x00b7: ISA = "ARM 64-bits (ARMv8/Aarch64)"; break; - case 0x00F3: + case 0x00f3: ISA = "RISC-V"; break; - case 0x00F7: + case 0x00f7: ISA = "Berkeley Packet Filter"; break; case 0x0101: @@ -590,14 +588,10 @@ class ELFInfo extends Operation { */ function readFlags(flags) { const result = []; - if (flags & 0x1) - result.push("Execute"); - if (flags & 0x2) - result.push("Write"); - if (flags & 0x4) - result.push("Read"); - if (flags & 0xf0000000) - result.push("Unspecified"); + if (flags & 0x1) result.push("Execute"); + if (flags & 0x2) result.push("Write"); + if (flags & 0x4) result.push("Read"); + if (flags & 0xf0000000) result.push("Unspecified"); return result.join(","); } @@ -606,54 +600,51 @@ class ELFInfo extends Operation { let pType = ""; const programHeaderType = stream.readInt(4, endianness); switch (true) { - case (programHeaderType === 0x00000000): + case programHeaderType === 0x00000000: pType = "Unused"; break; - case (programHeaderType === 0x00000001): + case programHeaderType === 0x00000001: pType = "Loadable Segment"; break; - case (programHeaderType === 0x00000002): + case programHeaderType === 0x00000002: pType = "Dynamic linking information"; break; - case (programHeaderType === 0x00000003): + case programHeaderType === 0x00000003: pType = "Interpreter Information"; break; - case (programHeaderType === 0x00000004): + case programHeaderType === 0x00000004: pType = "Auxiliary Information"; break; - case (programHeaderType === 0x00000005): + case programHeaderType === 0x00000005: pType = "Reserved"; break; - case (programHeaderType === 0x00000006): + case programHeaderType === 0x00000006: pType = "Program Header Table"; break; - case (programHeaderType === 0x00000007): + case programHeaderType === 0x00000007: pType = "Thread-Local Storage Template"; break; - case (programHeaderType >= 0x60000000 && programHeaderType <= 0x6FFFFFFF): + case programHeaderType >= 0x60000000 && programHeaderType <= 0x6fffffff: pType = "Reserved Inclusive Range. OS Specific"; break; - case (programHeaderType >= 0x70000000 && programHeaderType <= 0x7FFFFFFF): + case programHeaderType >= 0x70000000 && programHeaderType <= 0x7fffffff: pType = "Reserved Inclusive Range. Processor Specific"; break; default: break; - } phResult.push("Program Header Type:".padEnd(align) + pType); - if (format === 2) - phResult.push("Flags:".padEnd(align) + readFlags(stream.readInt(4, endianness))); + if (format === 2) phResult.push("Flags:".padEnd(align) + readFlags(stream.readInt(4, endianness))); - const readSize = format === 1? 4 : 8; + const readSize = format === 1 ? 4 : 8; phResult.push("Offset Of Segment:".padEnd(align) + `${stream.readInt(readSize, endianness)}`); phResult.push("Virtual Address of Segment:".padEnd(align) + `${stream.readInt(readSize, endianness)}`); phResult.push("Physical Address of Segment:".padEnd(align) + `${stream.readInt(readSize, endianness)}`); phResult.push("Size of Segment:".padEnd(align) + `${stream.readInt(readSize, endianness)} bytes`); phResult.push("Size of Segment in Memory:".padEnd(align) + `${stream.readInt(readSize, endianness)} bytes`); - if (format === 1) - phResult.push("Flags:".padEnd(align) + readFlags(stream.readInt(4, endianness))); + if (format === 1) phResult.push("Flags:".padEnd(align) + readFlags(stream.readInt(4, endianness))); stream.moveForwardsBy(readSize); @@ -699,64 +690,64 @@ class ELFInfo extends Operation { let type = ""; const shType = stream.readInt(4, endianness); switch (true) { - case (shType === 0x00000001): + case shType === 0x00000001: type = "Program Data"; break; - case (shType === 0x00000002): + case shType === 0x00000002: type = "Symbol Table"; break; - case (shType === 0x00000003): + case shType === 0x00000003: type = "String Table"; break; - case (shType === 0x00000004): + case shType === 0x00000004: type = "Relocation Entries with Addens"; break; - case (shType === 0x00000005): + case shType === 0x00000005: type = "Symbol Hash Table"; break; - case (shType === 0x00000006): + case shType === 0x00000006: type = "Dynamic Linking Information"; break; - case (shType === 0x00000007): + case shType === 0x00000007: type = "Notes"; break; - case (shType === 0x00000008): + case shType === 0x00000008: type = "Program Space with No Data"; break; - case (shType === 0x00000009): + case shType === 0x00000009: type = "Relocation Entries with no Addens"; break; - case (shType === 0x0000000A): + case shType === 0x0000000a: type = "Reserved"; break; - case (shType === 0x0000000B): + case shType === 0x0000000b: type = "Dynamic Linker Symbol Table"; break; - case (shType === 0x0000000E): + case shType === 0x0000000e: type = "Array of Constructors"; break; - case (shType === 0x0000000F): + case shType === 0x0000000f: type = "Array of Destructors"; break; - case (shType === 0x00000010): + case shType === 0x00000010: type = "Array of pre-constructors"; break; - case (shType === 0x00000011): + case shType === 0x00000011: type = "Section group"; break; - case (shType === 0x00000012): + case shType === 0x00000012: type = "Extended section indices"; break; - case (shType === 0x00000013): + case shType === 0x00000013: type = "Number of defined types"; break; - case (shType >= 0x60000000 && shType <= 0x6fffffff): + case shType >= 0x60000000 && shType <= 0x6fffffff: type = "OS-specific"; break; - case (shType >= 0x70000000 && shType <= 0x7fffffff): + case shType >= 0x70000000 && shType <= 0x7fffffff: type = "Processor-specific"; break; - case (shType >= 0x80000000 && shType <= 0x8fffffff): + case shType >= 0x80000000 && shType <= 0x8fffffff: type = "Application-specific"; break; default: @@ -772,7 +763,7 @@ class ELFInfo extends Operation { shResult.push("Section Name: ".padEnd(align) + nameResult); } - const readSize = (format === 1) ? 4 : 8; + const readSize = format === 1 ? 4 : 8; const flags = stream.readInt(readSize, endianness); const shFlags = []; @@ -787,14 +778,13 @@ class ELFInfo extends Operation { [0x00000100, "OS Specific Handling"], [0x00000200, "Group"], [0x00000400, "Thread Local Data"], - [0x0FF00000, "OS-Specific"], - [0xF0000000, "Processor Specific"], + [0x0ff00000, "OS-Specific"], + [0xf0000000, "Processor Specific"], [0x04000000, "Special Ordering (Solaris)"], [0x08000000, "Excluded (Solaris)"] ]; - bitMasks.forEach(elem => { - if (flags & elem[0]) - shFlags.push(elem[1]); + bitMasks.forEach((elem) => { + if (flags & elem[0]) shFlags.push(elem[1]); }); shResult.push("Flags:".padEnd(align) + shFlags); @@ -838,7 +828,7 @@ class ELFInfo extends Operation { */ function getNamesOffset(stream) { const preMove = stream.position; - stream.moveTo(shoff + (shentSize * shstrtab)); + stream.moveTo(shoff + shentSize * shstrtab); if (format === 1) { stream.moveForwardsBy(0x10); namesOffset = stream.readInt(4, endianness); @@ -889,25 +879,21 @@ class ELFInfo extends Operation { result.push("=".repeat(align) + " Program Header " + "=".repeat(align)); stream.moveTo(phoff); - for (let i = 0; i < phEntries; i++) - result.push(programHeader(stream) + "\n"); + for (let i = 0; i < phEntries; i++) result.push(programHeader(stream) + "\n"); result.push("=".repeat(align) + " Section Header " + "=".repeat(align)); stream.moveTo(shoff); - for (let i = 0; i < shEntries; i++) - result.push(sectionHeader(stream) + "\n"); + for (let i = 0; i < shEntries; i++) result.push(sectionHeader(stream) + "\n"); result.push("=".repeat(align) + " Symbol Table " + "=".repeat(align)); stream.moveTo(symtabOffset); let elem = ""; - for (let i = 0; i < (symtabSize / symtabEntSize); i++) - if ((elem = getSymbols(stream)) !== "") - result.push("Symbol Name:".padEnd(align) + elem); + for (let i = 0; i < symtabSize / symtabEntSize; i++) + if ((elem = getSymbols(stream)) !== "") result.push("Symbol Name:".padEnd(align) + elem); return result.join("\n"); } - } export default ELFInfo; diff --git a/src/core/operations/EncodeNetBIOSName.mjs b/src/core/operations/EncodeNetBIOSName.mjs index bcc9a11d..73d7ec4c 100644 --- a/src/core/operations/EncodeNetBIOSName.mjs +++ b/src/core/operations/EncodeNetBIOSName.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Encode NetBIOS Name operation */ class EncodeNetBIOSName extends Operation { - /** * EncodeNetBIOSName constructor */ @@ -19,7 +18,8 @@ class EncodeNetBIOSName extends Operation { this.name = "Encode NetBIOS Name"; this.module = "Default"; - this.description = "NetBIOS names as seen across the client interface to NetBIOS are exactly 16 bytes long. Within the NetBIOS-over-TCP protocols, a longer representation is used.

    There are two levels of encoding. The first level maps a NetBIOS name into a domain system name. The second level maps the domain system name into the 'compressed' representation required for interaction with the domain name system.

    This operation carries out the first level of encoding. See RFC 1001 for full details."; + this.description + = "NetBIOS names as seen across the client interface to NetBIOS are exactly 16 bytes long. Within the NetBIOS-over-TCP protocols, a longer representation is used.

    There are two levels of encoding. The first level maps a NetBIOS name into a domain system name. The second level maps the domain system name into the 'compressed' representation required for interaction with the domain name system.

    This operation carries out the first level of encoding. See RFC 1001 for full details."; this.infoURL = "https://wikipedia.org/wiki/NetBIOS"; this.inputType = "byteArray"; this.outputType = "byteArray"; @@ -52,9 +52,7 @@ class EncodeNetBIOSName extends Operation { } return output; - } - } export default EncodeNetBIOSName; diff --git a/src/core/operations/EncodeText.mjs b/src/core/operations/EncodeText.mjs index 8cc1450f..1c3e628d 100644 --- a/src/core/operations/EncodeText.mjs +++ b/src/core/operations/EncodeText.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import cptable from "codepage"; -import {CHR_ENC_CODE_PAGES} from "../lib/ChrEnc.mjs"; +import { CHR_ENC_CODE_PAGES } from "../lib/ChrEnc.mjs"; /** * Encode text operation */ class EncodeText extends Operation { - /** * EncodeText constructor */ @@ -26,8 +25,10 @@ class EncodeText extends Operation { "

    ", "Supported charsets are:", "
      ", - Object.keys(CHR_ENC_CODE_PAGES).map(e => `
    • ${e}
    • `).join("\n"), - "
    ", + Object.keys(CHR_ENC_CODE_PAGES) + .map((e) => `
  • ${e}
  • `) + .join("\n"), + "" ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Character_encoding"; this.inputType = "string"; @@ -51,8 +52,6 @@ class EncodeText extends Operation { const encoded = cptable.utils.encode(format, input); return new Uint8Array(encoded).buffer; } - } - export default EncodeText; diff --git a/src/core/operations/Enigma.mjs b/src/core/operations/Enigma.mjs index c0a75841..8a732109 100644 --- a/src/core/operations/Enigma.mjs +++ b/src/core/operations/Enigma.mjs @@ -11,7 +11,16 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ROTORS, LETTERS, ROTORS_FOURTH, REFLECTORS, Rotor, Reflector, Plugboard, EnigmaMachine} from "../lib/Enigma.mjs"; +import { + ROTORS, + LETTERS, + ROTORS_FOURTH, + REFLECTORS, + Rotor, + Reflector, + Plugboard, + EnigmaMachine +} from "../lib/Enigma.mjs"; /** * Enigma operation @@ -25,7 +34,8 @@ class Enigma extends Operation { this.name = "Enigma"; this.module = "Bletchley"; - this.description = "Encipher/decipher with the WW2 Enigma machine.

    Enigma was used by the German military, among others, around the WW2 era as a portable cipher machine to protect sensitive military, diplomatic and commercial communications.

    The standard set of German military rotors and reflectors are provided. To configure the plugboard, enter a string of connected pairs of letters, e.g. AB CD EF connects A to B, C to D, and E to F. This is also used to create your own reflectors. To create your own rotor, enter the letters that the rotor maps A to Z to, in order, optionally followed by < then a list of stepping points.
    This is deliberately fairly permissive with rotor placements etc compared to a real Enigma (on which, for example, a four-rotor Enigma uses only the thin reflectors and the beta or gamma rotor in the 4th slot).

    More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; + this.description + = "Encipher/decipher with the WW2 Enigma machine.

    Enigma was used by the German military, among others, around the WW2 era as a portable cipher machine to protect sensitive military, diplomatic and commercial communications.

    The standard set of German military rotors and reflectors are provided. To configure the plugboard, enter a string of connected pairs of letters, e.g. AB CD EF connects A to B, C to D, and E to F. This is also used to create your own reflectors. To create your own rotor, enter the letters that the rotor maps A to Z to, in order, optionally followed by < then a list of stepping points.
    This is deliberately fairly permissive with rotor placements etc compared to a real Enigma (on which, for example, a four-rotor Enigma uses only the thin reflectors and the beta or gamma rotor in the 4th slot).

    More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; this.infoURL = "https://wikipedia.org/wiki/Enigma_machine"; this.inputType = "string"; this.outputType = "string"; @@ -124,7 +134,7 @@ class Enigma extends Operation { hint: "Remove non-alphabet letters and group output", type: "boolean", value: true - }, + } ]; } @@ -157,13 +167,13 @@ class Enigma extends Operation { const plugboardstr = args[14]; const removeOther = args[15]; const rotors = []; - for (let i=0; i<4; i++) { + for (let i = 0; i < 4; i++) { if (i === 0 && model === "3-rotor") { // Skip the 4th rotor settings continue; } - const [rotorwiring, rotorsteps] = this.parseRotorStr(args[i*3 + 1], 1); - rotors.push(new Rotor(rotorwiring, rotorsteps, args[i*3 + 2], args[i*3 + 3])); + const [rotorwiring, rotorsteps] = this.parseRotorStr(args[i * 3 + 1], 1); + rotors.push(new Rotor(rotorwiring, rotorsteps, args[i * 3 + 2], args[i * 3 + 3])); } // Rotors are handled in reverse rotors.reverse(); @@ -211,7 +221,6 @@ class Enigma extends Operation { return pos; } } - } export default Enigma; diff --git a/src/core/operations/Entropy.mjs b/src/core/operations/Entropy.mjs index 296d5ee8..cb22d6dd 100644 --- a/src/core/operations/Entropy.mjs +++ b/src/core/operations/Entropy.mjs @@ -10,13 +10,12 @@ import * as nodomtemp from "nodom"; import Operation from "../Operation.mjs"; const d3 = d3temp.default ? d3temp.default : d3temp; -const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp; +const nodom = nodomtemp.default ? nodomtemp.default : nodomtemp; /** * Entropy operation */ class Entropy extends Operation { - /** * Entropy constructor */ @@ -25,7 +24,8 @@ class Entropy extends Operation { this.name = "Entropy"; this.module = "Charts"; - this.description = "Shannon Entropy, in the context of information theory, is a measure of the rate at which information is produced by a source of data. It can be used, in a broad sense, to detect whether data is likely to be structured or unstructured. 8 is the maximum, representing highly unstructured, 'random' data. English language text usually falls somewhere between 3.5 and 5. Properly encrypted or compressed data should have an entropy of over 7.5."; + this.description + = "Shannon Entropy, in the context of information theory, is a measure of the rate at which information is produced by a source of data. It can be used, in a broad sense, to detect whether data is likely to be structured or unstructured. 8 is the maximum, representing highly unstructured, 'random' data. English language text usually falls somewhere between 3.5 and 5. Properly encrypted or compressed data should have an entropy of over 7.5."; this.infoURL = "https://wikipedia.org/wiki/Entropy_(information_theory)"; this.inputType = "ArrayBuffer"; this.outputType = "json"; @@ -68,7 +68,7 @@ class Entropy extends Operation { for (i = 0; i < prob.length; i++) { p = prob[i]; - entropy += p * Math.log(p) / Math.log(2); + entropy += (p * Math.log(p)) / Math.log(2); } return -entropy; @@ -85,7 +85,7 @@ class Entropy extends Operation { const binWidth = inputBytes.length < 256 ? 8 : 256; for (let bytePos = 0; bytePos < inputBytes.length; bytePos += binWidth) { - const block = inputBytes.slice(bytePos, bytePos+binWidth); + const block = inputBytes.slice(bytePos, bytePos + binWidth); entropyData.push(this.calculateShannonEntropy(block)); } @@ -106,25 +106,21 @@ class Entropy extends Operation { */ createAxes(svg, xScale, yScale, svgHeight, svgWidth, margins, title, xTitle, yTitle) { // Axes - const yAxis = d3.axisLeft() - .scale(yScale); + const yAxis = d3.axisLeft().scale(yScale); - const xAxis = d3.axisBottom() - .scale(xScale); + const xAxis = d3.axisBottom().scale(xScale); svg.append("g") .attr("transform", `translate(0, ${svgHeight - margins.bottom})`) .call(xAxis); - svg.append("g") - .attr("transform", `translate(${margins.left},0)`) - .call(yAxis); + svg.append("g").attr("transform", `translate(${margins.left},0)`).call(yAxis); // Axes labels svg.append("text") .attr("transform", "rotate(-90)") .attr("y", 0 - margins.left) - .attr("x", 0 - (svgHeight / 2)) + .attr("x", 0 - svgHeight / 2) .attr("dy", "1em") .style("text-anchor", "middle") .text(yTitle); @@ -179,29 +175,29 @@ class Entropy extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); - const yScale = d3.scaleLinear() - .domain([0, d3.max(byteFrequency, d => d)]) + const yScale = d3 + .scaleLinear() + .domain([0, d3.max(byteFrequency, (d) => d)]) .range([svgHeight - margins.bottom, margins.top]); - const xScale = d3.scaleLinear() + const xScale = d3 + .scaleLinear() .domain([0, byteFrequency.length - 1]) .range([margins.left, svgWidth - margins.right]); - const line = d3.line() + const line = d3 + .line() .x((_, i) => xScale(i)) - .y(d => yScale(d)) + .y((d) => yScale(d)) .curve(d3.curveMonotoneX); - svg.append("path") - .datum(byteFrequency) - .attr("fill", "none") - .attr("stroke", "steelblue") - .attr("d", line); + svg.append("path").datum(byteFrequency).attr("fill", "none").attr("stroke", "steelblue").attr("d", line); this.createAxes(svg, xScale, yScale, svgHeight, svgWidth, margins, "", "Byte", "Byte Frequency"); @@ -223,27 +219,31 @@ class Entropy extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); - const yExtent = d3.extent(byteFrequency, d => d); - const yScale = d3.scaleLinear() + const yExtent = d3.extent(byteFrequency, (d) => d); + const yScale = d3 + .scaleLinear() .domain(yExtent) .range([svgHeight - margins.bottom, margins.top]); - const xScale = d3.scaleLinear() + const xScale = d3 + .scaleLinear() .domain([0, byteFrequency.length - 1]) .range([margins.left - binWidth, svgWidth - margins.right]); svg.selectAll("rect") .data(byteFrequency) - .enter().append("rect") + .enter() + .append("rect") .attr("x", (_, i) => xScale(i) + binWidth) - .attr("y", dataPoint => yScale(dataPoint)) + .attr("y", (dataPoint) => yScale(dataPoint)) .attr("width", binWidth) - .attr("height", dataPoint => yScale(yExtent[0]) - yScale(dataPoint)) + .attr("height", (dataPoint) => yScale(yExtent[0]) - yScale(dataPoint)) .attr("fill", "blue"); this.createAxes(svg, xScale, yScale, svgHeight, svgWidth, margins, "", "Byte", "Byte Frequency"); @@ -265,28 +265,30 @@ class Entropy extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); - const yScale = d3.scaleLinear() - .domain([0, d3.max(entropyData, d => d)]) + const yScale = d3 + .scaleLinear() + .domain([0, d3.max(entropyData, (d) => d)]) .range([svgHeight - margins.bottom, margins.top]); - const xScale = d3.scaleLinear() + const xScale = d3 + .scaleLinear() .domain([0, entropyData.length]) .range([margins.left, svgWidth - margins.right]); - const line = d3.line() + const line = d3 + .line() .x((_, i) => xScale(i)) - .y(d => yScale(d)) + .y((d) => yScale(d)) .curve(d3.curveMonotoneX); if (entropyData.length > 0) { - svg.append("path") - .datum(entropyData) - .attr("d", line); + svg.append("path").datum(entropyData).attr("d", line); svg.selectAll("path").attr("fill", "none").attr("stroke", "steelblue"); } @@ -318,25 +320,27 @@ class Entropy extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); - const greyScale = d3.scaleLinear() - .domain([0, d3.max(entropyData, d => d)]) + const greyScale = d3 + .scaleLinear() + .domain([0, d3.max(entropyData, (d) => d)]) .range(["#000000", "#FFFFFF"]) .interpolate(d3.interpolateRgb); - svg - .selectAll("rect") + svg.selectAll("rect") .data(nodes) - .enter().append("rect") - .attr("x", d => d.x * cellSize) - .attr("y", d => d.y * cellSize) + .enter() + .append("rect") + .attr("x", (d) => d.x * cellSize) + .attr("y", (d) => d.y * cellSize) .attr("width", cellSize) .attr("height", cellSize) - .style("fill", d => greyScale(d.entropy)); + .style("fill", (d) => greyScale(d.entropy)); return svg._groups[0][0].outerHTML; } diff --git a/src/core/operations/EscapeString.mjs b/src/core/operations/EscapeString.mjs index 3ddea181..e4979cfa 100644 --- a/src/core/operations/EscapeString.mjs +++ b/src/core/operations/EscapeString.mjs @@ -12,7 +12,6 @@ import jsesc from "jsesc"; * Escape string operation */ class EscapeString extends Operation { - /** * EscapeString constructor */ @@ -21,7 +20,8 @@ class EscapeString extends Operation { this.name = "Escape string"; this.module = "Default"; - this.description = "Escapes special characters in a string so that they do not cause conflicts. For example, Don't stop me now becomes Don\\'t stop me now.

    Supports the following escape sequences:
    • \\n (Line feed/newline)
    • \\r (Carriage return)
    • \\t (Horizontal tab)
    • \\b (Backspace)
    • \\f (Form feed)
    • \\xnn (Hex, where n is 0-f)
    • \\\\ (Backslash)
    • \\' (Single quote)
    • \\" (Double quote)
    • \\unnnn (Unicode character)
    • \\u{nnnnnn} (Unicode code point)
    "; + this.description + = "Escapes special characters in a string so that they do not cause conflicts. For example, Don't stop me now becomes Don\\'t stop me now.

    Supports the following escape sequences:
    • \\n (Line feed/newline)
    • \\r (Carriage return)
    • \\t (Horizontal tab)
    • \\b (Backspace)
    • \\f (Form feed)
    • \\xnn (Hex, where n is 0-f)
    • \\\\ (Backslash)
    • \\' (Single quote)
    • \\" (Double quote)
    • \\unnnn (Unicode character)
    • \\u{nnnnnn} (Unicode code point)
    "; this.infoURL = "https://wikipedia.org/wiki/Escape_sequence"; this.inputType = "string"; this.outputType = "string"; @@ -79,10 +79,9 @@ class EscapeString extends Operation { escapeEverything: level === "Everything", minimal: level === "Minimal", json: jsonCompat, - lowercaseHex: lowercaseHex, + lowercaseHex: lowercaseHex }); } - } export default EscapeString; diff --git a/src/core/operations/EscapeUnicodeCharacters.mjs b/src/core/operations/EscapeUnicodeCharacters.mjs index db2680c0..dadd476a 100644 --- a/src/core/operations/EscapeUnicodeCharacters.mjs +++ b/src/core/operations/EscapeUnicodeCharacters.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Escape Unicode Characters operation */ class EscapeUnicodeCharacters extends Operation { - /** * EscapeUnicodeCharacters constructor */ @@ -19,7 +18,8 @@ class EscapeUnicodeCharacters extends Operation { this.name = "Escape Unicode Characters"; this.module = "Default"; - this.description = "Converts characters to their unicode-escaped notations.

    Supports the prefixes:
    • \\u
    • %u
    • U+
    e.g. σου becomes \\u03C3\\u03BF\\u03C5"; + this.description + = "Converts characters to their unicode-escaped notations.

    Supports the prefixes:
    • \\u
    • %u
    • U+
    e.g. σου becomes \\u03C3\\u03BF\\u03C5"; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -90,7 +90,6 @@ class EscapeUnicodeCharacters extends Operation { return output; } - } export default EscapeUnicodeCharacters; diff --git a/src/core/operations/ExpandAlphabetRange.mjs b/src/core/operations/ExpandAlphabetRange.mjs index 62afeb65..3fdb5b5e 100644 --- a/src/core/operations/ExpandAlphabetRange.mjs +++ b/src/core/operations/ExpandAlphabetRange.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Expand alphabet range operation */ class ExpandAlphabetRange extends Operation { - /** * ExpandAlphabetRange constructor */ @@ -20,7 +19,8 @@ class ExpandAlphabetRange extends Operation { this.name = "Expand alphabet range"; this.module = "Default"; - this.description = "Expand an alphabet range string into a list of the characters in that range.

    e.g. a-z becomes abcdefghijklmnopqrstuvwxyz."; + this.description + = "Expand an alphabet range string into a list of the characters in that range.

    e.g. a-z becomes abcdefghijklmnopqrstuvwxyz."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -40,7 +40,6 @@ class ExpandAlphabetRange extends Operation { run(input, args) { return Utils.expandAlphRange(input).join(args[0]); } - } export default ExpandAlphabetRange; diff --git a/src/core/operations/ExtractDates.mjs b/src/core/operations/ExtractDates.mjs index 74c177d3..a947cc0a 100644 --- a/src/core/operations/ExtractDates.mjs +++ b/src/core/operations/ExtractDates.mjs @@ -11,7 +11,6 @@ import { search } from "../lib/Extract.mjs"; * Extract dates operation */ class ExtractDates extends Operation { - /** * ExtractDates constructor */ @@ -20,7 +19,8 @@ class ExtractDates extends Operation { this.name = "Extract dates"; this.module = "Regex"; - this.description = "Extracts dates in the following formats
    • yyyy-mm-dd
    • dd/mm/yyyy
    • mm/dd/yyyy
    Dividers can be any of /, -, . or space"; + this.description + = "Extracts dates in the following formats
    • yyyy-mm-dd
    • dd/mm/yyyy
    • mm/dd/yyyy
    Dividers can be any of /, -, . or space"; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -52,7 +52,6 @@ class ExtractDates extends Operation { return results.join("\n"); } } - } export default ExtractDates; diff --git a/src/core/operations/ExtractDomains.mjs b/src/core/operations/ExtractDomains.mjs index c28efbb5..c93dc97d 100644 --- a/src/core/operations/ExtractDomains.mjs +++ b/src/core/operations/ExtractDomains.mjs @@ -12,7 +12,6 @@ import { caseInsensitiveSort } from "../lib/Sort.mjs"; * Extract domains operation */ class ExtractDomains extends Operation { - /** * ExtractDomains constructor */ @@ -21,7 +20,8 @@ class ExtractDomains extends Operation { this.name = "Extract domains"; this.module = "Regex"; - this.description = "Extracts fully qualified domain names.
    Note that this will not include paths. Use Extract URLs to find entire URLs."; + this.description + = "Extracts fully qualified domain names.
    Note that this will not include paths. Use Extract URLs to find entire URLs."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -51,13 +51,7 @@ class ExtractDomains extends Operation { run(input, args) { const [displayTotal, sort, unique] = args; - const results = search( - input, - DOMAIN_REGEX, - null, - sort ? caseInsensitiveSort : null, - unique - ); + const results = search(input, DOMAIN_REGEX, null, sort ? caseInsensitiveSort : null, unique); if (displayTotal) { return `Total found: ${results.length}\n\n${results.join("\n")}`; @@ -65,7 +59,6 @@ class ExtractDomains extends Operation { return results.join("\n"); } } - } export default ExtractDomains; diff --git a/src/core/operations/ExtractEXIF.mjs b/src/core/operations/ExtractEXIF.mjs index 7edc8b80..19ffc801 100644 --- a/src/core/operations/ExtractEXIF.mjs +++ b/src/core/operations/ExtractEXIF.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Extract EXIF operation */ class ExtractEXIF extends Operation { - /** * ExtractEXIF constructor */ @@ -26,7 +25,7 @@ class ExtractEXIF extends Operation { "

    ", "EXIF data is metadata embedded in images (JPEG, JPG, TIFF) and audio files.", "

    ", - "EXIF data from photos usually contains information about the image file itself as well as the device used to create it.", + "EXIF data from photos usually contains information about the image file itself as well as the device used to create it." ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Exif"; this.inputType = "ArrayBuffer"; @@ -57,7 +56,6 @@ class ExtractEXIF extends Operation { throw new OperationError(`Could not extract EXIF data from image: ${err}`); } } - } export default ExtractEXIF; diff --git a/src/core/operations/ExtractEmailAddresses.mjs b/src/core/operations/ExtractEmailAddresses.mjs index f50e1aaf..47d94756 100644 --- a/src/core/operations/ExtractEmailAddresses.mjs +++ b/src/core/operations/ExtractEmailAddresses.mjs @@ -12,7 +12,6 @@ import { caseInsensitiveSort } from "../lib/Sort.mjs"; * Extract email addresses operation */ class ExtractEmailAddresses extends Operation { - /** * ExtractEmailAddresses constructor */ @@ -51,15 +50,10 @@ class ExtractEmailAddresses extends Operation { run(input, args) { const [displayTotal, sort, unique] = args, // email regex from: https://www.regextester.com/98066 - regex = /(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?\.)+[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}\])/ig; + regex + = /(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?\.)+[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}\])/gi; - const results = search( - input, - regex, - null, - sort ? caseInsensitiveSort : null, - unique - ); + const results = search(input, regex, null, sort ? caseInsensitiveSort : null, unique); if (displayTotal) { return `Total found: ${results.length}\n\n${results.join("\n")}`; @@ -67,7 +61,6 @@ class ExtractEmailAddresses extends Operation { return results.join("\n"); } } - } export default ExtractEmailAddresses; diff --git a/src/core/operations/ExtractFilePaths.mjs b/src/core/operations/ExtractFilePaths.mjs index 5de76fe5..629da809 100644 --- a/src/core/operations/ExtractFilePaths.mjs +++ b/src/core/operations/ExtractFilePaths.mjs @@ -12,7 +12,6 @@ import { caseInsensitiveSort } from "../lib/Sort.mjs"; * Extract file paths operation */ class ExtractFilePaths extends Operation { - /** * ExtractFilePaths constructor */ @@ -21,7 +20,8 @@ class ExtractFilePaths extends Operation { this.name = "Extract file paths"; this.module = "Regex"; - this.description = "Extracts anything that looks like a Windows or UNIX file path.

    Note that if UNIX is selected, there will likely be a lot of false positives."; + this.description + = "Extracts anything that looks like a Windows or UNIX file path.

    Note that if UNIX is selected, there will likely be a lot of false positives."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -63,8 +63,7 @@ class ExtractFilePaths extends Operation { winDrive = "[A-Z]:\\\\", winName = "[A-Z\\d][A-Z\\d\\- '_\\(\\)~]{0,61}", winExt = "[A-Z\\d]{1,6}", - winPath = winDrive + "(?:" + winName + "\\\\?)*" + winName + - "(?:\\." + winExt + ")?", + winPath = winDrive + "(?:" + winName + "\\\\?)*" + winName + "(?:\\." + winExt + ")?", unixPath = "(?:/[A-Z\\d.][A-Z\\d\\-.]{0,61})+"; let filePaths = ""; @@ -81,22 +80,14 @@ class ExtractFilePaths extends Operation { } const regex = new RegExp(filePaths, "ig"); - const results = search( - input, - regex, - null, - sort ? caseInsensitiveSort : null, - unique - ); + const results = search(input, regex, null, sort ? caseInsensitiveSort : null, unique); if (displayTotal) { return `Total found: ${results.length}\n\n${results.join("\n")}`; } else { return results.join("\n"); } - } - } export default ExtractFilePaths; diff --git a/src/core/operations/ExtractFiles.mjs b/src/core/operations/ExtractFiles.mjs index 3ff8ffb6..79f2af7c 100644 --- a/src/core/operations/ExtractFiles.mjs +++ b/src/core/operations/ExtractFiles.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {scanForFileTypes, extractFile} from "../lib/FileType.mjs"; -import {FILE_SIGNATURES} from "../lib/FileSignatures.mjs"; +import { scanForFileTypes, extractFile } from "../lib/FileType.mjs"; +import { FILE_SIGNATURES } from "../lib/FileSignatures.mjs"; /** * Extract Files operation */ class ExtractFiles extends Operation { - /** * ExtractFiles constructor */ @@ -22,10 +21,8 @@ class ExtractFiles extends Operation { super(); // Get the first extension for each signature that can be extracted - let supportedExts = Object.keys(FILE_SIGNATURES).map(cat => { - return FILE_SIGNATURES[cat] - .filter(sig => sig.extractor) - .map(sig => sig.extension.toUpperCase()); + let supportedExts = Object.keys(FILE_SIGNATURES).map((cat) => { + return FILE_SIGNATURES[cat].filter((sig) => sig.extractor).map((sig) => sig.extension.toUpperCase()); }); // Flatten categories and remove duplicates @@ -43,24 +40,26 @@ class ExtractFiles extends Operation { this.inputType = "ArrayBuffer"; this.outputType = "List"; this.presentType = "html"; - this.args = Object.keys(FILE_SIGNATURES).map(cat => { - return { - name: cat, - type: "boolean", - value: cat === "Miscellaneous" ? false : true - }; - }).concat([ - { - name: "Ignore failed extractions", - type: "boolean", - value: true - }, - { - name: "Minimum File Size", - type: "number", - value: 100 - } - ]); + this.args = Object.keys(FILE_SIGNATURES) + .map((cat) => { + return { + name: cat, + type: "boolean", + value: cat === "Miscellaneous" ? false : true + }; + }) + .concat([ + { + name: "Ignore failed extractions", + type: "boolean", + value: true + }, + { + name: "Minimum File Size", + type: "number", + value: 100 + } + ]); } /** @@ -84,17 +83,16 @@ class ExtractFiles extends Operation { // Extract each file that we support const files = []; const errors = []; - detectedFiles.forEach(detectedFile => { + detectedFiles.forEach((detectedFile) => { try { const file = extractFile(bytes, detectedFile.fileDetails, detectedFile.offset); - if (file.size >= minSize) - files.push(file); + if (file.size >= minSize) files.push(file); } catch (err) { if (!ignoreFailedExtractions && err.message.indexOf("No extraction algorithm available") < 0) { errors.push( - `Error while attempting to extract ${detectedFile.fileDetails.name} ` + - `at offset ${detectedFile.offset}:\n` + - `${err.message}` + `Error while attempting to extract ${detectedFile.fileDetails.name} ` + + `at offset ${detectedFile.offset}:\n` + + `${err.message}` ); } } @@ -107,7 +105,6 @@ class ExtractFiles extends Operation { return files; } - /** * Displays the files in HTML for web apps. * @@ -117,7 +114,6 @@ class ExtractFiles extends Operation { async present(files) { return await Utils.displayFilesAsHTML(files); } - } export default ExtractFiles; diff --git a/src/core/operations/ExtractID3.mjs b/src/core/operations/ExtractID3.mjs index b06bdcfe..09a17e1e 100644 --- a/src/core/operations/ExtractID3.mjs +++ b/src/core/operations/ExtractID3.mjs @@ -13,7 +13,6 @@ import Utils from "../Utils.mjs"; * Extract ID3 operation */ class ExtractID3 extends Operation { - /** * ExtractID3 constructor */ @@ -22,7 +21,8 @@ class ExtractID3 extends Operation { this.name = "Extract ID3"; this.module = "Default"; - this.description = "This operation extracts ID3 metadata from an MP3 file.

    ID3 is a metadata container most often used in conjunction with the MP3 audio file format. It allows information such as the title, artist, album, track number, and other information about the file to be stored in the file itself."; + this.description + = "This operation extracts ID3 metadata from an MP3 file.

    ID3 is a metadata container most often used in conjunction with the MP3 audio file format. It allows information such as the title, artist, album, track number, and other information about the file to be stored in the file itself."; this.infoURL = "https://wikipedia.org/wiki/ID3"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -67,7 +67,7 @@ class ExtractID3 extends Operation { let result = 0; // The sizes are 7 bit numbers stored in 8 bit locations - for (let i = (num) * 7; i; i -= 7) { + for (let i = num * 7; i; i -= 7) { result = (result << i) | input[0]; input = input.slice(1); } @@ -91,8 +91,7 @@ class ExtractID3 extends Operation { // Read data from frame let data = ""; - for (let i = 1; i < size; i++) - data += String.fromCharCode(input[i]); + for (let i = 1; i < size; i++) data += String.fromCharCode(input[i]); frame.Data = data; // Move to next Frame @@ -111,7 +110,6 @@ class ExtractID3 extends Operation { // While the current element is in the header while (pos < headerTagSize) { - // Frame Identifier of frame let id = String.fromCharCode(input[0]) + String.fromCharCode(input[1]) + String.fromCharCode(input[2]); input = input.slice(3); @@ -126,7 +124,8 @@ class ExtractID3 extends Operation { const [frame, size] = readFrame(id); tags[id] = frame; pos += 10 + size; - } else if (id === "\x00\x00\x00") { // end of header + } else if (id === "\x00\x00\x00") { + // end of header break; } else { throw new OperationError("Unknown Frame Identifier: " + id); @@ -144,8 +143,7 @@ class ExtractID3 extends Operation { * @returns {html} */ present(data) { - if (!data || !Object.prototype.hasOwnProperty.call(data, "Tags")) - return JSON.stringify(data, null, 4); + if (!data || !Object.prototype.hasOwnProperty.call(data, "Tags")) return JSON.stringify(data, null, 4); let output = ``; @@ -158,7 +156,6 @@ class ExtractID3 extends Operation { output += "
    TagDescriptionData
    "; return output; } - } // Borrowed from https://github.com/aadsm/jsmediatags diff --git a/src/core/operations/ExtractIPAddresses.mjs b/src/core/operations/ExtractIPAddresses.mjs index 97b52478..93c46cf3 100644 --- a/src/core/operations/ExtractIPAddresses.mjs +++ b/src/core/operations/ExtractIPAddresses.mjs @@ -12,7 +12,6 @@ import { ipSort } from "../lib/Sort.mjs"; * Extract IP addresses operation */ class ExtractIPAddresses extends Operation { - /** * ExtractIPAddresses constructor */ @@ -21,7 +20,8 @@ class ExtractIPAddresses extends Operation { this.name = "Extract IP addresses"; this.module = "Regex"; - this.description = "Extracts all IPv4 and IPv6 addresses.

    Warning: Given a string 710.65.0.456, this will match 10.65.0.45 so always check the original input!"; + this.description + = "Extracts all IPv4 and IPv6 addresses.

    Warning: Given a string 710.65.0.456, this will match 10.65.0.45 so always check the original input!"; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -65,9 +65,11 @@ class ExtractIPAddresses extends Operation { */ run(input, args) { const [includeIpv4, includeIpv6, removeLocal, displayTotal, sort, unique] = args, - ipv4 = "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", - ipv6 = "((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})(([\\dA-F]{1,4}((?!\\3)::|:\\b|(?![\\dA-F])))|(?!\\2\\3)){2}"; - let ips = ""; + ipv4 + = "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", + ipv6 + = "((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})(([\\dA-F]{1,4}((?!\\3)::|:\\b|(?![\\dA-F])))|(?!\\2\\3)){2}"; + let ips = ""; if (includeIpv4 && includeIpv6) { ips = ipv4 + "|" + ipv6; @@ -85,16 +87,9 @@ class ExtractIPAddresses extends Operation { oneninetwo = "192\\.168\\..+", oneseventwo = "172\\.(?:1[6-9]|2\\d|3[01])\\..+", onetwoseven = "127\\..+", - removeRegex = new RegExp("^(?:" + ten + "|" + oneninetwo + - "|" + oneseventwo + "|" + onetwoseven + ")"); + removeRegex = new RegExp("^(?:" + ten + "|" + oneninetwo + "|" + oneseventwo + "|" + onetwoseven + ")"); - const results = search( - input, - regex, - removeLocal ? removeRegex : null, - sort ? ipSort : null, - unique - ); + const results = search(input, regex, removeLocal ? removeRegex : null, sort ? ipSort : null, unique); if (displayTotal) { return `Total found: ${results.length}\n\n${results.join("\n")}`; @@ -102,7 +97,6 @@ class ExtractIPAddresses extends Operation { return results.join("\n"); } } - } export default ExtractIPAddresses; diff --git a/src/core/operations/ExtractLSB.mjs b/src/core/operations/ExtractLSB.mjs index 12f990da..59ac4e60 100644 --- a/src/core/operations/ExtractLSB.mjs +++ b/src/core/operations/ExtractLSB.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Extract LSB operation */ class ExtractLSB extends Operation { - /** * ExtractLSB constructor */ @@ -24,7 +23,8 @@ class ExtractLSB extends Operation { this.name = "Extract LSB"; this.module = "Image"; - this.description = "Extracts the Least Significant Bit data from each pixel in an image. This is a common way to hide data in Steganography."; + this.description + = "Extracts the Least Significant Bit data from each pixel in an image. This is a common way to hide data in Steganography."; this.infoURL = "https://wikipedia.org/wiki/Bit_numbering#Least_significant_bit_in_digital_steganography"; this.inputType = "ArrayBuffer"; this.outputType = "byteArray"; @@ -32,27 +32,27 @@ class ExtractLSB extends Operation { { name: "Colour Pattern #1", type: "option", - value: COLOUR_OPTIONS, + value: COLOUR_OPTIONS }, { name: "Colour Pattern #2", type: "option", - value: ["", ...COLOUR_OPTIONS], + value: ["", ...COLOUR_OPTIONS] }, { name: "Colour Pattern #3", type: "option", - value: ["", ...COLOUR_OPTIONS], + value: ["", ...COLOUR_OPTIONS] }, { name: "Colour Pattern #4", type: "option", - value: ["", ...COLOUR_OPTIONS], + value: ["", ...COLOUR_OPTIONS] }, { name: "Pixel Order", type: "option", - value: ["Row", "Column"], + value: ["Row", "Column"] }, { name: "Bit", @@ -72,7 +72,7 @@ class ExtractLSB extends Operation { const bit = 7 - args.pop(), pixelOrder = args.pop(), - colours = args.filter(option => option !== "").map(option => COLOUR_OPTIONS.indexOf(option)), + colours = args.filter((option) => option !== "").map((option) => COLOUR_OPTIONS.indexOf(option)), parsedImage = await jimp.read(input), width = parsedImage.bitmap.width, height = parsedImage.bitmap.height, @@ -82,7 +82,8 @@ class ExtractLSB extends Operation { throw new OperationError("Error: Bit argument must be between 0 and 7"); } - let i, combinedBinary = ""; + let i, + combinedBinary = ""; if (pixelOrder === "Row") { for (i = 0; i < rgba.length; i += 4) { @@ -106,7 +107,6 @@ class ExtractLSB extends Operation { return fromBinary(combinedBinary); } - } const COLOUR_OPTIONS = ["R", "G", "B", "A"]; diff --git a/src/core/operations/ExtractMACAddresses.mjs b/src/core/operations/ExtractMACAddresses.mjs index 1689d18f..e89942e8 100644 --- a/src/core/operations/ExtractMACAddresses.mjs +++ b/src/core/operations/ExtractMACAddresses.mjs @@ -12,7 +12,6 @@ import { hexadecimalSort } from "../lib/Sort.mjs"; * Extract MAC addresses operation */ class ExtractMACAddresses extends Operation { - /** * ExtractMACAddresses constructor */ @@ -50,14 +49,8 @@ class ExtractMACAddresses extends Operation { */ run(input, args) { const [displayTotal, sort, unique] = args, - regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/ig, - results = search( - input, - regex, - null, - sort ? hexadecimalSort : null, - unique - ); + regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/gi, + results = search(input, regex, null, sort ? hexadecimalSort : null, unique); if (displayTotal) { return `Total found: ${results.length}\n\n${results.join("\n")}`; @@ -65,7 +58,6 @@ class ExtractMACAddresses extends Operation { return results.join("\n"); } } - } export default ExtractMACAddresses; diff --git a/src/core/operations/ExtractRGBA.mjs b/src/core/operations/ExtractRGBA.mjs index 7d2fc274..82cd143d 100644 --- a/src/core/operations/ExtractRGBA.mjs +++ b/src/core/operations/ExtractRGBA.mjs @@ -9,13 +9,12 @@ import OperationError from "../errors/OperationError.mjs"; import { isImage } from "../lib/FileType.mjs"; import jimp from "jimp"; -import {RGBA_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { RGBA_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Extract RGBA operation */ class ExtractRGBA extends Operation { - /** * ExtractRGBA constructor */ @@ -24,7 +23,8 @@ class ExtractRGBA extends Operation { this.name = "Extract RGBA"; this.module = "Image"; - this.description = "Extracts each pixel's RGBA value in an image. These are sometimes used in Steganography to hide text or data."; + this.description + = "Extracts each pixel's RGBA value in an image. These are sometimes used in Steganography to hide text or data."; this.infoURL = "https://wikipedia.org/wiki/RGBA_color_space"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -59,7 +59,6 @@ class ExtractRGBA extends Operation { return bitmap.join(delimiter); } - } export default ExtractRGBA; diff --git a/src/core/operations/ExtractURLs.mjs b/src/core/operations/ExtractURLs.mjs index 32cdb3a7..4142a2b6 100644 --- a/src/core/operations/ExtractURLs.mjs +++ b/src/core/operations/ExtractURLs.mjs @@ -12,7 +12,6 @@ import { caseInsensitiveSort } from "../lib/Sort.mjs"; * Extract URLs operation */ class ExtractURLs extends Operation { - /** * ExtractURLs constructor */ @@ -21,7 +20,8 @@ class ExtractURLs extends Operation { this.name = "Extract URLs"; this.module = "Regex"; - this.description = "Extracts Uniform Resource Locators (URLs) from the input. The protocol (http, ftp etc.) is required otherwise there will be far too many false positives."; + this.description + = "Extracts Uniform Resource Locators (URLs) from the input. The protocol (http, ftp etc.) is required otherwise there will be far too many false positives."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -50,13 +50,7 @@ class ExtractURLs extends Operation { */ run(input, args) { const [displayTotal, sort, unique] = args; - const results = search( - input, - URL_REGEX, - null, - sort ? caseInsensitiveSort : null, - unique - ); + const results = search(input, URL_REGEX, null, sort ? caseInsensitiveSort : null, unique); if (displayTotal) { return `Total found: ${results.length}\n\n${results.join("\n")}`; @@ -64,7 +58,6 @@ class ExtractURLs extends Operation { return results.join("\n"); } } - } export default ExtractURLs; diff --git a/src/core/operations/FernetDecrypt.mjs b/src/core/operations/FernetDecrypt.mjs index 78d6efb9..459f0c67 100644 --- a/src/core/operations/FernetDecrypt.mjs +++ b/src/core/operations/FernetDecrypt.mjs @@ -20,7 +20,8 @@ class FernetDecrypt extends Operation { this.name = "Fernet Decrypt"; this.module = "Default"; - this.description = "Fernet is a symmetric encryption method which makes sure that the message encrypted cannot be manipulated/read without the key. It uses URL safe encoding for the keys. Fernet uses 128-bit AES in CBC mode and PKCS7 padding, with HMAC using SHA256 for authentication. The IV is created from os.random().

    Key: The key must be 32 bytes (256 bits) encoded with Base64."; + this.description + = "Fernet is a symmetric encryption method which makes sure that the message encrypted cannot be manipulated/read without the key. It uses URL safe encoding for the keys. Fernet uses 128-bit AES in CBC mode and PKCS7 padding, with HMAC using SHA256 for authentication. The IV is created from os.random().

    Key: The key must be 32 bytes (256 bits) encoded with Base64."; this.infoURL = "https://asecuritysite.com/encryption/fer"; this.inputType = "string"; this.outputType = "string"; @@ -29,14 +30,14 @@ class FernetDecrypt extends Operation { "name": "Key", "type": "string", "value": "" - }, + } ]; this.patterns = [ { match: "^[A-Z\\d\\-_=]{20,}$", flags: "i", args: [] - }, + } ]; } /** diff --git a/src/core/operations/FernetEncrypt.mjs b/src/core/operations/FernetEncrypt.mjs index 84778486..44782bb8 100644 --- a/src/core/operations/FernetEncrypt.mjs +++ b/src/core/operations/FernetEncrypt.mjs @@ -20,7 +20,8 @@ class FernetEncrypt extends Operation { this.name = "Fernet Encrypt"; this.module = "Default"; - this.description = "Fernet is a symmetric encryption method which makes sure that the message encrypted cannot be manipulated/read without the key. It uses URL safe encoding for the keys. Fernet uses 128-bit AES in CBC mode and PKCS7 padding, with HMAC using SHA256 for authentication. The IV is created from os.random().

    Key: The key must be 32 bytes (256 bits) encoded with Base64."; + this.description + = "Fernet is a symmetric encryption method which makes sure that the message encrypted cannot be manipulated/read without the key. It uses URL safe encoding for the keys. Fernet uses 128-bit AES in CBC mode and PKCS7 padding, with HMAC using SHA256 for authentication. The IV is created from os.random().

    Key: The key must be 32 bytes (256 bits) encoded with Base64."; this.infoURL = "https://asecuritysite.com/encryption/fer"; this.inputType = "string"; this.outputType = "string"; @@ -29,7 +30,7 @@ class FernetEncrypt extends Operation { "name": "Key", "type": "string", "value": "" - }, + } ]; } /** @@ -42,7 +43,7 @@ class FernetEncrypt extends Operation { try { const secret = new fernet.Secret(secretInput); const token = new fernet.Token({ - secret: secret, + secret: secret }); return token.encode(input); } catch (err) { diff --git a/src/core/operations/FileTree.mjs b/src/core/operations/FileTree.mjs index 8321f8f5..56681a59 100644 --- a/src/core/operations/FileTree.mjs +++ b/src/core/operations/FileTree.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Unique operation */ class FileTree extends Operation { - /** * Unique constructor */ @@ -44,7 +43,6 @@ class FileTree extends Operation { * @returns {string} */ run(input, args) { - // Set up arrow and pipe for nice output display const ARROW = "|---"; const PIPE = "| "; @@ -74,8 +72,8 @@ class FileTree extends Operation { printLine = path[j]; key = path[j]; } else { - printLine = PIPE.repeat(j-1) + ARROW + path[j]; - key = path.slice(0, j+1).join("/"); + printLine = PIPE.repeat(j - 1) + ARROW + path[j]; + key = path.slice(0, j + 1).join("/"); } // Check to see we have already added that path @@ -87,7 +85,6 @@ class FileTree extends Operation { } return printList.join("\n"); } - } export default FileTree; diff --git a/src/core/operations/Filter.mjs b/src/core/operations/Filter.mjs index 904bb65f..e1d398c8 100644 --- a/src/core/operations/Filter.mjs +++ b/src/core/operations/Filter.mjs @@ -6,7 +6,7 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; import OperationError from "../errors/OperationError.mjs"; import XRegExp from "xregexp"; @@ -14,7 +14,6 @@ import XRegExp from "xregexp"; * Filter operation */ class Filter extends Operation { - /** * Filter constructor */ @@ -23,7 +22,8 @@ class Filter extends Operation { this.name = "Filter"; this.module = "Regex"; - this.description = "Splits up the input using the specified delimiter and then filters each branch based on a regular expression."; + this.description + = "Splits up the input using the specified delimiter and then filters each branch based on a regular expression."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -61,13 +61,12 @@ class Filter extends Operation { throw new OperationError(`Invalid regex. Details: ${err.message}`); } - const regexFilter = function(value) { + const regexFilter = function (value) { return reverse ^ regex.test(value); }; return input.split(delim).filter(regexFilter).join(delim); } - } export default Filter; diff --git a/src/core/operations/FindReplace.mjs b/src/core/operations/FindReplace.mjs index 4fc1e43c..119c26f4 100644 --- a/src/core/operations/FindReplace.mjs +++ b/src/core/operations/FindReplace.mjs @@ -12,7 +12,6 @@ import XRegExp from "xregexp"; * Find / Replace operation */ class FindReplace extends Operation { - /** * FindReplace constructor */ @@ -21,7 +20,8 @@ class FindReplace extends Operation { this.name = "Find / Replace"; this.module = "Regex"; - this.description = "Replaces all occurrences of the first string with the second.

    Includes support for regular expressions (regex), simple strings and extended strings (which support \\n, \\r, \\t, \\b, \\f and escaped hex bytes using \\x notation, e.g. \\x00 for a null byte)."; + this.description + = "Replaces all occurrences of the first string with the second.

    Includes support for regular expressions (regex), simple strings and extended strings (which support \\n, \\r, \\t, \\b, \\f and escaped hex bytes using \\x notation, e.g. \\x00 for a null byte)."; this.infoURL = "https://wikipedia.org/wiki/Regular_expression"; this.inputType = "string"; this.outputType = "string"; @@ -66,7 +66,7 @@ class FindReplace extends Operation { * @returns {string} */ run(input, args) { - const [{option: type}, replace, g, i, m, s] = args; + const [{ option: type }, replace, g, i, m, s] = args; let find = args[0].string, modifiers = ""; @@ -88,7 +88,6 @@ class FindReplace extends Operation { return input.replace(find, replace); } - } export default FindReplace; diff --git a/src/core/operations/Fletcher16Checksum.mjs b/src/core/operations/Fletcher16Checksum.mjs index b91ec2a8..6a9064e0 100644 --- a/src/core/operations/Fletcher16Checksum.mjs +++ b/src/core/operations/Fletcher16Checksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Fletcher-16 Checksum operation */ class Fletcher16Checksum extends Operation { - /** * Fletcher16Checksum constructor */ @@ -20,7 +19,8 @@ class Fletcher16Checksum extends Operation { this.name = "Fletcher-16 Checksum"; this.module = "Crypto"; - this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

    The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; + this.description + = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

    The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-16"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -44,7 +44,6 @@ class Fletcher16Checksum extends Operation { return Utils.hex(((b << 8) | a) >>> 0, 4); } - } export default Fletcher16Checksum; diff --git a/src/core/operations/Fletcher32Checksum.mjs b/src/core/operations/Fletcher32Checksum.mjs index 7b41ce55..7871c1fd 100644 --- a/src/core/operations/Fletcher32Checksum.mjs +++ b/src/core/operations/Fletcher32Checksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Fletcher-32 Checksum operation */ class Fletcher32Checksum extends Operation { - /** * Fletcher32Checksum constructor */ @@ -20,7 +19,8 @@ class Fletcher32Checksum extends Operation { this.name = "Fletcher-32 Checksum"; this.module = "Crypto"; - this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

    The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; + this.description + = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

    The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-32"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -52,7 +52,6 @@ class Fletcher32Checksum extends Operation { return Utils.hex(((b << 16) | a) >>> 0, 8); } - } export default Fletcher32Checksum; diff --git a/src/core/operations/Fletcher64Checksum.mjs b/src/core/operations/Fletcher64Checksum.mjs index 68328ea3..11ec4db3 100644 --- a/src/core/operations/Fletcher64Checksum.mjs +++ b/src/core/operations/Fletcher64Checksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Fletcher-64 Checksum operation */ class Fletcher64Checksum extends Operation { - /** * Fletcher64Checksum constructor */ @@ -20,7 +19,8 @@ class Fletcher64Checksum extends Operation { this.name = "Fletcher-64 Checksum"; this.module = "Crypto"; - this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

    The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; + this.description + = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

    The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-64"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -56,7 +56,6 @@ class Fletcher64Checksum extends Operation { return Utils.hex(b >>> 0, 8) + Utils.hex(a >>> 0, 8); } - } export default Fletcher64Checksum; diff --git a/src/core/operations/Fletcher8Checksum.mjs b/src/core/operations/Fletcher8Checksum.mjs index 1200c00c..04b5ca54 100644 --- a/src/core/operations/Fletcher8Checksum.mjs +++ b/src/core/operations/Fletcher8Checksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Fletcher-8 Checksum operation */ class Fletcher8Checksum extends Operation { - /** * Fletcher8Checksum constructor */ @@ -20,7 +19,8 @@ class Fletcher8Checksum extends Operation { this.name = "Fletcher-8 Checksum"; this.module = "Crypto"; - this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

    The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; + this.description + = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

    The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -44,7 +44,6 @@ class Fletcher8Checksum extends Operation { return Utils.hex(((b << 4) | a) >>> 0, 2); } - } export default Fletcher8Checksum; diff --git a/src/core/operations/FlipImage.mjs b/src/core/operations/FlipImage.mjs index 30be5a4e..48fda14c 100644 --- a/src/core/operations/FlipImage.mjs +++ b/src/core/operations/FlipImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Flip Image operation */ class FlipImage extends Operation { - /** * FlipImage constructor */ @@ -56,8 +55,7 @@ class FlipImage extends Operation { throw new OperationError(`Error loading image. (${err})`); } try { - if (isWorkerEnvironment()) - self.sendStatusMessage("Flipping image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Flipping image..."); switch (flipAxis) { case "Horizontal": image.flip(true, false); @@ -95,7 +93,6 @@ class FlipImage extends Operation { return ``; } - } export default FlipImage; diff --git a/src/core/operations/Fork.mjs b/src/core/operations/Fork.mjs index 3d4c596a..4e4c4434 100644 --- a/src/core/operations/Fork.mjs +++ b/src/core/operations/Fork.mjs @@ -12,7 +12,6 @@ import Dish from "../Dish.mjs"; * Fork operation */ class Fork extends Operation { - /** * Fork constructor */ @@ -22,7 +21,8 @@ class Fork extends Operation { this.name = "Fork"; this.flowControl = true; this.module = "Default"; - this.description = "Split the input data up based on the specified delimiter and run all subsequent operations on each branch separately.

    For example, to decode multiple Base64 strings, enter them all on separate lines then add the 'Fork' and 'From Base64' operations to the recipe. Each string will be decoded separately."; + this.description + = "Split the input data up based on the specified delimiter and run all subsequent operations on each branch separately.

    For example, to decode multiple Base64 strings, enter them all on separate lines then add the 'Fork' and 'From Base64' operations to the recipe. Each string will be decoded separately."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -52,18 +52,17 @@ class Fork extends Operation { * @returns {Object} The updated state of the recipe. */ async run(state) { - const opList = state.opList, - inputType = opList[state.progress].inputType, - outputType = opList[state.progress].outputType, - input = await state.dish.get(inputType), - ings = opList[state.progress].ingValues, + const opList = state.opList, + inputType = opList[state.progress].inputType, + outputType = opList[state.progress].outputType, + input = await state.dish.get(inputType), + ings = opList[state.progress].ingValues, [splitDelim, mergeDelim, ignoreErrors] = ings, - subOpList = []; - let inputs = [], + subOpList = []; + let inputs = [], i; - if (input) - inputs = input.split(splitDelim); + if (input) inputs = input.split(splitDelim); // Set to 1 as if we are here, then there is one, the current one. let numOp = 1; @@ -72,14 +71,11 @@ class Fork extends Operation { for (i = state.progress + 1; i < opList.length; i++) { if (opList[i].name === "Merge" && !opList[i].disabled) { numOp--; - if (numOp === 0 || opList[i].ingValues[0]) - break; - else - // Not this Fork's Merge. - subOpList.push(opList[i]); + if (numOp === 0 || opList[i].ingValues[0]) break; + // Not this Fork's Merge. + else subOpList.push(opList[i]); } else { - if (opList[i].name === "Fork" || opList[i].name === "Subsection") - numOp++; + if (opList[i].name === "Fork" || opList[i].name === "Subsection") numOp++; subOpList.push(opList[i]); } } @@ -93,7 +89,7 @@ class Fork extends Operation { recipe.addOperations(subOpList); // Take a deep(ish) copy of the ingredient values - const ingValues = subOpList.map(op => JSON.parse(JSON.stringify(op.ingValues))); + const ingValues = subOpList.map((op) => JSON.parse(JSON.stringify(op.ingValues))); // Run recipe over each tranche for (i = 0; i < inputs.length; i++) { @@ -120,7 +116,6 @@ class Fork extends Operation { state.progress += progress; return state; } - } export default Fork; diff --git a/src/core/operations/FormatMACAddresses.mjs b/src/core/operations/FormatMACAddresses.mjs index 41fac594..806b998c 100644 --- a/src/core/operations/FormatMACAddresses.mjs +++ b/src/core/operations/FormatMACAddresses.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Format MAC addresses operation */ class FormatMACAddresses extends Operation { - /** * FormatMACAddresses constructor */ @@ -19,7 +18,8 @@ class FormatMACAddresses extends Operation { this.name = "Format MAC addresses"; this.module = "Default"; - this.description = "Displays given MAC addresses in multiple different formats.

    Expects addresses in a list separated by newlines, spaces or commas.

    WARNING: There are no validity checks."; + this.description + = "Displays given MAC addresses in multiple different formats.

    Expects addresses in a list separated by newlines, spaces or commas.

    WARNING: There are no validity checks."; this.infoURL = "https://wikipedia.org/wiki/MAC_address#Notational_conventions"; this.inputType = "string"; this.outputType = "string"; @@ -65,18 +65,11 @@ class FormatMACAddresses extends Operation { run(input, args) { if (!input) return ""; - const [ - outputCase, - noDelim, - dashDelim, - colonDelim, - ciscoStyle, - ipv6IntID - ] = args, + const [outputCase, noDelim, dashDelim, colonDelim, ciscoStyle, ipv6IntID] = args, outputList = [], macs = input.toLowerCase().split(/[,\s\r\n]+/); - macs.forEach(function(mac) { + macs.forEach(function (mac) { const cleanMac = mac.replace(/[:.-]+/g, ""), macHyphen = cleanMac.replace(/(.{2}(?=.))/g, "$1-"), macColon = cleanMac.replace(/(.{2}(?=.))/g, "$1:"), @@ -116,7 +109,6 @@ class FormatMACAddresses extends Operation { // Return the data as a string return outputList.join("\n"); } - } export default FormatMACAddresses; diff --git a/src/core/operations/FrequencyDistribution.mjs b/src/core/operations/FrequencyDistribution.mjs index 9bcb3f7f..8178ba8c 100644 --- a/src/core/operations/FrequencyDistribution.mjs +++ b/src/core/operations/FrequencyDistribution.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Frequency distribution operation */ class FrequencyDistribution extends Operation { - /** * FrequencyDistribution constructor */ @@ -63,7 +62,7 @@ class FrequencyDistribution extends Operation { let repr = 0; for (i = 0; i < 256; i++) { if (distrib[i] > 0) repr++; - percentages[i] = distrib[i] / len * 100; + percentages[i] = (distrib[i] / len) * 100; } return { @@ -108,7 +107,7 @@ Number of bytes not represented: ${256 - freq.bytesRepresented} if (showAscii) { if (i <= 32) { c = String.fromCharCode(0x2400 + i); - } else if (i === 127) { + } else if (i === 127) { c = String.fromCharCode(0x2421); } else { c = String.fromCharCode(i); @@ -117,7 +116,7 @@ Number of bytes not represented: ${256 - freq.bytesRepresented} const bite = `${Utils.hex(i, 2)}`, ascii = showAscii ? `${c}` : "", percentage = `${(freq.percentages[i].toFixed(2).replace(".00", "") + "%").padEnd(8, " ")}`, - bars = `${Array(Math.ceil(freq.percentages[i])+1).join("|")}`; + bars = `${Array(Math.ceil(freq.percentages[i]) + 1).join("|")}`; output += `${bite}${ascii}${percentage}${bars}`; } @@ -126,7 +125,6 @@ Number of bytes not represented: ${256 - freq.bytesRepresented} output += ""; return output; } - } export default FrequencyDistribution; diff --git a/src/core/operations/FromBCD.mjs b/src/core/operations/FromBCD.mjs index 8fa990a4..6c0752b3 100644 --- a/src/core/operations/FromBCD.mjs +++ b/src/core/operations/FromBCD.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ENCODING_SCHEME, ENCODING_LOOKUP, FORMAT} from "../lib/BCD.mjs"; +import { ENCODING_SCHEME, ENCODING_LOOKUP, FORMAT } from "../lib/BCD.mjs"; import BigNumber from "bignumber.js"; /** * From BCD operation */ class FromBCD extends Operation { - /** * FromBCD constructor */ @@ -23,7 +22,8 @@ class FromBCD extends Operation { this.name = "From BCD"; this.module = "Default"; - this.description = "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign."; + this.description + = "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign."; this.infoURL = "https://wikipedia.org/wiki/Binary-coded_decimal"; this.inputType = "string"; this.outputType = "BigNumber"; @@ -54,7 +54,7 @@ class FromBCD extends Operation { pattern: "^(?:\\d{4} ){3,}\\d{4}$", flags: "", args: ["8 4 2 1", true, false, "Nibbles"] - }, + } ]; } @@ -85,7 +85,7 @@ class FromBCD extends Operation { case "Raw": default: byteArray = new Uint8Array(Utils.strToArrayBuffer(input)); - byteArray.forEach(b => { + byteArray.forEach((b) => { nibbles.push(b >>> 4); nibbles.push(b & 15); }); @@ -101,14 +101,13 @@ class FromBCD extends Operation { if (signed) { const sign = nibbles.pop(); - if (sign === 13 || - sign === 11) { + if (sign === 13 || sign === 11) { // Negative output += "-"; } } - nibbles.forEach(n => { + nibbles.forEach((n) => { if (isNaN(n)) throw new OperationError("Invalid input"); const val = encoding.indexOf(n); if (val < 0) throw new OperationError(`Value ${Utils.bin(n, 4)} is not in the encoding scheme`); @@ -117,7 +116,6 @@ class FromBCD extends Operation { return new BigNumber(output); } - } export default FromBCD; diff --git a/src/core/operations/FromBase.mjs b/src/core/operations/FromBase.mjs index 4abd5c44..6669c02b 100644 --- a/src/core/operations/FromBase.mjs +++ b/src/core/operations/FromBase.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * From Base operation */ class FromBase extends Operation { - /** * FromBase constructor */ @@ -53,12 +52,11 @@ class FromBase extends Operation { // Fractional part for (let i = 0; i < number[1].length; i++) { const digit = new BigNumber(number[1][i], radix); - result += digit.div(Math.pow(radix, i+1)); + result += digit.div(Math.pow(radix, i + 1)); } return result; } - } export default FromBase; diff --git a/src/core/operations/FromBase32.mjs b/src/core/operations/FromBase32.mjs index 73added6..ab9c0381 100644 --- a/src/core/operations/FromBase32.mjs +++ b/src/core/operations/FromBase32.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * From Base32 operation */ class FromBase32 extends Operation { - /** * FromBase32 constructor */ @@ -20,7 +19,8 @@ class FromBase32 extends Operation { this.name = "From Base32"; this.module = "Default"; - this.description = "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7."; + this.description + = "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7."; this.infoURL = "https://wikipedia.org/wiki/Base32"; this.inputType = "string"; this.outputType = "byteArray"; @@ -53,13 +53,23 @@ class FromBase32 extends Operation { run(input, args) { if (!input) return []; - const alphabet = args[0] ? - Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", + const alphabet = args[0] ? Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", removeNonAlphChars = args[1], output = []; - let chr1, chr2, chr3, chr4, chr5, - enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8, + let chr1, + chr2, + chr3, + chr4, + chr5, + enc1, + enc2, + enc3, + enc4, + enc5, + enc6, + enc7, + enc8, i = 0; if (removeNonAlphChars) { @@ -92,7 +102,6 @@ class FromBase32 extends Operation { return output; } - } export default FromBase32; diff --git a/src/core/operations/FromBase45.mjs b/src/core/operations/FromBase45.mjs index 8cb202bc..10961e86 100644 --- a/src/core/operations/FromBase45.mjs +++ b/src/core/operations/FromBase45.mjs @@ -4,17 +4,15 @@ * @license Apache-2.0 */ -import {ALPHABET, highlightToBase45, highlightFromBase45} from "../lib/Base45.mjs"; +import { ALPHABET, highlightToBase45, highlightFromBase45 } from "../lib/Base45.mjs"; import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; - /** * From Base45 operation */ class FromBase45 extends Operation { - /** * FromBase45 constructor */ @@ -23,7 +21,8 @@ class FromBase45 extends Operation { this.name = "From Base45"; this.module = "Default"; - this.description = "Base45 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system. Base45 is optimized for usage with QR codes."; + this.description + = "Base45 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system. Base45 is optimized for usage with QR codes."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "string"; this.outputType = "byteArray"; @@ -37,7 +36,7 @@ class FromBase45 extends Operation { name: "Remove non-alphabet chars", type: "boolean", value: true - }, + } ]; this.highlight = highlightFromBase45; @@ -90,12 +89,10 @@ class FromBase45 extends Operation { * Pushing LSB */ res.push(b & 0xff); - } return res; } - } export default FromBase45; diff --git a/src/core/operations/FromBase58.mjs b/src/core/operations/FromBase58.mjs index f5a9ac3d..0f57a482 100644 --- a/src/core/operations/FromBase58.mjs +++ b/src/core/operations/FromBase58.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ALPHABET_OPTIONS} from "../lib/Base58.mjs"; +import { ALPHABET_OPTIONS } from "../lib/Base58.mjs"; /** * From Base58 operation */ class FromBase58 extends Operation { - /** * FromBase58 constructor */ @@ -22,7 +21,8 @@ class FromBase58 extends Operation { this.name = "From Base58"; this.module = "Default"; - this.description = "Base58 (similar to Base64) is a notation for encoding arbitrary byte data. It differs from Base64 by removing easily misread characters (i.e. l, I, 0 and O) to improve human readability.

    This operation decodes data from an ASCII string (with an alphabet of your choosing, presets included) back into its raw form.

    e.g. StV1DL6CwTryKyV becomes hello world

    Base58 is commonly used in cryptocurrencies (Bitcoin, Ripple, etc)."; + this.description + = "Base58 (similar to Base64) is a notation for encoding arbitrary byte data. It differs from Base64 by removing easily misread characters (i.e. l, I, 0 and O) to improve human readability.

    This operation decodes data from an ASCII string (with an alphabet of your choosing, presets included) back into its raw form.

    e.g. StV1DL6CwTryKyV becomes hello world

    Base58 is commonly used in cryptocurrencies (Bitcoin, Ripple, etc)."; this.infoURL = "https://wikipedia.org/wiki/Base58"; this.inputType = "string"; this.outputType = "byteArray"; @@ -48,7 +48,7 @@ class FromBase58 extends Operation { pattern: "^[1-9A-HJ-NP-Za-km-z]{20,}$", flags: "", args: ["rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz", false] - }, + } ]; } @@ -64,8 +64,7 @@ class FromBase58 extends Operation { alphabet = Utils.expandAlphRange(alphabet).join(""); - if (alphabet.length !== 58 || - [].unique.call(alphabet).length !== 58) { + if (alphabet.length !== 58 || [].unique.call(alphabet).length !== 58) { throw new OperationError("Alphabet must be of length 58"); } @@ -76,7 +75,7 @@ class FromBase58 extends Operation { zeroPrefix++; } - [].forEach.call(input, function(c, charIndex) { + [].forEach.call(input, function (c, charIndex) { const index = alphabet.indexOf(c); if (index === -1) { @@ -88,17 +87,17 @@ class FromBase58 extends Operation { } let carry = result[0] * 58 + index; - result[0] = carry & 0xFF; + result[0] = carry & 0xff; carry = carry >> 8; for (let i = 1; i < result.length; i++) { carry += result[i] * 58; - result[i] = carry & 0xFF; + result[i] = carry & 0xff; carry = carry >> 8; } while (carry > 0) { - result.push(carry & 0xFF); + result.push(carry & 0xff); carry = carry >> 8; } }); @@ -109,7 +108,6 @@ class FromBase58 extends Operation { return result.reverse(); } - } export default FromBase58; diff --git a/src/core/operations/FromBase62.mjs b/src/core/operations/FromBase62.mjs index 9e91f647..8f531b4b 100644 --- a/src/core/operations/FromBase62.mjs +++ b/src/core/operations/FromBase62.mjs @@ -8,12 +8,10 @@ import Operation from "../Operation.mjs"; import BigNumber from "bignumber.js"; import Utils from "../Utils.mjs"; - /** * From Base62 operation */ class FromBase62 extends Operation { - /** * FromBase62 constructor */ @@ -22,7 +20,8 @@ class FromBase62 extends Operation { this.name = "From Base62"; this.module = "Default"; - this.description = "Base62 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system."; + this.description + = "Base62 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "string"; this.outputType = "byteArray"; @@ -59,7 +58,6 @@ class FromBase62 extends Operation { return Utils.convertToByteArray(hex, "Hex"); } - } export default FromBase62; diff --git a/src/core/operations/FromBase64.mjs b/src/core/operations/FromBase64.mjs index 292de1e2..7fb25143 100644 --- a/src/core/operations/FromBase64.mjs +++ b/src/core/operations/FromBase64.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {fromBase64, ALPHABET_OPTIONS} from "../lib/Base64.mjs"; +import { fromBase64, ALPHABET_OPTIONS } from "../lib/Base64.mjs"; /** * From Base64 operation */ class FromBase64 extends Operation { - /** * FromBase64 constructor */ @@ -20,7 +19,8 @@ class FromBase64 extends Operation { this.name = "From Base64"; this.module = "Default"; - this.description = "Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.

    This operation decodes data from an ASCII Base64 string back into its raw format.

    e.g. aGVsbG8= becomes hello"; + this.description + = "Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.

    This operation decodes data from an ASCII Base64 string back into its raw format.

    e.g. aGVsbG8= becomes hello"; this.infoURL = "https://wikipedia.org/wiki/Base64"; this.inputType = "string"; this.outputType = "byteArray"; @@ -151,8 +151,8 @@ class FromBase64 extends Operation { * @returns {Object[]} pos */ highlight(pos, args) { - pos[0].start = Math.ceil(pos[0].start / 4 * 3); - pos[0].end = Math.floor(pos[0].end / 4 * 3); + pos[0].start = Math.ceil((pos[0].start / 4) * 3); + pos[0].end = Math.floor((pos[0].end / 4) * 3); return pos; } @@ -166,8 +166,8 @@ class FromBase64 extends Operation { * @returns {Object[]} pos */ highlightReverse(pos, args) { - pos[0].start = Math.floor(pos[0].start / 3 * 4); - pos[0].end = Math.ceil(pos[0].end / 3 * 4); + pos[0].start = Math.floor((pos[0].start / 3) * 4); + pos[0].end = Math.ceil((pos[0].end / 3) * 4); return pos; } } diff --git a/src/core/operations/FromBase85.mjs b/src/core/operations/FromBase85.mjs index d0c70da5..8eee2097 100644 --- a/src/core/operations/FromBase85.mjs +++ b/src/core/operations/FromBase85.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {ALPHABET_OPTIONS} from "../lib/Base85.mjs"; +import { ALPHABET_OPTIONS } from "../lib/Base85.mjs"; /** * From Base85 operation */ class FromBase85 extends Operation { - /** * From Base85 constructor */ @@ -22,7 +21,8 @@ class FromBase85 extends Operation { this.name = "From Base85"; this.module = "Default"; - this.description = "Base85 (also called Ascii85) is a notation for encoding arbitrary byte data. It is usually more efficient that Base64.

    This operation decodes data from an ASCII string (with an alphabet of your choosing, presets included).

    e.g. BOu!rD]j7BEbo7 becomes hello world

    Base85 is commonly used in Adobe's PostScript and PDF file formats."; + this.description + = "Base85 (also called Ascii85) is a notation for encoding arbitrary byte data. It is usually more efficient that Base64.

    This operation decodes data from an ASCII string (with an alphabet of your choosing, presets included).

    e.g. BOu!rD]j7BEbo7 becomes hello world

    Base85 is commonly used in Adobe's PostScript and PDF file formats."; this.infoURL = "https://wikipedia.org/wiki/Ascii85"; this.inputType = "string"; this.outputType = "byteArray"; @@ -47,31 +47,31 @@ class FromBase85 extends Operation { this.checks = [ { pattern: - "^\\s*(?:<~)?" + // Optional whitespace and starting marker - "[\\s!-uz]*" + // Any amount of base85 characters and whitespace - "[!-uz]{15}" + // At least 15 continoues base85 characters without whitespace - "[\\s!-uz]*" + // Any amount of base85 characters and whitespace - "(?:~>)?\\s*$", // Optional ending marker and whitespace - args: ["!-u"], + "^\\s*(?:<~)?" // Optional whitespace and starting marker + + "[\\s!-uz]*" // Any amount of base85 characters and whitespace + + "[!-uz]{15}" // At least 15 continoues base85 characters without whitespace + + "[\\s!-uz]*" // Any amount of base85 characters and whitespace + + "(?:~>)?\\s*$", // Optional ending marker and whitespace + args: ["!-u"] }, { pattern: - "^" + - "[\\s0-9a-zA-Z.\\-:+=^!/*?&<>()[\\]{}@%$#]*" + - "[0-9a-zA-Z.\\-:+=^!/*?&<>()[\\]{}@%$#]{15}" + // At least 15 continoues base85 characters without whitespace - "[\\s0-9a-zA-Z.\\-:+=^!/*?&<>()[\\]{}@%$#]*" + - "$", - args: ["0-9a-zA-Z.\\-:+=^!/*?&<>()[]{}@%$#"], + "^" + + "[\\s0-9a-zA-Z.\\-:+=^!/*?&<>()[\\]{}@%$#]*" + + "[0-9a-zA-Z.\\-:+=^!/*?&<>()[\\]{}@%$#]{15}" // At least 15 continoues base85 characters without whitespace + + "[\\s0-9a-zA-Z.\\-:+=^!/*?&<>()[\\]{}@%$#]*" + + "$", + args: ["0-9a-zA-Z.\\-:+=^!/*?&<>()[]{}@%$#"] }, { pattern: - "^" + - "[\\s0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~]*" + - "[0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~]{15}" + // At least 15 continoues base85 characters without whitespace - "[\\s0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~]*" + - "$", - args: ["0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~"], - }, + "^" + + "[\\s0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~]*" + + "[0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~]{15}" // At least 15 continoues base85 characters without whitespace + + "[\\s0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~]*" + + "$", + args: ["0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~"] + } ]; } @@ -86,8 +86,7 @@ class FromBase85 extends Operation { allZeroGroupChar = typeof args[2] === "string" ? args[2].slice(0, 1) : "", result = []; - if (alphabet.length !== 85 || - [].unique.call(alphabet).length !== 85) { + if (alphabet.length !== 85 || [].unique.call(alphabet).length !== 85) { throw new OperationError("Alphabet must be of length 85"); } @@ -101,7 +100,7 @@ class FromBase85 extends Operation { // Remove non-alphabet characters if (removeNonAlphChars) { - const re = new RegExp("[^~" + allZeroGroupChar +alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", "g"); + const re = new RegExp("[^~" + allZeroGroupChar + alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", "g"); input = input.replace(re, ""); // Remove delimiters again if present (incase of non-alphabet characters in front/behind delimiters) const matches = input.match(/^<~(.+?)~>$/); @@ -129,19 +128,14 @@ class FromBase85 extends Operation { return digit; }); - block = - digits[0] * 52200625 + - digits[1] * 614125 + - (i + 2 < input.length ? digits[2] : 84) * 7225 + - (i + 3 < input.length ? digits[3] : 84) * 85 + - (i + 4 < input.length ? digits[4] : 84); + block + = digits[0] * 52200625 + + digits[1] * 614125 + + (i + 2 < input.length ? digits[2] : 84) * 7225 + + (i + 3 < input.length ? digits[3] : 84) * 85 + + (i + 4 < input.length ? digits[4] : 84); - blockBytes = [ - (block >> 24) & 0xff, - (block >> 16) & 0xff, - (block >> 8) & 0xff, - block & 0xff - ]; + blockBytes = [(block >> 24) & 0xff, (block >> 16) & 0xff, (block >> 8) & 0xff, block & 0xff]; if (input.length < i + 5) { blockBytes.splice(input.length - (i + 5), 5); @@ -154,7 +148,6 @@ class FromBase85 extends Operation { return result; } - } export default FromBase85; diff --git a/src/core/operations/FromBase92.mjs b/src/core/operations/FromBase92.mjs index 8315a51c..97f09575 100644 --- a/src/core/operations/FromBase92.mjs +++ b/src/core/operations/FromBase92.mjs @@ -19,7 +19,8 @@ class FromBase92 extends Operation { this.name = "From Base92"; this.module = "Default"; - this.description = "Base92 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers."; + this.description + = "Base92 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "string"; this.outputType = "byteArray"; diff --git a/src/core/operations/FromBinary.mjs b/src/core/operations/FromBinary.mjs index 9a51fc8b..dd7adbe2 100644 --- a/src/core/operations/FromBinary.mjs +++ b/src/core/operations/FromBinary.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {BIN_DELIM_OPTIONS} from "../lib/Delim.mjs"; -import {fromBinary} from "../lib/Binary.mjs"; +import { BIN_DELIM_OPTIONS } from "../lib/Delim.mjs"; +import { fromBinary } from "../lib/Binary.mjs"; /** * From Binary operation */ class FromBinary extends Operation { - /** * FromBinary constructor */ @@ -22,7 +21,8 @@ class FromBinary extends Operation { this.name = "From Binary"; this.module = "Default"; - this.description = "Converts a binary string back into its raw form.

    e.g. 01001000 01101001 becomes Hi"; + this.description + = "Converts a binary string back into its raw form.

    e.g. 01001000 01101001 becomes Hi"; this.infoURL = "https://wikipedia.org/wiki/Binary_code"; this.inputType = "string"; this.outputType = "byteArray"; @@ -74,7 +74,7 @@ class FromBinary extends Operation { pattern: "^(?:[01]{8})(?:\\r\\n[01]{8})*$", flags: "", args: ["CRLF"] - }, + } ]; } @@ -119,7 +119,6 @@ class FromBinary extends Operation { pos[0].end = pos[0].end * (8 + delim.length) - delim.length; return pos; } - } export default FromBinary; diff --git a/src/core/operations/FromBraille.mjs b/src/core/operations/FromBraille.mjs index adbcff91..aa6e635e 100644 --- a/src/core/operations/FromBraille.mjs +++ b/src/core/operations/FromBraille.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {BRAILLE_LOOKUP} from "../lib/Braille.mjs"; +import { BRAILLE_LOOKUP } from "../lib/Braille.mjs"; /** * From Braille operation */ class FromBraille extends Operation { - /** * FromBraille constructor */ @@ -33,10 +32,13 @@ class FromBraille extends Operation { * @returns {string} */ run(input, args) { - return input.split("").map(b => { - const idx = BRAILLE_LOOKUP.dot6.indexOf(b); - return idx < 0 ? b : BRAILLE_LOOKUP.ascii[idx]; - }).join(""); + return input + .split("") + .map((b) => { + const idx = BRAILLE_LOOKUP.dot6.indexOf(b); + return idx < 0 ? b : BRAILLE_LOOKUP.ascii[idx]; + }) + .join(""); } /** @@ -64,7 +66,6 @@ class FromBraille extends Operation { highlightReverse(pos, args) { return pos; } - } export default FromBraille; diff --git a/src/core/operations/FromCaseInsensitiveRegex.mjs b/src/core/operations/FromCaseInsensitiveRegex.mjs index 31cbfb99..2c935935 100644 --- a/src/core/operations/FromCaseInsensitiveRegex.mjs +++ b/src/core/operations/FromCaseInsensitiveRegex.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * From Case Insensitive Regex operation */ class FromCaseInsensitiveRegex extends Operation { - /** * FromCaseInsensitiveRegex constructor */ @@ -19,7 +18,8 @@ class FromCaseInsensitiveRegex extends Operation { this.name = "From Case Insensitive Regex"; this.module = "Default"; - this.description = "Converts a case-insensitive regex string to a case sensitive regex string (no guarantee on it being the proper original casing) in case the i flag wasn't available at the time but now is, or you need it to be case-sensitive again.

    e.g. [mM][oO][zZ][iI][lL][lL][aA]/[0-9].[0-9] .* becomes Mozilla/[0-9].[0-9] .*"; + this.description + = "Converts a case-insensitive regex string to a case sensitive regex string (no guarantee on it being the proper original casing) in case the i flag wasn't available at the time but now is, or you need it to be case-sensitive again.

    e.g. [mM][oO][zZ][iI][lL][lL][aA]/[0-9].[0-9] .* becomes Mozilla/[0-9].[0-9] .*"; this.infoURL = "https://wikipedia.org/wiki/Regular_expression"; this.inputType = "string"; this.outputType = "string"; @@ -32,7 +32,7 @@ class FromCaseInsensitiveRegex extends Operation { * @returns {string} */ run(input, args) { - return input.replace(/\[[a-z]{2}\]/ig, m => m[1].toUpperCase() === m[2].toUpperCase() ? m[1] : m); + return input.replace(/\[[a-z]{2}\]/gi, (m) => (m[1].toUpperCase() === m[2].toUpperCase() ? m[1] : m)); } } diff --git a/src/core/operations/FromCharcode.mjs b/src/core/operations/FromCharcode.mjs index ef02d394..67efbe19 100644 --- a/src/core/operations/FromCharcode.mjs +++ b/src/core/operations/FromCharcode.mjs @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * From Charcode operation */ class FromCharcode extends Operation { - /** * FromCharcode constructor */ @@ -23,7 +22,8 @@ class FromCharcode extends Operation { this.name = "From Charcode"; this.module = "Default"; - this.description = "Converts unicode character codes back into text.

    e.g. 0393 03b5 03b9 03ac 20 03c3 03bf 03c5 becomes Γειά σου"; + this.description + = "Converts unicode character codes back into text.

    e.g. 0393 03b5 03b9 03ac 20 03c3 03bf 03c5 becomes Γειά σου"; this.infoURL = "https://wikipedia.org/wiki/Plane_(Unicode)"; this.inputType = "string"; this.outputType = "ArrayBuffer"; @@ -59,7 +59,7 @@ class FromCharcode extends Operation { } if (input.length === 0) { - return new ArrayBuffer; + return new ArrayBuffer(); } if (base !== 16 && isWorkerEnvironment()) self.setOption("attemptHighlight", false); @@ -69,7 +69,7 @@ class FromCharcode extends Operation { if (bites.length === 1 && input.length > 17) { bites = []; for (i = 0; i < input.length; i += 2) { - bites.push(input.slice(i, i+2)); + bites.push(input.slice(i, i + 2)); } } @@ -79,7 +79,6 @@ class FromCharcode extends Operation { } return Utils.strToArrayBuffer(latin1); } - } export default FromCharcode; diff --git a/src/core/operations/FromDecimal.mjs b/src/core/operations/FromDecimal.mjs index f98931d6..471a2ee6 100644 --- a/src/core/operations/FromDecimal.mjs +++ b/src/core/operations/FromDecimal.mjs @@ -5,14 +5,13 @@ */ import Operation from "../Operation.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; -import {fromDecimal} from "../lib/Decimal.mjs"; +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; +import { fromDecimal } from "../lib/Decimal.mjs"; /** * From Decimal operation */ class FromDecimal extends Operation { - /** * FromDecimal constructor */ @@ -21,7 +20,8 @@ class FromDecimal extends Operation { this.name = "From Decimal"; this.module = "Default"; - this.description = "Converts the data from an ordinal integer array back into its raw form.

    e.g. 72 101 108 108 111 becomes Hello"; + this.description + = "Converts the data from an ordinal integer array back into its raw form.

    e.g. 72 101 108 108 111 becomes Hello"; this.inputType = "string"; this.outputType = "byteArray"; this.args = [ @@ -77,12 +77,12 @@ class FromDecimal extends Operation { */ run(input, args) { let data = fromDecimal(input, args[0]); - if (args[1]) { // Convert negatives - data = data.map(v => v < 0 ? 0xFF + v + 1 : v); + if (args[1]) { + // Convert negatives + data = data.map((v) => (v < 0 ? 0xff + v + 1 : v)); } return data; } - } export default FromDecimal; diff --git a/src/core/operations/FromHTMLEntity.mjs b/src/core/operations/FromHTMLEntity.mjs index 4d09876d..531630ff 100644 --- a/src/core/operations/FromHTMLEntity.mjs +++ b/src/core/operations/FromHTMLEntity.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * From HTML Entity operation */ class FromHTMLEntity extends Operation { - /** * FromHTMLEntity constructor */ @@ -20,7 +19,8 @@ class FromHTMLEntity extends Operation { this.name = "From HTML Entity"; this.module = "Encodings"; - this.description = "Converts HTML entities back to characters

    e.g. &amp; becomes &"; + this.description + = "Converts HTML entities back to characters

    e.g. &amp; becomes &"; this.infoURL = "https://wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references"; this.inputType = "string"; this.outputType = "string"; @@ -47,8 +47,7 @@ class FromHTMLEntity extends Operation { while ((m = regex.exec(input))) { // Add up to match - for (; i < m.index;) - output += input[i++]; + for (; i < m.index;) output += input[i++]; // Add match const bite = entityToByte[m[1]]; @@ -64,22 +63,18 @@ class FromHTMLEntity extends Operation { output += Utils.chr(parseInt(hex, 16)); } else { // Not a valid entity, print as normal - for (; i < regex.lastIndex;) - output += input[i++]; + for (; i < regex.lastIndex;) output += input[i++]; } i = regex.lastIndex; } // Add all after final match - for (; i < input.length;) - output += input[i++]; + for (; i < input.length;) output += input[i++]; return output; } - } - /** * Lookup table to translate HTML entity codes to their byte values. */ diff --git a/src/core/operations/FromHex.mjs b/src/core/operations/FromHex.mjs index cd82d7df..1e1c222a 100644 --- a/src/core/operations/FromHex.mjs +++ b/src/core/operations/FromHex.mjs @@ -5,14 +5,13 @@ */ import Operation from "../Operation.mjs"; -import {fromHex, FROM_HEX_DELIM_OPTIONS} from "../lib/Hex.mjs"; +import { fromHex, FROM_HEX_DELIM_OPTIONS } from "../lib/Hex.mjs"; import Utils from "../Utils.mjs"; /** * From Hex operation */ class FromHex extends Operation { - /** * FromHex constructor */ @@ -21,7 +20,8 @@ class FromHex extends Operation { this.name = "From Hex"; this.module = "Default"; - this.description = "Converts a hexadecimal byte string back into its raw value.

    e.g. ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a becomes the UTF-8 encoded string Γειά σου"; + this.description + = "Converts a hexadecimal byte string back into its raw value.

    e.g. ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a becomes the UTF-8 encoded string Γειά σου"; this.infoURL = "https://wikipedia.org/wiki/Hexadecimal"; this.inputType = "string"; this.outputType = "byteArray"; diff --git a/src/core/operations/FromHexContent.mjs b/src/core/operations/FromHexContent.mjs index dc6c06f1..5c98a52c 100644 --- a/src/core/operations/FromHexContent.mjs +++ b/src/core/operations/FromHexContent.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {fromHex} from "../lib/Hex.mjs"; +import { fromHex } from "../lib/Hex.mjs"; /** * From Hex Content operation */ class FromHexContent extends Operation { - /** * FromHexContent constructor */ @@ -21,16 +20,18 @@ class FromHexContent extends Operation { this.name = "From Hex Content"; this.module = "Default"; - this.description = "Translates hexadecimal bytes in text back to raw bytes. This format is used by SNORT for representing hex within ASCII text.

    e.g. foo|3d|bar becomes foo=bar."; - this.infoURL = "http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node32.html#SECTION00451000000000000000"; + this.description + = "Translates hexadecimal bytes in text back to raw bytes. This format is used by SNORT for representing hex within ASCII text.

    e.g. foo|3d|bar becomes foo=bar."; + this.infoURL + = "http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node32.html#SECTION00451000000000000000"; this.inputType = "string"; this.outputType = "byteArray"; this.args = []; this.checks = [ { - pattern: "\\|([\\da-f]{2} ?)+\\|", - flags: "i", - args: [] + pattern: "\\|([\\da-f]{2} ?)+\\|", + flags: "i", + args: [] } ]; } @@ -43,32 +44,28 @@ class FromHexContent extends Operation { run(input, args) { const regex = /\|([a-f\d ]{2,})\|/gi, output = []; - let m, i = 0; + let m, + i = 0; while ((m = regex.exec(input))) { // Add up to match - for (; i < m.index;) - output.push(Utils.ord(input[i++])); + for (; i < m.index;) output.push(Utils.ord(input[i++])); // Add match const bytes = fromHex(m[1]); if (bytes) { - for (let a = 0; a < bytes.length;) - output.push(bytes[a++]); + for (let a = 0; a < bytes.length;) output.push(bytes[a++]); } else { // Not valid hex, print as normal - for (; i < regex.lastIndex;) - output.push(Utils.ord(input[i++])); + for (; i < regex.lastIndex;) output.push(Utils.ord(input[i++])); } i = regex.lastIndex; } // Add all after final match - for (; i < input.length;) - output.push(Utils.ord(input[i++])); + for (; i < input.length;) output.push(Utils.ord(input[i++])); return output; } - } export default FromHexContent; diff --git a/src/core/operations/FromHexdump.mjs b/src/core/operations/FromHexdump.mjs index e8c25441..f8e662ff 100644 --- a/src/core/operations/FromHexdump.mjs +++ b/src/core/operations/FromHexdump.mjs @@ -8,12 +8,10 @@ import Operation from "../Operation.mjs"; import { fromHex } from "../lib/Hex.mjs"; import { isWorkerEnvironment } from "../Utils.mjs"; - /** * From Hexdump operation */ class FromHexdump extends Operation { - /** * FromHexdump constructor */ @@ -22,17 +20,19 @@ class FromHexdump extends Operation { this.name = "From Hexdump"; this.module = "Default"; - this.description = "Attempts to convert a hexdump back into raw data. This operation supports many different hexdump variations, but probably not all. Make sure you verify that the data it gives you is correct before continuing analysis."; + this.description + = "Attempts to convert a hexdump back into raw data. This operation supports many different hexdump variations, but probably not all. Make sure you verify that the data it gives you is correct before continuing analysis."; this.infoURL = "https://wikipedia.org/wiki/Hex_dump"; this.inputType = "string"; this.outputType = "byteArray"; this.args = []; this.checks = [ { - pattern: "^(?:(?:[\\dA-F]{4,16}h?:?)?[ \\t]*((?:[\\dA-F]{2} ){1,8}(?:[ \\t]|[\\dA-F]{2}-)(?:[\\dA-F]{2} ){1,8}|(?:[\\dA-F]{4} )*[\\dA-F]{4}|(?:[\\dA-F]{2} )*[\\dA-F]{2})[^\\n]*\\n?){2,}$", + pattern: + "^(?:(?:[\\dA-F]{4,16}h?:?)?[ \\t]*((?:[\\dA-F]{2} ){1,8}(?:[ \\t]|[\\dA-F]{2}-)(?:[\\dA-F]{2} ){1,8}|(?:[\\dA-F]{4} )*[\\dA-F]{4}|(?:[\\dA-F]{2} )*[\\dA-F]{2})[^\\n]*\\n?){2,}$", flags: "i", args: [] - }, + } ]; } @@ -43,7 +43,8 @@ class FromHexdump extends Operation { */ run(input, args) { const output = [], - regex = /^\s*(?:[\dA-F]{4,16}h?:?)?[ \t]+((?:[\dA-F]{2} ){1,8}(?:[ \t]|[\dA-F]{2}-)(?:[\dA-F]{2} ){1,8}|(?:[\dA-F]{4} )*[\dA-F]{4}|(?:[\dA-F]{2} )*[\dA-F]{2})/igm; + regex + = /^\s*(?:[\dA-F]{4,16}h?:?)?[ \t]+((?:[\dA-F]{2} ){1,8}(?:[ \t]|[\dA-F]{2}-)(?:[\dA-F]{2} ){1,8}|(?:[\dA-F]{4} )*[\dA-F]{4}|(?:[\dA-F]{2} )*[\dA-F]{2})/gim; let block, line; while ((block = regex.exec(input))) { @@ -73,28 +74,34 @@ class FromHexdump extends Operation { */ highlight(pos, args) { const w = args[0] || 16; - const width = 14 + (w*4); + const width = 14 + w * 4; let line = Math.floor(pos[0].start / width); let offset = pos[0].start % width; - if (offset < 10) { // In line number section - pos[0].start = line*w; - } else if (offset > 10+(w*3)) { // In ASCII section - pos[0].start = (line+1)*w; - } else { // In byte section - pos[0].start = line*w + Math.floor((offset-10)/3); + if (offset < 10) { + // In line number section + pos[0].start = line * w; + } else if (offset > 10 + w * 3) { + // In ASCII section + pos[0].start = (line + 1) * w; + } else { + // In byte section + pos[0].start = line * w + Math.floor((offset - 10) / 3); } line = Math.floor(pos[0].end / width); offset = pos[0].end % width; - if (offset < 10) { // In line number section - pos[0].end = line*w; - } else if (offset > 10+(w*3)) { // In ASCII section - pos[0].end = (line+1)*w; - } else { // In byte section - pos[0].end = line*w + Math.ceil((offset-10)/3); + if (offset < 10) { + // In line number section + pos[0].end = line * w; + } else if (offset > 10 + w * 3) { + // In ASCII section + pos[0].end = (line + 1) * w; + } else { + // In byte section + pos[0].end = line * w + Math.ceil((offset - 10) / 3); } return pos; @@ -112,13 +119,13 @@ class FromHexdump extends Operation { highlightReverse(pos, args) { // Calculate overall selection const w = args[0] || 16, - width = 14 + (w*4); + width = 14 + w * 4; let line = Math.floor(pos[0].start / w), offset = pos[0].start % w, start = 0, end = 0; - pos[0].start = line*width + 10 + offset*3; + pos[0].start = line * width + 10 + offset * 3; line = Math.floor(pos[0].end / w); offset = pos[0].end % w; @@ -126,7 +133,7 @@ class FromHexdump extends Operation { line--; offset = w; } - pos[0].end = line*width + 10 + offset*3 - 1; + pos[0].end = line * width + 10 + offset * 3 - 1; // Set up multiple selections for bytes let startLineNum = Math.floor(pos[0].start / width); @@ -136,12 +143,12 @@ class FromHexdump extends Operation { pos.push(pos[0]); } else { start = pos[0].start; - end = (startLineNum+1) * width - w - 5; + end = (startLineNum + 1) * width - w - 5; pos.push({ start: start, end: end }); while (end < pos[0].end) { startLineNum++; start = startLineNum * width + 10; - end = (startLineNum+1) * width - w - 5; + end = (startLineNum + 1) * width - w - 5; if (end > pos[0].end) end = pos[0].end; pos.push({ start: start, end: end }); } @@ -154,13 +161,12 @@ class FromHexdump extends Operation { end = 0; for (let i = 1; i < len; i++) { lineNum = Math.floor(pos[i].start / width); - start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); - end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); + start = (pos[i].start - lineNum * width - 10) / 3 + (width - w - 2) + lineNum * width; + end = (pos[i].end + 1 - lineNum * width - 10) / 3 + (width - w - 2) + lineNum * width; pos.push({ start: start, end: end }); } return pos; } - } export default FromHexdump; diff --git a/src/core/operations/FromMessagePack.mjs b/src/core/operations/FromMessagePack.mjs index a557ebbe..f06a41f3 100644 --- a/src/core/operations/FromMessagePack.mjs +++ b/src/core/operations/FromMessagePack.mjs @@ -12,7 +12,6 @@ import notepack from "notepack.io"; * From MessagePack operation */ class FromMessagePack extends Operation { - /** * FromMessagePack constructor */ @@ -21,7 +20,8 @@ class FromMessagePack extends Operation { this.name = "From MessagePack"; this.module = "Code"; - this.description = "Converts MessagePack encoded data to JSON. MessagePack is a computer data interchange format. It is a binary form for representing simple data structures like arrays and associative arrays."; + this.description + = "Converts MessagePack encoded data to JSON. MessagePack is a computer data interchange format. It is a binary form for representing simple data structures like arrays and associative arrays."; this.infoURL = "https://wikipedia.org/wiki/MessagePack"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -41,7 +41,6 @@ class FromMessagePack extends Operation { throw new OperationError(`Could not decode MessagePack to JSON: ${err}`); } } - } export default FromMessagePack; diff --git a/src/core/operations/FromMorseCode.mjs b/src/core/operations/FromMorseCode.mjs index b0aa4ef2..d3c615a5 100644 --- a/src/core/operations/FromMorseCode.mjs +++ b/src/core/operations/FromMorseCode.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {LETTER_DELIM_OPTIONS, WORD_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { LETTER_DELIM_OPTIONS, WORD_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * From Morse Code operation */ class FromMorseCode extends Operation { - /** * FromMorseCode constructor */ @@ -59,15 +58,15 @@ class FromMorseCode extends Operation { const letterDelim = Utils.charRep(args[0]); const wordDelim = Utils.charRep(args[1]); - input = input.replace(/-|‐|−|_|–|—|dash/ig, ""); // hyphen-minus|hyphen|minus-sign|undersore|en-dash|em-dash - input = input.replace(/\.|·|dot/ig, ""); + input = input.replace(/-|‐|−|_|–|—|dash/gi, ""); // hyphen-minus|hyphen|minus-sign|undersore|en-dash|em-dash + input = input.replace(/\.|·|dot/gi, ""); let words = input.split(wordDelim); const self = this; - words = Array.prototype.map.call(words, function(word) { + words = Array.prototype.map.call(words, function (word) { const signals = word.split(letterDelim); - const letters = signals.map(function(signal) { + const letters = signals.map(function (signal) { return self.reversedTable[signal]; }); @@ -78,7 +77,6 @@ class FromMorseCode extends Operation { return words; } - /** * Reverses the Morse Code lookup table */ @@ -90,7 +88,6 @@ class FromMorseCode extends Operation { this.reversedTable[signal] = letter; } } - } const MORSE_TABLE = { @@ -137,7 +134,7 @@ const MORSE_TABLE = { "!": "", "?": "", "'": "", - "\"": "", + '"': "", "/": "", "-": "", "+": "", diff --git a/src/core/operations/FromOctal.mjs b/src/core/operations/FromOctal.mjs index 7060cdfb..aa4fccc4 100644 --- a/src/core/operations/FromOctal.mjs +++ b/src/core/operations/FromOctal.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * From Octal operation */ class FromOctal extends Operation { - /** * FromOctal constructor */ @@ -21,7 +20,8 @@ class FromOctal extends Operation { this.name = "From Octal"; this.module = "Default"; - this.description = "Converts an octal byte string back into its raw value.

    e.g. 316 223 316 265 316 271 316 254 40 317 203 316 277 317 205 becomes the UTF-8 encoded string Γειά σου"; + this.description + = "Converts an octal byte string back into its raw value.

    e.g. 316 223 316 265 316 271 316 254 40 317 203 316 277 317 205 becomes the UTF-8 encoded string Γειά σου"; this.infoURL = "https://wikipedia.org/wiki/Octal"; this.inputType = "string"; this.outputType = "byteArray"; @@ -74,9 +74,8 @@ class FromOctal extends Operation { run(input, args) { const delim = Utils.charRep(args[0] || "Space"); if (input.length === 0) return []; - return input.split(delim).map(val => parseInt(val, 8)); + return input.split(delim).map((val) => parseInt(val, 8)); } - } export default FromOctal; diff --git a/src/core/operations/FromPunycode.mjs b/src/core/operations/FromPunycode.mjs index 2217ee3b..c224a06c 100644 --- a/src/core/operations/FromPunycode.mjs +++ b/src/core/operations/FromPunycode.mjs @@ -11,7 +11,6 @@ import punycode from "punycode"; * From Punycode operation */ class FromPunycode extends Operation { - /** * FromPunycode constructor */ @@ -20,7 +19,8 @@ class FromPunycode extends Operation { this.name = "From Punycode"; this.module = "Encodings"; - this.description = "Punycode is a way to represent Unicode with the limited character subset of ASCII supported by the Domain Name System.

    e.g. mnchen-3ya decodes to m\xfcnchen"; + this.description + = "Punycode is a way to represent Unicode with the limited character subset of ASCII supported by the Domain Name System.

    e.g. mnchen-3ya decodes to m\xfcnchen"; this.infoURL = "https://wikipedia.org/wiki/Punycode"; this.inputType = "string"; this.outputType = "string"; @@ -47,7 +47,6 @@ class FromPunycode extends Operation { return punycode.decode(input); } } - } export default FromPunycode; diff --git a/src/core/operations/FromQuotedPrintable.mjs b/src/core/operations/FromQuotedPrintable.mjs index 7dce45b6..e3645cd1 100644 --- a/src/core/operations/FromQuotedPrintable.mjs +++ b/src/core/operations/FromQuotedPrintable.mjs @@ -14,7 +14,6 @@ import Operation from "../Operation.mjs"; * From Quoted Printable operation */ class FromQuotedPrintable extends Operation { - /** * FromQuotedPrintable constructor */ @@ -23,17 +22,19 @@ class FromQuotedPrintable extends Operation { this.name = "From Quoted Printable"; this.module = "Default"; - this.description = "Converts QP-encoded text back to standard text.

    e.g. The quoted-printable encoded string hello=20world becomes hello world"; + this.description + = "Converts QP-encoded text back to standard text.

    e.g. The quoted-printable encoded string hello=20world becomes hello world"; this.infoURL = "https://wikipedia.org/wiki/Quoted-printable"; this.inputType = "string"; this.outputType = "byteArray"; this.args = []; this.checks = [ { - pattern: "^[\\x21-\\x3d\\x3f-\\x7e \\t]{0,76}(?:=[\\da-f]{2}|=\\r?\\n)(?:[\\x21-\\x3d\\x3f-\\x7e \\t]|=[\\da-f]{2}|=\\r?\\n)*$", + pattern: + "^[\\x21-\\x3d\\x3f-\\x7e \\t]{0,76}(?:=[\\da-f]{2}|=\\r?\\n)(?:[\\x21-\\x3d\\x3f-\\x7e \\t]|=[\\da-f]{2}|=\\r?\\n)*$", flags: "i", args: [] - }, + } ]; } @@ -48,7 +49,8 @@ class FromQuotedPrintable extends Operation { const encodedBytesCount = (str.match(/=[\da-fA-F]{2}/g) || []).length, bufferLength = str.length - encodedBytesCount * 2, buffer = new Array(bufferLength); - let chr, hex, + let chr, + hex, bufferPos = 0; for (let i = 0, len = str.length; i < len; i++) { @@ -63,7 +65,6 @@ class FromQuotedPrintable extends Operation { return buffer; } - } export default FromQuotedPrintable; diff --git a/src/core/operations/FromUNIXTimestamp.mjs b/src/core/operations/FromUNIXTimestamp.mjs index 50d8539e..119fba52 100644 --- a/src/core/operations/FromUNIXTimestamp.mjs +++ b/src/core/operations/FromUNIXTimestamp.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import moment from "moment-timezone"; -import {UNITS} from "../lib/DateTime.mjs"; +import { UNITS } from "../lib/DateTime.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * From UNIX Timestamp operation */ class FromUNIXTimestamp extends Operation { - /** * FromUNIXTimestamp constructor */ @@ -22,7 +21,8 @@ class FromUNIXTimestamp extends Operation { this.name = "From UNIX Timestamp"; this.module = "Default"; - this.description = "Converts a UNIX timestamp to a datetime string.

    e.g. 978346800 becomes Mon 1 January 2001 11:00:00 UTC

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch)."; + this.description + = "Converts a UNIX timestamp to a datetime string.

    e.g. 978346800 becomes Mon 1 January 2001 11:00:00 UTC

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch)."; this.infoURL = "https://wikipedia.org/wiki/Unix_time"; this.inputType = "number"; this.outputType = "string"; @@ -86,7 +86,6 @@ class FromUNIXTimestamp extends Operation { throw new OperationError("Unrecognised unit"); } } - } export default FromUNIXTimestamp; diff --git a/src/core/operations/FuzzyMatch.mjs b/src/core/operations/FuzzyMatch.mjs index c35dd0ab..9ba56d12 100644 --- a/src/core/operations/FuzzyMatch.mjs +++ b/src/core/operations/FuzzyMatch.mjs @@ -5,14 +5,13 @@ */ import Operation from "../Operation.mjs"; -import {fuzzyMatch, calcMatchRanges, DEFAULT_WEIGHTS} from "../lib/FuzzyMatch.mjs"; +import { fuzzyMatch, calcMatchRanges, DEFAULT_WEIGHTS } from "../lib/FuzzyMatch.mjs"; import Utils from "../Utils.mjs"; /** * Fuzzy Match operation */ class FuzzyMatch extends Operation { - /** * FuzzyMatch constructor */ @@ -21,7 +20,8 @@ class FuzzyMatch extends Operation { this.name = "Fuzzy Match"; this.module = "Default"; - this.description = "Conducts a fuzzy search to find a pattern within the input based on weighted criteria.

    e.g. A search for dpan will match on Don't Panic"; + this.description + = "Conducts a fuzzy search to find a pattern within the input based on weighted criteria.

    e.g. A search for dpan will match on Don't Panic"; this.infoURL = "https://wikipedia.org/wiki/Fuzzy_matching_(computer-assisted_translation)"; this.inputType = "string"; this.outputType = "html"; @@ -71,7 +71,7 @@ class FuzzyMatch extends Operation { name: "Unmatched letter penalty", type: "number", value: DEFAULT_WEIGHTS.unmatchedLetterPenalty - }, + } ]; } @@ -97,7 +97,9 @@ class FuzzyMatch extends Operation { return "No matches."; } - let result = "", pos = 0, hlClass = "hl1"; + let result = "", + pos = 0, + hlClass = "hl1"; matches.forEach(([matches, score, idxs]) => { const matchRanges = calcMatchRanges(idxs); @@ -115,7 +117,6 @@ class FuzzyMatch extends Operation { return result; } - } export default FuzzyMatch; diff --git a/src/core/operations/GOSTDecrypt.mjs b/src/core/operations/GOSTDecrypt.mjs index 8259a0d4..d6c9f85c 100644 --- a/src/core/operations/GOSTDecrypt.mjs +++ b/src/core/operations/GOSTDecrypt.mjs @@ -14,7 +14,6 @@ import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js * GOST Decrypt operation */ class GOSTDecrypt extends Operation { - /** * GOSTDecrypt constructor */ @@ -23,7 +22,8 @@ class GOSTDecrypt extends Operation { this.name = "GOST Decrypt"; this.module = "Ciphers"; - this.description = "The GOST block cipher (Magma), defined in the standard GOST 28147-89 (RFC 5830), is a Soviet and Russian government standard symmetric key block cipher with a block size of 64 bits. The original standard, published in 1989, did not give the cipher any name, but the most recent revision of the standard, GOST R 34.12-2015 (RFC 7801, RFC 8891), specifies that it may be referred to as Magma. The GOST hash function is based on this cipher. The new standard also specifies a new 128-bit block cipher called Kuznyechik.

    Developed in the 1970s, the standard had been marked 'Top Secret' and then downgraded to 'Secret' in 1990. Shortly after the dissolution of the USSR, it was declassified and it was released to the public in 1994. GOST 28147 was a Soviet alternative to the United States standard algorithm, DES. Thus, the two are very similar in structure."; + this.description + = "The GOST block cipher (Magma), defined in the standard GOST 28147-89 (RFC 5830), is a Soviet and Russian government standard symmetric key block cipher with a block size of 64 bits. The original standard, published in 1989, did not give the cipher any name, but the most recent revision of the standard, GOST R 34.12-2015 (RFC 7801, RFC 8891), specifies that it may be referred to as Magma. The GOST hash function is based on this cipher. The new standard also specifies a new 128-bit block cipher called Kuznyechik.

    Developed in the 1970s, the standard had been marked 'Top Secret' and then downgraded to 'Secret' in 1990. Shortly after the dissolution of the USSR, it was declassified and it was released to the public in 1994. GOST 28147 was a Soviet alternative to the United States standard algorithm, DES. Thus, the two are very similar in structure."; this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -132,7 +132,6 @@ class GOSTDecrypt extends Operation { throw new OperationError(err); } } - } export default GOSTDecrypt; diff --git a/src/core/operations/GOSTEncrypt.mjs b/src/core/operations/GOSTEncrypt.mjs index ce92ecda..0b085536 100644 --- a/src/core/operations/GOSTEncrypt.mjs +++ b/src/core/operations/GOSTEncrypt.mjs @@ -14,7 +14,6 @@ import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js * GOST Encrypt operation */ class GOSTEncrypt extends Operation { - /** * GOSTEncrypt constructor */ @@ -23,7 +22,8 @@ class GOSTEncrypt extends Operation { this.name = "GOST Encrypt"; this.module = "Ciphers"; - this.description = "The GOST block cipher (Magma), defined in the standard GOST 28147-89 (RFC 5830), is a Soviet and Russian government standard symmetric key block cipher with a block size of 64 bits. The original standard, published in 1989, did not give the cipher any name, but the most recent revision of the standard, GOST R 34.12-2015 (RFC 7801, RFC 8891), specifies that it may be referred to as Magma. The GOST hash function is based on this cipher. The new standard also specifies a new 128-bit block cipher called Kuznyechik.

    Developed in the 1970s, the standard had been marked 'Top Secret' and then downgraded to 'Secret' in 1990. Shortly after the dissolution of the USSR, it was declassified and it was released to the public in 1994. GOST 28147 was a Soviet alternative to the United States standard algorithm, DES. Thus, the two are very similar in structure."; + this.description + = "The GOST block cipher (Magma), defined in the standard GOST 28147-89 (RFC 5830), is a Soviet and Russian government standard symmetric key block cipher with a block size of 64 bits. The original standard, published in 1989, did not give the cipher any name, but the most recent revision of the standard, GOST R 34.12-2015 (RFC 7801, RFC 8891), specifies that it may be referred to as Magma. The GOST hash function is based on this cipher. The new standard also specifies a new 128-bit block cipher called Kuznyechik.

    Developed in the 1970s, the standard had been marked 'Top Secret' and then downgraded to 'Secret' in 1990. Shortly after the dissolution of the USSR, it was declassified and it was released to the public in 1994. GOST 28147 was a Soviet alternative to the United States standard algorithm, DES. Thus, the two are very similar in structure."; this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -132,7 +132,6 @@ class GOSTEncrypt extends Operation { throw new OperationError(err); } } - } export default GOSTEncrypt; diff --git a/src/core/operations/GOSTHash.mjs b/src/core/operations/GOSTHash.mjs index 5c8cc6f7..aa08c62c 100644 --- a/src/core/operations/GOSTHash.mjs +++ b/src/core/operations/GOSTHash.mjs @@ -13,7 +13,6 @@ import { toHexFast } from "../lib/Hex.mjs"; * GOST hash operation */ class GOSTHash extends Operation { - /** * GOSTHash constructor */ @@ -22,7 +21,8 @@ class GOSTHash extends Operation { this.name = "GOST Hash"; this.module = "Hashing"; - this.description = "The GOST hash function, defined in the standards GOST R 34.11-94 and GOST 34.311-95 is a 256-bit cryptographic hash function. It was initially defined in the Russian national standard GOST R 34.11-94 Information Technology – Cryptographic Information Security – Hash Function. The equivalent standard used by other member-states of the CIS is GOST 34.311-95.

    This function must not be confused with a different Streebog hash function, which is defined in the new revision of the standard GOST R 34.11-2012.

    The GOST hash function is based on the GOST block cipher."; + this.description + = "The GOST hash function, defined in the standards GOST R 34.11-94 and GOST 34.311-95 is a 256-bit cryptographic hash function. It was initially defined in the Russian national standard GOST R 34.11-94 Information Technology – Cryptographic Information Security – Hash Function. The equivalent standard used by other member-states of the CIS is GOST 34.311-95.

    This function must not be confused with a different Streebog hash function, which is defined in the new revision of the standard GOST R 34.11-2012.

    The GOST hash function is based on the GOST block cipher."; this.infoURL = "https://wikipedia.org/wiki/GOST_(hash_function)"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -85,7 +85,6 @@ class GOSTHash extends Operation { throw new OperationError(err); } } - } export default GOSTHash; diff --git a/src/core/operations/GOSTKeyUnwrap.mjs b/src/core/operations/GOSTKeyUnwrap.mjs index afcd6287..5e98f7ec 100644 --- a/src/core/operations/GOSTKeyUnwrap.mjs +++ b/src/core/operations/GOSTKeyUnwrap.mjs @@ -14,7 +14,6 @@ import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js * GOST Key Unwrap operation */ class GOSTKeyUnwrap extends Operation { - /** * GOSTKeyUnwrap constructor */ @@ -123,7 +122,6 @@ class GOSTKeyUnwrap extends Operation { throw new OperationError(err); } } - } export default GOSTKeyUnwrap; diff --git a/src/core/operations/GOSTKeyWrap.mjs b/src/core/operations/GOSTKeyWrap.mjs index 5a3fd4e6..d6016290 100644 --- a/src/core/operations/GOSTKeyWrap.mjs +++ b/src/core/operations/GOSTKeyWrap.mjs @@ -14,7 +14,6 @@ import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js * GOST Key Wrap operation */ class GOSTKeyWrap extends Operation { - /** * GOSTKeyWrap constructor */ @@ -23,7 +22,8 @@ class GOSTKeyWrap extends Operation { this.name = "GOST Key Wrap"; this.module = "Ciphers"; - this.description = "A key wrapping algorithm for protecting keys in untrusted storage using one of the GOST block cipers."; + this.description + = "A key wrapping algorithm for protecting keys in untrusted storage using one of the GOST block cipers."; this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -123,7 +123,6 @@ class GOSTKeyWrap extends Operation { throw new OperationError(err); } } - } export default GOSTKeyWrap; diff --git a/src/core/operations/GOSTSign.mjs b/src/core/operations/GOSTSign.mjs index 9195f469..c0bdc0a9 100644 --- a/src/core/operations/GOSTSign.mjs +++ b/src/core/operations/GOSTSign.mjs @@ -14,7 +14,6 @@ import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js * GOST Sign operation */ class GOSTSign extends Operation { - /** * GOSTSign constructor */ @@ -123,7 +122,6 @@ class GOSTSign extends Operation { throw new OperationError(err); } } - } export default GOSTSign; diff --git a/src/core/operations/GOSTVerify.mjs b/src/core/operations/GOSTVerify.mjs index a270e7c5..dd11ae3f 100644 --- a/src/core/operations/GOSTVerify.mjs +++ b/src/core/operations/GOSTVerify.mjs @@ -14,7 +14,6 @@ import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js * GOST Verify operation */ class GOSTVerify extends Operation { - /** * GOSTVerify constructor */ @@ -23,7 +22,8 @@ class GOSTVerify extends Operation { this.name = "GOST Verify"; this.module = "Ciphers"; - this.description = "Verify the signature of a plaintext message using one of the GOST block ciphers. Enter the signature in the MAC field."; + this.description + = "Verify the signature of a plaintext message using one of the GOST block ciphers. Enter the signature in the MAC field."; this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -117,7 +117,6 @@ class GOSTVerify extends Operation { throw new OperationError(err); } } - } export default GOSTVerify; diff --git a/src/core/operations/GenerateAllHashes.mjs b/src/core/operations/GenerateAllHashes.mjs index d9af8065..5ebe3163 100644 --- a/src/core/operations/GenerateAllHashes.mjs +++ b/src/core/operations/GenerateAllHashes.mjs @@ -42,7 +42,6 @@ import OperationError from "../errors/OperationError.mjs"; * Generate all hashes operation */ class GenerateAllHashes extends Operation { - /** * GenerateAllHashes constructor */ @@ -59,70 +58,113 @@ class GenerateAllHashes extends Operation { { name: "Length (bits)", type: "option", - value: [ - "All", "128", "160", "224", "256", "320", "384", "512" - ] + value: ["All", "128", "160", "224", "256", "320", "384", "512"] }, { name: "Include names", type: "boolean", value: true - }, + } ]; this.hashes = [ - {name: "MD2", algo: (new MD2()), inputType: "arrayBuffer", params: []}, - {name: "MD4", algo: (new MD4()), inputType: "arrayBuffer", params: []}, - {name: "MD5", algo: (new MD5()), inputType: "arrayBuffer", params: []}, - {name: "MD6", algo: (new MD6()), inputType: "str", params: []}, - {name: "SHA0", algo: (new SHA0()), inputType: "arrayBuffer", params: []}, - {name: "SHA1", algo: (new SHA1()), inputType: "arrayBuffer", params: []}, - {name: "SHA2 224", algo: (new SHA2()), inputType: "arrayBuffer", params: ["224"]}, - {name: "SHA2 256", algo: (new SHA2()), inputType: "arrayBuffer", params: ["256"]}, - {name: "SHA2 384", algo: (new SHA2()), inputType: "arrayBuffer", params: ["384"]}, - {name: "SHA2 512", algo: (new SHA2()), inputType: "arrayBuffer", params: ["512"]}, - {name: "SHA3 224", algo: (new SHA3()), inputType: "arrayBuffer", params: ["224"]}, - {name: "SHA3 256", algo: (new SHA3()), inputType: "arrayBuffer", params: ["256"]}, - {name: "SHA3 384", algo: (new SHA3()), inputType: "arrayBuffer", params: ["384"]}, - {name: "SHA3 512", algo: (new SHA3()), inputType: "arrayBuffer", params: ["512"]}, - {name: "Keccak 224", algo: (new Keccak()), inputType: "arrayBuffer", params: ["224"]}, - {name: "Keccak 256", algo: (new Keccak()), inputType: "arrayBuffer", params: ["256"]}, - {name: "Keccak 384", algo: (new Keccak()), inputType: "arrayBuffer", params: ["384"]}, - {name: "Keccak 512", algo: (new Keccak()), inputType: "arrayBuffer", params: ["512"]}, - {name: "Shake 128", algo: (new Shake()), inputType: "arrayBuffer", params: ["128", 256]}, - {name: "Shake 256", algo: (new Shake()), inputType: "arrayBuffer", params: ["256", 512]}, - {name: "RIPEMD-128", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["128"]}, - {name: "RIPEMD-160", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["160"]}, - {name: "RIPEMD-256", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["256"]}, - {name: "RIPEMD-320", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["320"]}, - {name: "HAS-160", algo: (new HAS160()), inputType: "arrayBuffer", params: []}, - {name: "Whirlpool-0", algo: (new Whirlpool()), inputType: "arrayBuffer", params: ["Whirlpool-0"]}, - {name: "Whirlpool-T", algo: (new Whirlpool()), inputType: "arrayBuffer", params: ["Whirlpool-T"]}, - {name: "Whirlpool", algo: (new Whirlpool()), inputType: "arrayBuffer", params: ["Whirlpool"]}, - {name: "BLAKE2b-128", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["128", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2b-160", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["160", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2b-256", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["256", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2b-384", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["384", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2b-512", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["512", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2s-128", algo: (new BLAKE2s), inputType: "arrayBuffer", params: ["128", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2s-160", algo: (new BLAKE2s), inputType: "arrayBuffer", params: ["160", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2s-256", algo: (new BLAKE2s), inputType: "arrayBuffer", params: ["256", "Hex", {string: "", option: "UTF8"}]}, - {name: "Streebog-256", algo: (new Streebog), inputType: "arrayBuffer", params: ["256"]}, - {name: "Streebog-512", algo: (new Streebog), inputType: "arrayBuffer", params: ["512"]}, - {name: "GOST", algo: (new GOSTHash), inputType: "arrayBuffer", params: ["GOST 28147 (1994)", "256", "D-A"]}, - {name: "LM Hash", algo: (new LMHash), inputType: "str", params: []}, - {name: "NT Hash", algo: (new NTHash), inputType: "str", params: []}, - {name: "SSDEEP", algo: (new SSDEEP()), inputType: "str"}, - {name: "CTPH", algo: (new CTPH()), inputType: "str"} + { name: "MD2", algo: new MD2(), inputType: "arrayBuffer", params: [] }, + { name: "MD4", algo: new MD4(), inputType: "arrayBuffer", params: [] }, + { name: "MD5", algo: new MD5(), inputType: "arrayBuffer", params: [] }, + { name: "MD6", algo: new MD6(), inputType: "str", params: [] }, + { name: "SHA0", algo: new SHA0(), inputType: "arrayBuffer", params: [] }, + { name: "SHA1", algo: new SHA1(), inputType: "arrayBuffer", params: [] }, + { name: "SHA2 224", algo: new SHA2(), inputType: "arrayBuffer", params: ["224"] }, + { name: "SHA2 256", algo: new SHA2(), inputType: "arrayBuffer", params: ["256"] }, + { name: "SHA2 384", algo: new SHA2(), inputType: "arrayBuffer", params: ["384"] }, + { name: "SHA2 512", algo: new SHA2(), inputType: "arrayBuffer", params: ["512"] }, + { name: "SHA3 224", algo: new SHA3(), inputType: "arrayBuffer", params: ["224"] }, + { name: "SHA3 256", algo: new SHA3(), inputType: "arrayBuffer", params: ["256"] }, + { name: "SHA3 384", algo: new SHA3(), inputType: "arrayBuffer", params: ["384"] }, + { name: "SHA3 512", algo: new SHA3(), inputType: "arrayBuffer", params: ["512"] }, + { name: "Keccak 224", algo: new Keccak(), inputType: "arrayBuffer", params: ["224"] }, + { name: "Keccak 256", algo: new Keccak(), inputType: "arrayBuffer", params: ["256"] }, + { name: "Keccak 384", algo: new Keccak(), inputType: "arrayBuffer", params: ["384"] }, + { name: "Keccak 512", algo: new Keccak(), inputType: "arrayBuffer", params: ["512"] }, + { name: "Shake 128", algo: new Shake(), inputType: "arrayBuffer", params: ["128", 256] }, + { name: "Shake 256", algo: new Shake(), inputType: "arrayBuffer", params: ["256", 512] }, + { name: "RIPEMD-128", algo: new RIPEMD(), inputType: "arrayBuffer", params: ["128"] }, + { name: "RIPEMD-160", algo: new RIPEMD(), inputType: "arrayBuffer", params: ["160"] }, + { name: "RIPEMD-256", algo: new RIPEMD(), inputType: "arrayBuffer", params: ["256"] }, + { name: "RIPEMD-320", algo: new RIPEMD(), inputType: "arrayBuffer", params: ["320"] }, + { name: "HAS-160", algo: new HAS160(), inputType: "arrayBuffer", params: [] }, + { name: "Whirlpool-0", algo: new Whirlpool(), inputType: "arrayBuffer", params: ["Whirlpool-0"] }, + { name: "Whirlpool-T", algo: new Whirlpool(), inputType: "arrayBuffer", params: ["Whirlpool-T"] }, + { name: "Whirlpool", algo: new Whirlpool(), inputType: "arrayBuffer", params: ["Whirlpool"] }, + { + name: "BLAKE2b-128", + algo: new BLAKE2b(), + inputType: "arrayBuffer", + params: ["128", "Hex", { string: "", option: "UTF8" }] + }, + { + name: "BLAKE2b-160", + algo: new BLAKE2b(), + inputType: "arrayBuffer", + params: ["160", "Hex", { string: "", option: "UTF8" }] + }, + { + name: "BLAKE2b-256", + algo: new BLAKE2b(), + inputType: "arrayBuffer", + params: ["256", "Hex", { string: "", option: "UTF8" }] + }, + { + name: "BLAKE2b-384", + algo: new BLAKE2b(), + inputType: "arrayBuffer", + params: ["384", "Hex", { string: "", option: "UTF8" }] + }, + { + name: "BLAKE2b-512", + algo: new BLAKE2b(), + inputType: "arrayBuffer", + params: ["512", "Hex", { string: "", option: "UTF8" }] + }, + { + name: "BLAKE2s-128", + algo: new BLAKE2s(), + inputType: "arrayBuffer", + params: ["128", "Hex", { string: "", option: "UTF8" }] + }, + { + name: "BLAKE2s-160", + algo: new BLAKE2s(), + inputType: "arrayBuffer", + params: ["160", "Hex", { string: "", option: "UTF8" }] + }, + { + name: "BLAKE2s-256", + algo: new BLAKE2s(), + inputType: "arrayBuffer", + params: ["256", "Hex", { string: "", option: "UTF8" }] + }, + { name: "Streebog-256", algo: new Streebog(), inputType: "arrayBuffer", params: ["256"] }, + { name: "Streebog-512", algo: new Streebog(), inputType: "arrayBuffer", params: ["512"] }, + { + name: "GOST", + algo: new GOSTHash(), + inputType: "arrayBuffer", + params: ["GOST 28147 (1994)", "256", "D-A"] + }, + { name: "LM Hash", algo: new LMHash(), inputType: "str", params: [] }, + { name: "NT Hash", algo: new NTHash(), inputType: "str", params: [] }, + { name: "SSDEEP", algo: new SSDEEP(), inputType: "str" }, + { name: "CTPH", algo: new CTPH(), inputType: "str" } ]; this.checksums = [ - {name: "Fletcher-8", algo: (new Fletcher8Checksum), inputType: "byteArray", params: []}, - {name: "Fletcher-16", algo: (new Fletcher16Checksum), inputType: "byteArray", params: []}, - {name: "Fletcher-32", algo: (new Fletcher32Checksum), inputType: "byteArray", params: []}, - {name: "Fletcher-64", algo: (new Fletcher64Checksum), inputType: "byteArray", params: []}, - {name: "Adler-32", algo: (new Adler32Checksum), inputType: "byteArray", params: []}, - {name: "CRC-8", algo: (new CRC8Checksum), inputType: "arrayBuffer", params: ["CRC-8"]}, - {name: "CRC-16", algo: (new CRC16Checksum), inputType: "arrayBuffer", params: []}, - {name: "CRC-32", algo: (new CRC32Checksum), inputType: "arrayBuffer", params: []} + { name: "Fletcher-8", algo: new Fletcher8Checksum(), inputType: "byteArray", params: [] }, + { name: "Fletcher-16", algo: new Fletcher16Checksum(), inputType: "byteArray", params: [] }, + { name: "Fletcher-32", algo: new Fletcher32Checksum(), inputType: "byteArray", params: [] }, + { name: "Fletcher-64", algo: new Fletcher64Checksum(), inputType: "byteArray", params: [] }, + { name: "Adler-32", algo: new Adler32Checksum(), inputType: "byteArray", params: [] }, + { name: "CRC-8", algo: new CRC8Checksum(), inputType: "arrayBuffer", params: ["CRC-8"] }, + { name: "CRC-16", algo: new CRC16Checksum(), inputType: "arrayBuffer", params: [] }, + { name: "CRC-32", algo: new CRC32Checksum(), inputType: "arrayBuffer", params: [] } ]; } @@ -137,16 +179,17 @@ class GenerateAllHashes extends Operation { this.inputStr = Utils.arrayBufferToStr(input, false); this.inputByteArray = new Uint8Array(input); - let digest, output = ""; + let digest, + output = ""; // iterate over each of the hashes - this.hashes.forEach(hash => { + this.hashes.forEach((hash) => { digest = this.executeAlgo(hash.algo, hash.inputType, hash.params || []); output += this.formatDigest(digest, length, includeNames, hash.name); }); if (length === "All") { output += "\nChecksums:\n"; - this.checksums.forEach(checksum => { + this.checksums.forEach((checksum) => { digest = this.executeAlgo(checksum.algo, checksum.inputType, checksum.params || []); output += this.formatDigest(digest, length, includeNames, checksum.name); }); @@ -163,7 +206,7 @@ class GenerateAllHashes extends Operation { * @param {Object[]} [params=[]] * @returns {string} */ - executeAlgo(algo, inputType, params=[]) { + executeAlgo(algo, inputType, params = []) { let digest = null; switch (inputType) { case "arrayBuffer": @@ -191,15 +234,12 @@ class GenerateAllHashes extends Operation { * @returns {string} */ formatDigest(digest, length, includeNames, name) { - if (length !== "All" && (digest.length * 4) !== parseInt(length, 10)) - return ""; + if (length !== "All" && digest.length * 4 !== parseInt(length, 10)) return ""; - if (!includeNames) - return digest + "\n"; + if (!includeNames) return digest + "\n"; - return `${name}:${" ".repeat(13-name.length)}${digest}\n`; + return `${name}:${" ".repeat(13 - name.length)}${digest}\n`; } - } export default GenerateAllHashes; diff --git a/src/core/operations/GenerateDeBruijnSequence.mjs b/src/core/operations/GenerateDeBruijnSequence.mjs index f28d421f..40a250aa 100644 --- a/src/core/operations/GenerateDeBruijnSequence.mjs +++ b/src/core/operations/GenerateDeBruijnSequence.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Generate De Bruijn Sequence operation */ class GenerateDeBruijnSequence extends Operation { - /** * GenerateDeBruijnSequence constructor */ diff --git a/src/core/operations/GenerateHOTP.mjs b/src/core/operations/GenerateHOTP.mjs index a800df6b..c2ae7e98 100644 --- a/src/core/operations/GenerateHOTP.mjs +++ b/src/core/operations/GenerateHOTP.mjs @@ -12,7 +12,6 @@ import ToBase32 from "./ToBase32.mjs"; * Generate HOTP operation */ class GenerateHOTP extends Operation { - /** * GenerateHOTP constructor */ @@ -21,7 +20,8 @@ class GenerateHOTP extends Operation { this.name = "Generate HOTP"; this.module = "Default"; - this.description = "The HMAC-based One-Time Password algorithm (HOTP) is an algorithm that computes a one-time password from a shared secret key and an incrementing counter. It has been adopted as Internet Engineering Task Force standard RFC 4226, is the cornerstone of Initiative For Open Authentication (OAUTH), and is used in a number of two-factor authentication systems.

    Enter the secret as the input or leave it blank for a random secret to be generated."; + this.description + = "The HMAC-based One-Time Password algorithm (HOTP) is an algorithm that computes a one-time password from a shared secret key and an incrementing counter. It has been adopted as Internet Engineering Task Force standard RFC 4226, is the cornerstone of Initiative For Open Authentication (OAUTH), and is used in a number of two-factor authentication systems.

    Enter the secret as the input or leave it blank for a random secret to be generated."; this.infoURL = "https://wikipedia.org/wiki/HMAC-based_One-time_Password_algorithm"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -59,12 +59,11 @@ class GenerateHOTP extends Operation { name: args[0], keySize: args[1], codeLength: args[2], - secret: (new ToBase32).run(input, []).split("=")[0], + secret: new ToBase32().run(input, []).split("=")[0] }); const counter = args[3]; return `URI: ${otpObj.hotpURL}\n\nPassword: ${otpObj.hotp(counter)}`; } - } export default GenerateHOTP; diff --git a/src/core/operations/GenerateImage.mjs b/src/core/operations/GenerateImage.mjs index 66e762b5..5a1fcc6c 100644 --- a/src/core/operations/GenerateImage.mjs +++ b/src/core/operations/GenerateImage.mjs @@ -7,16 +7,15 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {isImage} from "../lib/FileType.mjs"; -import {toBase64} from "../lib/Base64.mjs"; -import {isWorkerEnvironment} from "../Utils.mjs"; +import { isImage } from "../lib/FileType.mjs"; +import { toBase64 } from "../lib/Base64.mjs"; +import { isWorkerEnvironment } from "../Utils.mjs"; import jimp from "jimp"; /** * Generate Image operation */ class GenerateImage extends Operation { - /** * GenerateImage constructor */ @@ -39,12 +38,12 @@ class GenerateImage extends Operation { { "name": "Pixel Scale Factor", "type": "number", - "value": 8, + "value": 8 }, { "name": "Pixels per row", "type": "number", - "value": 64, + "value": 64 } ]; } @@ -71,20 +70,19 @@ class GenerateImage extends Operation { "RG": 2, "RGB": 3, "RGBA": 4, - "Bits": 1/8, + "Bits": 1 / 8 }; const bytesPerPixel = bytePerPixelMap[mode]; - if (bytesPerPixel > 0 && input.length % bytesPerPixel !== 0) { + if (bytesPerPixel > 0 && input.length % bytesPerPixel !== 0) { throw new OperationError(`Number of bytes is not a divisor of ${bytesPerPixel}`); } const height = Math.ceil(input.length / bytesPerPixel / width); const image = await new jimp(width, height, (err, image) => {}); - if (isWorkerEnvironment()) - self.sendStatusMessage("Generating image from data..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Generating image from data..."); if (mode === "Bits") { let index = 0; @@ -94,8 +92,8 @@ class GenerateImage extends Operation { const x = index % width; const y = Math.floor(index / width); - const value = curByte[k] === "0" ? 0xFF : 0x00; - const pixel = jimp.rgbaToInt(value, value, value, 0xFF); + const value = curByte[k] === "0" ? 0xff : 0x00; + const pixel = jimp.rgbaToInt(value, value, value, 0xff); image.setPixelColor(pixel, x, y); } } @@ -109,7 +107,7 @@ class GenerateImage extends Operation { let red = 0x00; let green = 0x00; let blue = 0x00; - let alpha = 0xFF; + let alpha = 0xff; switch (mode) { case "Greyscale": @@ -148,10 +146,9 @@ class GenerateImage extends Operation { } if (scale !== 1) { - if (isWorkerEnvironment()) - self.sendStatusMessage("Scaling image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Scaling image..."); - image.scaleToFit(width*scale, height*scale, jimp.RESIZE_NEAREST_NEIGHBOR); + image.scaleToFit(width * scale, height * scale, jimp.RESIZE_NEAREST_NEIGHBOR); } try { @@ -178,7 +175,6 @@ class GenerateImage extends Operation { return ``; } - } export default GenerateImage; diff --git a/src/core/operations/GenerateLoremIpsum.mjs b/src/core/operations/GenerateLoremIpsum.mjs index 7bc636ac..aa3489f5 100644 --- a/src/core/operations/GenerateLoremIpsum.mjs +++ b/src/core/operations/GenerateLoremIpsum.mjs @@ -12,7 +12,6 @@ import { GenerateParagraphs, GenerateSentences, GenerateWords, GenerateBytes } f * Generate Lorem Ipsum operation */ class GenerateLoremIpsum extends Operation { - /** * GenerateLoremIpsum constructor */ @@ -36,7 +35,6 @@ class GenerateLoremIpsum extends Operation { "type": "option", "value": ["Paragraphs", "Sentences", "Words", "Bytes"] } - ]; } @@ -61,10 +59,8 @@ class GenerateLoremIpsum extends Operation { return GenerateBytes(length); default: throw new OperationError("Invalid length type"); - } } - } export default GenerateLoremIpsum; diff --git a/src/core/operations/GeneratePGPKeyPair.mjs b/src/core/operations/GeneratePGPKeyPair.mjs index a26b5cc8..50293b71 100644 --- a/src/core/operations/GeneratePGPKeyPair.mjs +++ b/src/core/operations/GeneratePGPKeyPair.mjs @@ -13,12 +13,10 @@ import { cryptNotice } from "../lib/Crypt.mjs"; import * as es6promisify from "es6-promisify"; const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; - /** * Generate PGP Key Pair operation */ class GeneratePGPKeyPair extends Operation { - /** * GeneratePGPKeyPair constructor */ @@ -87,15 +85,18 @@ class GeneratePGPKeyPair extends Operation { "flags": flags, "expire_in": 0 }, - subkeys: [{ - "nbits": getSubkeySize(keySize), - "flags": kbpgp.const.openpgp.sign_data, - "expire_in": 86400 * 365 * 8 - }, { - "nbits": getSubkeySize(keySize), - "flags": kbpgp.const.openpgp.encrypt_comm | kbpgp.const.openpgp.encrypt_storage, - "expire_in": 86400 * 365 * 2 - }], + subkeys: [ + { + "nbits": getSubkeySize(keySize), + "flags": kbpgp.const.openpgp.sign_data, + "expire_in": 86400 * 365 * 8 + }, + { + "nbits": getSubkeySize(keySize), + "flags": kbpgp.const.openpgp.encrypt_comm | kbpgp.const.openpgp.encrypt_storage, + "expire_in": 86400 * 365 * 2 + } + ], asp: ASP }; @@ -108,7 +109,9 @@ class GeneratePGPKeyPair extends Operation { privateKeyExportOptions = {}; if (password) privateKeyExportOptions.passphrase = password; - const privateKey = await promisify(signedKey.export_pgp_private.bind(signedKey))(privateKeyExportOptions); + const privateKey = await promisify(signedKey.export_pgp_private.bind(signedKey))( + privateKeyExportOptions + ); const publicKey = await promisify(signedKey.export_pgp_public.bind(signedKey))({}); resolve(privateKey + "\n" + publicKey.trim()); } catch (err) { @@ -116,7 +119,6 @@ class GeneratePGPKeyPair extends Operation { } }); } - } export default GeneratePGPKeyPair; diff --git a/src/core/operations/GenerateQRCode.mjs b/src/core/operations/GenerateQRCode.mjs index d3e1ee3b..64ffca4b 100644 --- a/src/core/operations/GenerateQRCode.mjs +++ b/src/core/operations/GenerateQRCode.mjs @@ -15,7 +15,6 @@ import Utils from "../Utils.mjs"; * Generate QR Code operation */ class GenerateQRCode extends Operation { - /** * GenerateQRCode constructor */ @@ -24,7 +23,8 @@ class GenerateQRCode extends Operation { this.name = "Generate QR Code"; this.module = "Image"; - this.description = "Generates a Quick Response (QR) code from the input text.

    A QR code is a type of matrix barcode (or two-dimensional barcode) first designed in 1994 for the automotive industry in Japan. A barcode is a machine-readable optical label that contains information about the item to which it is attached."; + this.description + = "Generates a Quick Response (QR) code from the input text.

    A QR code is a type of matrix barcode (or two-dimensional barcode) first designed in 1994 for the automotive industry in Japan. A barcode is a machine-readable optical label that contains information about the item to which it is attached."; this.infoURL = "https://wikipedia.org/wiki/QR_code"; this.inputType = "string"; this.outputType = "ArrayBuffer"; @@ -88,7 +88,6 @@ class GenerateQRCode extends Operation { return Utils.arrayBufferToStr(data); } - } export default GenerateQRCode; diff --git a/src/core/operations/GenerateRSAKeyPair.mjs b/src/core/operations/GenerateRSAKeyPair.mjs index 3dd2837d..51c8d1a6 100644 --- a/src/core/operations/GenerateRSAKeyPair.mjs +++ b/src/core/operations/GenerateRSAKeyPair.mjs @@ -13,7 +13,6 @@ import { cryptNotice } from "../lib/Crypt.mjs"; * Generate RSA Key Pair operation */ class GenerateRSAKeyPair extends Operation { - /** * GenerateRSAKeyPair constructor */ @@ -30,20 +29,12 @@ class GenerateRSAKeyPair extends Operation { { name: "RSA Key Length", type: "option", - value: [ - "1024", - "2048", - "4096" - ] + value: ["1024", "2048", "4096"] }, { name: "Output Format", type: "option", - value: [ - "PEM", - "JSON", - "DER" - ] + value: ["PEM", "JSON", "DER"] } ]; } @@ -57,32 +48,37 @@ class GenerateRSAKeyPair extends Operation { const [keyLength, outputFormat] = args; return new Promise((resolve, reject) => { - forge.pki.rsa.generateKeyPair({ - bits: Number(keyLength), - workers: -1, - workerScript: "assets/forge/prime.worker.min.js" - }, (err, keypair) => { - if (err) return reject(err); + forge.pki.rsa.generateKeyPair( + { + bits: Number(keyLength), + workers: -1, + workerScript: "assets/forge/prime.worker.min.js" + }, + (err, keypair) => { + if (err) return reject(err); - let result; + let result; - switch (outputFormat) { - case "PEM": - result = forge.pki.publicKeyToPem(keypair.publicKey) + "\n" + forge.pki.privateKeyToPem(keypair.privateKey); - break; - case "JSON": - result = JSON.stringify(keypair); - break; - case "DER": - result = forge.asn1.toDer(forge.pki.privateKeyToAsn1(keypair.privateKey)).getBytes(); - break; + switch (outputFormat) { + case "PEM": + result + = forge.pki.publicKeyToPem(keypair.publicKey) + + "\n" + + forge.pki.privateKeyToPem(keypair.privateKey); + break; + case "JSON": + result = JSON.stringify(keypair); + break; + case "DER": + result = forge.asn1.toDer(forge.pki.privateKeyToAsn1(keypair.privateKey)).getBytes(); + break; + } + + resolve(result); } - - resolve(result); - }); + ); }); } - } export default GenerateRSAKeyPair; diff --git a/src/core/operations/GenerateTOTP.mjs b/src/core/operations/GenerateTOTP.mjs index 5c52721d..5d5aebda 100644 --- a/src/core/operations/GenerateTOTP.mjs +++ b/src/core/operations/GenerateTOTP.mjs @@ -12,7 +12,6 @@ import ToBase32 from "./ToBase32.mjs"; * Generate TOTP operation */ class GenerateTOTP extends Operation { - /** * GenerateTOTP constructor */ @@ -21,7 +20,8 @@ class GenerateTOTP extends Operation { this.name = "Generate TOTP"; this.module = "Default"; - this.description = "The Time-based One-Time Password algorithm (TOTP) is an algorithm that computes a one-time password from a shared secret key and the current time. It has been adopted as Internet Engineering Task Force standard RFC 6238, is the cornerstone of Initiative For Open Authentication (OAUTH), and is used in a number of two-factor authentication systems. A TOTP is an HOTP where the counter is the current time.

    Enter the secret as the input or leave it blank for a random secret to be generated. T0 and T1 are in seconds."; + this.description + = "The Time-based One-Time Password algorithm (TOTP) is an algorithm that computes a one-time password from a shared secret key and the current time. It has been adopted as Internet Engineering Task Force standard RFC 6238, is the cornerstone of Initiative For Open Authentication (OAUTH), and is used in a number of two-factor authentication systems. A TOTP is an HOTP where the counter is the current time.

    Enter the secret as the input or leave it blank for a random secret to be generated. T0 and T1 are in seconds."; this.infoURL = "https://wikipedia.org/wiki/Time-based_One-time_Password_algorithm"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -64,13 +64,12 @@ class GenerateTOTP extends Operation { name: args[0], keySize: args[1], codeLength: args[2], - secret: (new ToBase32).run(input, []).split("=")[0], + secret: new ToBase32().run(input, []).split("=")[0], epoch: args[3], timeSlice: args[4] }); return `URI: ${otpObj.totpURL}\n\nPassword: ${otpObj.totp()}`; } - } export default GenerateTOTP; diff --git a/src/core/operations/GenerateUUID.mjs b/src/core/operations/GenerateUUID.mjs index 1ee0faba..08f8349c 100644 --- a/src/core/operations/GenerateUUID.mjs +++ b/src/core/operations/GenerateUUID.mjs @@ -11,7 +11,6 @@ import crypto from "crypto"; * Generate UUID operation */ class GenerateUUID extends Operation { - /** * GenerateUUID constructor */ @@ -20,7 +19,8 @@ class GenerateUUID extends Operation { this.name = "Generate UUID"; this.module = "Crypto"; - this.description = "Generates an RFC 4122 version 4 compliant Universally Unique Identifier (UUID), also known as a Globally Unique Identifier (GUID).

    A version 4 UUID relies on random numbers, in this case generated using window.crypto if available and falling back to Math.random if not."; + this.description + = "Generates an RFC 4122 version 4 compliant Universally Unique Identifier (UUID), also known as a Globally Unique Identifier (GUID).

    A version 4 UUID relies on random numbers, in this case generated using window.crypto if available and falling back to Math.random if not."; this.infoURL = "https://wikipedia.org/wiki/Universally_unique_identifier"; this.inputType = "string"; this.outputType = "string"; @@ -37,14 +37,13 @@ class GenerateUUID extends Operation { return crypto.randomBytes(4).readUInt32BE(0, true); }); let i = 0; - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { const r = (buf[i >> 3] >> ((i % 8) * 4)) & 0xf, - v = c === "x" ? r : (r & 0x3 | 0x8); + v = c === "x" ? r : (r & 0x3) | 0x8; i++; return v.toString(16); }); } - } export default GenerateUUID; diff --git a/src/core/operations/GenericCodeBeautify.mjs b/src/core/operations/GenericCodeBeautify.mjs index 30e11cb3..4be1dccb 100644 --- a/src/core/operations/GenericCodeBeautify.mjs +++ b/src/core/operations/GenericCodeBeautify.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Generic Code Beautify operation */ class GenericCodeBeautify extends Operation { - /** * GenericCodeBeautify constructor */ @@ -19,7 +18,8 @@ class GenericCodeBeautify extends Operation { this.name = "Generic Code Beautify"; this.module = "Code"; - this.description = "Attempts to pretty print C-style languages such as C, C++, C#, Java, PHP, JavaScript etc.

    This will not do a perfect job, and the resulting code may not work any more. This operation is designed purely to make obfuscated or minified code more easy to read and understand.

    Things which will not work properly:
    • For loop formatting
    • Do-While loop formatting
    • Switch/Case indentation
    • Certain bit shift operators
    "; + this.description + = "Attempts to pretty print C-style languages such as C, C++, C#, Java, PHP, JavaScript etc.

    This will not do a perfect job, and the resulting code may not work any more. This operation is designed purely to make obfuscated or minified code more easy to read and understand.

    Things which will not work properly:
    • For loop formatting
    • Do-While loop formatting
    • Switch/Case indentation
    • Certain bit shift operators
    "; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -100,13 +100,13 @@ class GenericCodeBeautify extends Operation { level++; break; case "\n": - if (i+1 >= code.length) break; + if (i + 1 >= code.length) break; - if (code[i+1] === "}") level--; - indent = (level >= 0) ? Array(level*4+1).join(" ") : ""; + if (code[i + 1] === "}") level--; + indent = level >= 0 ? Array(level * 4 + 1).join(" ") : ""; - code = code.substring(0, i+1) + indent + code.substring(i+1); - if (level > 0) i += level*4; + code = code.substring(0, i + 1) + indent + code.substring(i + 1); + if (level > 0) i += level * 4; break; } i++; @@ -150,12 +150,15 @@ class GenericCodeBeautify extends Operation { */ function preserveToken(str, match, t) { preservedTokens[t] = match[0]; - return str.substring(0, match.index) + - "###preservedToken" + t + "###" + - str.substring(match.index + match[0].length); + return ( + str.substring(0, match.index) + + "###preservedToken" + + t + + "###" + + str.substring(match.index + match[0].length) + ); } } - } export default GenericCodeBeautify; diff --git a/src/core/operations/GetAllCasings.mjs b/src/core/operations/GetAllCasings.mjs index b3f3e94e..5a9ab823 100644 --- a/src/core/operations/GetAllCasings.mjs +++ b/src/core/operations/GetAllCasings.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Permutate String operation */ class GetAllCasings extends Operation { - /** * GetAllCasings constructor */ diff --git a/src/core/operations/GetTime.mjs b/src/core/operations/GetTime.mjs index 7d10864f..f080c6da 100644 --- a/src/core/operations/GetTime.mjs +++ b/src/core/operations/GetTime.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {UNITS} from "../lib/DateTime.mjs"; +import { UNITS } from "../lib/DateTime.mjs"; /** * Get Time operation */ class GetTime extends Operation { - /** * GetTime constructor */ @@ -22,7 +21,8 @@ class GetTime extends Operation { this.name = "Get Time"; this.module = "Default"; - this.description = "Generates a timestamp showing the amount of time since the UNIX epoch (1970-01-01 00:00:00 UTC). Uses the W3C High Resolution Time API."; + this.description + = "Generates a timestamp showing the amount of time since the UNIX epoch (1970-01-01 00:00:00 UTC). Uses the W3C High Resolution Time API."; this.infoURL = "https://wikipedia.org/wiki/Unix_time"; this.inputType = "string"; this.outputType = "number"; @@ -41,7 +41,7 @@ class GetTime extends Operation { * @returns {number} */ run(input, args) { - const nowMs = (performance.timeOrigin + performance.now()), + const nowMs = performance.timeOrigin + performance.now(), granularity = args[0]; switch (granularity) { @@ -57,7 +57,6 @@ class GetTime extends Operation { throw new OperationError("Unknown granularity value: " + granularity); } } - } export default GetTime; diff --git a/src/core/operations/GroupIPAddresses.mjs b/src/core/operations/GroupIPAddresses.mjs index 06840eeb..9292e180 100644 --- a/src/core/operations/GroupIPAddresses.mjs +++ b/src/core/operations/GroupIPAddresses.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {IP_DELIM_OPTIONS} from "../lib/Delim.mjs"; -import {ipv6ToStr, genIpv6Mask, IPV4_REGEX, strToIpv6, ipv4ToStr, IPV6_REGEX, strToIpv4} from "../lib/IP.mjs"; +import { IP_DELIM_OPTIONS } from "../lib/Delim.mjs"; +import { ipv6ToStr, genIpv6Mask, IPV4_REGEX, strToIpv6, ipv4ToStr, IPV6_REGEX, strToIpv4 } from "../lib/IP.mjs"; /** * Group IP addresses operation */ class GroupIPAddresses extends Operation { - /** * GroupIPAddresses constructor */ @@ -41,7 +40,7 @@ class GroupIPAddresses extends Operation { { "name": "Only show the subnets", "type": "boolean", - "value": false, + "value": false } ]; } @@ -55,7 +54,7 @@ class GroupIPAddresses extends Operation { const delim = Utils.charRep(args[0]), cidr = args[1], onlySubnets = args[2], - ipv4Mask = cidr < 32 ? ~(0xFFFFFFFF >>> cidr) : 0xFFFFFFFF, + ipv4Mask = cidr < 32 ? ~(0xffffffff >>> cidr) : 0xffffffff, ipv6Mask = genIpv6Mask(cidr), ips = input.split(delim), ipv4Networks = {}, @@ -131,7 +130,6 @@ class GroupIPAddresses extends Operation { return output; } - } export default GroupIPAddresses; diff --git a/src/core/operations/Gunzip.mjs b/src/core/operations/Gunzip.mjs index d3d97f6d..91ca6e49 100644 --- a/src/core/operations/Gunzip.mjs +++ b/src/core/operations/Gunzip.mjs @@ -13,7 +13,6 @@ const Zlib = gunzip.Zlib; * Gunzip operation */ class Gunzip extends Operation { - /** * Gunzip constructor */ @@ -45,7 +44,6 @@ class Gunzip extends Operation { const gzipObj = new Zlib.Gunzip(new Uint8Array(input)); return new Uint8Array(gzipObj.decompress()).buffer; } - } export default Gunzip; diff --git a/src/core/operations/Gzip.mjs b/src/core/operations/Gzip.mjs index 093ae6a4..0f67cc80 100644 --- a/src/core/operations/Gzip.mjs +++ b/src/core/operations/Gzip.mjs @@ -5,7 +5,7 @@ */ import Operation from "../Operation.mjs"; -import {COMPRESSION_TYPE, ZLIB_COMPRESSION_TYPE_LOOKUP} from "../lib/Zlib.mjs"; +import { COMPRESSION_TYPE, ZLIB_COMPRESSION_TYPE_LOOKUP } from "../lib/Zlib.mjs"; import gzip from "zlibjs/bin/gzip.min.js"; const Zlib = gzip.Zlib; @@ -14,7 +14,6 @@ const Zlib = gzip.Zlib; * Gzip operation */ class Gzip extends Operation { - /** * Gzip constructor */ @@ -83,7 +82,6 @@ class Gzip extends Operation { } return compressed.buffer; } - } export default Gzip; diff --git a/src/core/operations/HAS160.mjs b/src/core/operations/HAS160.mjs index 707b99b3..8cacf97e 100644 --- a/src/core/operations/HAS160.mjs +++ b/src/core/operations/HAS160.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * HAS-160 operation */ class HAS160 extends Operation { - /** * HAS-160 constructor */ @@ -20,7 +19,8 @@ class HAS160 extends Operation { this.name = "HAS-160"; this.module = "Crypto"; - this.description = "HAS-160 is a cryptographic hash function designed for use with the Korean KCDSA digital signature algorithm. It is derived from SHA-1, with assorted changes intended to increase its security. It produces a 160-bit output.

    HAS-160 is used in the same way as SHA-1. First it divides input in blocks of 512 bits each and pads the final block. A digest function updates the intermediate hash value by processing the input blocks in turn.

    The message digest algorithm consists, by default, of 80 rounds."; + this.description + = "HAS-160 is a cryptographic hash function designed for use with the Korean KCDSA digital signature algorithm. It is derived from SHA-1, with assorted changes intended to increase its security. It produces a 160-bit output.

    HAS-160 is used in the same way as SHA-1. First it divides input in blocks of 512 bits each and pads the final block. A digest function updates the intermediate hash value by processing the input blocks in turn.

    The message digest algorithm consists, by default, of 80 rounds."; this.infoURL = "https://wikipedia.org/wiki/HAS-160"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -41,9 +41,8 @@ class HAS160 extends Operation { * @returns {string} */ run(input, args) { - return runHash("has160", input, {rounds: args[0]}); + return runHash("has160", input, { rounds: args[0] }); } - } export default HAS160; diff --git a/src/core/operations/HASSHClientFingerprint.mjs b/src/core/operations/HASSHClientFingerprint.mjs index e507cea1..60c2c15f 100644 --- a/src/core/operations/HASSHClientFingerprint.mjs +++ b/src/core/operations/HASSHClientFingerprint.mjs @@ -18,13 +18,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import Stream from "../lib/Stream.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * HASSH Client Fingerprint operation */ class HASSHClientFingerprint extends Operation { - /** * HASSHClientFingerprint constructor */ @@ -33,7 +32,8 @@ class HASSHClientFingerprint extends Operation { this.name = "HASSH Client Fingerprint"; this.module = "Crypto"; - this.description = "Generates a HASSH fingerprint to help identify SSH clients based on hashing together values from the Client Key Exchange Init message.

    Input: A hex stream of the SSH_MSG_KEXINIT packet application layer from Client to Server."; + this.description + = "Generates a HASSH fingerprint to help identify SSH clients based on hashing together values from the Client Key Exchange Init message.

    Input: A hex stream of the SSH_MSG_KEXINIT packet application layer from Client to Server."; this.infoURL = "https://engineering.salesforce.com/open-sourcing-hassh-abed3ae5044c"; this.inputType = "string"; this.outputType = "string"; @@ -64,16 +64,14 @@ class HASSHClientFingerprint extends Operation { // Length const length = s.readInt(4); - if (s.length !== length + 4) - throw new OperationError("Incorrect packet length."); + if (s.length !== length + 4) throw new OperationError("Incorrect packet length."); // Padding length const paddingLength = s.readInt(1); // Message code const messageCode = s.readInt(1); - if (messageCode !== 20) - throw new OperationError("Not a Key Exchange Init."); + if (messageCode !== 20) throw new OperationError("Not a Key Exchange Init."); // Cookie s.moveForwardsBy(16); @@ -128,12 +126,7 @@ class HASSHClientFingerprint extends Operation { s.moveForwardsBy(paddingLength); // Output - const hassh = [ - kexAlgos, - encAlgosC2S, - macAlgosC2S, - compAlgosC2S - ]; + const hassh = [kexAlgos, encAlgosC2S, macAlgosC2S, compAlgosC2S]; const hasshStr = hassh.join(";"); const hasshHash = runHash("md5", Utils.strToArrayBuffer(hasshStr)); @@ -160,7 +153,6 @@ ${compAlgosC2S}`; return hasshHash; } } - } export default HASSHClientFingerprint; diff --git a/src/core/operations/HASSHServerFingerprint.mjs b/src/core/operations/HASSHServerFingerprint.mjs index f08a418b..c5aac8e6 100644 --- a/src/core/operations/HASSHServerFingerprint.mjs +++ b/src/core/operations/HASSHServerFingerprint.mjs @@ -12,19 +12,18 @@ * Josh Atkins * * Algorithm released under the BSD-3-clause licence -*/ + */ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import Stream from "../lib/Stream.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * HASSH Server Fingerprint operation */ class HASSHServerFingerprint extends Operation { - /** * HASSHServerFingerprint constructor */ @@ -33,7 +32,8 @@ class HASSHServerFingerprint extends Operation { this.name = "HASSH Server Fingerprint"; this.module = "Crypto"; - this.description = "Generates a HASSH fingerprint to help identify SSH servers based on hashing together values from the Server Key Exchange Init message.

    Input: A hex stream of the SSH_MSG_KEXINIT packet application layer from Server to Client."; + this.description + = "Generates a HASSH fingerprint to help identify SSH servers based on hashing together values from the Server Key Exchange Init message.

    Input: A hex stream of the SSH_MSG_KEXINIT packet application layer from Server to Client."; this.infoURL = "https://engineering.salesforce.com/open-sourcing-hassh-abed3ae5044c"; this.inputType = "string"; this.outputType = "string"; @@ -64,16 +64,14 @@ class HASSHServerFingerprint extends Operation { // Length const length = s.readInt(4); - if (s.length !== length + 4) - throw new OperationError("Incorrect packet length."); + if (s.length !== length + 4) throw new OperationError("Incorrect packet length."); // Padding length const paddingLength = s.readInt(1); // Message code const messageCode = s.readInt(1); - if (messageCode !== 20) - throw new OperationError("Not a Key Exchange Init."); + if (messageCode !== 20) throw new OperationError("Not a Key Exchange Init."); // Cookie s.moveForwardsBy(16); @@ -128,12 +126,7 @@ class HASSHServerFingerprint extends Operation { s.moveForwardsBy(paddingLength); // Output - const hassh = [ - kexAlgos, - encAlgosS2C, - macAlgosS2C, - compAlgosS2C - ]; + const hassh = [kexAlgos, encAlgosS2C, macAlgosS2C, compAlgosS2C]; const hasshStr = hassh.join(";"); const hasshHash = runHash("md5", Utils.strToArrayBuffer(hasshStr)); @@ -160,7 +153,6 @@ ${compAlgosS2C}`; return hasshHash; } } - } export default HASSHServerFingerprint; diff --git a/src/core/operations/HMAC.mjs b/src/core/operations/HMAC.mjs index cb129692..64c6ceda 100644 --- a/src/core/operations/HMAC.mjs +++ b/src/core/operations/HMAC.mjs @@ -12,7 +12,6 @@ import CryptoApi from "crypto-api/src/crypto-api.mjs"; * HMAC operation */ class HMAC extends Operation { - /** * HMAC constructor */ @@ -21,7 +20,8 @@ class HMAC extends Operation { this.name = "HMAC"; this.module = "Crypto"; - this.description = "Keyed-Hash Message Authentication Codes (HMAC) are a mechanism for message authentication using cryptographic hash functions."; + this.description + = "Keyed-Hash Message Authentication Codes (HMAC) are a mechanism for message authentication using cryptographic hash functions."; this.infoURL = "https://wikipedia.org/wiki/HMAC"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -76,7 +76,6 @@ class HMAC extends Operation { mac.update(msg); return CryptoApi.encoder.toHex(mac.finalize()); } - } export default HMAC; diff --git a/src/core/operations/HTMLToText.mjs b/src/core/operations/HTMLToText.mjs index ff90572a..e4785f84 100644 --- a/src/core/operations/HTMLToText.mjs +++ b/src/core/operations/HTMLToText.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * HTML To Text operation */ class HTMLToText extends Operation { - /** * HTMLToText constructor */ @@ -20,7 +19,8 @@ class HTMLToText extends Operation { this.name = "HTML To Text"; this.module = "Default"; - this.description = "Converts an HTML output from an operation to a readable string instead of being rendered in the DOM."; + this.description + = "Converts an HTML output from an operation to a readable string instead of being rendered in the DOM."; this.infoURL = ""; this.inputType = "html"; this.outputType = "string"; @@ -35,7 +35,6 @@ class HTMLToText extends Operation { run(input, args) { return input; } - } export default HTMLToText; diff --git a/src/core/operations/HTTPRequest.mjs b/src/core/operations/HTTPRequest.mjs index 7d061f37..ad552016 100644 --- a/src/core/operations/HTTPRequest.mjs +++ b/src/core/operations/HTTPRequest.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * HTTP request operation */ class HTTPRequest extends Operation { - /** * HTTPRequest constructor */ @@ -28,7 +27,7 @@ class HTTPRequest extends Operation { "

    ", "You can add headers line by line in the format Key: Value", "

    ", - "The status code of the response, along with a limited selection of exposed headers, can be viewed by checking the 'Show response metadata' option. Only a limited set of response headers are exposed by the browser for security reasons.", + "The status code of the response, along with a limited selection of exposed headers, can be viewed by checking the 'Show response metadata' option. Only a limited set of response headers are exposed by the browser for security reasons." ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/List_of_HTTP_header_fields#Request_fields"; this.inputType = "string"; @@ -38,11 +37,7 @@ class HTTPRequest extends Operation { { "name": "Method", "type": "option", - "value": [ - "GET", "POST", "HEAD", - "PUT", "PATCH", "DELETE", - "CONNECT", "TRACE", "OPTIONS" - ] + "value": ["GET", "POST", "HEAD", "PUT", "PATCH", "DELETE", "CONNECT", "TRACE", "OPTIONS"] }, { "name": "URL", @@ -57,10 +52,7 @@ class HTTPRequest extends Operation { { "name": "Mode", "type": "option", - "value": [ - "Cross-Origin Resource Sharing", - "No CORS (limited to HEAD, GET or POST)", - ] + "value": ["Cross-Origin Resource Sharing", "No CORS (limited to HEAD, GET or POST)"] }, { "name": "Show response metadata", @@ -81,7 +73,7 @@ class HTTPRequest extends Operation { if (url.length === 0) return ""; const headers = new Headers(); - headersText.split(/\r?\n/).forEach(line => { + headersText.split(/\r?\n/).forEach((line) => { line = line.trim(); if (line.length === 0) return; @@ -96,7 +88,7 @@ class HTTPRequest extends Operation { method: method, headers: headers, mode: modeLookup[mode], - cache: "no-cache", + cache: "no-cache" }; if (method !== "GET" && method !== "HEAD") { @@ -104,7 +96,7 @@ class HTTPRequest extends Operation { } return fetch(url, config) - .then(r => { + .then((r) => { if (r.status === 0 && r.type === "opaque") { throw new OperationError("Error: Null response. Try setting the connection mode to CORS."); } @@ -114,25 +106,33 @@ class HTTPRequest extends Operation { for (const pair of r.headers.entries()) { headers += " " + pair[0] + ": " + pair[1] + "\n"; } - return r.text().then(b => { - return "####\n Status: " + r.status + " " + r.statusText + - "\n Exposed headers:\n" + headers + "####\n\n" + b; + return r.text().then((b) => { + return ( + "####\n Status: " + + r.status + + " " + + r.statusText + + "\n Exposed headers:\n" + + headers + + "####\n\n" + + b + ); }); } return r.text(); }) - .catch(e => { - throw new OperationError(e.toString() + - "\n\nThis error could be caused by one of the following:\n" + - " - An invalid URL\n" + - " - Making a request to an insecure resource (HTTP) from a secure source (HTTPS)\n" + - " - Making a cross-origin request to a server which does not support CORS\n"); + .catch((e) => { + throw new OperationError( + e.toString() + + "\n\nThis error could be caused by one of the following:\n" + + " - An invalid URL\n" + + " - Making a request to an insecure resource (HTTP) from a secure source (HTTPS)\n" + + " - Making a cross-origin request to a server which does not support CORS\n" + ); }); } - } - /** * Lookup table for HTTP modes * @@ -140,8 +140,7 @@ class HTTPRequest extends Operation { */ const modeLookup = { "Cross-Origin Resource Sharing": "cors", - "No CORS (limited to HEAD, GET or POST)": "no-cors", + "No CORS (limited to HEAD, GET or POST)": "no-cors" }; - export default HTTPRequest; diff --git a/src/core/operations/HammingDistance.mjs b/src/core/operations/HammingDistance.mjs index 7d5a9b1d..3c63ddc1 100644 --- a/src/core/operations/HammingDistance.mjs +++ b/src/core/operations/HammingDistance.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {fromHex} from "../lib/Hex.mjs"; +import { fromHex } from "../lib/Hex.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * Hamming Distance operation */ class HammingDistance extends Operation { - /** * HammingDistance constructor */ @@ -22,7 +21,8 @@ class HammingDistance extends Operation { this.name = "Hamming Distance"; this.module = "Default"; - this.description = "In information theory, the Hamming distance between two strings of equal length is the number of positions at which the corresponding symbols are different. In other words, it measures the minimum number of substitutions required to change one string into the other, or the minimum number of errors that could have transformed one string into the other. In a more general context, the Hamming distance is one of several string metrics for measuring the edit distance between two sequences."; + this.description + = "In information theory, the Hamming distance between two strings of equal length is the number of positions at which the corresponding symbols are different. In other words, it measures the minimum number of substitutions required to change one string into the other, or the minimum number of errors that could have transformed one string into the other. In a more general context, the Hamming distance is one of several string metrics for measuring the edit distance between two sequences."; this.infoURL = "https://wikipedia.org/wiki/Hamming_distance"; this.inputType = "string"; this.outputType = "string"; @@ -57,7 +57,9 @@ class HammingDistance extends Operation { samples = input.split(delim); if (samples.length !== 2) { - throw new OperationError("Error: You can only calculate the edit distance between 2 strings. Please ensure exactly two inputs are provided, separated by the specified delimiter."); + throw new OperationError( + "Error: You can only calculate the edit distance between 2 strings. Please ensure exactly two inputs are provided, separated by the specified delimiter." + ); } if (samples[0].length !== samples[1].length) { @@ -92,7 +94,6 @@ class HammingDistance extends Operation { return dist.toString(); } - } export default HammingDistance; diff --git a/src/core/operations/HaversineDistance.mjs b/src/core/operations/HaversineDistance.mjs index 680bff4d..01eb9676 100644 --- a/src/core/operations/HaversineDistance.mjs +++ b/src/core/operations/HaversineDistance.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * HaversineDistance operation */ class HaversineDistance extends Operation { - /** * HaversineDistance constructor */ @@ -20,7 +19,8 @@ class HaversineDistance extends Operation { this.name = "Haversine distance"; this.module = "Default"; - this.description = "Returns the distance between two pairs of GPS latitude and longitude co-ordinates in metres.

    e.g. 51.487263,-0.124323, 38.9517,-77.1467"; + this.description + = "Returns the distance between two pairs of GPS latitude and longitude co-ordinates in metres.

    e.g. 51.487263,-0.124323, 38.9517,-77.1467"; this.infoURL = "https://wikipedia.org/wiki/Haversine_formula"; this.inputType = "string"; this.outputType = "number"; @@ -33,7 +33,6 @@ class HaversineDistance extends Operation { * @returns {number} */ run(input, args) { - const values = input.match(/^(-?\d+(\.\d+)?), ?(-?\d+(\.\d+)?), ?(-?\d+(\.\d+)?), ?(-?\d+(\.\d+)?)$/); if (!values) { throw new OperationError("Input must in the format lat1, lng1, lat2, lng2"); @@ -45,15 +44,15 @@ class HaversineDistance extends Operation { const lng2 = parseFloat(values[7]); const TO_RAD = Math.PI / 180; - const dLat = (lat2-lat1) * TO_RAD; - const dLng = (lng2-lng1) * TO_RAD; - const a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1 * TO_RAD) * Math.cos(lat2 * TO_RAD) * Math.sin(dLng/2) * Math.sin(dLng/2); - const metres = 6371000 * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); + const dLat = (lat2 - lat1) * TO_RAD; + const dLng = (lng2 - lng1) * TO_RAD; + const a + = Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(lat1 * TO_RAD) * Math.cos(lat2 * TO_RAD) * Math.sin(dLng / 2) * Math.sin(dLng / 2); + const metres = 6371000 * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return metres; - } - } export default HaversineDistance; diff --git a/src/core/operations/Head.mjs b/src/core/operations/Head.mjs index d74c3eea..a34a1333 100644 --- a/src/core/operations/Head.mjs +++ b/src/core/operations/Head.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Head operation */ class Head extends Operation { - /** * Head constructor */ @@ -21,7 +20,8 @@ class Head extends Operation { this.name = "Head"; this.module = "Default"; - this.description = "Like the UNIX head utility.
    Gets the first n lines.
    You can select all but the last n lines by entering a negative value for n.
    The delimiter can be changed so that instead of lines, fields (i.e. commas) are selected instead."; + this.description + = "Like the UNIX head utility.
    Gets the first n lines.
    You can select all but the last n lines by entering a negative value for n.
    The delimiter can be changed so that instead of lines, fields (i.e. commas) are selected instead."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -62,7 +62,6 @@ class Head extends Operation { }) .join(delimiter); } - } export default Head; diff --git a/src/core/operations/HeatmapChart.mjs b/src/core/operations/HeatmapChart.mjs index 96636986..a2d45c93 100644 --- a/src/core/operations/HeatmapChart.mjs +++ b/src/core/operations/HeatmapChart.mjs @@ -14,13 +14,12 @@ import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; const d3 = d3temp.default ? d3temp.default : d3temp; -const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp; +const nodom = nodomtemp.default ? nodomtemp.default : nodomtemp; /** * Heatmap chart operation */ class HeatmapChart extends Operation { - /** * HeatmapChart constructor */ @@ -29,7 +28,8 @@ class HeatmapChart extends Operation { this.name = "Heatmap chart"; this.module = "Charts"; - this.description = "A heatmap is a graphical representation of data where the individual values contained in a matrix are represented as colors."; + this.description + = "A heatmap is a graphical representation of data where the individual values contained in a matrix are represented as colors."; this.infoURL = "https://wikipedia.org/wiki/Heat_map"; this.inputType = "string"; this.outputType = "html"; @@ -37,53 +37,53 @@ class HeatmapChart extends Operation { { name: "Record delimiter", type: "option", - value: RECORD_DELIMITER_OPTIONS, + value: RECORD_DELIMITER_OPTIONS }, { name: "Field delimiter", type: "option", - value: FIELD_DELIMITER_OPTIONS, + value: FIELD_DELIMITER_OPTIONS }, { name: "Number of vertical bins", type: "number", - value: 25, + value: 25 }, { name: "Number of horizontal bins", type: "number", - value: 25, + value: 25 }, { name: "Use column headers as labels", type: "boolean", - value: true, + value: true }, { name: "X label", type: "string", - value: "", + value: "" }, { name: "Y label", type: "string", - value: "", + value: "" }, { name: "Draw bin edges", type: "boolean", - value: false, + value: false }, { name: "Min colour value", type: "string", - value: COLOURS.min, + value: COLOURS.min }, { name: "Max colour value", type: "string", - value: COLOURS.max, - }, + value: COLOURS.max + } ]; } @@ -123,7 +123,8 @@ class HeatmapChart extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${dimension} ${dimension}`); @@ -132,41 +133,34 @@ class HeatmapChart extends Operation { top: 10, right: 0, bottom: 40, - left: 30, + left: 30 }, width = dimension - margin.left - margin.right, height = dimension - margin.top - margin.bottom, binWidth = width / hBins, - binHeight = height/ vBins, - marginedSpace = svg.append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + binHeight = height / vBins, + marginedSpace = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")"); const bins = this.getHeatmapPacking(values, vBins, hBins), - maxCount = Math.max(...bins.map(row => { - const lengths = row.map(cell => cell.length); - return Math.max(...lengths); - })); + maxCount = Math.max( + ...bins.map((row) => { + const lengths = row.map((cell) => cell.length); + return Math.max(...lengths); + }) + ); - const xExtent = d3.extent(values, d => d[0]), - yExtent = d3.extent(values, d => d[1]); + const xExtent = d3.extent(values, (d) => d[0]), + yExtent = d3.extent(values, (d) => d[1]); - const xAxis = d3.scaleLinear() - .domain(xExtent) - .range([0, width]); - const yAxis = d3.scaleLinear() - .domain(yExtent) - .range([height, 0]); + const xAxis = d3.scaleLinear().domain(xExtent).range([0, width]); + const yAxis = d3.scaleLinear().domain(yExtent).range([height, 0]); - const colour = d3.scaleSequential(d3.interpolateLab(minColour, maxColour)) - .domain([0, maxCount]); + const colour = d3.scaleSequential(d3.interpolateLab(minColour, maxColour)).domain([0, maxCount]); - marginedSpace.append("clipPath") - .attr("id", "clip") - .append("rect") - .attr("width", width) - .attr("height", height); + marginedSpace.append("clipPath").attr("id", "clip").append("rect").attr("width", width).attr("height", height); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "bins") .attr("clip-path", "url(#clip)") .selectAll("g") @@ -174,29 +168,27 @@ class HeatmapChart extends Operation { .enter() .append("g") .selectAll("rect") - .data(d => d) + .data((d) => d) .enter() .append("rect") .attr("x", (d) => binWidth * d.x) - .attr("y", (d) => (height - binHeight * (d.y + 1))) + .attr("y", (d) => height - binHeight * (d.y + 1)) .attr("width", binWidth) .attr("height", binHeight) .attr("fill", (d) => colour(d.length)) .attr("stroke", drawEdges ? "rgba(0, 0, 0, 0.5)" : "none") .attr("stroke-width", drawEdges ? "0.5" : "none") .append("title") - .text(d => { + .text((d) => { const count = d.length, - perc = 100.0 * d.length / values.length, + perc = (100.0 * d.length) / values.length, tooltip = `Count: ${count}\n Percentage: ${perc.toFixed(2)}%\n `.replace(/\s{2,}/g, "\n"); return tooltip; }); - marginedSpace.append("g") - .attr("class", "axis axis--y") - .call(d3.axisLeft(yAxis).tickSizeOuter(-width)); + marginedSpace.append("g").attr("class", "axis axis--y").call(d3.axisLeft(yAxis).tickSizeOuter(-width)); svg.append("text") .attr("transform", "rotate(-90)") @@ -206,7 +198,8 @@ class HeatmapChart extends Operation { .style("text-anchor", "middle") .text(yLabel); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "axis axis--x") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(xAxis).tickSizeOuter(-height)); @@ -229,12 +222,14 @@ class HeatmapChart extends Operation { * @returns {Object[]} a list of bins (each bin is an Array) with x y coordinates, filled with the points */ getHeatmapPacking(values, vBins, hBins) { - const xBounds = d3.extent(values, d => d[0]), - yBounds = d3.extent(values, d => d[1]), + const xBounds = d3.extent(values, (d) => d[0]), + yBounds = d3.extent(values, (d) => d[1]), bins = []; - if (xBounds[0] === xBounds[1]) throw "Cannot pack points. There is no difference between the minimum and maximum X coordinate."; - if (yBounds[0] === yBounds[1]) throw "Cannot pack points. There is no difference between the minimum and maximum Y coordinate."; + if (xBounds[0] === xBounds[1]) + throw "Cannot pack points. There is no difference between the minimum and maximum X coordinate."; + if (yBounds[0] === yBounds[1]) + throw "Cannot pack points. There is no difference between the minimum and maximum Y coordinate."; for (let y = 0; y < vBins; y++) { bins.push([]); @@ -249,18 +244,17 @@ class HeatmapChart extends Operation { const epsilon = 0.000000001; // This is to clamp values that are exactly the maximum; - values.forEach(v => { - const fractionOfY = (v[1] - yBounds[0]) / ((yBounds[1] + epsilon) - yBounds[0]), - fractionOfX = (v[0] - xBounds[0]) / ((xBounds[1] + epsilon) - xBounds[0]), + values.forEach((v) => { + const fractionOfY = (v[1] - yBounds[0]) / (yBounds[1] + epsilon - yBounds[0]), + fractionOfX = (v[0] - xBounds[0]) / (xBounds[1] + epsilon - xBounds[0]), y = Math.floor(vBins * fractionOfY), x = Math.floor(hBins * fractionOfX); - bins[y][x].push({x: v[0], y: v[1]}); + bins[y][x].push({ x: v[0], y: v[1] }); }); return bins; } - } export default HeatmapChart; diff --git a/src/core/operations/HexDensityChart.mjs b/src/core/operations/HexDensityChart.mjs index 72cab9fa..2a98e1dd 100644 --- a/src/core/operations/HexDensityChart.mjs +++ b/src/core/operations/HexDensityChart.mjs @@ -15,14 +15,12 @@ import Utils from "../Utils.mjs"; const d3 = d3temp.default ? d3temp.default : d3temp; const d3hexbin = d3hexbintemp.default ? d3hexbintemp.default : d3hexbintemp; -const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp; - +const nodom = nodomtemp.default ? nodomtemp.default : nodomtemp; /** * Hex Density chart operation */ class HexDensityChart extends Operation { - /** * HexDensityChart constructor */ @@ -31,69 +29,69 @@ class HexDensityChart extends Operation { this.name = "Hex Density chart"; this.module = "Charts"; - this.description = "Hex density charts are used in a similar way to scatter charts, however rather than rendering tens of thousands of points, it groups the points into a few hundred hexagons to show the distribution."; + this.description + = "Hex density charts are used in a similar way to scatter charts, however rather than rendering tens of thousands of points, it groups the points into a few hundred hexagons to show the distribution."; this.inputType = "string"; this.outputType = "html"; this.args = [ { name: "Record delimiter", type: "option", - value: RECORD_DELIMITER_OPTIONS, + value: RECORD_DELIMITER_OPTIONS }, { name: "Field delimiter", type: "option", - value: FIELD_DELIMITER_OPTIONS, + value: FIELD_DELIMITER_OPTIONS }, { name: "Pack radius", type: "number", - value: 25, + value: 25 }, { name: "Draw radius", type: "number", - value: 15, + value: 15 }, { name: "Use column headers as labels", type: "boolean", - value: true, + value: true }, { name: "X label", type: "string", - value: "", + value: "" }, { name: "Y label", type: "string", - value: "", + value: "" }, { name: "Draw hexagon edges", type: "boolean", - value: false, + value: false }, { name: "Min colour value", type: "string", - value: COLOURS.min, + value: COLOURS.min }, { name: "Max colour value", type: "string", - value: COLOURS.max, + value: COLOURS.max }, { name: "Draw empty hexagons within data boundaries", type: "boolean", - value: false, + value: false } ]; } - /** * Hex Bin chart operation. * @@ -129,7 +127,8 @@ class HexDensityChart extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${dimension} ${dimension}`); @@ -138,58 +137,47 @@ class HexDensityChart extends Operation { top: 10, right: 0, bottom: 40, - left: 30, + left: 30 }, width = dimension - margin.left - margin.right, height = dimension - margin.top - margin.bottom, - marginedSpace = svg.append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + marginedSpace = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")"); - const hexbin = d3hexbin.hexbin() - .radius(packRadius) - .extent([0, 0], [width, height]); + const hexbin = d3hexbin.hexbin().radius(packRadius).extent([0, 0], [width, height]); const hexPoints = hexbin(values), - maxCount = Math.max(...hexPoints.map(b => b.length)); + maxCount = Math.max(...hexPoints.map((b) => b.length)); - const xExtent = d3.extent(hexPoints, d => d.x), - yExtent = d3.extent(hexPoints, d => d.y); + const xExtent = d3.extent(hexPoints, (d) => d.x), + yExtent = d3.extent(hexPoints, (d) => d.y); xExtent[0] -= 2 * packRadius; xExtent[1] += 3 * packRadius; yExtent[0] -= 2 * packRadius; yExtent[1] += 2 * packRadius; - const xAxis = d3.scaleLinear() - .domain(xExtent) - .range([0, width]); - const yAxis = d3.scaleLinear() - .domain(yExtent) - .range([height, 0]); + const xAxis = d3.scaleLinear().domain(xExtent).range([0, width]); + const yAxis = d3.scaleLinear().domain(yExtent).range([height, 0]); - const colour = d3.scaleSequential(d3.interpolateLab(minColour, maxColour)) - .domain([0, maxCount]); + const colour = d3.scaleSequential(d3.interpolateLab(minColour, maxColour)).domain([0, maxCount]); - marginedSpace.append("clipPath") - .attr("id", "clip") - .append("rect") - .attr("width", width) - .attr("height", height); + marginedSpace.append("clipPath").attr("id", "clip").append("rect").attr("width", width).attr("height", height); if (drawEmptyHexagons) { - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "empty-hexagon") .selectAll("path") .data(this.getEmptyHexagons(hexPoints, packRadius)) .enter() .append("path") - .attr("d", d => { + .attr("d", (d) => { return `M${xAxis(d.x)},${yAxis(d.y)} ${hexbin.hexagon(drawRadius)}`; }) .attr("fill", (d) => colour(0)) .attr("stroke", drawEdges ? "black" : "none") .attr("stroke-width", drawEdges ? "0.5" : "none") .append("title") - .text(d => { + .text((d) => { const count = 0, perc = 0, tooltip = `Count: ${count}\n @@ -200,29 +188,30 @@ class HexDensityChart extends Operation { }); } - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "hexagon") .attr("clip-path", "url(#clip)") .selectAll("path") .data(hexPoints) .enter() .append("path") - .attr("d", d => { + .attr("d", (d) => { return `M${xAxis(d.x)},${yAxis(d.y)} ${hexbin.hexagon(drawRadius)}`; }) .attr("fill", (d) => colour(d.length)) .attr("stroke", drawEdges ? "black" : "none") .attr("stroke-width", drawEdges ? "0.5" : "none") .append("title") - .text(d => { + .text((d) => { const count = d.length, - perc = 100.0 * d.length / values.length, + perc = (100.0 * d.length) / values.length, CX = d.x, CY = d.y, - xMin = Math.min(...d.map(d => d[0])), - xMax = Math.max(...d.map(d => d[0])), - yMin = Math.min(...d.map(d => d[1])), - yMax = Math.max(...d.map(d => d[1])), + xMin = Math.min(...d.map((d) => d[0])), + xMax = Math.max(...d.map((d) => d[0])), + yMin = Math.min(...d.map((d) => d[1])), + yMax = Math.max(...d.map((d) => d[1])), tooltip = `Count: ${count}\n Percentage: ${perc.toFixed(2)}%\n Center: ${CX.toFixed(2)}, ${CY.toFixed(2)}\n @@ -234,9 +223,7 @@ class HexDensityChart extends Operation { return tooltip; }); - marginedSpace.append("g") - .attr("class", "axis axis--y") - .call(d3.axisLeft(yAxis).tickSizeOuter(-width)); + marginedSpace.append("g").attr("class", "axis axis--y").call(d3.axisLeft(yAxis).tickSizeOuter(-width)); svg.append("text") .attr("transform", "rotate(-90)") @@ -246,7 +233,8 @@ class HexDensityChart extends Operation { .style("text-anchor", "middle") .text(yLabel); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "axis axis--x") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(xAxis).tickSizeOuter(-height)); @@ -260,7 +248,6 @@ class HexDensityChart extends Operation { return svg._groups[0][0].outerHTML; } - /** * Hex Bin chart operation. * @@ -270,9 +257,9 @@ class HexDensityChart extends Operation { */ getEmptyHexagons(centres, radius) { const emptyCentres = [], - boundingRect = [d3.extent(centres, d => d.x), d3.extent(centres, d => d.y)], - hexagonCenterToEdge = Math.cos(2 * Math.PI / 12) * radius, - hexagonEdgeLength = Math.sin(2 * Math.PI / 12) * radius; + boundingRect = [d3.extent(centres, (d) => d.x), d3.extent(centres, (d) => d.y)], + hexagonCenterToEdge = Math.cos((2 * Math.PI) / 12) * radius, + hexagonEdgeLength = Math.sin((2 * Math.PI) / 12) * radius; let indent = false; for (let y = boundingRect[1][0]; y <= boundingRect[1][1] + radius; y += hexagonEdgeLength + radius) { @@ -283,14 +270,13 @@ class HexDensityChart extends Operation { if (indent && x >= boundingRect[0][1]) break; if (indent) cx += hexagonCenterToEdge; - emptyCentres.push({x: cx, y: cy}); + emptyCentres.push({ x: cx, y: cy }); } indent = !indent; } return emptyCentres; } - } export default HexDensityChart; diff --git a/src/core/operations/HexToObjectIdentifier.mjs b/src/core/operations/HexToObjectIdentifier.mjs index 67971f8d..acd23652 100644 --- a/src/core/operations/HexToObjectIdentifier.mjs +++ b/src/core/operations/HexToObjectIdentifier.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * Hex to Object Identifier operation */ class HexToObjectIdentifier extends Operation { - /** * HexToObjectIdentifier constructor */ @@ -35,7 +34,6 @@ class HexToObjectIdentifier extends Operation { run(input, args) { return r.KJUR.asn1.ASN1Util.oidHexToInt(input.replace(/\s/g, "")); } - } export default HexToObjectIdentifier; diff --git a/src/core/operations/HexToPEM.mjs b/src/core/operations/HexToPEM.mjs index 8217ffbd..da5d2b80 100644 --- a/src/core/operations/HexToPEM.mjs +++ b/src/core/operations/HexToPEM.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * Hex to PEM operation */ class HexToPEM extends Operation { - /** * HexToPEM constructor */ @@ -20,7 +19,8 @@ class HexToPEM extends Operation { this.name = "Hex to PEM"; this.module = "PublicKey"; - this.description = "Converts a hexadecimal DER (Distinguished Encoding Rules) string into PEM (Privacy Enhanced Mail) format."; + this.description + = "Converts a hexadecimal DER (Distinguished Encoding Rules) string into PEM (Privacy Enhanced Mail) format."; this.infoURL = "https://wikipedia.org/wiki/Privacy-Enhanced_Mail"; this.inputType = "string"; this.outputType = "string"; @@ -41,7 +41,6 @@ class HexToPEM extends Operation { run(input, args) { return r.KJUR.asn1.ASN1Util.getPEMStringFromHex(input.replace(/\s/g, ""), args[0]); } - } export default HexToPEM; diff --git a/src/core/operations/ImageBrightnessContrast.mjs b/src/core/operations/ImageBrightnessContrast.mjs index 3845bebb..71a5de23 100644 --- a/src/core/operations/ImageBrightnessContrast.mjs +++ b/src/core/operations/ImageBrightnessContrast.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Image Brightness / Contrast operation */ class ImageBrightnessContrast extends Operation { - /** * ImageBrightnessContrast constructor */ @@ -66,13 +65,11 @@ class ImageBrightnessContrast extends Operation { } try { if (brightness !== 0) { - if (isWorkerEnvironment()) - self.sendStatusMessage("Changing image brightness..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Changing image brightness..."); image.brightness(brightness / 100); } if (contrast !== 0) { - if (isWorkerEnvironment()) - self.sendStatusMessage("Changing image contrast..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Changing image contrast..."); image.contrast(contrast / 100); } @@ -104,7 +101,6 @@ class ImageBrightnessContrast extends Operation { return ``; } - } export default ImageBrightnessContrast; diff --git a/src/core/operations/ImageFilter.mjs b/src/core/operations/ImageFilter.mjs index 137dd0fc..eb4623d1 100644 --- a/src/core/operations/ImageFilter.mjs +++ b/src/core/operations/ImageFilter.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Image Filter operation */ class ImageFilter extends Operation { - /** * ImageFilter constructor */ @@ -33,10 +32,7 @@ class ImageFilter extends Operation { { name: "Filter type", type: "option", - value: [ - "Greyscale", - "Sepia" - ] + value: ["Greyscale", "Sepia"] } ]; } @@ -95,7 +91,6 @@ class ImageFilter extends Operation { return ``; } - } export default ImageFilter; diff --git a/src/core/operations/ImageHueSaturationLightness.mjs b/src/core/operations/ImageHueSaturationLightness.mjs index b0bad682..bb120e40 100644 --- a/src/core/operations/ImageHueSaturationLightness.mjs +++ b/src/core/operations/ImageHueSaturationLightness.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Image Hue/Saturation/Lightness operation */ class ImageHueSaturationLightness extends Operation { - /** * ImageHueSaturationLightness constructor */ @@ -74,8 +73,7 @@ class ImageHueSaturationLightness extends Operation { } try { if (hue !== 0) { - if (isWorkerEnvironment()) - self.sendStatusMessage("Changing image hue..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Changing image hue..."); image.colour([ { apply: "hue", @@ -84,8 +82,7 @@ class ImageHueSaturationLightness extends Operation { ]); } if (saturation !== 0) { - if (isWorkerEnvironment()) - self.sendStatusMessage("Changing image saturation..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Changing image saturation..."); image.colour([ { apply: "saturate", @@ -94,8 +91,7 @@ class ImageHueSaturationLightness extends Operation { ]); } if (lightness !== 0) { - if (isWorkerEnvironment()) - self.sendStatusMessage("Changing image lightness..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Changing image lightness..."); image.colour([ { apply: "lighten", diff --git a/src/core/operations/ImageOpacity.mjs b/src/core/operations/ImageOpacity.mjs index 622ee96c..56bb3197 100644 --- a/src/core/operations/ImageOpacity.mjs +++ b/src/core/operations/ImageOpacity.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Image Opacity operation */ class ImageOpacity extends Operation { - /** * ImageOpacity constructor */ @@ -58,8 +57,7 @@ class ImageOpacity extends Operation { throw new OperationError(`Error loading image. (${err})`); } try { - if (isWorkerEnvironment()) - self.sendStatusMessage("Changing image opacity..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Changing image opacity..."); image.opacity(opacity / 100); let imageBuffer; @@ -90,7 +88,6 @@ class ImageOpacity extends Operation { return ``; } - } export default ImageOpacity; diff --git a/src/core/operations/IndexOfCoincidence.mjs b/src/core/operations/IndexOfCoincidence.mjs index 8655ccd7..803cc497 100644 --- a/src/core/operations/IndexOfCoincidence.mjs +++ b/src/core/operations/IndexOfCoincidence.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Index of Coincidence operation */ class IndexOfCoincidence extends Operation { - /** * IndexOfCoincidence constructor */ @@ -20,7 +19,8 @@ class IndexOfCoincidence extends Operation { this.name = "Index of Coincidence"; this.module = "Default"; - this.description = "Index of Coincidence (IC) is the probability of two randomly selected characters being the same. This can be used to determine whether text is readable or random, with English text having an IC of around 0.066. IC can therefore be a sound method to automate frequency analysis."; + this.description + = "Index of Coincidence (IC) is the probability of two randomly selected characters being the same. This can be used to determine whether text is readable or random, with English text having an IC of around 0.066. IC can therefore be a sound method to automate frequency analysis."; this.infoURL = "https://wikipedia.org/wiki/Index_of_coincidence"; this.inputType = "string"; this.outputType = "number"; @@ -37,16 +37,16 @@ class IndexOfCoincidence extends Operation { const text = input.toLowerCase().replace(/[^a-z]/g, ""), frequencies = new Array(26).fill(0), alphabet = Utils.expandAlphRange("a-z"); - let coincidence = 0.00, - density = 0.00, - result = 0.00, + let coincidence = 0.0, + density = 0.0, + result = 0.0, i; - for (i=0; i < alphabet.length; i++) { + for (i = 0; i < alphabet.length; i++) { frequencies[i] = text.count(alphabet[i]); } - for (i=0; i < frequencies.length; i++) { + for (i = 0; i < frequencies.length; i++) { coincidence += frequencies[i] * (frequencies[i] - 1); } @@ -101,7 +101,6 @@ The graph shows the IC of the input data. A low IC generally means that the text `; } - } export default IndexOfCoincidence; diff --git a/src/core/operations/InvertImage.mjs b/src/core/operations/InvertImage.mjs index 6b62dea7..1977b5ef 100644 --- a/src/core/operations/InvertImage.mjs +++ b/src/core/operations/InvertImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Invert Image operation */ class InvertImage extends Operation { - /** * InvertImage constructor */ @@ -49,8 +48,7 @@ class InvertImage extends Operation { throw new OperationError(`Error loading image. (${err})`); } try { - if (isWorkerEnvironment()) - self.sendStatusMessage("Inverting image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Inverting image..."); image.invert(); let imageBuffer; @@ -81,7 +79,6 @@ class InvertImage extends Operation { return ``; } - } export default InvertImage; diff --git a/src/core/operations/JA3Fingerprint.mjs b/src/core/operations/JA3Fingerprint.mjs index 941e2fcb..a0751eb4 100644 --- a/src/core/operations/JA3Fingerprint.mjs +++ b/src/core/operations/JA3Fingerprint.mjs @@ -15,13 +15,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import Stream from "../lib/Stream.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * JA3 Fingerprint operation */ class JA3Fingerprint extends Operation { - /** * JA3Fingerprint constructor */ @@ -30,7 +29,8 @@ class JA3Fingerprint extends Operation { this.name = "JA3 Fingerprint"; this.module = "Crypto"; - this.description = "Generates a JA3 fingerprint to help identify TLS clients based on hashing together values from the Client Hello.

    Input: A hex stream of the TLS Client Hello packet application layer."; + this.description + = "Generates a JA3 fingerprint to help identify TLS clients based on hashing together values from the Client Hello.

    Input: A hex stream of the TLS Client Hello packet application layer."; this.infoURL = "https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967"; this.inputType = "string"; this.outputType = "string"; @@ -60,26 +60,22 @@ class JA3Fingerprint extends Operation { const s = new Stream(new Uint8Array(input)); const handshake = s.readInt(1); - if (handshake !== 0x16) - throw new OperationError("Not handshake data."); + if (handshake !== 0x16) throw new OperationError("Not handshake data."); // Version s.moveForwardsBy(2); // Length const length = s.readInt(2); - if (s.length !== length + 5) - throw new OperationError("Incorrect handshake length."); + if (s.length !== length + 5) throw new OperationError("Incorrect handshake length."); // Handshake type const handshakeType = s.readInt(1); - if (handshakeType !== 1) - throw new OperationError("Not a Client Hello."); + if (handshakeType !== 1) throw new OperationError("Not a Client Hello."); // Handshake length const handshakeLength = s.readInt(3); - if (s.length !== handshakeLength + 9) - throw new OperationError("Not enough data in Client Hello."); + if (s.length !== handshakeLength + 9) throw new OperationError("Not enough data in Client Hello."); // Hello version const helloVersion = s.readInt(2); @@ -105,7 +101,10 @@ class JA3Fingerprint extends Operation { const extensionsLength = s.readInt(2); const extensions = s.getBytes(extensionsLength); const es = new Stream(extensions); - let ecsLen, ecs, ellipticCurves = "", ellipticCurvePointFormats = ""; + let ecsLen, + ecs, + ellipticCurves = "", + ellipticCurvePointFormats = ""; const exts = []; while (es.hasMore()) { const type = es.readInt(2); @@ -124,18 +123,11 @@ class JA3Fingerprint extends Operation { default: es.moveForwardsBy(length); } - if (!GREASE_CIPHERSUITES.includes(type)) - exts.push(type); + if (!GREASE_CIPHERSUITES.includes(type)) exts.push(type); } // Output - const ja3 = [ - helloVersion.toString(), - cipherSegment, - exts.join("-"), - ellipticCurves, - ellipticCurvePointFormats - ]; + const ja3 = [helloVersion.toString(), cipherSegment, exts.join("-"), ellipticCurves, ellipticCurvePointFormats]; const ja3Str = ja3.join(","); const ja3Hash = runHash("md5", Utils.strToArrayBuffer(ja3Str)); @@ -164,7 +156,6 @@ ${ellipticCurvePointFormats}`; return ja3Hash; } } - } /** @@ -173,33 +164,18 @@ ${ellipticCurvePointFormats}`; * @param {Stream} stream * @returns {string} */ -function parseJA3Segment(stream, size=2) { +function parseJA3Segment(stream, size = 2) { const segment = []; while (stream.hasMore()) { const element = stream.readInt(size); - if (!GREASE_CIPHERSUITES.includes(element)) - segment.push(element); + if (!GREASE_CIPHERSUITES.includes(element)) segment.push(element); } return segment.join("-"); } const GREASE_CIPHERSUITES = [ - 0x0a0a, - 0x1a1a, - 0x2a2a, - 0x3a3a, - 0x4a4a, - 0x5a5a, - 0x6a6a, - 0x7a7a, - 0x8a8a, - 0x9a9a, - 0xaaaa, - 0xbaba, - 0xcaca, - 0xdada, - 0xeaea, - 0xfafa + 0x0a0a, 0x1a1a, 0x2a2a, 0x3a3a, 0x4a4a, 0x5a5a, 0x6a6a, 0x7a7a, 0x8a8a, 0x9a9a, 0xaaaa, 0xbaba, 0xcaca, 0xdada, + 0xeaea, 0xfafa ]; export default JA3Fingerprint; diff --git a/src/core/operations/JA3SFingerprint.mjs b/src/core/operations/JA3SFingerprint.mjs index 9c3b88da..e3904e5b 100644 --- a/src/core/operations/JA3SFingerprint.mjs +++ b/src/core/operations/JA3SFingerprint.mjs @@ -15,13 +15,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import Stream from "../lib/Stream.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * JA3S Fingerprint operation */ class JA3SFingerprint extends Operation { - /** * JA3SFingerprint constructor */ @@ -30,7 +29,8 @@ class JA3SFingerprint extends Operation { this.name = "JA3S Fingerprint"; this.module = "Crypto"; - this.description = "Generates a JA3S fingerprint to help identify TLS servers based on hashing together values from the Server Hello.

    Input: A hex stream of the TLS Server Hello record application layer."; + this.description + = "Generates a JA3S fingerprint to help identify TLS servers based on hashing together values from the Server Hello.

    Input: A hex stream of the TLS Server Hello record application layer."; this.infoURL = "https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967"; this.inputType = "string"; this.outputType = "string"; @@ -60,26 +60,22 @@ class JA3SFingerprint extends Operation { const s = new Stream(new Uint8Array(input)); const handshake = s.readInt(1); - if (handshake !== 0x16) - throw new OperationError("Not handshake data."); + if (handshake !== 0x16) throw new OperationError("Not handshake data."); // Version s.moveForwardsBy(2); // Length const length = s.readInt(2); - if (s.length !== length + 5) - throw new OperationError("Incorrect handshake length."); + if (s.length !== length + 5) throw new OperationError("Incorrect handshake length."); // Handshake type const handshakeType = s.readInt(1); - if (handshakeType !== 2) - throw new OperationError("Not a Server Hello."); + if (handshakeType !== 2) throw new OperationError("Not a Server Hello."); // Handshake length const handshakeLength = s.readInt(3); - if (s.length !== handshakeLength + 9) - throw new OperationError("Not enough data in Server Hello."); + if (s.length !== handshakeLength + 9) throw new OperationError("Not enough data in Server Hello."); // Hello version const helloVersion = s.readInt(2); @@ -110,11 +106,7 @@ class JA3SFingerprint extends Operation { } // Output - const ja3s = [ - helloVersion.toString(), - cipherSuite, - exts.join("-") - ]; + const ja3s = [helloVersion.toString(), cipherSuite, exts.join("-")]; const ja3sStr = ja3s.join(","); const ja3sHash = runHash("md5", Utils.strToArrayBuffer(ja3sStr)); @@ -139,7 +131,6 @@ ${exts.join("-")}`; return ja3sHash; } } - } export default JA3SFingerprint; diff --git a/src/core/operations/JPathExpression.mjs b/src/core/operations/JPathExpression.mjs index 73a27433..a510cfb5 100644 --- a/src/core/operations/JPathExpression.mjs +++ b/src/core/operations/JPathExpression.mjs @@ -4,7 +4,7 @@ * @license Apache-2.0 */ -import {JSONPath} from "jsonpath-plus"; +import { JSONPath } from "jsonpath-plus"; import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * JPath expression operation */ class JPathExpression extends Operation { - /** * JPathExpression constructor */ @@ -70,9 +69,8 @@ class JPathExpression extends Operation { throw new OperationError(`Invalid JPath expression: ${err.message}`); } - return results.map(result => JSON.stringify(result)).join(delimiter); + return results.map((result) => JSON.stringify(result)).join(delimiter); } - } export default JPathExpression; diff --git a/src/core/operations/JSONBeautify.mjs b/src/core/operations/JSONBeautify.mjs index 923ae7dc..be5907d7 100644 --- a/src/core/operations/JSONBeautify.mjs +++ b/src/core/operations/JSONBeautify.mjs @@ -14,7 +14,6 @@ import Utils from "../Utils.mjs"; * JSON Beautify operation */ class JSONBeautify extends Operation { - /** * JSONBeautify constructor */ @@ -23,7 +22,8 @@ class JSONBeautify extends Operation { this.name = "JSON Beautify"; this.module = "Code"; - this.description = "Indents and pretty prints JavaScript Object Notation (JSON) code.

    Tags: json viewer, prettify, syntax highlighting"; + this.description + = "Indents and pretty prints JavaScript Object Notation (JSON) code.

    Tags: json viewer, prettify, syntax highlighting"; this.inputType = "string"; this.outputType = "string"; this.presentType = "html"; @@ -88,10 +88,11 @@ class JSONBeautify extends Operation { if (isCollapsable(json)) { const isArr = json instanceof Array; - html += '
    ' + - `` + - json2html(json, options) + - "
    "; + html + += '
    ' + + `` + + json2html(json, options) + + "
    "; } else { html += json2html(json, options); } @@ -112,15 +113,16 @@ function sortKeys(o) { if (Array.isArray(o)) { return o.map(sortKeys); } else if ("[object Object]" === Object.prototype.toString.call(o)) { - return Object.keys(o).sort().reduce(function(a, k) { - a[k] = sortKeys(o[k]); - return a; - }, {}); + return Object.keys(o) + .sort() + .reduce(function (a, k) { + a[k] = sortKeys(o[k]); + return a; + }, {}); } return o; } - /** * Check if arg is either an array with at least 1 element, or a dict with at least 1 key * @returns {boolean} @@ -181,10 +183,11 @@ function json2html(json, options) { // Add toggle button if item is collapsable if (isCollapsable(json[i])) { const isArr = json[i] instanceof Array; - html += '
    ' + - `` + - json2html(json[i], options) + - "
    "; + html + += '
    ' + + `` + + json2html(json[i], options) + + "
    "; } else { html += json2html(json[i], options); } @@ -217,10 +220,11 @@ function json2html(json, options) { // Add toggle button if item is collapsable if (isCollapsable(json[key])) { const isArr = json[key] instanceof Array; - html += '
    ' + - `${safeKey}: ` + - json2html(json[key], options) + - "
    "; + html + += '
    ' + + `${safeKey}: ` + + json2html(json[key], options) + + "
    "; } else { html += safeKey + ': ' + json2html(json[key], options); } diff --git a/src/core/operations/JSONMinify.mjs b/src/core/operations/JSONMinify.mjs index 7f0c6f2b..0a12c145 100644 --- a/src/core/operations/JSONMinify.mjs +++ b/src/core/operations/JSONMinify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * JSON Minify operation */ class JSONMinify extends Operation { - /** * JSONMinify constructor */ @@ -35,7 +34,6 @@ class JSONMinify extends Operation { if (!input) return ""; return vkbeautify.jsonmin(input); } - } export default JSONMinify; diff --git a/src/core/operations/JSONToCSV.mjs b/src/core/operations/JSONToCSV.mjs index 875ff6e8..4c420736 100644 --- a/src/core/operations/JSONToCSV.mjs +++ b/src/core/operations/JSONToCSV.mjs @@ -13,7 +13,6 @@ const flatten = flat.default ? flat.default.flatten : flat.flatten; * JSON to CSV operation */ class JSONToCSV extends Operation { - /** * JSONToCSV constructor */ @@ -46,33 +45,32 @@ class JSONToCSV extends Operation { * @param {boolean} force - Whether to force conversion of data to fit in a cell * @returns {string} */ - toCSV(force=false) { + toCSV(force = false) { const self = this; // If the JSON is an array of arrays, this is easy if (this.flattened[0] instanceof Array) { - return this.flattened - .map(row => row - .map(d => self.escapeCellContents(d, force)) - .join(this.cellDelim) - ) - .join(this.rowDelim) + - this.rowDelim; + return ( + this.flattened + .map((row) => row.map((d) => self.escapeCellContents(d, force)).join(this.cellDelim)) + .join(this.rowDelim) + this.rowDelim + ); } // If it's an array of dictionaries... const header = Object.keys(this.flattened[0]); - return header - .map(d => self.escapeCellContents(d, force)) - .join(this.cellDelim) + - this.rowDelim + - this.flattened - .map(row => header - .map(h => row[h]) - .map(d => self.escapeCellContents(d, force)) - .join(this.cellDelim) + return ( + header.map((d) => self.escapeCellContents(d, force)).join(this.cellDelim) + + this.rowDelim + + this.flattened + .map((row) => + header + .map((h) => row[h]) + .map((d) => self.escapeCellContents(d, force)) + .join(this.cellDelim) ) - .join(this.rowDelim) + - this.rowDelim; + .join(this.rowDelim) + + this.rowDelim + ); } /** @@ -113,7 +111,7 @@ class JSONToCSV extends Operation { * @param {boolean} force - Whether to force conversion of data to fit in a cell * @returns {string} */ - escapeCellContents(data, force=false) { + escapeCellContents(data, force = false) { if (data !== "string") { const isPrimitive = data == null || typeof data !== "object"; if (isPrimitive) data = `${data}`; @@ -125,18 +123,17 @@ class JSONToCSV extends Operation { // If the cell contains a cell or row delimiter or a double quote, it must be enclosed in double quotes if ( - data.indexOf(this.cellDelim) >= 0 || - data.indexOf(this.rowDelim) >= 0 || - data.indexOf("\n") >= 0 || - data.indexOf("\r") >= 0 || - data.indexOf('"') >= 0 + data.indexOf(this.cellDelim) >= 0 + || data.indexOf(this.rowDelim) >= 0 + || data.indexOf("\n") >= 0 + || data.indexOf("\r") >= 0 + || data.indexOf('"') >= 0 ) { data = `"${data}"`; } return data; } - } export default JSONToCSV; diff --git a/src/core/operations/JWTDecode.mjs b/src/core/operations/JWTDecode.mjs index b6356b5a..dcd76de9 100644 --- a/src/core/operations/JWTDecode.mjs +++ b/src/core/operations/JWTDecode.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * JWT Decode operation */ class JWTDecode extends Operation { - /** * JWTDecode constructor */ @@ -21,7 +20,8 @@ class JWTDecode extends Operation { this.name = "JWT Decode"; this.module = "Crypto"; - this.description = "Decodes a JSON Web Token without checking whether the provided secret / private key is valid. Use 'JWT Verify' to check if the signature is valid as well."; + this.description + = "Decodes a JSON Web Token without checking whether the provided secret / private key is valid. Use 'JWT Verify' to check if the signature is valid as well."; this.infoURL = "https://wikipedia.org/wiki/JSON_Web_Token"; this.inputType = "string"; this.outputType = "JSON"; @@ -31,7 +31,7 @@ class JWTDecode extends Operation { pattern: "^ey([A-Za-z0-9_-]+)\\.ey([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)$", flags: "", args: [] - }, + } ]; } @@ -52,7 +52,6 @@ class JWTDecode extends Operation { throw new OperationError(err); } } - } export default JWTDecode; diff --git a/src/core/operations/JWTSign.mjs b/src/core/operations/JWTSign.mjs index af46908e..dc0d4447 100644 --- a/src/core/operations/JWTSign.mjs +++ b/src/core/operations/JWTSign.mjs @@ -6,14 +6,12 @@ import Operation from "../Operation.mjs"; import jwt from "jsonwebtoken"; import OperationError from "../errors/OperationError.mjs"; -import {JWT_ALGORITHMS} from "../lib/JWT.mjs"; - +import { JWT_ALGORITHMS } from "../lib/JWT.mjs"; /** * JWT Sign operation */ class JWTSign extends Operation { - /** * JWTSign constructor */ @@ -22,7 +20,8 @@ class JWTSign extends Operation { this.name = "JWT Sign"; this.module = "Crypto"; - this.description = "Signs a JSON object as a JSON Web Token using a provided secret / private key.

    The key should be either the secret for HMAC algorithms or the PEM-encoded private key for RSA and ECDSA."; + this.description + = "Signs a JSON object as a JSON Web Token using a provided secret / private key.

    The key should be either the secret for HMAC algorithms or the PEM-encoded private key for RSA and ECDSA."; this.infoURL = "https://wikipedia.org/wiki/JSON_Web_Token"; this.inputType = "JSON"; this.outputType = "string"; @@ -58,7 +57,6 @@ class JWTSign extends Operation { ${err}`); } } - } export default JWTSign; diff --git a/src/core/operations/JWTVerify.mjs b/src/core/operations/JWTVerify.mjs index 604edc9c..32275f08 100644 --- a/src/core/operations/JWTVerify.mjs +++ b/src/core/operations/JWTVerify.mjs @@ -6,14 +6,12 @@ import Operation from "../Operation.mjs"; import jwt from "jsonwebtoken"; import OperationError from "../errors/OperationError.mjs"; -import {JWT_ALGORITHMS} from "../lib/JWT.mjs"; - +import { JWT_ALGORITHMS } from "../lib/JWT.mjs"; /** * JWT Verify operation */ class JWTVerify extends Operation { - /** * JWTVerify constructor */ @@ -22,7 +20,8 @@ class JWTVerify extends Operation { this.name = "JWT Verify"; this.module = "Crypto"; - this.description = "Verifies that a JSON Web Token is valid and has been signed with the provided secret / private key.

    The key should be either the secret for HMAC algorithms or the PEM-encoded private key for RSA and ECDSA."; + this.description + = "Verifies that a JSON Web Token is valid and has been signed with the provided secret / private key.

    The key should be either the secret for HMAC algorithms or the PEM-encoded private key for RSA and ECDSA."; this.infoURL = "https://wikipedia.org/wiki/JSON_Web_Token"; this.inputType = "string"; this.outputType = "JSON"; @@ -31,7 +30,7 @@ class JWTVerify extends Operation { name: "Public/Secret Key", type: "text", value: "secret" - }, + } ]; } @@ -57,7 +56,6 @@ class JWTVerify extends Operation { throw new OperationError(err); } } - } export default JWTVerify; diff --git a/src/core/operations/JavaScriptBeautify.mjs b/src/core/operations/JavaScriptBeautify.mjs index 94575fcb..e7f90941 100644 --- a/src/core/operations/JavaScriptBeautify.mjs +++ b/src/core/operations/JavaScriptBeautify.mjs @@ -13,7 +13,6 @@ import * as esprima from "esprima"; * JavaScript Beautify operation */ class JavaScriptBeautify extends Operation { - /** * JavaScriptBeautify constructor */ @@ -22,7 +21,8 @@ class JavaScriptBeautify extends Operation { this.name = "JavaScript Beautify"; this.module = "Code"; - this.description = "Parses and pretty prints valid JavaScript code. Also works with JavaScript Object Notation (JSON)."; + this.description + = "Parses and pretty prints valid JavaScript code. Also works with JavaScript Object Notation (JSON)."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -57,7 +57,7 @@ class JavaScriptBeautify extends Operation { run(input, args) { const beautifyIndent = args[0] || "\\t", quotes = args[1].toLowerCase(), - [,, beautifySemicolons, beautifyComment] = args; + [, , beautifySemicolons, beautifyComment] = args; let result = "", AST; @@ -74,13 +74,12 @@ class JavaScriptBeautify extends Operation { style: beautifyIndent }, quotes: quotes, - semicolons: beautifySemicolons, + semicolons: beautifySemicolons }, comment: beautifyComment }; - if (options.comment) - AST = escodegen.attachComments(AST, AST.comments, AST.tokens); + if (options.comment) AST = escodegen.attachComments(AST, AST.comments, AST.tokens); result = escodegen.generate(AST, options); } catch (e) { @@ -89,7 +88,6 @@ class JavaScriptBeautify extends Operation { } return result; } - } export default JavaScriptBeautify; diff --git a/src/core/operations/JavaScriptMinify.mjs b/src/core/operations/JavaScriptMinify.mjs index bfa73f6a..8ec8cff9 100644 --- a/src/core/operations/JavaScriptMinify.mjs +++ b/src/core/operations/JavaScriptMinify.mjs @@ -12,7 +12,6 @@ import * as terser from "terser"; * JavaScript Minify operation */ class JavaScriptMinify extends Operation { - /** * JavaScriptMinify constructor */ @@ -39,7 +38,6 @@ class JavaScriptMinify extends Operation { } return result.code; } - } export default JavaScriptMinify; diff --git a/src/core/operations/JavaScriptParser.mjs b/src/core/operations/JavaScriptParser.mjs index 2fb13891..dba6f6df 100644 --- a/src/core/operations/JavaScriptParser.mjs +++ b/src/core/operations/JavaScriptParser.mjs @@ -11,7 +11,6 @@ import * as esprima from "esprima"; * JavaScript Parser operation */ class JavaScriptParser extends Operation { - /** * JavaScriptParser constructor */ @@ -61,10 +60,10 @@ class JavaScriptParser extends Operation { run(input, args) { const [parseLoc, parseRange, parseTokens, parseComment, parseTolerant] = args, options = { - loc: parseLoc, - range: parseRange, - tokens: parseTokens, - comment: parseComment, + loc: parseLoc, + range: parseRange, + tokens: parseTokens, + comment: parseComment, tolerant: parseTolerant }; let result = {}; @@ -72,7 +71,6 @@ class JavaScriptParser extends Operation { result = esprima.parseScript(input, options); return JSON.stringify(result, null, 2); } - } export default JavaScriptParser; diff --git a/src/core/operations/Jump.mjs b/src/core/operations/Jump.mjs index 26a2c922..3f1fb456 100644 --- a/src/core/operations/Jump.mjs +++ b/src/core/operations/Jump.mjs @@ -11,7 +11,6 @@ import { getLabelIndex } from "../lib/FlowControl.mjs"; * Jump operation */ class Jump extends Operation { - /** * Jump constructor */ @@ -60,7 +59,6 @@ class Jump extends Operation { state.numJumps++; return state; } - } export default Jump; diff --git a/src/core/operations/Keccak.mjs b/src/core/operations/Keccak.mjs index 151a4e82..0b843140 100644 --- a/src/core/operations/Keccak.mjs +++ b/src/core/operations/Keccak.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Keccak operation */ class Keccak extends Operation { - /** * Keccak constructor */ @@ -21,7 +20,8 @@ class Keccak extends Operation { this.name = "Keccak"; this.module = "Crypto"; - this.description = "The Keccak hash algorithm was designed by Guido Bertoni, Joan Daemen, Micha\xebl Peeters, and Gilles Van Assche, building upon RadioGat\xfan. It was selected as the winner of the SHA-3 design competition.

    This version of the algorithm is Keccak[c=2d] and differs from the SHA-3 specification."; + this.description + = "The Keccak hash algorithm was designed by Guido Bertoni, Joan Daemen, Micha\xebl Peeters, and Gilles Van Assche, building upon RadioGat\xfan. It was selected as the winner of the SHA-3 design competition.

    This version of the algorithm is Keccak[c=2d] and differs from the SHA-3 specification."; this.infoURL = "https://wikipedia.org/wiki/SHA-3"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -62,7 +62,6 @@ class Keccak extends Operation { return algo(input); } - } export default Keccak; diff --git a/src/core/operations/LMHash.mjs b/src/core/operations/LMHash.mjs index 2bedf0e8..6b4de5e8 100644 --- a/src/core/operations/LMHash.mjs +++ b/src/core/operations/LMHash.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {smbhash} from "ntlm"; +import { smbhash } from "ntlm"; /** * LM Hash operation */ class LMHash extends Operation { - /** * LMHash constructor */ @@ -20,7 +19,8 @@ class LMHash extends Operation { this.name = "LM Hash"; this.module = "Crypto"; - this.description = "An LM Hash, or LAN Manager Hash, is a deprecated way of storing passwords on old Microsoft operating systems. It is particularly weak and can be cracked in seconds on modern hardware using rainbow tables."; + this.description + = "An LM Hash, or LAN Manager Hash, is a deprecated way of storing passwords on old Microsoft operating systems. It is particularly weak and can be cracked in seconds on modern hardware using rainbow tables."; this.infoURL = "https://wikipedia.org/wiki/LAN_Manager#Password_hashing_algorithm"; this.inputType = "string"; this.outputType = "string"; @@ -35,7 +35,6 @@ class LMHash extends Operation { run(input, args) { return smbhash.lmhash(input); } - } export default LMHash; diff --git a/src/core/operations/LS47Decrypt.mjs b/src/core/operations/LS47Decrypt.mjs index d5764d7f..85e42a5a 100644 --- a/src/core/operations/LS47Decrypt.mjs +++ b/src/core/operations/LS47Decrypt.mjs @@ -11,7 +11,6 @@ import * as LS47 from "../lib/LS47.mjs"; * LS47 Decrypt operation */ class LS47Decrypt extends Operation { - /** * LS47Decrypt constructor */ @@ -20,7 +19,8 @@ class LS47Decrypt extends Operation { this.name = "LS47 Decrypt"; this.module = "Crypto"; - this.description = "This is a slight improvement of the ElsieFour cipher as described by Alan Kaminsky. We use 7x7 characters instead of original (barely fitting) 6x6, to be able to encrypt some structured information. We also describe a simple key-expansion algorithm, because remembering passwords is popular. Similar security considerations as with ElsieFour hold.
    The LS47 alphabet consists of following characters: _abcdefghijklmnopqrstuvwxyz.0123456789,-+*/:?!'()
    An LS47 key is a permutation of the alphabet that is then represented in a 7x7 grid used for the encryption or decryption."; + this.description + = "This is a slight improvement of the ElsieFour cipher as described by Alan Kaminsky. We use 7x7 characters instead of original (barely fitting) 6x6, to be able to encrypt some structured information. We also describe a simple key-expansion algorithm, because remembering passwords is popular. Similar security considerations as with ElsieFour hold.
    The LS47 alphabet consists of following characters: _abcdefghijklmnopqrstuvwxyz.0123456789,-+*/:?!'()
    An LS47 key is a permutation of the alphabet that is then represented in a 7x7 grid used for the encryption or decryption."; this.infoURL = "https://github.com/exaexa/ls47"; this.inputType = "string"; this.outputType = "string"; @@ -51,7 +51,6 @@ class LS47Decrypt extends Operation { const key = LS47.deriveKey(args[0]); return LS47.decryptPad(key, input, this.paddingSize); } - } export default LS47Decrypt; diff --git a/src/core/operations/LS47Encrypt.mjs b/src/core/operations/LS47Encrypt.mjs index 02f7d994..b6d6027c 100644 --- a/src/core/operations/LS47Encrypt.mjs +++ b/src/core/operations/LS47Encrypt.mjs @@ -11,7 +11,6 @@ import * as LS47 from "../lib/LS47.mjs"; * LS47 Encrypt operation */ class LS47Encrypt extends Operation { - /** * LS47Encrypt constructor */ @@ -20,7 +19,8 @@ class LS47Encrypt extends Operation { this.name = "LS47 Encrypt"; this.module = "Crypto"; - this.description = "This is a slight improvement of the ElsieFour cipher as described by Alan Kaminsky. We use 7x7 characters instead of original (barely fitting) 6x6, to be able to encrypt some structured information. We also describe a simple key-expansion algorithm, because remembering passwords is popular. Similar security considerations as with ElsieFour hold.
    The LS47 alphabet consists of following characters: _abcdefghijklmnopqrstuvwxyz.0123456789,-+*/:?!'()
    A LS47 key is a permutation of the alphabet that is then represented in a 7x7 grid used for the encryption or decryption."; + this.description + = "This is a slight improvement of the ElsieFour cipher as described by Alan Kaminsky. We use 7x7 characters instead of original (barely fitting) 6x6, to be able to encrypt some structured information. We also describe a simple key-expansion algorithm, because remembering passwords is popular. Similar security considerations as with ElsieFour hold.
    The LS47 alphabet consists of following characters: _abcdefghijklmnopqrstuvwxyz.0123456789,-+*/:?!'()
    A LS47 key is a permutation of the alphabet that is then represented in a 7x7 grid used for the encryption or decryption."; this.infoURL = "https://github.com/exaexa/ls47"; this.inputType = "string"; this.outputType = "string"; @@ -56,7 +56,6 @@ class LS47Encrypt extends Operation { const key = LS47.deriveKey(args[0]); return LS47.encryptPad(key, input, args[2], this.paddingSize); } - } export default LS47Encrypt; diff --git a/src/core/operations/LZ4Compress.mjs b/src/core/operations/LZ4Compress.mjs index 1f43785f..54244471 100644 --- a/src/core/operations/LZ4Compress.mjs +++ b/src/core/operations/LZ4Compress.mjs @@ -11,7 +11,6 @@ import lz4 from "lz4js"; * LZ4 Compress operation */ class LZ4Compress extends Operation { - /** * LZ4Compress constructor */ @@ -20,7 +19,8 @@ class LZ4Compress extends Operation { this.name = "LZ4 Compress"; this.module = "Compression"; - this.description = "LZ4 is a lossless data compression algorithm that is focused on compression and decompression speed. It belongs to the LZ77 family of byte-oriented compression schemes."; + this.description + = "LZ4 is a lossless data compression algorithm that is focused on compression and decompression speed. It belongs to the LZ77 family of byte-oriented compression schemes."; this.infoURL = "https://wikipedia.org/wiki/LZ4_(compression_algorithm)"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -37,7 +37,6 @@ class LZ4Compress extends Operation { const compressed = lz4.compress(inBuf); return compressed.buffer; } - } export default LZ4Compress; diff --git a/src/core/operations/LZ4Decompress.mjs b/src/core/operations/LZ4Decompress.mjs index 2ba50416..27c352ce 100644 --- a/src/core/operations/LZ4Decompress.mjs +++ b/src/core/operations/LZ4Decompress.mjs @@ -11,7 +11,6 @@ import lz4 from "lz4js"; * LZ4 Decompress operation */ class LZ4Decompress extends Operation { - /** * LZ4Decompress constructor */ @@ -20,7 +19,8 @@ class LZ4Decompress extends Operation { this.name = "LZ4 Decompress"; this.module = "Compression"; - this.description = "LZ4 is a lossless data compression algorithm that is focused on compression and decompression speed. It belongs to the LZ77 family of byte-oriented compression schemes."; + this.description + = "LZ4 is a lossless data compression algorithm that is focused on compression and decompression speed. It belongs to the LZ77 family of byte-oriented compression schemes."; this.infoURL = "https://wikipedia.org/wiki/LZ4_(compression_algorithm)"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -37,7 +37,6 @@ class LZ4Decompress extends Operation { const decompressed = lz4.decompress(inBuf); return decompressed.buffer; } - } export default LZ4Decompress; diff --git a/src/core/operations/LZMACompress.mjs b/src/core/operations/LZMACompress.mjs index 5a252db2..03e98686 100644 --- a/src/core/operations/LZMACompress.mjs +++ b/src/core/operations/LZMACompress.mjs @@ -8,13 +8,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import { compress } from "@blu3r4y/lzma"; -import {isWorkerEnvironment} from "../Utils.mjs"; +import { isWorkerEnvironment } from "../Utils.mjs"; /** * LZMA Compress operation */ class LZMACompress extends Operation { - /** * LZMACompress constructor */ @@ -23,7 +22,8 @@ class LZMACompress extends Operation { this.name = "LZMA Compress"; this.module = "Compression"; - this.description = "Compresses data using the Lempel\u2013Ziv\u2013Markov chain algorithm. Compression mode determines the speed and effectiveness of the compression: 1 is fastest and less effective, 9 is slowest and most effective"; + this.description + = "Compresses data using the Lempel\u2013Ziv\u2013Markov chain algorithm. Compression mode determines the speed and effectiveness of the compression: 1 is fastest and less effective, 9 is slowest and most effective"; this.infoURL = "https://wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Markov_chain_algorithm"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -31,9 +31,7 @@ class LZMACompress extends Operation { { name: "Compression Mode", type: "option", - value: [ - "1", "2", "3", "4", "5", "6", "7", "8", "9" - ], + value: ["1", "2", "3", "4", "5", "6", "7", "8", "9"], "defaultIndex": 6 } ]; @@ -47,18 +45,23 @@ class LZMACompress extends Operation { async run(input, args) { const mode = Number(args[0]); return new Promise((resolve, reject) => { - compress(new Uint8Array(input), mode, (result, error) => { - if (error) { - reject(new OperationError(`Failed to compress input: ${error.message}`)); + compress( + new Uint8Array(input), + mode, + (result, error) => { + if (error) { + reject(new OperationError(`Failed to compress input: ${error.message}`)); + } + // The compression returns as an Int8Array, but we can just get the unsigned data from the buffer + resolve(new Int8Array(result).buffer); + }, + (percent) => { + if (isWorkerEnvironment()) + self.sendStatusMessage(`Compressing input: ${(percent * 100).toFixed(2)}%`); } - // The compression returns as an Int8Array, but we can just get the unsigned data from the buffer - resolve(new Int8Array(result).buffer); - }, (percent) => { - if (isWorkerEnvironment()) self.sendStatusMessage(`Compressing input: ${(percent*100).toFixed(2)}%`); - }); + ); }); } - } export default LZMACompress; diff --git a/src/core/operations/LZMADecompress.mjs b/src/core/operations/LZMADecompress.mjs index 3bebb860..aa9924de 100644 --- a/src/core/operations/LZMADecompress.mjs +++ b/src/core/operations/LZMADecompress.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {decompress} from "@blu3r4y/lzma"; -import Utils, {isWorkerEnvironment} from "../Utils.mjs"; +import { decompress } from "@blu3r4y/lzma"; +import Utils, { isWorkerEnvironment } from "../Utils.mjs"; /** * LZMA Decompress operation */ class LZMADecompress extends Operation { - /** * LZMADecompress constructor */ @@ -35,23 +34,27 @@ class LZMADecompress extends Operation { */ async run(input, args) { return new Promise((resolve, reject) => { - decompress(new Uint8Array(input), (result, error) => { - if (error) { - reject(new OperationError(`Failed to decompress input: ${error.message}`)); - } - // The decompression returns either a String or an untyped unsigned int8 array, but we can just get the unsigned data from the buffer + decompress( + new Uint8Array(input), + (result, error) => { + if (error) { + reject(new OperationError(`Failed to decompress input: ${error.message}`)); + } + // The decompression returns either a String or an untyped unsigned int8 array, but we can just get the unsigned data from the buffer - if (typeof result == "string") { - resolve(Utils.strToArrayBuffer(result)); - } else { - resolve(new Int8Array(result).buffer); + if (typeof result == "string") { + resolve(Utils.strToArrayBuffer(result)); + } else { + resolve(new Int8Array(result).buffer); + } + }, + (percent) => { + if (isWorkerEnvironment()) + self.sendStatusMessage(`Decompressing input: ${(percent * 100).toFixed(2)}%`); } - }, (percent) => { - if (isWorkerEnvironment()) self.sendStatusMessage(`Decompressing input: ${(percent*100).toFixed(2)}%`); - }); + ); }); } - } export default LZMADecompress; diff --git a/src/core/operations/LZNT1Decompress.mjs b/src/core/operations/LZNT1Decompress.mjs index b5308e77..e128033b 100644 --- a/src/core/operations/LZNT1Decompress.mjs +++ b/src/core/operations/LZNT1Decompress.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {decompress} from "../lib/LZNT1.mjs"; +import { decompress } from "../lib/LZNT1.mjs"; /** * LZNT1 Decompress operation */ class LZNT1Decompress extends Operation { - /** * LZNT1 Decompress constructor */ @@ -20,8 +19,10 @@ class LZNT1Decompress extends Operation { this.name = "LZNT1 Decompress"; this.module = "Compression"; - this.description = "Decompresses data using the LZNT1 algorithm.

    Similar to the Windows API RtlDecompressBuffer."; - this.infoURL = "https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-xca/5655f4a3-6ba4-489b-959f-e1f407c52f15"; + this.description + = "Decompresses data using the LZNT1 algorithm.

    Similar to the Windows API RtlDecompressBuffer."; + this.infoURL + = "https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-xca/5655f4a3-6ba4-489b-959f-e1f407c52f15"; this.inputType = "byteArray"; this.outputType = "byteArray"; this.args = []; @@ -35,7 +36,6 @@ class LZNT1Decompress extends Operation { run(input, args) { return decompress(input); } - } export default LZNT1Decompress; diff --git a/src/core/operations/LZStringCompress.mjs b/src/core/operations/LZStringCompress.mjs index 11d5710a..9337bd59 100644 --- a/src/core/operations/LZStringCompress.mjs +++ b/src/core/operations/LZStringCompress.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {COMPRESSION_OUTPUT_FORMATS, COMPRESSION_FUNCTIONS} from "../lib/LZString.mjs"; +import { COMPRESSION_OUTPUT_FORMATS, COMPRESSION_FUNCTIONS } from "../lib/LZString.mjs"; /** * LZString Compress operation */ class LZStringCompress extends Operation { - /** * LZStringCompress constructor */ @@ -49,7 +48,6 @@ class LZStringCompress extends Operation { throw new OperationError("Unable to find compression function"); } } - } export default LZStringCompress; diff --git a/src/core/operations/LZStringDecompress.mjs b/src/core/operations/LZStringDecompress.mjs index 87d0d85b..1791ac51 100644 --- a/src/core/operations/LZStringDecompress.mjs +++ b/src/core/operations/LZStringDecompress.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {COMPRESSION_OUTPUT_FORMATS, DECOMPRESSION_FUNCTIONS} from "../lib/LZString.mjs"; +import { COMPRESSION_OUTPUT_FORMATS, DECOMPRESSION_FUNCTIONS } from "../lib/LZString.mjs"; /** * LZString Decompress operation */ class LZStringDecompress extends Operation { - /** * LZStringDecompress constructor */ @@ -49,8 +48,6 @@ class LZStringDecompress extends Operation { throw new OperationError("Unable to find decompression function"); } } - - } export default LZStringDecompress; diff --git a/src/core/operations/Label.mjs b/src/core/operations/Label.mjs index fb13d803..0862db12 100644 --- a/src/core/operations/Label.mjs +++ b/src/core/operations/Label.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Label operation. For use with Jump and Conditional Jump. */ class Label extends Operation { - /** * Label constructor */ @@ -42,7 +41,6 @@ class Label extends Operation { run(state) { return state; } - } export default Label; diff --git a/src/core/operations/LevenshteinDistance.mjs b/src/core/operations/LevenshteinDistance.mjs index b9d30aa0..01b928f4 100644 --- a/src/core/operations/LevenshteinDistance.mjs +++ b/src/core/operations/LevenshteinDistance.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Levenshtein Distance operation */ class LevenshteinDistance extends Operation { - /** * LevenshteinDistance constructor */ @@ -20,7 +19,8 @@ class LevenshteinDistance extends Operation { this.name = "Levenshtein Distance"; this.module = "Default"; - this.description = "Levenshtein Distance (also known as Edit Distance) is a string metric to measure a difference between two strings that counts operations (insertions, deletions, and substitutions) on single character that are required to change one string to another."; + this.description + = "Levenshtein Distance (also known as Edit Distance) is a string metric to measure a difference between two strings that counts operations (insertions, deletions, and substitutions) on single character that are required to change one string to another."; this.infoURL = "https://wikipedia.org/wiki/Levenshtein_distance"; this.inputType = "string"; this.outputType = "number"; @@ -44,7 +44,7 @@ class LevenshteinDistance extends Operation { name: "Substitution cost", type: "number", value: 1 - }, + } ]; } @@ -62,7 +62,8 @@ class LevenshteinDistance extends Operation { if (insCost < 0 || delCost < 0 || subCost < 0) { throw new OperationError("Negative costs are not allowed."); } - const src = samples[0], dest = samples[1]; + const src = samples[0], + dest = samples[1]; let currentCost = new Array(src.length + 1); let nextCost = new Array(src.length + 1); for (let i = 0; i < currentCost.length; i++) { @@ -92,7 +93,6 @@ class LevenshteinDistance extends Operation { return currentCost[currentCost.length - 1]; } - } export default LevenshteinDistance; diff --git a/src/core/operations/Lorenz.mjs b/src/core/operations/Lorenz.mjs index 28ac3bf7..db735891 100644 --- a/src/core/operations/Lorenz.mjs +++ b/src/core/operations/Lorenz.mjs @@ -16,7 +16,6 @@ import OperationError from "../errors/OperationError.mjs"; * Lorenz operation */ class Lorenz extends Operation { - /** * Lorenz constructor */ @@ -25,7 +24,8 @@ class Lorenz extends Operation { this.name = "Lorenz"; this.module = "Bletchley"; - this.description = "The Lorenz SZ40/42 cipher attachment was a WW2 German rotor cipher machine with twelve rotors which attached in-line between remote teleprinters.

    It used the Vernam cipher with two groups of five rotors (named the psi(ψ) wheels and chi(χ) wheels at Bletchley Park) to create two pseudorandom streams of five bits, encoded in ITA2, which were XOR added to the plaintext. Two other rotors, dubbed the mu(μ) or motor wheels, could hold up the stepping of the psi wheels meaning they stepped intermittently.

    Each rotor has a different number of cams/lugs around their circumference which could be set active or inactive changing the key stream.

    Three models of the Lorenz are emulated, SZ40, SZ42a and SZ42b and three example wheel patterns (the lug settings) are included (KH, ZMUG & BREAM) with the option to set a custom set using the letter 'x' for active or '.' for an inactive lug.

    The input can either be plaintext or ITA2 when sending and ITA2 when receiving.

    To learn more, Virtual Lorenz, an online, browser based simulation of the Lorenz SZ40/42 is available at lorenz.virtualcolossus.co.uk.

    A more detailed description of this operation can be found here."; + this.description + = "The Lorenz SZ40/42 cipher attachment was a WW2 German rotor cipher machine with twelve rotors which attached in-line between remote teleprinters.

    It used the Vernam cipher with two groups of five rotors (named the psi(ψ) wheels and chi(χ) wheels at Bletchley Park) to create two pseudorandom streams of five bits, encoded in ITA2, which were XOR added to the plaintext. Two other rotors, dubbed the mu(μ) or motor wheels, could hold up the stepping of the psi wheels meaning they stepped intermittently.

    Each rotor has a different number of cams/lugs around their circumference which could be set active or inactive changing the key stream.

    Three models of the Lorenz are emulated, SZ40, SZ42a and SZ42b and three example wheel patterns (the lug settings) are included (KH, ZMUG & BREAM) with the option to set a custom set using the letter 'x' for active or '.' for an inactive lug.

    The input can either be plaintext or ITA2 when sending and ITA2 when receiving.

    To learn more, Virtual Lorenz, an online, browser based simulation of the Lorenz SZ40/42 is available at lorenz.virtualcolossus.co.uk.

    A more detailed description of this operation can be found here."; this.infoURL = "https://wikipedia.org/wiki/Lorenz_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -226,7 +226,6 @@ class Lorenz extends Operation { * @returns {string} */ run(input, args) { - const model = args[0], pattern = args[1], kt = args[2], @@ -262,35 +261,47 @@ class Lorenz extends Operation { this.reverseTable(); - if (s1<1 || s1>43) throw new OperationError("Ψ1 start must be between 1 and 43"); - if (s2<1 || s2>47) throw new OperationError("Ψ2 start must be between 1 and 47"); - if (s3<1 || s3>51) throw new OperationError("Ψ3 start must be between 1 and 51"); - if (s4<1 || s4>53) throw new OperationError("Ψ4 start must be between 1 and 53"); - if (s5<1 || s5>59) throw new OperationError("Ψ5 start must be between 1 and 59"); - if (m37<1 || m37>37) throw new OperationError("Μ37 start must be between 1 and 37"); - if (m61<1 || m61>61) throw new OperationError("Μ61 start must be between 1 and 61"); - if (x1<1 || x1>41) throw new OperationError("Χ1 start must be between 1 and 41"); - if (x2<1 || x2>31) throw new OperationError("Χ2 start must be between 1 and 31"); - if (x3<1 || x3>29) throw new OperationError("Χ3 start must be between 1 and 29"); - if (x4<1 || x4>26) throw new OperationError("Χ4 start must be between 1 and 26"); - if (x5<1 || x5>23) throw new OperationError("Χ5 start must be between 1 and 23"); + if (s1 < 1 || s1 > 43) throw new OperationError("Ψ1 start must be between 1 and 43"); + if (s2 < 1 || s2 > 47) throw new OperationError("Ψ2 start must be between 1 and 47"); + if (s3 < 1 || s3 > 51) throw new OperationError("Ψ3 start must be between 1 and 51"); + if (s4 < 1 || s4 > 53) throw new OperationError("Ψ4 start must be between 1 and 53"); + if (s5 < 1 || s5 > 59) throw new OperationError("Ψ5 start must be between 1 and 59"); + if (m37 < 1 || m37 > 37) throw new OperationError("Μ37 start must be between 1 and 37"); + if (m61 < 1 || m61 > 61) throw new OperationError("Μ61 start must be between 1 and 61"); + if (x1 < 1 || x1 > 41) throw new OperationError("Χ1 start must be between 1 and 41"); + if (x2 < 1 || x2 > 31) throw new OperationError("Χ2 start must be between 1 and 31"); + if (x3 < 1 || x3 > 29) throw new OperationError("Χ3 start must be between 1 and 29"); + if (x4 < 1 || x4 > 26) throw new OperationError("Χ4 start must be between 1 and 26"); + if (x5 < 1 || x5 > 23) throw new OperationError("Χ5 start must be between 1 and 23"); // Initialise chosen wheel pattern let chosenSetting = ""; if (pattern === "Custom") { const re = new RegExp("^[.xX]*$"); - if (lugs1.length !== 43 || !re.test(lugs1)) throw new OperationError("Ψ1 custom lugs must be 43 long and can only include . or x "); - if (lugs2.length !== 47 || !re.test(lugs2)) throw new OperationError("Ψ2 custom lugs must be 47 long and can only include . or x"); - if (lugs3.length !== 51 || !re.test(lugs3)) throw new OperationError("Ψ3 custom lugs must be 51 long and can only include . or x"); - if (lugs4.length !== 53 || !re.test(lugs4)) throw new OperationError("Ψ4 custom lugs must be 53 long and can only include . or x"); - if (lugs5.length !== 59 || !re.test(lugs5)) throw new OperationError("Ψ5 custom lugs must be 59 long and can only include . or x"); - if (lugm37.length !== 37 || !re.test(lugm37)) throw new OperationError("M37 custom lugs must be 37 long and can only include . or x"); - if (lugm61.length !== 61 || !re.test(lugm61)) throw new OperationError("M61 custom lugs must be 61 long and can only include . or x"); - if (lugx1.length !== 41 || !re.test(lugx1)) throw new OperationError("Χ1 custom lugs must be 41 long and can only include . or x"); - if (lugx2.length !== 31 || !re.test(lugx2)) throw new OperationError("Χ2 custom lugs must be 31 long and can only include . or x"); - if (lugx3.length !== 29 || !re.test(lugx3)) throw new OperationError("Χ3 custom lugs must be 29 long and can only include . or x"); - if (lugx4.length !== 26 || !re.test(lugx4)) throw new OperationError("Χ4 custom lugs must be 26 long and can only include . or x"); - if (lugx5.length !== 23 || !re.test(lugx5)) throw new OperationError("Χ5 custom lugs must be 23 long and can only include . or x"); + if (lugs1.length !== 43 || !re.test(lugs1)) + throw new OperationError("Ψ1 custom lugs must be 43 long and can only include . or x "); + if (lugs2.length !== 47 || !re.test(lugs2)) + throw new OperationError("Ψ2 custom lugs must be 47 long and can only include . or x"); + if (lugs3.length !== 51 || !re.test(lugs3)) + throw new OperationError("Ψ3 custom lugs must be 51 long and can only include . or x"); + if (lugs4.length !== 53 || !re.test(lugs4)) + throw new OperationError("Ψ4 custom lugs must be 53 long and can only include . or x"); + if (lugs5.length !== 59 || !re.test(lugs5)) + throw new OperationError("Ψ5 custom lugs must be 59 long and can only include . or x"); + if (lugm37.length !== 37 || !re.test(lugm37)) + throw new OperationError("M37 custom lugs must be 37 long and can only include . or x"); + if (lugm61.length !== 61 || !re.test(lugm61)) + throw new OperationError("M61 custom lugs must be 61 long and can only include . or x"); + if (lugx1.length !== 41 || !re.test(lugx1)) + throw new OperationError("Χ1 custom lugs must be 41 long and can only include . or x"); + if (lugx2.length !== 31 || !re.test(lugx2)) + throw new OperationError("Χ2 custom lugs must be 31 long and can only include . or x"); + if (lugx3.length !== 29 || !re.test(lugx3)) + throw new OperationError("Χ3 custom lugs must be 29 long and can only include . or x"); + if (lugx4.length !== 26 || !re.test(lugx4)) + throw new OperationError("Χ4 custom lugs must be 26 long and can only include . or x"); + if (lugx5.length !== 23 || !re.test(lugx5)) + throw new OperationError("Χ5 custom lugs must be 23 long and can only include . or x"); chosenSetting = INIT_PATTERNS["No Pattern"]; chosenSetting.S[1] = this.readLugs(lugs1); chosenSetting.S[2] = this.readLugs(lugs2); @@ -316,34 +327,34 @@ class Lorenz extends Operation { let thisPsi = []; let thisChi = []; - let m61lug = muSettings[1][m61-1]; - let m37lug = muSettings[2][m37-1]; + let m61lug = muSettings[1][m61 - 1]; + let m37lug = muSettings[2][m37 - 1]; const p5 = [0, 0, 0]; const self = this; - const letters = Array.prototype.map.call(ita2Input, function(character) { + const letters = Array.prototype.map.call(ita2Input, function (character) { const letter = character.toUpperCase(); // Store lugs used in limitations, need these later - let x2bptr = x2+1; - if (x2bptr===32) x2bptr=1; - let s1bptr = s1+1; - if (s1bptr===44) s1bptr=1; + let x2bptr = x2 + 1; + if (x2bptr === 32) x2bptr = 1; + let s1bptr = s1 + 1; + if (s1bptr === 44) s1bptr = 1; thisChi = [ - chiSettings[1][x1-1], - chiSettings[2][x2-1], - chiSettings[3][x3-1], - chiSettings[4][x4-1], - chiSettings[5][x5-1] + chiSettings[1][x1 - 1], + chiSettings[2][x2 - 1], + chiSettings[3][x3 - 1], + chiSettings[4][x4 - 1], + chiSettings[5][x5 - 1] ]; thisPsi = [ - psiSettings[1][s1-1], - psiSettings[2][s2-1], - psiSettings[3][s3-1], - psiSettings[4][s4-1], - psiSettings[5][s5-1] + psiSettings[1][s1 - 1], + psiSettings[2][s2 - 1], + psiSettings[3][s3 - 1], + psiSettings[4][s4 - 1], + psiSettings[5][s5 - 1] ]; if (typeof ITA2_TABLE[letter] == "undefined") { @@ -354,7 +365,7 @@ class Lorenz extends Operation { // We calculate Bitwise XOR for each of the 5 bits across our input ( K XOR Psi XOR Chi ) const xorSum = []; - for (let i=0;i<=4;i++) { + for (let i = 0; i <= 4; i++) { xorSum[i] = ITA2_TABLE[letter][i] ^ thisPsi[i] ^ thisChi[i]; } const resultStr = xorSum.join(""); @@ -384,54 +395,52 @@ class Lorenz extends Operation { p5[2] = p5[1]; p5[1] = p5[0]; - if (mode==="Send") { + if (mode === "Send") { p5[0] = parseInt(ITA2_TABLE[letter][4], 10); } else { p5[0] = parseInt(xorSum[4], 10); } // Limitations here - if (model==="SZ42a") { + if (model === "SZ42a") { // Chi 2 one back lim - The active character of Chi 2 (2nd Chi wheel) in the previous position - lim = parseInt(chiSettings[2][x2bptr-1], 10); + lim = parseInt(chiSettings[2][x2bptr - 1], 10); if (kt) { // p5 back 2 - if (lim===p5[2]) { + if (lim === p5[2]) { lim = 0; } else { - lim=1; + lim = 1; } } // If basic motor = 0 and limitation = 1, Total motor = 0 [no move], otherwise, total motor = 1 [move] - if (basicmotor===0 && lim===1) { + if (basicmotor === 0 && lim === 1) { totalmotor = 0; } else { totalmotor = 1; } - - } else if (model==="SZ42b") { + } else if (model === "SZ42b") { // Chi 2 one back + Psi 1 one back. - const x2b1lug = parseInt(chiSettings[2][x2bptr-1], 10); - const s1b1lug = parseInt(psiSettings[1][s1bptr-1], 10); + const x2b1lug = parseInt(chiSettings[2][x2bptr - 1], 10); + const s1b1lug = parseInt(psiSettings[1][s1bptr - 1], 10); lim = 1; - if (x2b1lug===s1b1lug) lim=0; + if (x2b1lug === s1b1lug) lim = 0; if (kt) { - // p5 back 2 - if (lim===p5[2]) { - lim=0; + // p5 back 2 + if (lim === p5[2]) { + lim = 0; } else { - lim=1; + lim = 1; } } // If basic motor = 0 and limitation = 1, Total motor = 0 [no move], otherwise, total motor = 1 [move] - if (basicmotor===0 && lim===1) { + if (basicmotor === 0 && lim === 1) { totalmotor = 0; } else { totalmotor = 1; } - - } else if (model==="SZ40") { + } else if (model === "SZ40") { // SZ40 - just move based on the M37 motor wheel totalmotor = basicmotor; } else { @@ -447,14 +456,14 @@ class Lorenz extends Operation { if (--s5 < 1) s5 = 59; } - m61lug = muSettings[1][m61-1]; - m37lug = muSettings[2][m37-1]; + m61lug = muSettings[1][m61 - 1]; + m37lug = muSettings[2][m37 - 1]; let rtnstr = self.REVERSE_ITA2_TABLE[resultStr]; - if (format==="5/8/9") { - if (rtnstr==="+") rtnstr="5"; // + or 5 used to represent figure shift - if (rtnstr==="-") rtnstr="8"; // - or 8 used to represent letter shift - if (rtnstr===".") rtnstr="9"; // . or 9 used to represent space + if (format === "5/8/9") { + if (rtnstr === "+") rtnstr = "5"; // + or 5 used to represent figure shift + if (rtnstr === "-") rtnstr = "8"; // - or 8 used to represent letter shift + if (rtnstr === ".") rtnstr = "9"; // . or 9 used to represent space } return rtnstr; }); @@ -462,7 +471,6 @@ class Lorenz extends Operation { const ita2output = letters.join(""); return this.convertFromITA2(ita2output, outtype, mode); - } /** @@ -486,8 +494,8 @@ class Lorenz extends Operation { * Read lugs settings - convert to 0|1 */ readLugs(lugstr) { - const arr = Array.prototype.map.call(lugstr, function(lug) { - if (lug===".") { + const arr = Array.prototype.map.call(lugstr, function (lug) { + if (lug === ".") { return 0; } else { return 1; @@ -510,13 +518,14 @@ class Lorenz extends Operation { if (intype === "ITA2" || mode === "Receive") { if (validITA2.indexOf(letter) === -1) { let errltr = letter; - if (errltr==="\n") errltr = "Carriage Return"; - if (errltr===" ") errltr = "Space"; - throw new OperationError("Invalid ITA2 character : "+errltr); + if (errltr === "\n") errltr = "Carriage Return"; + if (errltr === " ") errltr = "Space"; + throw new OperationError("Invalid ITA2 character : " + errltr); } result += letter; } else { - if (validChars.indexOf(letter) === -1) throw new OperationError("Invalid Plaintext character : "+letter); + if (validChars.indexOf(letter) === -1) + throw new OperationError("Invalid Plaintext character : " + letter); if (!figShifted && figShiftedChars.indexOf(letter) !== -1) { // in letters mode and next char needs to be figure shifted @@ -524,9 +533,9 @@ class Lorenz extends Operation { result += "55" + figShiftArr[letter]; } else if (figShifted) { // in figures mode and next char needs to be letter shifted - if (letter==="\n") { + if (letter === "\n") { result += "34"; - } else if (letter==="\r") { + } else if (letter === "\r") { result += "4"; } else if (figShiftedChars.indexOf(letter) === -1) { figShifted = false; @@ -534,19 +543,16 @@ class Lorenz extends Operation { } else { result += figShiftArr[letter]; } - } else { - if (letter==="\n") { + if (letter === "\n") { result += "34"; - } else if (letter==="\r") { + } else if (letter === "\r") { result += "4"; } else { result += letter; } } - } - } return result; @@ -560,10 +566,8 @@ class Lorenz extends Operation { let figShifted = false; for (const letter of input) { if (mode === "Receive") { - // Convert output ITA2 to plaintext (including figure/letter shifts) if (outtype === "Plaintext") { - if (letter === "5" || letter === "+") { figShifted = true; } else if (letter === "8" || letter === "-") { @@ -577,28 +581,22 @@ class Lorenz extends Operation { } else if (letter === "/") { result += "/"; } else { - if (figShifted) { result += this.REVERSE_FIGSHIFT_TABLE[letter]; } else { result += letter; } - } - } else { result += letter; } - } else { result += letter; } } return result; - } - } const ITA2_TABLE = { @@ -679,83 +677,178 @@ const figShiftArr = { const INIT_PATTERNS = { "No Pattern": { "X": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 + ], 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 5: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, "S": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 5: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + ], + 2: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + 3: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + 4: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + 5: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] }, "M": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + 2: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 + ] } - }, "KH Pattern": { "X": { - 1: [0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0], + 1: [ + 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 0, 0 + ], 2: [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0], 3: [0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0], 4: [1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0], 5: [1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0] }, "S": { - 1: [0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1], - 2: [0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1], - 3: [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1], - 4: [0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], - 5: [1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0] + 1: [ + 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 1, 0, 1 + ], + 2: [ + 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 + ], + 3: [ + 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1 + ], + 4: [ + 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, + 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 + ], + 5: [ + 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0 + ] }, - "M": { - 1: [0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0], - 2: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0] + "M": { + 1: [ + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0 + ], + 2: [ + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0 + ] } }, - "ZMUG Pattern": { + "ZMUG Pattern": { "X": { - 1: [0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0], + 1: [ + 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 1, 1, 0 + ], 2: [1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0], 3: [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0], 4: [1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1], 5: [0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1] }, "S": { - 1: [1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0], - 2: [0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1], - 3: [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1], - 4: [0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1], - 5: [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0] + 1: [ + 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 0, 0 + ], + 2: [ + 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1 + ], + 3: [ + 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1 + ], + 4: [ + 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1 + ], + 5: [ + 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0 + ] }, "M": { - 1: [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1], - 2: [0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1] + 1: [ + 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1 + ], + 2: [ + 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, + 1, 1 + ] } }, "BREAM Pattern": { "X": { - 1: [0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0], + 1: [ + 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0 + ], 2: [0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1], 3: [1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0], 4: [1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0], 5: [0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0] }, "S": { - 1: [0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0], - 2: [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0], - 3: [1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], - 4: [0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1], - 5: [1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0] + 1: [ + 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 0 + ], + 2: [ + 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0 + ], + 3: [ + 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 + ], + 4: [ + 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1 + ], + 5: [ + 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, + 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 + ] }, "M": { - 1: [1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1], - 2: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1] + 1: [ + 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, + 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1 + ], + 2: [ + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, + 0, 1 + ] } } }; diff --git a/src/core/operations/LuhnChecksum.mjs b/src/core/operations/LuhnChecksum.mjs index cb3a7c24..fbdf5044 100644 --- a/src/core/operations/LuhnChecksum.mjs +++ b/src/core/operations/LuhnChecksum.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Luhn Checksum operation */ class LuhnChecksum extends Operation { - /** * LuhnChecksum constructor */ @@ -20,7 +19,8 @@ class LuhnChecksum extends Operation { this.name = "Luhn Checksum"; this.module = "Default"; - this.description = "The Luhn algorithm, also known as the modulus 10 or mod 10 algorithm, is a simple checksum formula used to validate a variety of identification numbers, such as credit card numbers, IMEI numbers and Canadian Social Insurance Numbers."; + this.description + = "The Luhn algorithm, also known as the modulus 10 or mod 10 algorithm, is a simple checksum formula used to validate a variety of identification numbers, such as credit card numbers, IMEI numbers and Canadian Social Insurance Numbers."; this.infoURL = "https://wikipedia.org/wiki/Luhn_algorithm"; this.inputType = "string"; this.outputType = "string"; @@ -35,24 +35,28 @@ class LuhnChecksum extends Operation { */ checksum(inputStr) { let even = false; - return inputStr.split("").reverse().reduce((acc, elem) => { - // Convert element to integer. - let temp = parseInt(elem, 10); + return ( + inputStr + .split("") + .reverse() + .reduce((acc, elem) => { + // Convert element to integer. + let temp = parseInt(elem, 10); - // If element is not an integer. - if (isNaN(temp)) - throw new OperationError("Character: " + elem + " is not a digit."); + // If element is not an integer. + if (isNaN(temp)) throw new OperationError("Character: " + elem + " is not a digit."); - // If element is in an even position - if (even) { - // Double the element and add the quotient and remainder together. - temp = 2 * elem; - temp = Math.floor(temp/10) + (temp % 10); - } + // If element is in an even position + if (even) { + // Double the element and add the quotient and remainder together. + temp = 2 * elem; + temp = Math.floor(temp / 10) + (temp % 10); + } - even = !even; - return acc + temp; - }, 0) % 10; + even = !even; + return acc + temp; + }, 0) % 10 + ); } /** @@ -65,13 +69,12 @@ class LuhnChecksum extends Operation { const checkSum = this.checksum(input); let checkDigit = this.checksum(input + "0"); - checkDigit = checkDigit === 0 ? 0 : (10-checkDigit); + checkDigit = checkDigit === 0 ? 0 : 10 - checkDigit; return `Checksum: ${checkSum} Checkdigit: ${checkDigit} Luhn Validated String: ${input + "" + checkDigit}`; } - } export default LuhnChecksum; diff --git a/src/core/operations/MD2.mjs b/src/core/operations/MD2.mjs index 38f6d325..e3ef742f 100644 --- a/src/core/operations/MD2.mjs +++ b/src/core/operations/MD2.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * MD2 operation */ class MD2 extends Operation { - /** * MD2 constructor */ @@ -20,7 +19,8 @@ class MD2 extends Operation { this.name = "MD2"; this.module = "Crypto"; - this.description = "The MD2 (Message-Digest 2) algorithm is a cryptographic hash function developed by Ronald Rivest in 1989. The algorithm is optimized for 8-bit computers.

    Although MD2 is no longer considered secure, even as of 2014, it remains in use in public key infrastructures as part of certificates generated with MD2 and RSA. The message digest algorithm consists, by default, of 18 rounds."; + this.description + = "The MD2 (Message-Digest 2) algorithm is a cryptographic hash function developed by Ronald Rivest in 1989. The algorithm is optimized for 8-bit computers.

    Although MD2 is no longer considered secure, even as of 2014, it remains in use in public key infrastructures as part of certificates generated with MD2 and RSA. The message digest algorithm consists, by default, of 18 rounds."; this.infoURL = "https://wikipedia.org/wiki/MD2_(cryptography)"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -40,9 +40,8 @@ class MD2 extends Operation { * @returns {string} */ run(input, args) { - return runHash("md2", input, {rounds: args[0]}); + return runHash("md2", input, { rounds: args[0] }); } - } export default MD2; diff --git a/src/core/operations/MD4.mjs b/src/core/operations/MD4.mjs index 381528cc..1aed2ab8 100644 --- a/src/core/operations/MD4.mjs +++ b/src/core/operations/MD4.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * MD4 operation */ class MD4 extends Operation { - /** * MD4 constructor */ @@ -20,7 +19,8 @@ class MD4 extends Operation { this.name = "MD4"; this.module = "Crypto"; - this.description = "The MD4 (Message-Digest 4) algorithm is a cryptographic hash function developed by Ronald Rivest in 1990. The digest length is 128 bits. The algorithm has influenced later designs, such as the MD5, SHA-1 and RIPEMD algorithms.

    The security of MD4 has been severely compromised."; + this.description + = "The MD4 (Message-Digest 4) algorithm is a cryptographic hash function developed by Ronald Rivest in 1990. The digest length is 128 bits. The algorithm has influenced later designs, such as the MD5, SHA-1 and RIPEMD algorithms.

    The security of MD4 has been severely compromised."; this.infoURL = "https://wikipedia.org/wiki/MD4"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -35,7 +35,6 @@ class MD4 extends Operation { run(input, args) { return runHash("md4", input); } - } export default MD4; diff --git a/src/core/operations/MD5.mjs b/src/core/operations/MD5.mjs index f55edaf5..370e071d 100644 --- a/src/core/operations/MD5.mjs +++ b/src/core/operations/MD5.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * MD5 operation */ class MD5 extends Operation { - /** * MD5 constructor */ @@ -20,7 +19,8 @@ class MD5 extends Operation { this.name = "MD5"; this.module = "Crypto"; - this.description = "MD5 (Message-Digest 5) is a widely used hash function. It has been used in a variety of security applications and is also commonly used to check the integrity of files.

    However, MD5 is not collision resistant and it isn't suitable for applications like SSL/TLS certificates or digital signatures that rely on this property."; + this.description + = "MD5 (Message-Digest 5) is a widely used hash function. It has been used in a variety of security applications and is also commonly used to check the integrity of files.

    However, MD5 is not collision resistant and it isn't suitable for applications like SSL/TLS certificates or digital signatures that rely on this property."; this.infoURL = "https://wikipedia.org/wiki/MD5"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -35,7 +35,6 @@ class MD5 extends Operation { run(input, args) { return runHash("md5", input); } - } export default MD5; diff --git a/src/core/operations/MD6.mjs b/src/core/operations/MD6.mjs index 0ab13ffe..88f29c79 100644 --- a/src/core/operations/MD6.mjs +++ b/src/core/operations/MD6.mjs @@ -12,7 +12,6 @@ import NodeMD6 from "node-md6"; * MD6 operation */ class MD6 extends Operation { - /** * MD6 constructor */ @@ -21,7 +20,8 @@ class MD6 extends Operation { this.name = "MD6"; this.module = "Crypto"; - this.description = "The MD6 (Message-Digest 6) algorithm is a cryptographic hash function. It uses a Merkle tree-like structure to allow for immense parallel computation of hashes for very long inputs."; + this.description + = "The MD6 (Message-Digest 6) algorithm is a cryptographic hash function. It uses a Merkle tree-like structure to allow for immense parallel computation of hashes for very long inputs."; this.infoURL = "https://wikipedia.org/wiki/MD6"; this.inputType = "string"; this.outputType = "string"; @@ -52,14 +52,11 @@ class MD6 extends Operation { run(input, args) { const [size, levels, key] = args; - if (size < 0 || size > 512) - throw new OperationError("Size must be between 0 and 512"); - if (levels < 0) - throw new OperationError("Levels must be greater than 0"); + if (size < 0 || size > 512) throw new OperationError("Size must be between 0 and 512"); + if (levels < 0) throw new OperationError("Levels must be greater than 0"); return NodeMD6.getHashOfText(input, size, key, levels); } - } export default MD6; diff --git a/src/core/operations/Magic.mjs b/src/core/operations/Magic.mjs index 69cad1db..61368475 100644 --- a/src/core/operations/Magic.mjs +++ b/src/core/operations/Magic.mjs @@ -13,7 +13,6 @@ import MagicLib from "../lib/Magic.mjs"; * Magic operation */ class Magic extends Operation { - /** * Magic constructor */ @@ -23,8 +22,10 @@ class Magic extends Operation { this.name = "Magic"; this.flowControl = true; this.module = "Default"; - this.description = "The Magic operation attempts to detect various properties of the input data and suggests which operations could help to make more sense of it.

    Options
    Depth: If an operation appears to match the data, it will be run and the result will be analysed further. This argument controls the maximum number of levels of recursion.

    Intensive mode: When this is turned on, various operations like XOR, bit rotates, and character encodings are brute-forced to attempt to detect valid data underneath. To improve performance, only the first 100 bytes of the data is brute-forced.

    Extensive language support: At each stage, the relative byte frequencies of the data will be compared to average frequencies for a number of languages. The default set consists of ~40 of the most commonly used languages on the Internet. The extensive list consists of 284 languages and can result in many languages matching the data if their byte frequencies are similar.

    Optionally enter a regular expression to match a string you expect to find to filter results (crib)."; - this.infoURL = "https://github.com/gchq/CyberChef/wiki/Automatic-detection-of-encoded-data-using-CyberChef-Magic"; + this.description + = "The Magic operation attempts to detect various properties of the input data and suggests which operations could help to make more sense of it.

    Options
    Depth: If an operation appears to match the data, it will be run and the result will be analysed further. This argument controls the maximum number of levels of recursion.

    Intensive mode: When this is turned on, various operations like XOR, bit rotates, and character encodings are brute-forced to attempt to detect valid data underneath. To improve performance, only the first 100 bytes of the data is brute-forced.

    Extensive language support: At each stage, the relative byte frequencies of the data will be compared to average frequencies for a number of languages. The default set consists of ~40 of the most commonly used languages on the Internet. The extensive list consists of 284 languages and can result in many languages matching the data if their byte frequencies are similar.

    Optionally enter a regular expression to match a string you expect to find to filter results (crib)."; + this.infoURL + = "https://github.com/gchq/CyberChef/wiki/Automatic-detection-of-encoded-data-using-CyberChef-Magic"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; this.presentType = "html"; @@ -64,12 +65,12 @@ class Magic extends Operation { [depth, intensive, extLang, crib] = ings, dish = state.dish, magic = new MagicLib(await dish.get(Dish.ARRAY_BUFFER)), - cribRegex = (crib && crib.length) ? new RegExp(crib, "i") : null; + cribRegex = crib && crib.length ? new RegExp(crib, "i") : null; let options = await magic.speculativeExecution(depth, extLang, intensive, [], false, cribRegex); // Filter down to results which matched the crib if (cribRegex) { - options = options.filter(option => option.matchesCrib); + options = options.filter((option) => option.matchesCrib); } // Record the current state for use when presenting @@ -86,7 +87,7 @@ class Magic extends Operation { * @returns {html} */ present(options) { - const currentRecipeConfig = this.state.opList.map(op => op.config); + const currentRecipeConfig = this.state.opList.map((op) => op.config); let output = ` { + options.forEach((option) => { // Construct recipe URL // Replace this Magic op with the generated recipe - const recipeConfig = currentRecipeConfig.slice(0, this.state.progress) + const recipeConfig = currentRecipeConfig + .slice(0, this.state.progress) .concat(option.recipe) .concat(currentRecipeConfig.slice(this.state.progress + 1)), recipeURL = "recipe=" + Utils.encodeURIFragment(Utils.generatePrettyRecipe(recipeConfig)); @@ -122,17 +124,22 @@ class Magic extends Operation { matchingOps = "", useful = ""; const entropy = `Entropy: ${option.entropy.toFixed(2)}`, - validUTF8 = option.isUTF8 ? "Valid UTF8\n" : ""; + validUTF8 = option.isUTF8 + ? "Valid UTF8\n" + : ""; if (option.languageScores[0].probability > 0) { - let likelyLangs = option.languageScores.filter(l => l.probability > 0); + let likelyLangs = option.languageScores.filter((l) => l.probability > 0); if (likelyLangs.length < 1) likelyLangs = [option.languageScores[0]]; - language = "" + - "Possible languages:\n " + - likelyLangs.map(lang => { - return MagicLib.codeToLanguage(lang.lang); - }).join("\n ") + - "\n"; + language + = "" + + "Possible languages:\n " + + likelyLangs + .map((lang) => { + return MagicLib.codeToLanguage(lang.lang); + }) + .join("\n ") + + "\n"; } if (option.fileType) { @@ -140,11 +147,12 @@ class Magic extends Operation { } if (option.matchingOps.length) { - matchingOps = `Matching ops: ${[...new Set(option.matchingOps.map(op => op.op))].join(", ")}\n`; + matchingOps = `Matching ops: ${[...new Set(option.matchingOps.map((op) => op.op))].join(", ")}\n`; } if (option.useful) { - useful = "Useful op detected\n"; + useful + = "Useful op detected\n"; } output += ` @@ -157,12 +165,12 @@ class Magic extends Operation { output += "
    "; if (!options.length) { - output = "Nothing of interest could be detected about the input data.\nHave you tried modifying the operation arguments?"; + output + = "Nothing of interest could be detected about the input data.\nHave you tried modifying the operation arguments?"; } return output; } - } export default Magic; diff --git a/src/core/operations/Mean.mjs b/src/core/operations/Mean.mjs index ee826201..74b83c1d 100644 --- a/src/core/operations/Mean.mjs +++ b/src/core/operations/Mean.mjs @@ -14,7 +14,6 @@ import BigNumber from "bignumber.js"; * Mean operation */ class Mean extends Operation { - /** * Mean constructor */ @@ -23,7 +22,8 @@ class Mean extends Operation { this.name = "Mean"; this.module = "Default"; - this.description = "Computes the mean (average) of a number list. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 .5 becomes 4.75"; + this.description + = "Computes the mean (average) of a number list. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 .5 becomes 4.75"; this.infoURL = "https://wikipedia.org/wiki/Arithmetic_mean"; this.inputType = "string"; this.outputType = "BigNumber"; @@ -31,7 +31,7 @@ class Mean extends Operation { { "name": "Delimiter", "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, + "value": ARITHMETIC_DELIM_OPTIONS } ]; } @@ -45,7 +45,6 @@ class Mean extends Operation { const val = mean(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Mean; diff --git a/src/core/operations/Median.mjs b/src/core/operations/Median.mjs index 4ec9eceb..93478a36 100644 --- a/src/core/operations/Median.mjs +++ b/src/core/operations/Median.mjs @@ -14,7 +14,6 @@ import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; * Median operation */ class Median extends Operation { - /** * Median constructor */ @@ -23,7 +22,8 @@ class Median extends Operation { this.name = "Median"; this.module = "Default"; - this.description = "Computes the median of a number list. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 1 .5 becomes 4.5"; + this.description + = "Computes the median of a number list. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 1 .5 becomes 4.5"; this.infoURL = "https://wikipedia.org/wiki/Median"; this.inputType = "string"; this.outputType = "BigNumber"; @@ -31,7 +31,7 @@ class Median extends Operation { { "name": "Delimiter", "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, + "value": ARITHMETIC_DELIM_OPTIONS } ]; } @@ -45,7 +45,6 @@ class Median extends Operation { const val = median(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Median; diff --git a/src/core/operations/Merge.mjs b/src/core/operations/Merge.mjs index 573e62e0..295498ea 100644 --- a/src/core/operations/Merge.mjs +++ b/src/core/operations/Merge.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Merge operation */ class Merge extends Operation { - /** * Merge constructor */ @@ -20,14 +19,15 @@ class Merge extends Operation { this.name = "Merge"; this.flowControl = true; this.module = "Default"; - this.description = "Consolidate all branches back into a single trunk. The opposite of Fork. Unticking the Merge All checkbox will only consolidate all branches up to the nearest Fork/Subsection."; + this.description + = "Consolidate all branches back into a single trunk. The opposite of Fork. Unticking the Merge All checkbox will only consolidate all branches up to the nearest Fork/Subsection."; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Merge All", type: "boolean", - value: true, + value: true } ]; } @@ -44,7 +44,6 @@ class Merge extends Operation { // merge when it sees this operation. return state; } - } export default Merge; diff --git a/src/core/operations/MicrosoftScriptDecoder.mjs b/src/core/operations/MicrosoftScriptDecoder.mjs index 3e59e95e..1a55e6f9 100644 --- a/src/core/operations/MicrosoftScriptDecoder.mjs +++ b/src/core/operations/MicrosoftScriptDecoder.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Microsoft Script Decoder operation */ class MicrosoftScriptDecoder extends Operation { - /** * MicrosoftScriptDecoder constructor */ @@ -19,7 +18,8 @@ class MicrosoftScriptDecoder extends Operation { this.name = "Microsoft Script Decoder"; this.module = "Default"; - this.description = "Decodes Microsoft Encoded Script files that have been encoded with Microsoft's custom encoding. These are often VBS (Visual Basic Script) files that are encoded and renamed with a '.vbe' extention or JS (JScript) files renamed with a '.jse' extention.

    Sample

    Encoded:
    #@~^RQAAAA==-mD~sX|:/TP{~J:+dYbxL~@!F@*@!+@*@!&@*eEI@#@&@#@&.jm.raY 214Wv:zms/obI0xEAAA==^#~@

    Decoded:
    var my_msg = "Testing <1><2><3>!";\n\nVScript.Echo(my_msg);"; + this.description + = "Decodes Microsoft Encoded Script files that have been encoded with Microsoft's custom encoding. These are often VBS (Visual Basic Script) files that are encoded and renamed with a '.vbe' extention or JS (JScript) files renamed with a '.jse' extention.

    Sample

    Encoded:
    #@~^RQAAAA==-mD~sX|:/TP{~J:+dYbxL~@!F@*@!+@*@!&@*eEI@#@&@#@&.jm.raY 214Wv:zms/obI0xEAAA==^#~@

    Decoded:
    var my_msg = "Testing <1><2><3>!";\n\nVScript.Echo(my_msg);"; this.infoURL = "https://wikipedia.org/wiki/JScript.Encode"; this.inputType = "string"; this.outputType = "string"; @@ -60,7 +60,8 @@ class MicrosoftScriptDecoder extends Operation { static _decode(data) { const result = []; let index = -1; - data = data.replace(/@&/g, String.fromCharCode(10)) + data = data + .replace(/@&/g, String.fromCharCode(10)) .replace(/@#/g, String.fromCharCode(13)) .replace(/@\*/g, ">") .replace(/@!/g, "<") @@ -73,17 +74,13 @@ class MicrosoftScriptDecoder extends Operation { index++; } - if ((byte === 9 || byte > 31 && byte < 128) && - byte !== 60 && - byte !== 62 && - byte !== 64) { + if ((byte === 9 || (byte > 31 && byte < 128)) && byte !== 60 && byte !== 62 && byte !== 64) { char = D_DECODE[byte].charAt(D_COMBINATION[index % 64]); } result.push(char); } return result.join(""); } - } const D_DECODE = [ @@ -218,8 +215,8 @@ const D_DECODE = [ ]; const D_COMBINATION = [ - 0, 1, 2, 0, 1, 2, 1, 2, 2, 1, 2, 1, 0, 2, 1, 2, 0, 2, 1, 2, 0, 0, 1, 2, 2, 1, 0, 2, 1, 2, 2, 1, - 0, 0, 2, 1, 2, 1, 2, 0, 2, 0, 0, 1, 2, 0, 2, 1, 0, 2, 1, 2, 0, 0, 1, 2, 2, 0, 0, 1, 2, 0, 2, 1 + 0, 1, 2, 0, 1, 2, 1, 2, 2, 1, 2, 1, 0, 2, 1, 2, 0, 2, 1, 2, 0, 0, 1, 2, 2, 1, 0, 2, 1, 2, 2, 1, 0, 0, 2, 1, 2, 1, 2, + 0, 2, 0, 0, 1, 2, 0, 2, 1, 0, 2, 1, 2, 0, 0, 1, 2, 2, 0, 0, 1, 2, 0, 2, 1 ]; export default MicrosoftScriptDecoder; diff --git a/src/core/operations/MultipleBombe.mjs b/src/core/operations/MultipleBombe.mjs index 1af471c2..2390fe40 100644 --- a/src/core/operations/MultipleBombe.mjs +++ b/src/core/operations/MultipleBombe.mjs @@ -13,7 +13,6 @@ import { BombeMachine } from "../lib/Bombe.mjs"; import { ROTORS, ROTORS_FOURTH, REFLECTORS, Reflector } from "../lib/Enigma.mjs"; import { isWorkerEnvironment } from "../Utils.mjs"; - /** * Convenience method for flattening the preset ROTORS object into a newline-separated string. * @param {Object[]} - Preset rotors object @@ -37,7 +36,7 @@ function rotorsFormat(rotors, s, n) { */ function choose(n, k) { let res = 1; - for (let i=1; i<=k; i++) { + for (let i = 1; i <= k; i++) { res *= (n + 1 - i) / i; } return res; @@ -55,7 +54,8 @@ class MultipleBombe extends Operation { this.name = "Multiple Bombe"; this.module = "Bletchley"; - this.description = "Emulation of the Bombe machine used to attack Enigma. This version carries out multiple Bombe runs to handle unknown rotor configurations.

    You should test your menu on the single Bombe operation before running it here. See the description of the Bombe operation for instructions on choosing a crib.

    More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; + this.description + = "Emulation of the Bombe machine used to attack Enigma. This version carries out multiple Bombe runs to handle unknown rotor configurations.

    You should test your menu on the single Bombe operation before running it here. See the description of the Bombe operation for instructions on choosing a crib.

    More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; this.infoURL = "https://wikipedia.org/wiki/Bombe"; this.inputType = "string"; this.outputType = "JSON"; @@ -67,19 +67,11 @@ class MultipleBombe extends Operation { "value": [ { name: "German Service Enigma (First - 3 rotor)", - value: [ - rotorsFormat(ROTORS, 0, 5), - "", - rotorsFormat(REFLECTORS, 0, 1) - ] + value: [rotorsFormat(ROTORS, 0, 5), "", rotorsFormat(REFLECTORS, 0, 1)] }, { name: "German Service Enigma (Second - 3 rotor)", - value: [ - rotorsFormat(ROTORS, 0, 8), - "", - rotorsFormat(REFLECTORS, 0, 2) - ] + value: [rotorsFormat(ROTORS, 0, 8), "", rotorsFormat(REFLECTORS, 0, 2)] }, { name: "German Service Enigma (Third - 4 rotor)", @@ -100,7 +92,7 @@ class MultipleBombe extends Operation { { name: "User defined", value: ["", "", ""] - }, + } ], "target": [1, 2, 3] }, @@ -145,7 +137,7 @@ class MultipleBombe extends Operation { */ updateStatus(nLoops, nStops, progress, start) { const elapsed = Date.now() - start; - const remaining = (elapsed / progress) * (1 - progress) / 1000; + const remaining = ((elapsed / progress) * (1 - progress)) / 1000; const hours = Math.floor(remaining / 3600); const minutes = `0${Math.floor((remaining % 3600) / 60)}`.slice(-2); const seconds = `0${Math.floor(remaining % 60)}`.slice(-2); @@ -230,7 +222,7 @@ class MultipleBombe extends Operation { update = undefined; } let bombe = undefined; - const output = {bombeRuns: []}; + const output = { bombeRuns: [] }; // I could use a proper combinatorics algorithm here... but it would be more code to // write one, and we don't seem to have one in our existing libraries, so massively nested // for loop it is @@ -280,7 +272,6 @@ class MultipleBombe extends Operation { return output; } - /** * Displays the MultiBombe results in an HTML table * @@ -294,7 +285,8 @@ class MultipleBombe extends Operation { for (const run of output.bombeRuns) { html += `\nRotors: ${run.rotors.slice().reverse().join(", ")}\nReflector: ${run.reflector}\n`; - html += "\n"; + html + += "
    Rotor stops Partial plugboard Decryption preview
    \n"; for (const [setting, stecker, decrypt] of run.result) { html += `\n`; } diff --git a/src/core/operations/Multiply.mjs b/src/core/operations/Multiply.mjs index 9f1666e8..220c6b88 100644 --- a/src/core/operations/Multiply.mjs +++ b/src/core/operations/Multiply.mjs @@ -10,12 +10,10 @@ import Operation from "../Operation.mjs"; import { multi, createNumArray } from "../lib/Arithmetic.mjs"; import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; - /** * Multiply operation */ class Multiply extends Operation { - /** * Multiply constructor */ @@ -24,7 +22,8 @@ class Multiply extends Operation { this.name = "Multiply"; this.module = "Default"; - this.description = "Multiplies a list of numbers. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 becomes 40"; + this.description + = "Multiplies a list of numbers. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 becomes 40"; this.infoURL = "https://wikipedia.org/wiki/Multiplication"; this.inputType = "string"; this.outputType = "BigNumber"; @@ -32,7 +31,7 @@ class Multiply extends Operation { { "name": "Delimiter", "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, + "value": ARITHMETIC_DELIM_OPTIONS } ]; } @@ -46,7 +45,6 @@ class Multiply extends Operation { const val = multi(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Multiply; diff --git a/src/core/operations/MurmurHash3.mjs b/src/core/operations/MurmurHash3.mjs index f4aea611..a3bb81d3 100644 --- a/src/core/operations/MurmurHash3.mjs +++ b/src/core/operations/MurmurHash3.mjs @@ -14,7 +14,6 @@ import Operation from "../Operation.mjs"; * MurmurHash3 operation */ class MurmurHash3 extends Operation { - /** * MurmurHash3 constructor */ @@ -41,15 +40,15 @@ class MurmurHash3 extends Operation { ]; } - /** - * Calculates the MurmurHash3 hash of the input. - * Based on Gary Court's JS MurmurHash implementation - * @see http://github.com/garycourt/murmurhash-js - * @author AliceGrey [alice@grey.systems] - * @param {string} input ASCII only - * @param {number} seed Positive integer only - * @return {number} 32-bit positive integer hash - */ + /** + * Calculates the MurmurHash3 hash of the input. + * Based on Gary Court's JS MurmurHash implementation + * @see http://github.com/garycourt/murmurhash-js + * @author AliceGrey [alice@grey.systems] + * @param {string} input ASCII only + * @param {number} seed Positive integer only + * @return {number} 32-bit positive integer hash + */ mmh3(input, seed) { let h1b; let k1; @@ -61,21 +60,21 @@ class MurmurHash3 extends Operation { let i = 0; while (i < bytes) { - k1 = - ((input.charCodeAt(i) & 0xff)) | - ((input.charCodeAt(++i) & 0xff) << 8) | - ((input.charCodeAt(++i) & 0xff) << 16) | - ((input.charCodeAt(++i) & 0xff) << 24); + k1 + = (input.charCodeAt(i) & 0xff) + | ((input.charCodeAt(++i) & 0xff) << 8) + | ((input.charCodeAt(++i) & 0xff) << 16) + | ((input.charCodeAt(++i) & 0xff) << 24); ++i; - k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff; + k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); - k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff; + k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; h1 ^= k1; h1 = (h1 << 13) | (h1 >>> 19); - h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff; - h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16)); + h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff; + h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16); } k1 = 0; @@ -89,31 +88,31 @@ class MurmurHash3 extends Operation { } if (remainder === 3 || remainder === 2 || remainder === 1) { - k1 ^= (input.charCodeAt(i) & 0xff); + k1 ^= input.charCodeAt(i) & 0xff; - k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; + k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); - k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; + k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; h1 ^= k1; } h1 ^= input.length; h1 ^= h1 >>> 16; - h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; + h1 = ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; h1 ^= h1 >>> 13; - h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff; + h1 = ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & 0xffffffff; h1 ^= h1 >>> 16; return h1 >>> 0; } /** - * Converts an unsigned 32-bit integer to a signed 32-bit integer - * @author AliceGrey [alice@grey.systems] - * @param {value} 32-bit unsigned integer - * @return {number} 32-bit signed integer - */ + * Converts an unsigned 32-bit integer to a signed 32-bit integer + * @author AliceGrey [alice@grey.systems] + * @param {value} 32-bit unsigned integer + * @return {number} 32-bit signed integer + */ unsignedToSigned(value) { if (value & 0x80000000) { return -0x100000000 + value; diff --git a/src/core/operations/NOT.mjs b/src/core/operations/NOT.mjs index 46fc1b8c..6bc1299d 100644 --- a/src/core/operations/NOT.mjs +++ b/src/core/operations/NOT.mjs @@ -11,7 +11,6 @@ import { bitOp, not } from "../lib/BitwiseOp.mjs"; * NOT operation */ class NOT extends Operation { - /** * NOT constructor */ @@ -62,7 +61,6 @@ class NOT extends Operation { highlightReverse(pos, args) { return pos; } - } export default NOT; diff --git a/src/core/operations/NTHash.mjs b/src/core/operations/NTHash.mjs index bde7a24a..88e47eac 100644 --- a/src/core/operations/NTHash.mjs +++ b/src/core/operations/NTHash.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * NT Hash operation */ class NTHash extends Operation { - /** * NTHash constructor */ @@ -20,7 +19,8 @@ class NTHash extends Operation { this.name = "NT Hash"; this.module = "Crypto"; - this.description = "An NT Hash, sometimes referred to as an NTLM hash, is a method of storing passwords on Windows systems. It works by running MD4 on UTF-16LE encoded input. NTLM hashes are considered weak because they can be brute-forced very easily with modern hardware."; + this.description + = "An NT Hash, sometimes referred to as an NTLM hash, is a method of storing passwords on Windows systems. It works by running MD4 on UTF-16LE encoded input. NTLM hashes are considered weak because they can be brute-forced very easily with modern hardware."; this.infoURL = "https://wikipedia.org/wiki/NT_LAN_Manager"; this.inputType = "string"; this.outputType = "string"; diff --git a/src/core/operations/NormaliseImage.mjs b/src/core/operations/NormaliseImage.mjs index 08de9ed5..29c2e0cc 100644 --- a/src/core/operations/NormaliseImage.mjs +++ b/src/core/operations/NormaliseImage.mjs @@ -14,7 +14,6 @@ import jimp from "jimp"; * Normalise Image operation */ class NormaliseImage extends Operation { - /** * NormaliseImage constructor */ @@ -27,7 +26,7 @@ class NormaliseImage extends Operation { this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; - this.presentType= "html"; + this.presentType = "html"; this.args = []; } @@ -79,7 +78,6 @@ class NormaliseImage extends Operation { return ``; } - } export default NormaliseImage; diff --git a/src/core/operations/NormaliseUnicode.mjs b/src/core/operations/NormaliseUnicode.mjs index 80d3be3c..b713cc08 100644 --- a/src/core/operations/NormaliseUnicode.mjs +++ b/src/core/operations/NormaliseUnicode.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {UNICODE_NORMALISATION_FORMS} from "../lib/ChrEnc.mjs"; +import { UNICODE_NORMALISATION_FORMS } from "../lib/ChrEnc.mjs"; import unorm from "unorm"; /** * Normalise Unicode operation */ class NormaliseUnicode extends Operation { - /** * NormaliseUnicode constructor */ @@ -56,7 +55,6 @@ class NormaliseUnicode extends Operation { throw new OperationError("Unknown Normalisation Form"); } } - } export default NormaliseUnicode; diff --git a/src/core/operations/Numberwang.mjs b/src/core/operations/Numberwang.mjs index 7f94e360..535b39fa 100644 --- a/src/core/operations/Numberwang.mjs +++ b/src/core/operations/Numberwang.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Numberwang operation. Remain indoors. */ class Numberwang extends Operation { - /** * Numberwang constructor */ @@ -49,7 +48,6 @@ class Numberwang extends Operation { const rand = Math.floor(Math.random() * didYouKnow.length); return output + "\n\nDid you know: " + didYouKnow[rand]; } - } /** @@ -64,38 +62,38 @@ const didYouKnow = [ "Numberwang was invented on a Sevenday.", "Contrary to popular belief, Albert Einstein always got good grades in Numberwang at school. He once scored ^4$ on a test.", "680 asteroids have been named after Numberwang.", - "Archimedes is most famous for proclaiming \"That's Numberwang!\" during an epiphany about water displacement he had while taking a bath.", + 'Archimedes is most famous for proclaiming "That\'s Numberwang!" during an epiphany about water displacement he had while taking a bath.', "Numberwang Day is celebrated in Japan on every day of the year apart from June 6.", "Biologists recently discovered Numberwang within a strand of human DNA.", - "Numbernot is a special type of non-Numberwang number. It is divisible by 3 and the letter \"y\".", + 'Numbernot is a special type of non-Numberwang number. It is divisible by 3 and the letter "y".', "Julie once got 612.04 Numberwangs in a single episode of Emmerdale.", - "In India, it is traditional to shout out \"Numberwang!\" instead of checkmate during games of chess.", + 'In India, it is traditional to shout out "Numberwang!" instead of checkmate during games of chess.', "There is a rule on Countdown which states that if you get Numberwang in the numbers round, you automatically win. It has only ever been invoked twice.", - "\"Numberwang\" was the third-most common baby name for a brief period in 1722.", - "\"The Lion King\" was loosely based on Numberwang.", - "\"A Numberwang a day keeps the doctor away\" is how Donny Cosy, the oldest man in the world, explained how he was in such good health at the age of 136.", - "The \"number lock\" button on a keyboard is based on the popular round of the same name in \"Numberwang\".", + '"Numberwang" was the third-most common baby name for a brief period in 1722.', + '"The Lion King" was loosely based on Numberwang.', + '"A Numberwang a day keeps the doctor away" is how Donny Cosy, the oldest man in the world, explained how he was in such good health at the age of 136.', + 'The "number lock" button on a keyboard is based on the popular round of the same name in "Numberwang".', "Cambridge became the first university to offer a course in Numberwang in 1567.", "Schrödinger's Numberwang is a number that has been confusing dentists for centuries.", - "\"Harry Potter and the Numberwang of Numberwang\" was rejected by publishers -41 times before it became a bestseller.", - "\"Numberwang\" is the longest-running British game show in history; it has aired 226 seasons, each containing 19 episodes, which makes a grand total of 132 episodes.", + '"Harry Potter and the Numberwang of Numberwang" was rejected by publishers -41 times before it became a bestseller.', + '"Numberwang" is the longest-running British game show in history; it has aired 226 seasons, each containing 19 episodes, which makes a grand total of 132 episodes.', "The triple Numberwang bonus was discovered by archaeologist Thomas Jefferson in Somerset.", "Numberwang is illegal in parts of Czechoslovakia.", "Numberwang was discovered in India in the 12th century.", "Numberwang has the chemical formula Zn4SO2(HgEs)3.", - "The first pack of cards ever created featured two \"Numberwang\" cards instead of jokers.", + 'The first pack of cards ever created featured two "Numberwang" cards instead of jokers.', "Julius Caesar was killed by an overdose of Numberwang.", "The most Numberwang musical note is G#.", - "In 1934, the forty-third Google Doodle promoted the upcoming television show \"Numberwang on Ice\".", + 'In 1934, the forty-third Google Doodle promoted the upcoming television show "Numberwang on Ice".', "A recent psychology study found that toddlers were 17% faster at identifying numbers which were Numberwang.", - "There are 700 ways to commit a foul in the television show \"Numberwang\". All 700 of these fouls were committed by Julie in one single episode in 1473.", + 'There are 700 ways to commit a foul in the television show "Numberwang". All 700 of these fouls were committed by Julie in one single episode in 1473.', "Astronomers suspect God is Numberwang.", "Numberwang is the official beverage of Canada.", - "In the pilot episode of \"The Price is Right\", if a contestant got the value of an item exactly right they were told \"That's Numberwang!\" and immediately won ₹5.7032.", + 'In the pilot episode of "The Price is Right", if a contestant got the value of an item exactly right they were told "That\'s Numberwang!" and immediately won ₹5.7032.', "The first person to get three Numberwangs in a row was Madonna.", - "\"Numberwang\" has the code U+46402 in Unicode.", - "The musical note \"Numberwang\" is between D# and E♮.", - "Numberwang was first played on the moon in 1834.", + '"Numberwang" has the code U+46402 in Unicode.', + 'The musical note "Numberwang" is between D# and E♮.', + "Numberwang was first played on the moon in 1834." ]; export default Numberwang; diff --git a/src/core/operations/OR.mjs b/src/core/operations/OR.mjs index 183fb1fe..7b585f22 100644 --- a/src/core/operations/OR.mjs +++ b/src/core/operations/OR.mjs @@ -12,7 +12,6 @@ import { bitOp, or, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs"; * OR operation */ class OR extends Operation { - /** * OR constructor */ @@ -72,7 +71,6 @@ class OR extends Operation { highlightReverse(pos, args) { return pos; } - } export default OR; diff --git a/src/core/operations/ObjectIdentifierToHex.mjs b/src/core/operations/ObjectIdentifierToHex.mjs index 3e78cc03..b088cf8b 100644 --- a/src/core/operations/ObjectIdentifierToHex.mjs +++ b/src/core/operations/ObjectIdentifierToHex.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * Object Identifier to Hex operation */ class ObjectIdentifierToHex extends Operation { - /** * ObjectIdentifierToHex constructor */ @@ -35,7 +34,6 @@ class ObjectIdentifierToHex extends Operation { run(input, args) { return r.KJUR.asn1.ASN1Util.oidIntToHex(input); } - } export default ObjectIdentifierToHex; diff --git a/src/core/operations/OffsetChecker.mjs b/src/core/operations/OffsetChecker.mjs index 0f66e591..53b2711e 100644 --- a/src/core/operations/OffsetChecker.mjs +++ b/src/core/operations/OffsetChecker.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Offset checker operation */ class OffsetChecker extends Operation { - /** * OffsetChecker constructor */ @@ -21,7 +20,8 @@ class OffsetChecker extends Operation { this.name = "Offset checker"; this.module = "Default"; - this.description = "Compares multiple inputs (separated by the specified delimiter) and highlights matching characters which appear at the same position in all samples."; + this.description + = "Compares multiple inputs (separated by the specified delimiter) and highlights matching characters which appear at the same position in all samples."; this.inputType = "string"; this.outputType = "html"; this.args = [ @@ -49,7 +49,9 @@ class OffsetChecker extends Operation { chr; if (!samples || samples.length < 2) { - throw new OperationError("Not enough samples, perhaps you need to modify the sample delimiter or add more data?"); + throw new OperationError( + "Not enough samples, perhaps you need to modify the sample delimiter or add more data?" + ); } // Initialise output strings @@ -101,7 +103,6 @@ class OffsetChecker extends Operation { return outputs.join(sampleDelim); } - } export default OffsetChecker; diff --git a/src/core/operations/OpticalCharacterRecognition.mjs b/src/core/operations/OpticalCharacterRecognition.mjs index 6262df7b..b6a1e152 100644 --- a/src/core/operations/OpticalCharacterRecognition.mjs +++ b/src/core/operations/OpticalCharacterRecognition.mjs @@ -19,7 +19,6 @@ import { createWorker } from "tesseract.js"; * Optical Character Recognition operation */ class OpticalCharacterRecognition extends Operation { - /** * OpticalCharacterRecognition constructor */ @@ -28,7 +27,8 @@ class OpticalCharacterRecognition extends Operation { this.name = "Optical Character Recognition"; this.module = "OCR"; - this.description = "Optical character recognition or optical character reader (OCR) is the mechanical or electronic conversion of images of typed, handwritten or printed text into machine-encoded text.

    Supported image formats: png, jpg, bmp, pbm."; + this.description + = "Optical character recognition or optical character reader (OCR) is the mechanical or electronic conversion of images of typed, handwritten or printed text into machine-encoded text.

    Supported image formats: png, jpg, bmp, pbm."; this.infoURL = "https://wikipedia.org/wiki/Optical_character_recognition"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -65,9 +65,11 @@ class OpticalCharacterRecognition extends Operation { workerPath: `${assetDir}tesseract/worker.min.js`, langPath: `${assetDir}tesseract/lang-data`, corePath: `${assetDir}tesseract/tesseract-core.wasm.js`, - logger: progress => { + logger: (progress) => { if (isWorkerEnvironment()) { - self.sendStatusMessage(`Status: ${progress.status}${progress.status === "recognizing text" ? ` - ${(parseFloat(progress.progress)*100).toFixed(2)}%`: "" }`); + self.sendStatusMessage( + `Status: ${progress.status}${progress.status === "recognizing text" ? ` - ${(parseFloat(progress.progress) * 100).toFixed(2)}%` : ""}` + ); } } }); diff --git a/src/core/operations/PEMToHex.mjs b/src/core/operations/PEMToHex.mjs index afbb4972..c325467d 100644 --- a/src/core/operations/PEMToHex.mjs +++ b/src/core/operations/PEMToHex.mjs @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * PEM to Hex operation */ class PEMToHex extends Operation { - /** * PEMToHex constructor */ @@ -23,7 +22,8 @@ class PEMToHex extends Operation { this.name = "PEM to Hex"; this.module = "Default"; - this.description = "Converts PEM (Privacy Enhanced Mail) format to a hexadecimal DER (Distinguished Encoding Rules) string."; + this.description + = "Converts PEM (Privacy Enhanced Mail) format to a hexadecimal DER (Distinguished Encoding Rules) string."; this.infoURL = "https://wikipedia.org/wiki/Privacy-Enhanced_Mail#Format"; this.inputType = "string"; this.outputType = "string"; @@ -62,7 +62,6 @@ class PEMToHex extends Operation { } return output.join("\n"); } - } export default PEMToHex; diff --git a/src/core/operations/PGPDecrypt.mjs b/src/core/operations/PGPDecrypt.mjs index d69b88ea..7e7ffe7b 100644 --- a/src/core/operations/PGPDecrypt.mjs +++ b/src/core/operations/PGPDecrypt.mjs @@ -15,7 +15,6 @@ const promisify = es6promisify.default ? es6promisify.default.promisify : es6pro * PGP Decrypt operation */ class PGPDecrypt extends Operation { - /** * PGPDecrypt constructor */ @@ -32,7 +31,7 @@ class PGPDecrypt extends Operation { "

    ", "Pretty Good Privacy is an encryption standard (OpenPGP) used for encrypting, decrypting, and signing messages.", "

    ", - "This function uses the Keybase implementation of PGP.", + "This function uses the Keybase implementation of PGP." ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Pretty_Good_Privacy"; this.inputType = "string"; @@ -81,7 +80,6 @@ class PGPDecrypt extends Operation { return plaintextMessage.toString(); } - } export default PGPDecrypt; diff --git a/src/core/operations/PGPDecryptAndVerify.mjs b/src/core/operations/PGPDecryptAndVerify.mjs index 119ccf16..897c35d7 100644 --- a/src/core/operations/PGPDecryptAndVerify.mjs +++ b/src/core/operations/PGPDecryptAndVerify.mjs @@ -15,7 +15,6 @@ const promisify = es6promisify.default ? es6promisify.default.promisify : es6pro * PGP Decrypt and Verify operation */ class PGPDecryptAndVerify extends Operation { - /** * PGPDecryptAndVerify constructor */ @@ -34,7 +33,7 @@ class PGPDecryptAndVerify extends Operation { "

    ", "Pretty Good Privacy is an encryption standard (OpenPGP) used for encrypting, decrypting, and signing messages.", "

    ", - "This function uses the Keybase implementation of PGP.", + "This function uses the Keybase implementation of PGP." ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Pretty_Good_Privacy"; this.inputType = "string"; @@ -118,7 +117,6 @@ class PGPDecryptAndVerify extends Operation { throw new OperationError(`Couldn't verify message: ${err}`); } } - } export default PGPDecryptAndVerify; diff --git a/src/core/operations/PGPEncrypt.mjs b/src/core/operations/PGPEncrypt.mjs index 2f41cc0b..9195840a 100644 --- a/src/core/operations/PGPEncrypt.mjs +++ b/src/core/operations/PGPEncrypt.mjs @@ -15,7 +15,6 @@ const promisify = es6promisify.default ? es6promisify.default.promisify : es6pro * PGP Encrypt operation */ class PGPEncrypt extends Operation { - /** * PGPEncrypt constructor */ @@ -31,7 +30,7 @@ class PGPEncrypt extends Operation { "

    ", "Pretty Good Privacy is an encryption standard (OpenPGP) used for encrypting, decrypting, and signing messages.", "

    ", - "This function uses the Keybase implementation of PGP.", + "This function uses the Keybase implementation of PGP." ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Pretty_Good_Privacy"; this.inputType = "string"; @@ -73,7 +72,6 @@ class PGPEncrypt extends Operation { return encryptedMessage.toString(); } - } export default PGPEncrypt; diff --git a/src/core/operations/PGPEncryptAndSign.mjs b/src/core/operations/PGPEncryptAndSign.mjs index 8fdbe4c3..6807d11c 100644 --- a/src/core/operations/PGPEncryptAndSign.mjs +++ b/src/core/operations/PGPEncryptAndSign.mjs @@ -15,7 +15,6 @@ const promisify = es6promisify.default ? es6promisify.default.promisify : es6pro * PGP Encrypt and Sign operation */ class PGPEncryptAndSign extends Operation { - /** * PGPEncryptAndSign constructor */ @@ -34,7 +33,7 @@ class PGPEncryptAndSign extends Operation { "

    ", "Pretty Good Privacy is an encryption standard (OpenPGP) used for encrypting, decrypting, and signing messages.", "

    ", - "This function uses the Keybase implementation of PGP.", + "This function uses the Keybase implementation of PGP." ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Pretty_Good_Privacy"; this.inputType = "string"; @@ -88,7 +87,6 @@ class PGPEncryptAndSign extends Operation { return signedMessage; } - } export default PGPEncryptAndSign; diff --git a/src/core/operations/PGPVerify.mjs b/src/core/operations/PGPVerify.mjs index ee346916..944a2c85 100644 --- a/src/core/operations/PGPVerify.mjs +++ b/src/core/operations/PGPVerify.mjs @@ -16,7 +16,6 @@ const promisify = es6promisify.default ? es6promisify.default.promisify : es6pro * PGP Verify operation */ class PGPVerify extends Operation { - /** * PGPVerify constructor */ @@ -34,7 +33,7 @@ class PGPVerify extends Operation { "

    ", "Pretty Good Privacy is an encryption standard (OpenPGP) used for encrypting, decrypting, and signing messages.", "

    ", - "This function uses the Keybase implementation of PGP.", + "This function uses the Keybase implementation of PGP." ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Pretty_Good_Privacy"; this.inputType = "string"; @@ -105,7 +104,6 @@ class PGPVerify extends Operation { throw new OperationError(`Couldn't verify message: ${err}`); } } - } export default PGPVerify; diff --git a/src/core/operations/PHPDeserialize.mjs b/src/core/operations/PHPDeserialize.mjs index 77d18bc2..d7a350ad 100644 --- a/src/core/operations/PHPDeserialize.mjs +++ b/src/core/operations/PHPDeserialize.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * PHP Deserialize operation */ class PHPDeserialize extends Operation { - /** * PHPDeserialize constructor */ @@ -20,7 +19,8 @@ class PHPDeserialize extends Operation { this.name = "PHP Deserialize"; this.module = "Default"; - this.description = "Deserializes PHP serialized data, outputting keyed arrays as JSON.

    This function does not support object tags.

    Example:
    a:2:{s:1:"a";i:10;i:0;a:1:{s:2:"ab";b:1;}}
    becomes
    {"a": 10,0: {"ab": true}}

    Output valid JSON: JSON doesn't support integers as keys, whereas PHP serialization does. Enabling this will cast these integers to strings. This will also escape backslashes."; + this.description + = "Deserializes PHP serialized data, outputting keyed arrays as JSON.

    This function does not support object tags.

    Example:
    a:2:{s:1:"a";i:10;i:0;a:1:{s:2:"ab";b:1;}}
    becomes
    {"a": 10,0: {"ab": true}}

    Output valid JSON: JSON doesn't support integers as keys, whereas PHP serialization does. Enabling this will cast these integers to strings. This will also escape backslashes."; this.infoURL = "http://www.phpinternalsbook.com/classes_objects/serialization.html"; this.inputType = "string"; this.outputType = "string"; @@ -77,7 +77,6 @@ class PHPDeserialize extends Operation { } } return result; - } /** @@ -122,7 +121,6 @@ class PHPDeserialize extends Operation { return result; } - const kind = read(1).toLowerCase(); switch (kind) { @@ -135,7 +133,7 @@ class PHPDeserialize extends Operation { expect(":"); const data = readUntil(";"); if (kind === "b") { - return (parseInt(data, 10) !== 0); + return parseInt(data, 10) !== 0; } return data; } @@ -147,7 +145,7 @@ class PHPDeserialize extends Operation { case "s": { expect(":"); const length = readUntil(":"); - expect("\""); + expect('"'); const value = read(length); expect('";'); if (args[0]) { @@ -165,7 +163,6 @@ class PHPDeserialize extends Operation { const inputPart = input.split(""); return handleInput(); } - } export default PHPDeserialize; diff --git a/src/core/operations/PLISTViewer.mjs b/src/core/operations/PLISTViewer.mjs index 9b4aada4..0d937011 100644 --- a/src/core/operations/PLISTViewer.mjs +++ b/src/core/operations/PLISTViewer.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * P-list Viewer operation */ class PlistViewer extends Operation { - /** * PlistViewer constructor */ @@ -19,7 +18,8 @@ class PlistViewer extends Operation { this.name = "P-list Viewer"; this.module = "Default"; - this.description = "In the macOS, iOS, NeXTSTEP, and GNUstep programming frameworks, property list files are files that store serialized objects. Property list files use the filename extension .plist, and thus are often referred to as p-list files.

    This operation displays plist files in a human readable format."; + this.description + = "In the macOS, iOS, NeXTSTEP, and GNUstep programming frameworks, property list files are files that store serialized objects. Property list files use the filename extension .plist, and thus are often referred to as p-list files.

    This operation displays plist files in a human readable format."; this.infoURL = "https://wikipedia.org/wiki/Property_list"; this.inputType = "string"; this.outputType = "string"; @@ -32,23 +32,23 @@ class PlistViewer extends Operation { * @returns {string} */ run(input, args) { - // Regexes are designed to transform the xml format into a more readable string format. - input = input.slice(input.indexOf("/g, "plist => ") .replace(//g, "{") .replace(/<\/dict>/g, "}") .replace(//g, "[") .replace(/<\/array>/g, "]") - .replace(/.+<\/key>/g, m => `${m.slice(5, m.indexOf(/<\/key>/g)-5)}\t=> `) - .replace(/.+<\/real>/g, m => `${m.slice(6, m.indexOf(/<\/real>/g)-6)}\n`) - .replace(/.+<\/string>/g, m => `"${m.slice(8, m.indexOf(/<\/string>/g)-8)}"\n`) - .replace(/.+<\/integer>/g, m => `${m.slice(9, m.indexOf(/<\/integer>/g)-9)}\n`) - .replace(//g, m => "false") - .replace(//g, m => "true") + .replace(/.+<\/key>/g, (m) => `${m.slice(5, m.indexOf(/<\/key>/g) - 5)}\t=> `) + .replace(/.+<\/real>/g, (m) => `${m.slice(6, m.indexOf(/<\/real>/g) - 6)}\n`) + .replace(/.+<\/string>/g, (m) => `"${m.slice(8, m.indexOf(/<\/string>/g) - 8)}"\n`) + .replace(/.+<\/integer>/g, (m) => `${m.slice(9, m.indexOf(/<\/integer>/g) - 9)}\n`) + .replace(//g, (m) => "false") + .replace(//g, (m) => "true") .replace(/<\/plist>/g, "/plist") - .replace(/.+<\/date>/g, m => `${m.slice(6, m.indexOf(/<\/integer>/g)-6)}`) - .replace(/[\s\S]+?<\/data>/g, m => `${m.slice(6, m.indexOf(/<\/data>/g)-6)}`) + .replace(/.+<\/date>/g, (m) => `${m.slice(6, m.indexOf(/<\/integer>/g) - 6)}`) + .replace(/[\s\S]+?<\/data>/g, (m) => `${m.slice(6, m.indexOf(/<\/data>/g) - 6)}`) .replace(/[ \t\r\f\v]/g, ""); /** @@ -62,8 +62,7 @@ class PlistViewer extends Operation { const temp = vals.indexOf(elem); if (temp !== -1) { depthCount += offset; - if (temp === 1) - arrCount += offset; + if (temp === 1) arrCount += offset; } } @@ -78,8 +77,7 @@ class PlistViewer extends Operation { * @param {number} index */ function printIt(input, index) { - if (!(input.length)) - return; + if (!input.length) return; let temp = ""; const origArr = arrCount; @@ -87,12 +85,10 @@ class PlistViewer extends Operation { // If the current position points at a larger dynamic structure. if (currElem.indexOf("=>") !== -1) { - // If the LHS also points at a larger structure (nested plists in a dictionary). if (input[1].indexOf("=>") !== -1) temp = currElem.slice(0, -2) + " => " + input[1].slice(0, -2) + " =>\n"; - else - temp = currElem.slice(0, -2) + " => " + input[1] + "\n"; + else temp = currElem.slice(0, -2) + " => " + input[1] + "\n"; input = input.slice(1); } else { @@ -107,11 +103,10 @@ class PlistViewer extends Operation { currElem = input[0]; // Tab out to the correct distance. - result += ("\t".repeat(depthCount)); + result += "\t".repeat(depthCount); // If it is enclosed in an array show index. - if (arrCount > 0 && currElem !== "]") - result += index.toString() + " => "; + if (arrCount > 0 && currElem !== "]") result += index.toString() + " => "; result += temp; @@ -119,12 +114,11 @@ class PlistViewer extends Operation { braces(currElem, ["{", "["], 1); // If there has been a new array then reset index. - if (arrCount > origArr) - return printIt(input.slice(1), 0); + if (arrCount > origArr) return printIt(input.slice(1), 0); return printIt(input.slice(1), ++index); } - input = input.split("\n").filter(e => e !== ""); + input = input.split("\n").filter((e) => e !== ""); printIt(input, 0); return result; } diff --git a/src/core/operations/PadLines.mjs b/src/core/operations/PadLines.mjs index c1464cce..d1bd2275 100644 --- a/src/core/operations/PadLines.mjs +++ b/src/core/operations/PadLines.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Pad lines operation */ class PadLines extends Operation { - /** * PadLines constructor */ @@ -54,17 +53,16 @@ class PadLines extends Operation { if (position === "Start") { for (i = 0; i < lines.length; i++) { - output += lines[i].padStart(lines[i].length+len, chr) + "\n"; + output += lines[i].padStart(lines[i].length + len, chr) + "\n"; } } else if (position === "End") { for (i = 0; i < lines.length; i++) { - output += lines[i].padEnd(lines[i].length+len, chr) + "\n"; + output += lines[i].padEnd(lines[i].length + len, chr) + "\n"; } } - return output.slice(0, output.length-1); + return output.slice(0, output.length - 1); } - } export default PadLines; diff --git a/src/core/operations/ParseASN1HexString.mjs b/src/core/operations/ParseASN1HexString.mjs index 35fd5ba4..27e9c288 100644 --- a/src/core/operations/ParseASN1HexString.mjs +++ b/src/core/operations/ParseASN1HexString.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * Parse ASN.1 hex string operation */ class ParseASN1HexString extends Operation { - /** * ParseASN1HexString constructor */ @@ -20,7 +19,8 @@ class ParseASN1HexString extends Operation { this.name = "Parse ASN.1 hex string"; this.module = "PublicKey"; - this.description = "Abstract Syntax Notation One (ASN.1) is a standard and notation that describes rules and structures for representing, encoding, transmitting, and decoding data in telecommunications and computer networking.

    This operation parses arbitrary ASN.1 data (encoded as an hex string: use the 'To Hex' operation if necessary) and presents the resulting tree."; + this.description + = "Abstract Syntax Notation One (ASN.1) is a standard and notation that describes rules and structures for representing, encoding, transmitting, and decoding data in telecommunications and computer networking.

    This operation parses arbitrary ASN.1 data (encoded as an hex string: use the 'To Hex' operation if necessary) and presents the resulting tree."; this.infoURL = "https://wikipedia.org/wiki/Abstract_Syntax_Notation_One"; this.inputType = "string"; this.outputType = "string"; @@ -45,11 +45,14 @@ class ParseASN1HexString extends Operation { */ run(input, args) { const [index, truncateLen] = args; - return r.ASN1HEX.dump(input.replace(/\s/g, "").toLowerCase(), { - "ommit_long_octet": truncateLen - }, index); + return r.ASN1HEX.dump( + input.replace(/\s/g, "").toLowerCase(), + { + "ommit_long_octet": truncateLen + }, + index + ); } - } export default ParseASN1HexString; diff --git a/src/core/operations/ParseColourCode.mjs b/src/core/operations/ParseColourCode.mjs index 31e575a1..51ae55d2 100644 --- a/src/core/operations/ParseColourCode.mjs +++ b/src/core/operations/ParseColourCode.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Parse colour code operation */ class ParseColourCode extends Operation { - /** * ParseColourCode constructor */ @@ -19,7 +18,8 @@ class ParseColourCode extends Operation { this.name = "Parse colour code"; this.module = "Default"; - this.description = "Converts a colour code in a standard format to other standard formats and displays the colour itself.

    Example inputs
    • #d9edf7
    • rgba(217,237,247,1)
    • hsla(200,65%,91%,1)
    • cmyk(0.12, 0.04, 0.00, 0.03)
    "; + this.description + = "Converts a colour code in a standard format to other standard formats and displays the colour itself.

    Example inputs
    • #d9edf7
    • rgba(217,237,247,1)
    • hsla(200,65%,91%,1)
    • cmyk(0.12, 0.04, 0.00, 0.03)
    "; this.infoURL = "https://wikipedia.org/wiki/Web_colors"; this.inputType = "string"; this.outputType = "html"; @@ -33,7 +33,10 @@ class ParseColourCode extends Operation { */ run(input, args) { let m = null, - r = 0, g = 0, b = 0, a = 1; + r = 0, + g = 0, + b = 0, + a = 1; // Read in the input if ((m = input.match(/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/i))) { @@ -41,13 +44,21 @@ class ParseColourCode extends Operation { r = parseInt(m[1], 16); g = parseInt(m[2], 16); b = parseInt(m[3], 16); - } else if ((m = input.match(/rgba?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)(?:,\s?(\d(?:\.\d+)?))?\)/i))) { + } else if ( + (m = input.match( + /rgba?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)(?:,\s?(\d(?:\.\d+)?))?\)/i + )) + ) { // RGB or RGBA - rgb(217,237,247) or rgba(217,237,247,1) r = parseFloat(m[1]); g = parseFloat(m[2]); b = parseFloat(m[3]); a = m[4] ? parseFloat(m[4]) : 1; - } else if ((m = input.match(/hsla?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)%,\s?(\d{1,3}(?:\.\d+)?)%(?:,\s?(\d(?:\.\d+)?))?\)/i))) { + } else if ( + (m = input.match( + /hsla?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)%,\s?(\d{1,3}(?:\.\d+)?)%(?:,\s?(\d(?:\.\d+)?))?\)/i + )) + ) { // HSL or HSLA - hsl(200, 65%, 91%) or hsla(200, 65%, 91%, 1) const h_ = parseFloat(m[1]) / 360, s_ = parseFloat(m[2]) / 100, @@ -74,24 +85,25 @@ class ParseColourCode extends Operation { h = Math.round(hsl_[0] * 360), s = Math.round(hsl_[1] * 100), l = Math.round(hsl_[2] * 100); - let k = 1 - Math.max(r/255, g/255, b/255), - c = (1 - r/255 - k) / (1 - k), - y = (1 - b/255 - k) / (1 - k); + let k = 1 - Math.max(r / 255, g / 255, b / 255), + c = (1 - r / 255 - k) / (1 - k), + y = (1 - b / 255 - k) / (1 - k); - m = (1 - g/255 - k) / (1 - k); + m = (1 - g / 255 - k) / (1 - k); c = isNaN(c) ? "0" : c.toFixed(2); m = isNaN(m) ? "0" : m.toFixed(2); y = isNaN(y) ? "0" : y.toFixed(2); k = k.toFixed(2); - const hex = "#" + - Math.round(r).toString(16).padStart(2, "0") + - Math.round(g).toString(16).padStart(2, "0") + - Math.round(b).toString(16).padStart(2, "0"), - rgb = "rgb(" + r + ", " + g + ", " + b + ")", + const hex + = "#" + + Math.round(r).toString(16).padStart(2, "0") + + Math.round(g).toString(16).padStart(2, "0") + + Math.round(b).toString(16).padStart(2, "0"), + rgb = "rgb(" + r + ", " + g + ", " + b + ")", rgba = "rgba(" + r + ", " + g + ", " + b + ", " + a + ")", - hsl = "hsl(" + h + ", " + s + "%, " + l + "%)", + hsl = "hsl(" + h + ", " + s + "%, " + l + "%)", hsla = "hsla(" + h + ", " + s + "%, " + l + "%, " + a + ")", cmyk = "cmyk(" + c + ", " + m + ", " + y + ", " + k + ")"; @@ -140,17 +152,17 @@ CMYK: ${cmyk} const hue2rgb = function hue2rgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; - if (t < 1/6) return p + (q - p) * 6 * t; - if (t < 1/2) return q; - if (t < 2/3) return p + (q - p) * (2/3 - t) * 6; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; }; const q = l < 0.5 ? l * (1 + s) : l + s - l * s; const p = 2 * l - q; - r = hue2rgb(p, q, h + 1/3); + r = hue2rgb(p, q, h + 1 / 3); g = hue2rgb(p, q, h); - b = hue2rgb(p, q, h - 1/3); + b = hue2rgb(p, q, h - 1 / 3); } return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; @@ -170,7 +182,9 @@ CMYK: ${cmyk} * @return {Array} The HSL representation */ static _rgbToHsl(r, g, b) { - r /= 255; g /= 255; b /= 255; + r /= 255; + g /= 255; + b /= 255; const max = Math.max(r, g, b), min = Math.min(r, g, b), l = (max + min) / 2; @@ -182,9 +196,15 @@ CMYK: ${cmyk} const d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch (max) { - case r: h = (g - b) / d + (g < b ? 6 : 0); break; - case g: h = (b - r) / d + 2; break; - case b: h = (r - g) / d + 4; break; + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; } h /= 6; } diff --git a/src/core/operations/ParseDateTime.mjs b/src/core/operations/ParseDateTime.mjs index 1fb6fb5e..5457ead5 100644 --- a/src/core/operations/ParseDateTime.mjs +++ b/src/core/operations/ParseDateTime.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import moment from "moment-timezone"; -import {DATETIME_FORMATS, FORMAT_EXAMPLES} from "../lib/DateTime.mjs"; +import { DATETIME_FORMATS, FORMAT_EXAMPLES } from "../lib/DateTime.mjs"; /** * Parse DateTime operation */ class ParseDateTime extends Operation { - /** * ParseDateTime constructor */ @@ -21,7 +20,8 @@ class ParseDateTime extends Operation { this.name = "Parse DateTime"; this.module = "Default"; - this.description = "Parses a DateTime string in your specified format and displays it in whichever timezone you choose with the following information:
    • Date
    • Time
    • Period (AM/PM)
    • Timezone
    • UTC offset
    • Daylight Saving Time
    • Leap year
    • Days in this month
    • Day of year
    • Week number
    • Quarter
    Run with no input to see format string examples if required."; + this.description + = "Parses a DateTime string in your specified format and displays it in whichever timezone you choose with the following information:
    • Date
    • Time
    • Period (AM/PM)
    • Timezone
    • UTC offset
    • Daylight Saving Time
    • Leap year
    • Days in this month
    • Day of year
    • Week number
    • Quarter
    Run with no input to see format string examples if required."; this.infoURL = "https://momentjs.com/docs/#/parsing/string-format/"; this.inputType = "string"; this.outputType = "html"; @@ -63,21 +63,32 @@ class ParseDateTime extends Operation { return `Invalid format.\n\n${FORMAT_EXAMPLES}`; } - output += "Date: " + date.format("dddd Do MMMM YYYY") + - "\nTime: " + date.format("HH:mm:ss") + - "\nPeriod: " + date.format("A") + - "\nTimezone: " + date.format("z") + - "\nUTC offset: " + date.format("ZZ") + - "\n\nDaylight Saving Time: " + date.isDST() + - "\nLeap year: " + date.isLeapYear() + - "\nDays in this month: " + date.daysInMonth() + - "\n\nDay of year: " + date.dayOfYear() + - "\nWeek number: " + date.week() + - "\nQuarter: " + date.quarter(); + output + += "Date: " + + date.format("dddd Do MMMM YYYY") + + "\nTime: " + + date.format("HH:mm:ss") + + "\nPeriod: " + + date.format("A") + + "\nTimezone: " + + date.format("z") + + "\nUTC offset: " + + date.format("ZZ") + + "\n\nDaylight Saving Time: " + + date.isDST() + + "\nLeap year: " + + date.isLeapYear() + + "\nDays in this month: " + + date.daysInMonth() + + "\n\nDay of year: " + + date.dayOfYear() + + "\nWeek number: " + + date.week() + + "\nQuarter: " + + date.quarter(); return output; } - } export default ParseDateTime; diff --git a/src/core/operations/ParseIPRange.mjs b/src/core/operations/ParseIPRange.mjs index 2c59c015..67c2e868 100644 --- a/src/core/operations/ParseIPRange.mjs +++ b/src/core/operations/ParseIPRange.mjs @@ -7,13 +7,19 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ipv4CidrRange, ipv4HyphenatedRange, ipv4ListedRange, ipv6CidrRange, ipv6HyphenatedRange, ipv6ListedRange} from "../lib/IP.mjs"; +import { + ipv4CidrRange, + ipv4HyphenatedRange, + ipv4ListedRange, + ipv6CidrRange, + ipv6HyphenatedRange, + ipv6ListedRange +} from "../lib/IP.mjs"; /** * Parse IP range operation */ class ParseIPRange extends Operation { - /** * ParseIPRange constructor */ @@ -22,7 +28,8 @@ class ParseIPRange extends Operation { this.name = "Parse IP range"; this.module = "Default"; - this.description = "Given a CIDR range (e.g. 10.0.0.0/24), hyphenated range (e.g. 10.0.0.0 - 10.0.1.0), or a list of IPs and/or CIDR ranges (separated by a new line), this operation provides network information and enumerates all IP addresses in the range.

    IPv6 is supported but will not be enumerated."; + this.description + = "Given a CIDR range (e.g. 10.0.0.0/24), hyphenated range (e.g. 10.0.0.0 - 10.0.1.0), or a list of IPs and/or CIDR ranges (separated by a new line), this operation provides network information and enumerates all IP addresses in the range.

    IPv6 is supported but will not be enumerated."; this.infoURL = "https://wikipedia.org/wiki/Subnetwork"; this.inputType = "string"; this.outputType = "string"; @@ -51,19 +58,18 @@ class ParseIPRange extends Operation { * @returns {string} */ run(input, args) { - const [ - includeNetworkInfo, - enumerateAddresses, - allowLargeList - ] = args; + const [includeNetworkInfo, enumerateAddresses, allowLargeList] = args; // Check what type of input we are looking at const ipv4CidrRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\/(\d\d?)\s*$/, ipv4RangeRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*-\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/, ipv4ListRegex = /^\s*(((?:\d{1,3}\.){3}\d{1,3})(\/(\d\d?))?(\n|$)(\n*))+\s*$/, - ipv6CidrRegex = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\/(\d\d?\d?)\s*$/i, - ipv6RangeRegex = /^\s*(((?=.*::)(?!.*::[^-]+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*-\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\17)::|:\b|(?![\dA-F])))|(?!\16\17)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, - ipv6ListRegex = /^\s*((((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))(\/(\d\d?\d?))?(\n|$)(\n*))+\s*$/i; + ipv6CidrRegex + = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\/(\d\d?\d?)\s*$/i, + ipv6RangeRegex + = /^\s*(((?=.*::)(?!.*::[^-]+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*-\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\17)::|:\b|(?![\dA-F])))|(?!\16\17)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, + ipv6ListRegex + = /^\s*((((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))(\/(\d\d?\d?))?(\n|$)(\n*))+\s*$/i; let match; if ((match = ipv4CidrRegex.exec(input))) { @@ -79,11 +85,11 @@ class ParseIPRange extends Operation { } else if ((match = ipv6ListRegex.exec(input))) { return ipv6ListedRange(match, includeNetworkInfo); } else { - throw new OperationError("Invalid input.\n\nEnter either a CIDR range (e.g. 10.0.0.0/24) or a hyphenated range (e.g. 10.0.0.0 - 10.0.1.0). IPv6 also supported."); + throw new OperationError( + "Invalid input.\n\nEnter either a CIDR range (e.g. 10.0.0.0/24) or a hyphenated range (e.g. 10.0.0.0 - 10.0.1.0). IPv6 also supported." + ); } } - } - export default ParseIPRange; diff --git a/src/core/operations/ParseIPv4Header.mjs b/src/core/operations/ParseIPv4Header.mjs index 84351cdc..eabd7e16 100644 --- a/src/core/operations/ParseIPv4Header.mjs +++ b/src/core/operations/ParseIPv4Header.mjs @@ -7,15 +7,14 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {fromHex, toHex} from "../lib/Hex.mjs"; -import {ipv4ToStr, protocolLookup} from "../lib/IP.mjs"; +import { fromHex, toHex } from "../lib/Hex.mjs"; +import { ipv4ToStr, protocolLookup } from "../lib/IP.mjs"; import TCPIPChecksum from "./TCPIPChecksum.mjs"; /** * Parse IPv4 header operation */ class ParseIPv4Header extends Operation { - /** * ParseIPv4Header constructor */ @@ -24,7 +23,8 @@ class ParseIPv4Header extends Operation { this.name = "Parse IPv4 header"; this.module = "Default"; - this.description = "Given an IPv4 header, this operations parses and displays each field in an easily readable format."; + this.description + = "Given an IPv4 header, this operations parses and displays each field in an easily readable format."; this.infoURL = "https://wikipedia.org/wiki/IPv4#Header"; this.inputType = "string"; this.outputType = "html"; @@ -57,20 +57,19 @@ class ParseIPv4Header extends Operation { let ihl = input[0] & 0x0f; const dscp = (input[1] >>> 2) & 0x3f, ecn = input[1] & 0x03, - length = input[2] << 8 | input[3], - identification = input[4] << 8 | input[5], + length = (input[2] << 8) | input[3], + identification = (input[4] << 8) | input[5], flags = (input[6] >>> 5) & 0x07, - fragOffset = (input[6] & 0x1f) << 8 | input[7], + fragOffset = ((input[6] & 0x1f) << 8) | input[7], ttl = input[8], protocol = input[9], - checksum = input[10] << 8 | input[11], - srcIP = input[12] << 24 | input[13] << 16 | input[14] << 8 | input[15], - dstIP = input[16] << 24 | input[17] << 16 | input[18] << 8 | input[19], + checksum = (input[10] << 8) | input[11], + srcIP = (input[12] << 24) | (input[13] << 16) | (input[14] << 8) | input[15], + dstIP = (input[16] << 24) | (input[17] << 16) | (input[18] << 8) | input[19], checksumHeader = input.slice(0, 10).concat([0, 0]).concat(input.slice(12, 20)); let version = (input[0] >>> 4) & 0x0f, options = []; - // Version if (version !== 4) { version = version + " (Error: for IPv4 headers, this should always be set to 4)"; @@ -86,10 +85,10 @@ class ParseIPv4Header extends Operation { } // Protocol - const protocolInfo = protocolLookup[protocol] || {keyword: "", protocol: ""}; + const protocolInfo = protocolLookup[protocol] || { keyword: "", protocol: "" }; // Checksum - const correctChecksum = (new TCPIPChecksum).run(checksumHeader), + const correctChecksum = new TCPIPChecksum().run(checksumHeader), givenChecksum = Utils.hex(checksum); let checksumResult; if (correctChecksum === givenChecksum) { @@ -109,7 +108,7 @@ class ParseIPv4Header extends Operation {
    @@ -124,7 +123,6 @@ class ParseIPv4Header extends Operation { return output + "
    Rotor stops Partial plugboard Decryption preview
    ${setting} ${stecker} ${decrypt}
    Identification0x${Utils.hex(identification)} (${identification})
    Flags0x${Utils.hex(flags, 2)} Reserved bit:${flags >> 2} (must be 0) - Don't fragment:${flags >> 1 & 1} + Don't fragment:${(flags >> 1) & 1} More fragments:${flags & 1}
    Fragment offset${fragOffset}
    Time-To-Live${ttl}
    "; } - } export default ParseIPv4Header; diff --git a/src/core/operations/ParseIPv6Address.mjs b/src/core/operations/ParseIPv6Address.mjs index f2141e01..d5ba0b09 100644 --- a/src/core/operations/ParseIPv6Address.mjs +++ b/src/core/operations/ParseIPv6Address.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {strToIpv6, ipv6ToStr, ipv4ToStr, IPV6_REGEX} from "../lib/IP.mjs"; +import { strToIpv6, ipv6ToStr, ipv4ToStr, IPV6_REGEX } from "../lib/IP.mjs"; import BigNumber from "bignumber.js"; /** * Parse IPv6 address operation */ class ParseIPv6Address extends Operation { - /** * ParseIPv6Address constructor */ @@ -23,7 +22,8 @@ class ParseIPv6Address extends Operation { this.name = "Parse IPv6 address"; this.module = "Default"; - this.description = "Displays the longhand and shorthand versions of a valid IPv6 address.

    Recognises all reserved ranges and parses encapsulated or tunnelled addresses including Teredo and 6to4."; + this.description + = "Displays the longhand and shorthand versions of a valid IPv6 address.

    Recognises all reserved ranges and parses encapsulated or tunnelled addresses including Teredo and 6to4."; this.infoURL = "https://wikipedia.org/wiki/IPv6_address"; this.inputType = "string"; this.outputType = "string"; @@ -55,24 +55,45 @@ class ParseIPv6Address extends Operation { // Loopback address output += "\nLoopback address to the local host corresponding to 127.0.0.1/8 in IPv4."; output += "\nLoopback addresses range: ::1/128"; - } else if (ipv6[0] === 0 && ipv6[1] === 0 && ipv6[2] === 0 && - ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0xffff) { + } else if ( + ipv6[0] === 0 + && ipv6[1] === 0 + && ipv6[2] === 0 + && ipv6[3] === 0 + && ipv6[4] === 0 + && ipv6[5] === 0xffff + ) { // IPv4-mapped IPv6 address - output += "\nIPv4-mapped IPv6 address detected. IPv6 clients will be handled natively by default, and IPv4 clients appear as IPv6 clients at their IPv4-mapped IPv6 address."; + output + += "\nIPv4-mapped IPv6 address detected. IPv6 clients will be handled natively by default, and IPv4 clients appear as IPv6 clients at their IPv4-mapped IPv6 address."; output += "\nMapped IPv4 address: " + ipv4ToStr((ipv6[6] << 16) + ipv6[7]); output += "\nIPv4-mapped IPv6 addresses range: ::ffff:0:0/96"; - } else if (ipv6[0] === 0 && ipv6[1] === 0 && ipv6[2] === 0 && - ipv6[3] === 0 && ipv6[4] === 0xffff && ipv6[5] === 0) { + } else if ( + ipv6[0] === 0 + && ipv6[1] === 0 + && ipv6[2] === 0 + && ipv6[3] === 0 + && ipv6[4] === 0xffff + && ipv6[5] === 0 + ) { // IPv4-translated address - output += "\nIPv4-translated address detected. Used by Stateless IP/ICMP Translation (SIIT). See RFCs 6145 and 6052 for more details."; + output + += "\nIPv4-translated address detected. Used by Stateless IP/ICMP Translation (SIIT). See RFCs 6145 and 6052 for more details."; output += "\nTranslated IPv4 address: " + ipv4ToStr((ipv6[6] << 16) + ipv6[7]); output += "\nIPv4-translated addresses range: ::ffff:0:0:0/96"; } else if (ipv6[0] === 0x100) { // Discard prefix per RFC 6666 - output += "\nDiscard prefix detected. This is used when forwarding traffic to a sinkhole router to mitigate the effects of a denial-of-service attack. See RFC 6666 for more details."; + output + += "\nDiscard prefix detected. This is used when forwarding traffic to a sinkhole router to mitigate the effects of a denial-of-service attack. See RFC 6666 for more details."; output += "\nDiscard range: 100::/64"; - } else if (ipv6[0] === 0x64 && ipv6[1] === 0xff9b && ipv6[2] === 0 && - ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0) { + } else if ( + ipv6[0] === 0x64 + && ipv6[1] === 0xff9b + && ipv6[2] === 0 + && ipv6[3] === 0 + && ipv6[4] === 0 + && ipv6[5] === 0 + ) { // IPv4/IPv6 translation per RFC 6052 output += "\n'Well-Known' prefix for IPv4/IPv6 translation detected. See RFC 6052 for more details."; output += "\nTranslated IPv4 address: " + ipv4ToStr((ipv6[6] << 16) + ipv6[7]); @@ -80,20 +101,25 @@ class ParseIPv6Address extends Operation { } else if (ipv6[0] === 0x2001 && ipv6[1] === 0) { // Teredo tunneling output += "\nTeredo tunneling IPv6 address detected\n"; - const serverIpv4 = (ipv6[2] << 16) + ipv6[3], - udpPort = (~ipv6[5]) & 0xffff, - clientIpv4 = ~((ipv6[6] << 16) + ipv6[7]), - flagCone = (ipv6[4] >>> 15) & 1, - flagR = (ipv6[4] >>> 14) & 1, + const serverIpv4 = (ipv6[2] << 16) + ipv6[3], + udpPort = ~ipv6[5] & 0xffff, + clientIpv4 = ~((ipv6[6] << 16) + ipv6[7]), + flagCone = (ipv6[4] >>> 15) & 1, + flagR = (ipv6[4] >>> 14) & 1, flagRandom1 = (ipv6[4] >>> 10) & 15, - flagUg = (ipv6[4] >>> 8) & 3, + flagUg = (ipv6[4] >>> 8) & 3, flagRandom2 = ipv6[4] & 255; - output += "\nServer IPv4 address: " + ipv4ToStr(serverIpv4) + - "\nClient IPv4 address: " + ipv4ToStr(clientIpv4) + - "\nClient UDP port: " + udpPort + - "\nFlags:" + - "\n\tCone: " + flagCone; + output + += "\nServer IPv4 address: " + + ipv4ToStr(serverIpv4) + + "\nClient IPv4 address: " + + ipv4ToStr(clientIpv4) + + "\nClient UDP port: " + + udpPort + + "\nFlags:" + + "\n\tCone: " + + flagCone; if (flagCone) { output += " (Client is behind a cone NAT)"; @@ -107,8 +133,7 @@ class ParseIPv6Address extends Operation { output += " Error: This flag should be set to 0. See RFC 5991 and RFC 4380."; } - output += "\n\tRandom1: " + Utils.bin(flagRandom1, 4) + - "\n\tUG: " + Utils.bin(flagUg, 2); + output += "\n\tRandom1: " + Utils.bin(flagRandom1, 4) + "\n\tUG: " + Utils.bin(flagUg, 2); if (flagUg) { output += " Error: This flag should be set to 00. See RFC 4380."; @@ -119,47 +144,61 @@ class ParseIPv6Address extends Operation { if (!flagR && !flagUg && flagRandom1 && flagRandom2) { output += "\n\nThis is a valid Teredo address which complies with RFC 4380 and RFC 5991."; } else if (!flagR && !flagUg) { - output += "\n\nThis is a valid Teredo address which complies with RFC 4380, however it does not comply with RFC 5991 (Teredo Security Updates) as there are no randomised bits in the flag field."; + output + += "\n\nThis is a valid Teredo address which complies with RFC 4380, however it does not comply with RFC 5991 (Teredo Security Updates) as there are no randomised bits in the flag field."; } else { output += "\n\nThis is an invalid Teredo address."; } output += "\n\nTeredo prefix range: 2001::/32"; } else if (ipv6[0] === 0x2001 && ipv6[1] === 0x2 && ipv6[2] === 0) { // Benchmarking - output += "\nAssigned to the Benchmarking Methodology Working Group (BMWG) for benchmarking IPv6. Corresponds to 198.18.0.0/15 for benchmarking IPv4. See RFC 5180 for more details."; + output + += "\nAssigned to the Benchmarking Methodology Working Group (BMWG) for benchmarking IPv6. Corresponds to 198.18.0.0/15 for benchmarking IPv4. See RFC 5180 for more details."; output += "\nBMWG range: 2001:2::/48"; } else if (ipv6[0] === 0x2001 && ipv6[1] >= 0x10 && ipv6[1] <= 0x1f) { // ORCHIDv1 - output += "\nDeprecated, previously ORCHIDv1 (Overlay Routable Cryptographic Hash Identifiers).\nORCHIDv1 range: 2001:10::/28\nORCHIDv2 now uses 2001:20::/28."; + output + += "\nDeprecated, previously ORCHIDv1 (Overlay Routable Cryptographic Hash Identifiers).\nORCHIDv1 range: 2001:10::/28\nORCHIDv2 now uses 2001:20::/28."; } else if (ipv6[0] === 0x2001 && ipv6[1] >= 0x20 && ipv6[1] <= 0x2f) { // ORCHIDv2 - output += "\nORCHIDv2 (Overlay Routable Cryptographic Hash Identifiers).\nThese are non-routed IPv6 addresses used for Cryptographic Hash Identifiers."; + output + += "\nORCHIDv2 (Overlay Routable Cryptographic Hash Identifiers).\nThese are non-routed IPv6 addresses used for Cryptographic Hash Identifiers."; output += "\nORCHIDv2 range: 2001:20::/28"; } else if (ipv6[0] === 0x2001 && ipv6[1] === 0xdb8) { // Documentation - output += "\nThis is a documentation IPv6 address. This range should be used whenever an example IPv6 address is given or to model networking scenarios. Corresponds to 192.0.2.0/24, 198.51.100.0/24, and 203.0.113.0/24 in IPv4."; + output + += "\nThis is a documentation IPv6 address. This range should be used whenever an example IPv6 address is given or to model networking scenarios. Corresponds to 192.0.2.0/24, 198.51.100.0/24, and 203.0.113.0/24 in IPv4."; output += "\nDocumentation range: 2001:db8::/32"; } else if (ipv6[0] === 0x2002) { // 6to4 - output += "\n6to4 transition IPv6 address detected. See RFC 3056 for more details." + - "\n6to4 prefix range: 2002::/16"; + output + += "\n6to4 transition IPv6 address detected. See RFC 3056 for more details." + + "\n6to4 prefix range: 2002::/16"; const v4Addr = ipv4ToStr((ipv6[1] << 16) + ipv6[2]), slaId = ipv6[3], - interfaceIdStr = ipv6[4].toString(16) + ipv6[5].toString(16) + ipv6[6].toString(16) + ipv6[7].toString(16), + interfaceIdStr + = ipv6[4].toString(16) + ipv6[5].toString(16) + ipv6[6].toString(16) + ipv6[7].toString(16), interfaceId = new BigNumber(interfaceIdStr, 16); - output += "\n\nEncapsulated IPv4 address: " + v4Addr + - "\nSLA ID: " + slaId + - "\nInterface ID (base 16): " + interfaceIdStr + - "\nInterface ID (base 10): " + interfaceId.toString(); + output + += "\n\nEncapsulated IPv4 address: " + + v4Addr + + "\nSLA ID: " + + slaId + + "\nInterface ID (base 16): " + + interfaceIdStr + + "\nInterface ID (base 10): " + + interfaceId.toString(); } else if (ipv6[0] >= 0xfc00 && ipv6[0] <= 0xfdff) { // Unique local address - output += "\nThis is a unique local address comparable to the IPv4 private addresses 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. See RFC 4193 for more details."; + output + += "\nThis is a unique local address comparable to the IPv4 private addresses 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. See RFC 4193 for more details."; output += "\nUnique local addresses range: fc00::/7"; } else if (ipv6[0] >= 0xfe80 && ipv6[0] <= 0xfebf) { // Link-local address - output += "\nThis is a link-local address comparable to the auto-configuration addresses 169.254.0.0/16 in IPv4."; + output + += "\nThis is a link-local address comparable to the auto-configuration addresses 169.254.0.0/16 in IPv4."; output += "\nLink-local addresses range: fe80::/10"; } else if (ipv6[0] >= 0xff00) { // Multicast @@ -192,7 +231,8 @@ class ParseIPv6Address extends Operation { if (ipv6[6] === 1) { if (ipv6[7] === 2) { - output += "\nReserved Multicast Address for 'All DHCP Servers and Relay Agents (defined in RFC3315)'"; + output + += "\nReserved Multicast Address for 'All DHCP Servers and Relay Agents (defined in RFC3315)'"; } else if (ipv6[7] === 3) { output += "\nReserved Multicast Address for 'All LLMNR Hosts (defined in RFC4795)'"; } @@ -229,7 +269,8 @@ class ParseIPv6Address extends Operation { output += "\nReserved Multicast Address for 'MLDv2 Reports (defined in RFC3810)'"; break; case 0x6b: - output += "\nReserved Multicast Address for 'Precision Time Protocol v2 Peer Delay Measurement Messages'"; + output + += "\nReserved Multicast Address for 'Precision Time Protocol v2 Peer Delay Measurement Messages'"; break; case 0xfb: output += "\nReserved Multicast Address for 'Multicast DNS'"; @@ -244,33 +285,53 @@ class ParseIPv6Address extends Operation { output += "\nReserved Multicast Address for 'Experiments'"; break; case 0x181: - output += "\nReserved Multicast Address for 'Precision Time Protocol v2 Messages (exc. Peer Delay)'"; + output + += "\nReserved Multicast Address for 'Precision Time Protocol v2 Messages (exc. Peer Delay)'"; break; } } } - // Detect possible EUI-64 addresses - if (((ipv6[5] & 0xff) === 0xff) && (ipv6[6] >>> 8 === 0xfe)) { - output += "\n\nThis IPv6 address contains a modified EUI-64 address, identified by the presence of FF:FE in the 12th and 13th octets."; + if ((ipv6[5] & 0xff) === 0xff && ipv6[6] >>> 8 === 0xfe) { + output + += "\n\nThis IPv6 address contains a modified EUI-64 address, identified by the presence of FF:FE in the 12th and 13th octets."; - const intIdent = Utils.hex(ipv6[4] >>> 8) + ":" + Utils.hex(ipv6[4] & 0xff) + ":" + - Utils.hex(ipv6[5] >>> 8) + ":" + Utils.hex(ipv6[5] & 0xff) + ":" + - Utils.hex(ipv6[6] >>> 8) + ":" + Utils.hex(ipv6[6] & 0xff) + ":" + - Utils.hex(ipv6[7] >>> 8) + ":" + Utils.hex(ipv6[7] & 0xff), - mac = Utils.hex((ipv6[4] >>> 8) ^ 2) + ":" + Utils.hex(ipv6[4] & 0xff) + ":" + - Utils.hex(ipv6[5] >>> 8) + ":" + Utils.hex(ipv6[6] & 0xff) + ":" + - Utils.hex(ipv6[7] >>> 8) + ":" + Utils.hex(ipv6[7] & 0xff); - output += "\nInterface identifier: " + intIdent + - "\nMAC address: " + mac; + const intIdent + = Utils.hex(ipv6[4] >>> 8) + + ":" + + Utils.hex(ipv6[4] & 0xff) + + ":" + + Utils.hex(ipv6[5] >>> 8) + + ":" + + Utils.hex(ipv6[5] & 0xff) + + ":" + + Utils.hex(ipv6[6] >>> 8) + + ":" + + Utils.hex(ipv6[6] & 0xff) + + ":" + + Utils.hex(ipv6[7] >>> 8) + + ":" + + Utils.hex(ipv6[7] & 0xff), + mac + = Utils.hex((ipv6[4] >>> 8) ^ 2) + + ":" + + Utils.hex(ipv6[4] & 0xff) + + ":" + + Utils.hex(ipv6[5] >>> 8) + + ":" + + Utils.hex(ipv6[6] & 0xff) + + ":" + + Utils.hex(ipv6[7] >>> 8) + + ":" + + Utils.hex(ipv6[7] & 0xff); + output += "\nInterface identifier: " + intIdent + "\nMAC address: " + mac; } } else { throw new OperationError("Invalid IPv6 address"); } return output; } - } export default ParseIPv6Address; diff --git a/src/core/operations/ParseObjectIDTimestamp.mjs b/src/core/operations/ParseObjectIDTimestamp.mjs index f86c098e..0cfc9dcd 100644 --- a/src/core/operations/ParseObjectIDTimestamp.mjs +++ b/src/core/operations/ParseObjectIDTimestamp.mjs @@ -12,7 +12,6 @@ import BSON from "bson"; * Parse ObjectID timestamp operation */ class ParseObjectIDTimestamp extends Operation { - /** * ParseObjectIDTimestamp constructor */ @@ -41,7 +40,6 @@ class ParseObjectIDTimestamp extends Operation { throw new OperationError(err); } } - } export default ParseObjectIDTimestamp; diff --git a/src/core/operations/ParseQRCode.mjs b/src/core/operations/ParseQRCode.mjs index 77ab7d21..5efd7c7a 100644 --- a/src/core/operations/ParseQRCode.mjs +++ b/src/core/operations/ParseQRCode.mjs @@ -13,7 +13,6 @@ import { parseQrCode } from "../lib/QRCode.mjs"; * Parse QR Code operation */ class ParseQRCode extends Operation { - /** * ParseQRCode constructor */ @@ -22,7 +21,8 @@ class ParseQRCode extends Operation { this.name = "Parse QR Code"; this.module = "Image"; - this.description = "Reads an image file and attempts to detect and read a Quick Response (QR) code from the image.

    Normalise Image
    Attempts to normalise the image before parsing it to improve detection of a QR code."; + this.description + = "Reads an image file and attempts to detect and read a Quick Response (QR) code from the image.

    Normalise Image
    Attempts to normalise the image before parsing it to improve detection of a QR code."; this.infoURL = "https://wikipedia.org/wiki/QR_code"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -35,7 +35,8 @@ class ParseQRCode extends Operation { ]; this.checks = [ { - "pattern": "^(?:\\xff\\xd8\\xff|\\x89\\x50\\x4e\\x47|\\x47\\x49\\x46|.{8}\\x57\\x45\\x42\\x50|\\x42\\x4d)", + "pattern": + "^(?:\\xff\\xd8\\xff|\\x89\\x50\\x4e\\x47|\\x47\\x49\\x46|.{8}\\x57\\x45\\x42\\x50|\\x42\\x4d)", "flags": "", "args": [false], "useful": true @@ -56,7 +57,6 @@ class ParseQRCode extends Operation { } return await parseQrCode(input, normalise); } - } export default ParseQRCode; diff --git a/src/core/operations/ParseSSHHostKey.mjs b/src/core/operations/ParseSSHHostKey.mjs index f1a1f58c..de0163a7 100644 --- a/src/core/operations/ParseSSHHostKey.mjs +++ b/src/core/operations/ParseSSHHostKey.mjs @@ -14,7 +14,6 @@ import { fromHex, toHexFast } from "../lib/Hex.mjs"; * Parse SSH Host Key operation */ class ParseSSHHostKey extends Operation { - /** * ParseSSHHostKey constructor */ @@ -23,7 +22,8 @@ class ParseSSHHostKey extends Operation { this.name = "Parse SSH Host Key"; this.module = "Default"; - this.description = "Parses a SSH host key and extracts fields from it.
    The key type can be:
    • ssh-rsa
    • ssh-dss
    • ecdsa-sha2
    • ssh-ed25519
    The key format can be either Hex or Base64."; + this.description + = "Parses a SSH host key and extracts fields from it.
    The key type can be:
    • ssh-rsa
    • ssh-dss
    • ecdsa-sha2
    • ssh-ed25519
    The key format can be either Hex or Base64."; this.infoURL = "https://wikipedia.org/wiki/Secure_Shell"; this.inputType = "string"; this.outputType = "string"; @@ -31,18 +31,14 @@ class ParseSSHHostKey extends Operation { { name: "Input Format", type: "option", - value: [ - "Auto", - "Base64", - "Hex" - ] + value: ["Auto", "Base64", "Hex"] } ]; this.checks = [ { - pattern: "^\\s*([A-F\\d]{2}[,;:]){15,}[A-F\\d]{2}\\s*$", - flags: "i", - args: ["Hex"] + pattern: "^\\s*([A-F\\d]{2}[,;:]){15,}[A-F\\d]{2}\\s*$", + flags: "i", + args: ["Hex"] } ]; } @@ -108,7 +104,6 @@ class ParseSSHHostKey extends Operation { } } - /** * Detects if the key is base64 or hex encoded * @@ -128,7 +123,6 @@ class ParseSSHHostKey extends Operation { } } - /** * Parses fields from the key * @@ -153,7 +147,6 @@ class ParseSSHHostKey extends Operation { return fields; } - } export default ParseSSHHostKey; diff --git a/src/core/operations/ParseTCP.mjs b/src/core/operations/ParseTCP.mjs index 7adb37e0..222f67d1 100644 --- a/src/core/operations/ParseTCP.mjs +++ b/src/core/operations/ParseTCP.mjs @@ -6,9 +6,9 @@ import Operation from "../Operation.mjs"; import Stream from "../lib/Stream.mjs"; -import {toHexFast, fromHex} from "../lib/Hex.mjs"; -import {toBinary} from "../lib/Binary.mjs"; -import {objToTable, bytesToLargeNumber} from "../lib/Protocol.mjs"; +import { toHexFast, fromHex } from "../lib/Hex.mjs"; +import { toBinary } from "../lib/Binary.mjs"; +import { objToTable, bytesToLargeNumber } from "../lib/Protocol.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; import BigNumber from "bignumber.js"; @@ -17,7 +17,6 @@ import BigNumber from "bignumber.js"; * Parse TCP operation */ class ParseTCP extends Operation { - /** * ParseTCP constructor */ @@ -78,7 +77,7 @@ class ParseTCP extends Operation { "PSH": s.readBits(1), "RST": s.readBits(1), "SYN": s.readBits(1), - "FIN": s.readBits(1), + "FIN": s.readBits(1) }, "Window size": s.readInt(2), "Checksum": "0x" + toHexFast(s.getBytes(2)), @@ -109,9 +108,10 @@ class ParseTCP extends Operation { if (Object.prototype.hasOwnProperty.call(opt, "parser")) { option.Value = opt.parser(s.getBytes(option.Length - 2)); } else { - option.Value = option.Length <= 6 ? - s.readInt(option.Length - 2): - "0x" + toHexFast(s.getBytes(option.Length - 2)); + option.Value + = option.Length <= 6 + ? s.readInt(option.Length - 2) + : "0x" + toHexFast(s.getBytes(option.Length - 2)); } // Store Window Scale shift for later @@ -134,7 +134,9 @@ class ParseTCP extends Operation { // Improve values TCPPacket["Data offset"] = `${TCPPacket["Data offset"]} (${TCPPacket["Data offset"] * 4} bytes)`; - const trueWndSize = BigNumber(TCPPacket["Window size"]).multipliedBy(BigNumber(2).pow(BigNumber(windowScaleShift))); + const trueWndSize = BigNumber(TCPPacket["Window size"]).multipliedBy( + BigNumber(2).pow(BigNumber(windowScaleShift)) + ); TCPPacket["Window size"] = `${TCPPacket["Window size"]} (Scaled: ${trueWndSize})`; return TCPPacket; @@ -148,7 +150,6 @@ class ParseTCP extends Operation { present(data) { return objToTable(data); } - } // Taken from https://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml @@ -216,8 +217,7 @@ function tcpAlternateChecksumParser(data) { function tcpTimestampParser(data) { const s = new Stream(data); - if (s.length !== 8) - return `Error: Timestamp field should be 8 bytes long (received 0x${toHexFast(data)})`; + if (s.length !== 8) return `Error: Timestamp field should be 8 bytes long (received 0x${toHexFast(data)})`; const tsval = bytesToLargeNumber(s.getBytes(4)), tsecr = bytesToLargeNumber(s.getBytes(4)); @@ -233,8 +233,7 @@ function tcpTimestampParser(data) { * @param {Uint8Array} data */ function windowScaleParser(data) { - if (data.length !== 1) - return `Error: Window Scale should be one byte long (received 0x${toHexFast(data)})`; + if (data.length !== 1) return `Error: Window Scale should be one byte long (received 0x${toHexFast(data)})`; return { "Shift count": data[0], diff --git a/src/core/operations/ParseTLV.mjs b/src/core/operations/ParseTLV.mjs index d4c4e11c..3c8ddc2f 100644 --- a/src/core/operations/ParseTLV.mjs +++ b/src/core/operations/ParseTLV.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * Parse TLV operation */ class ParseTLV extends Operation { - /** * ParseTLV constructor */ @@ -22,7 +21,8 @@ class ParseTLV extends Operation { this.name = "Parse TLV"; this.module = "Default"; - this.description = "Converts a Type-Length-Value (TLV) encoded string into a JSON object. Can optionally include a Key / Type entry.

    Tags: Key-Length-Value, KLV, Length-Value, LV"; + this.description + = "Converts a Type-Length-Value (TLV) encoded string into a JSON object. Can optionally include a Key / Type entry.

    Tags: Key-Length-Value, KLV, Length-Value, LV"; this.infoURL = "https://wikipedia.org/wiki/Type-length-value"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -71,7 +71,6 @@ class ParseTLV extends Operation { return data; } - } export default ParseTLV; diff --git a/src/core/operations/ParseUDP.mjs b/src/core/operations/ParseUDP.mjs index 2aa762ae..62ecb358 100644 --- a/src/core/operations/ParseUDP.mjs +++ b/src/core/operations/ParseUDP.mjs @@ -6,8 +6,8 @@ import Operation from "../Operation.mjs"; import Stream from "../lib/Stream.mjs"; -import {toHexFast, fromHex} from "../lib/Hex.mjs"; -import {objToTable} from "../lib/Protocol.mjs"; +import { toHexFast, fromHex } from "../lib/Hex.mjs"; +import { objToTable } from "../lib/Protocol.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; @@ -15,7 +15,6 @@ import OperationError from "../errors/OperationError.mjs"; * Parse UDP operation */ class ParseUDP extends Operation { - /** * ParseUDP constructor */ @@ -82,8 +81,6 @@ class ParseUDP extends Operation { present(data) { return objToTable(data); } - } - export default ParseUDP; diff --git a/src/core/operations/ParseUNIXFilePermissions.mjs b/src/core/operations/ParseUNIXFilePermissions.mjs index ae472a83..b258a79f 100644 --- a/src/core/operations/ParseUNIXFilePermissions.mjs +++ b/src/core/operations/ParseUNIXFilePermissions.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Parse UNIX file permissions operation */ class ParseUNIXFilePermissions extends Operation { - /** * ParseUNIXFilePermissions constructor */ @@ -20,16 +19,17 @@ class ParseUNIXFilePermissions extends Operation { this.name = "Parse UNIX file permissions"; this.module = "Default"; - this.description = "Given a UNIX/Linux file permission string in octal or textual format, this operation explains which permissions are granted to which user groups.

    Input should be in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format."; + this.description + = "Given a UNIX/Linux file permission string in octal or textual format, this operation explains which permissions are granted to which user groups.

    Input should be in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format."; this.infoURL = "https://wikipedia.org/wiki/File_system_permissions#Traditional_Unix_permissions"; this.inputType = "string"; this.outputType = "string"; this.args = []; this.checks = [ { - pattern: "^\\s*d[rxw-]{9}\\s*$", - flags: "", - args: [] + pattern: "^\\s*d[rxw-]{9}\\s*$", + flags: "", + args: [] } ]; } @@ -41,10 +41,10 @@ class ParseUNIXFilePermissions extends Operation { */ run(input, args) { const perms = { - d: false, // directory + d: false, // directory sl: false, // symbolic link np: false, // named pipe - s: false, // socket + s: false, // socket cd: false, // character device bd: false, // block device dr: false, // door @@ -59,7 +59,7 @@ class ParseUNIXFilePermissions extends Operation { eg: false, // execute group ro: false, // read other wo: false, // write other - eo: false // execute other + eo: false // execute other }; let d = 0, u = 0, @@ -84,20 +84,20 @@ class ParseUNIXFilePermissions extends Operation { if (octal.length > 2) o = parseInt(octal[2], 8); } - perms.su = d >> 2 & 0x1; - perms.sg = d >> 1 & 0x1; + perms.su = (d >> 2) & 0x1; + perms.sg = (d >> 1) & 0x1; perms.sb = d & 0x1; - perms.ru = u >> 2 & 0x1; - perms.wu = u >> 1 & 0x1; + perms.ru = (u >> 2) & 0x1; + perms.wu = (u >> 1) & 0x1; perms.eu = u & 0x1; - perms.rg = g >> 2 & 0x1; - perms.wg = g >> 1 & 0x1; + perms.rg = (g >> 2) & 0x1; + perms.wg = (g >> 1) & 0x1; perms.eg = g & 0x1; - perms.ro = o >> 2 & 0x1; - perms.wo = o >> 1 & 0x1; + perms.ro = (o >> 2) & 0x1; + perms.wo = (o >> 1) & 0x1; perms.eo = o & 0x1; } else if (input.search(/\s*[dlpcbDrwxsStT-]{1,10}\s*/) === 0) { // Input is textual @@ -178,7 +178,9 @@ class ParseUNIXFilePermissions extends Operation { } } } else { - throw new OperationError("Invalid input format.\nPlease enter the permissions in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format."); + throw new OperationError( + "Invalid input format.\nPlease enter the permissions in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format." + ); } output += "Textual representation: " + permsToStr(perms); @@ -217,10 +219,8 @@ class ParseUNIXFilePermissions extends Operation { return output; } - } - /** * Given a permissions object dictionary, generates a textual permissions string. * @@ -311,7 +311,6 @@ function permsToOctal(perms) { return d.toString() + u.toString() + g.toString() + o.toString(); } - /** * Given a permissions object dictionary, returns the file type. * diff --git a/src/core/operations/ParseURI.mjs b/src/core/operations/ParseURI.mjs index 17ca90db..333f9444 100644 --- a/src/core/operations/ParseURI.mjs +++ b/src/core/operations/ParseURI.mjs @@ -11,7 +11,6 @@ import url from "url"; * Parse URI operation */ class ParseURI extends Operation { - /** * ParseURI constructor */ @@ -20,7 +19,8 @@ class ParseURI extends Operation { this.name = "Parse URI"; this.module = "URL"; - this.description = "Pretty prints complicated Uniform Resource Identifier (URI) strings for ease of reading. Particularly useful for Uniform Resource Locators (URLs) with a lot of arguments."; + this.description + = "Pretty prints complicated Uniform Resource Identifier (URI) strings for ease of reading. Particularly useful for Uniform Resource Locators (URLs) with a lot of arguments."; this.infoURL = "https://wikipedia.org/wiki/Uniform_Resource_Identifier"; this.inputType = "string"; this.outputType = "string"; @@ -46,8 +46,8 @@ class ParseURI extends Operation { const keys = Object.keys(uri.query); let padding = 0; - keys.forEach(k => { - padding = (k.length > padding) ? k.length : padding; + keys.forEach((k) => { + padding = k.length > padding ? k.length : padding; }); output += "Arguments:\n"; @@ -64,7 +64,6 @@ class ParseURI extends Operation { return output; } - } export default ParseURI; diff --git a/src/core/operations/ParseUserAgent.mjs b/src/core/operations/ParseUserAgent.mjs index 57ac9312..62a3f16f 100644 --- a/src/core/operations/ParseUserAgent.mjs +++ b/src/core/operations/ParseUserAgent.mjs @@ -11,7 +11,6 @@ import UAParser from "ua-parser-js"; * Parse User Agent operation */ class ParseUserAgent extends Operation { - /** * ParseUserAgent constructor */ @@ -27,9 +26,9 @@ class ParseUserAgent extends Operation { this.args = []; this.checks = [ { - pattern: "^(User-Agent:|Mozilla\\/)[^\\n\\r]+\\s*$", - flags: "i", - args: [] + pattern: "^(User-Agent:|Mozilla\\/)[^\\n\\r]+\\s*$", + flags: "i", + args: [] } ]; } @@ -57,7 +56,6 @@ OS CPU Architecture: ${ua.cpu.architecture || "unknown"}`; } - } export default ParseUserAgent; diff --git a/src/core/operations/ParseX509Certificate.mjs b/src/core/operations/ParseX509Certificate.mjs index 11e63424..14962569 100644 --- a/src/core/operations/ParseX509Certificate.mjs +++ b/src/core/operations/ParseX509Certificate.mjs @@ -15,7 +15,6 @@ import Utils from "../Utils.mjs"; * Parse X.509 certificate operation */ class ParseX509Certificate extends Operation { - /** * ParseX509Certificate constructor */ @@ -24,7 +23,8 @@ class ParseX509Certificate extends Operation { this.name = "Parse X.509 certificate"; this.module = "PublicKey"; - this.description = "X.509 is an ITU-T standard for a public key infrastructure (PKI) and Privilege Management Infrastructure (PMI). It is commonly involved with SSL/TLS security.

    This operation displays the contents of a certificate in a human readable format, similar to the openssl command line tool.

    Tags: X509, server hello, handshake"; + this.description + = "X.509 is an ITU-T standard for a public key infrastructure (PKI) and Privilege Management Infrastructure (PMI). It is commonly involved with SSL/TLS security.

    This operation displays the contents of a certificate in a human readable format, similar to the openssl command line tool.

    Tags: X509, server hello, handshake"; this.infoURL = "https://wikipedia.org/wiki/X.509"; this.inputType = "string"; this.outputType = "string"; @@ -98,20 +98,22 @@ class ParseX509Certificate extends Operation { value: pk.type }); - if (pk.type === "EC") { // ECDSA + if (pk.type === "EC") { + // ECDSA pkFields.push({ key: "Curve Name", value: pk.curveName }); pkFields.push({ key: "Length", - value: (((new r.BigInteger(pk.pubKeyHex, 16)).bitLength()-3) /2) + " bits" + value: (new r.BigInteger(pk.pubKeyHex, 16).bitLength() - 3) / 2 + " bits" }); pkFields.push({ key: "pub", value: formatByteStr(pk.pubKeyHex, 16, 18) }); - } else if (pk.type === "DSA") { // DSA + } else if (pk.type === "DSA") { + // DSA pkFields.push({ key: "pub", value: formatByteStr(pk.y.toString(16), 16, 18) @@ -128,7 +130,8 @@ class ParseX509Certificate extends Operation { key: "G", value: formatByteStr(pk.g.toString(16), 16, 18) }); - } else if (pk.e) { // RSA + } else if (pk.e) { + // RSA pkFields.push({ key: "Length", value: pk.n.bitLength() + " bits" @@ -164,10 +167,12 @@ class ParseX509Certificate extends Operation { // Error processing signature, output without further breakout } - if (breakoutSig) { // DSA or ECDSA + if (breakoutSig) { + // DSA or ECDSA sigStr = ` r: ${formatByteStr(r.ASN1HEX.getV(sig, 4), 16, 18)} s: ${formatByteStr(r.ASN1HEX.getV(sig, 48), 16, 18)}`; - } else { // RSA or unknown + } else { + // RSA or unknown sigStr = ` Signature: ${formatByteStr(sig, 16, 18)}`; } @@ -200,7 +205,6 @@ ${sigStr} Extensions ${extensions}`; } - } /** @@ -209,16 +213,32 @@ ${extensions}`; * @param {string} dateStr * @returns {string} */ -function formatDate (dateStr) { - if (dateStr.length === 13) { // UTC Time +function formatDate(dateStr) { + if (dateStr.length === 13) { + // UTC Time dateStr = (dateStr[0] < "5" ? "20" : "19") + dateStr; } - return dateStr[6] + dateStr[7] + "/" + - dateStr[4] + dateStr[5] + "/" + - dateStr[0] + dateStr[1] + dateStr[2] + dateStr[3] + " " + - dateStr[8] + dateStr[9] + ":" + - dateStr[10] + dateStr[11] + ":" + - dateStr[12] + dateStr[13]; + return ( + dateStr[6] + + dateStr[7] + + "/" + + dateStr[4] + + dateStr[5] + + "/" + + dateStr[0] + + dateStr[1] + + dateStr[2] + + dateStr[3] + + " " + + dateStr[8] + + dateStr[9] + + ":" + + dateStr[10] + + dateStr[11] + + ":" + + dateStr[12] + + dateStr[13] + ); } export default ParseX509Certificate; diff --git a/src/core/operations/PlayMedia.mjs b/src/core/operations/PlayMedia.mjs index 22b7d8a2..1656f224 100644 --- a/src/core/operations/PlayMedia.mjs +++ b/src/core/operations/PlayMedia.mjs @@ -15,7 +15,6 @@ import { isType, detectFileType } from "../lib/FileType.mjs"; * PlayMedia operation */ class PlayMedia extends Operation { - /** * PlayMedia constructor */ @@ -24,7 +23,8 @@ class PlayMedia extends Operation { this.name = "Play Media"; this.module = "Default"; - this.description = "Plays the input as audio or video depending on the type.

    Tags: sound, movie, mp3, mp4, mov, webm, wav, ogg"; + this.description + = "Plays the input as audio or video depending on the type.

    Tags: sound, movie, mp3, mp4, mov, webm, wav, ogg"; this.infoURL = ""; this.inputType = "string"; this.outputType = "byteArray"; @@ -64,7 +64,6 @@ class PlayMedia extends Operation { break; } - // Determine file type if (!isType(/^(audio|video)/, input)) { throw new OperationError("Invalid or unrecognised file type"); diff --git a/src/core/operations/PowerSet.mjs b/src/core/operations/PowerSet.mjs index a05dd783..06de63d0 100644 --- a/src/core/operations/PowerSet.mjs +++ b/src/core/operations/PowerSet.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Power Set operation */ class PowerSet extends Operation { - /** * Power set constructor */ @@ -28,7 +27,7 @@ class PowerSet extends Operation { name: "Item delimiter", type: "binaryString", value: "," - }, + } ]; } @@ -42,7 +41,7 @@ class PowerSet extends Operation { run(input, args) { [this.itemDelimiter] = args; // Split and filter empty strings - const inputArray = input.split(this.itemDelimiter).filter(a => a); + const inputArray = input.split(this.itemDelimiter).filter((a) => a); if (inputArray.length) { return this.runPowerSet(inputArray); @@ -59,7 +58,7 @@ class PowerSet extends Operation { */ runPowerSet(a) { // empty array items getting picked up - a = a.filter(i => i.length); + a = a.filter((i) => i.length); if (!a.length) { return []; } @@ -71,11 +70,11 @@ class PowerSet extends Operation { const toBinary = (dec) => (dec >>> 0).toString(2); const result = new Set(); // Get the decimal number to make a binary as long as the input - const maxBinaryValue = parseInt(Number(a.map(i => "1").reduce((p, c) => p + c)), 2); + const maxBinaryValue = parseInt(Number(a.map((i) => "1").reduce((p, c) => p + c)), 2); // Make an array of each binary number from 0 to maximum const binaries = [...Array(maxBinaryValue + 1).keys()] .map(toBinary) - .map(i => i.padStart(toBinary(maxBinaryValue).length, "0")); + .map((i) => i.padStart(toBinary(maxBinaryValue).length, "0")); // XOR the input with each binary to get each unique permutation binaries.forEach((binary) => { @@ -85,8 +84,10 @@ class PowerSet extends Operation { // map for formatting & put in length order. return [...result] - .map(r => r.join(this.itemDelimiter)).sort((a, b) => a.length - b.length) - .map(i => `${i}\n`).join(""); + .map((r) => r.join(this.itemDelimiter)) + .sort((a, b) => a.length - b.length) + .map((i) => `${i}\n`) + .join(""); } } diff --git a/src/core/operations/ProtobufDecode.mjs b/src/core/operations/ProtobufDecode.mjs index fbc16dc4..5af5a5f8 100644 --- a/src/core/operations/ProtobufDecode.mjs +++ b/src/core/operations/ProtobufDecode.mjs @@ -12,7 +12,6 @@ import Protobuf from "../lib/Protobuf.mjs"; * Protobuf Decode operation */ class ProtobufDecode extends Operation { - /** * ProtobufDecode constructor */ @@ -21,7 +20,8 @@ class ProtobufDecode extends Operation { this.name = "Protobuf Decode"; this.module = "Protobuf"; - this.description = "Decodes any Protobuf encoded data to a JSON representation of the data using the field number as the field key.

    If a .proto schema is defined, the encoded data will be decoded with reference to the schema. Only one message instance will be decoded.

    Show Unknown Fields
    When a schema is used, this option shows fields that are present in the input data but not defined in the schema.

    Show Types
    Show the type of a field next to its name. For undefined fields, the wiretype and example types are shown instead."; + this.description + = "Decodes any Protobuf encoded data to a JSON representation of the data using the field number as the field key.

    If a .proto schema is defined, the encoded data will be decoded with reference to the schema. Only one message instance will be decoded.

    Show Unknown Fields
    When a schema is used, this option shows fields that are present in the input data but not defined in the schema.

    Show Types
    Show the type of a field next to its name. For undefined fields, the wiretype and example types are shown instead."; this.infoURL = "https://wikipedia.org/wiki/Protocol_Buffers"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -59,7 +59,6 @@ class ProtobufDecode extends Operation { throw new OperationError(err); } } - } export default ProtobufDecode; diff --git a/src/core/operations/ProtobufEncode.mjs b/src/core/operations/ProtobufEncode.mjs index eaf4d6c4..bf89ebf8 100644 --- a/src/core/operations/ProtobufEncode.mjs +++ b/src/core/operations/ProtobufEncode.mjs @@ -12,7 +12,6 @@ import Protobuf from "../lib/Protobuf.mjs"; * Protobuf Encode operation */ class ProtobufEncode extends Operation { - /** * ProtobufEncode constructor */ @@ -48,7 +47,6 @@ class ProtobufEncode extends Operation { throw new OperationError(error); } } - } export default ProtobufEncode; diff --git a/src/core/operations/PseudoRandomNumberGenerator.mjs b/src/core/operations/PseudoRandomNumberGenerator.mjs index 53150566..22298dde 100644 --- a/src/core/operations/PseudoRandomNumberGenerator.mjs +++ b/src/core/operations/PseudoRandomNumberGenerator.mjs @@ -14,7 +14,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Pseudo-Random Number Generator operation */ class PseudoRandomNumberGenerator extends Operation { - /** * PseudoRandomNumberGenerator constructor */ @@ -23,7 +22,8 @@ class PseudoRandomNumberGenerator extends Operation { this.name = "Pseudo-Random Number Generator"; this.module = "Ciphers"; - this.description = "A cryptographically-secure pseudo-random number generator (PRNG).

    This operation uses the browser's built-in crypto.getRandomValues() method if available. If this cannot be found, it falls back to a Fortuna-based PRNG algorithm."; + this.description + = "A cryptographically-secure pseudo-random number generator (PRNG).

    This operation uses the browser's built-in crypto.getRandomValues() method if available. If this cannot be found, it falls back to a Fortuna-based PRNG algorithm."; this.infoURL = "https://wikipedia.org/wiki/Pseudorandom_number_generator"; this.inputType = "string"; this.outputType = "string"; @@ -80,7 +80,6 @@ class PseudoRandomNumberGenerator extends Operation { return bytes; } } - } export default PseudoRandomNumberGenerator; diff --git a/src/core/operations/RAKE.mjs b/src/core/operations/RAKE.mjs index d1165b51..252f2fc6 100644 --- a/src/core/operations/RAKE.mjs +++ b/src/core/operations/RAKE.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * RAKE operation */ class RAKE extends Operation { - /** * RAKE constructor */ @@ -24,7 +23,7 @@ class RAKE extends Operation { "

    ", "RAKE is a domain-independent keyword extraction algorithm in Natural Language Processing.", "

    ", - "The list of stop words are from the NLTK python package", + "The list of stop words are from the NLTK python package" ].join("\n"); this.inputType = "string"; this.outputType = "string"; @@ -53,9 +52,8 @@ class RAKE extends Operation { * @returns {string} */ run(input, args) { - // Get delimiter regexs - const wordDelim = new RegExp(args[0], "g"); + const wordDelim = new RegExp(args[0], "g"); const sentDelim = new RegExp(args[1], "g"); // Deduplicate the stop words and add the empty string @@ -73,7 +71,6 @@ class RAKE extends Operation { // Build up list of phrases and token counts const sentences = input.split(sentDelim); for (const sent of sentences) { - // Split sentence into words const splitSent = sent.split(wordDelim); let startIndex = 0; @@ -87,7 +84,7 @@ class RAKE extends Operation { } else { // If token is not a stop word add to the count of the list of words if (tokens.includes(token)) { - wordFrequencies[tokens.indexOf(token)]+=1; + wordFrequencies[tokens.indexOf(token)] += 1; } else { tokens.push(token); wordFrequencies.push(1); @@ -98,18 +95,22 @@ class RAKE extends Operation { } // remove empty phrases - phrases = phrases.filter(subArray => subArray.length > 0); + phrases = phrases.filter((subArray) => subArray.length > 0); // Remove duplicate phrases - const uniquePhrases = [...new Set(phrases.map(function (phrase) { - return phrase.join(" "); - }))]; + const uniquePhrases = [ + ...new Set( + phrases.map(function (phrase) { + return phrase.join(" "); + }) + ) + ]; phrases = uniquePhrases.map(function (phrase) { return phrase.split(" "); }); // Generate word_degree_matrix and populate - const wordDegreeMatrix = Array.from(Array(tokens.length), _ => Array(tokens.length).fill(0)); + const wordDegreeMatrix = Array.from(Array(tokens.length), (_) => Array(tokens.length).fill(0)); phrases.forEach(function (phrase) { phrase.forEach(function (word1) { phrase.forEach(function (word2) { @@ -120,9 +121,9 @@ class RAKE extends Operation { // Calculate degree score for each token const degreeScores = Array(tokens.length).fill(0); - for (let i=0; i= 65 && chr <= 90) { // Upper case + if (rot13Upperacse && chr >= 65 && chr <= 90) { + // Upper case chr = (chr - 65 + amount) % 26; output[i] = chr + 65; - } else if (rot13Lowercase && chr >= 97 && chr <= 122) { // Lower case + } else if (rot13Lowercase && chr >= 97 && chr <= 122) { + // Lower case chr = (chr - 97 + amount) % 26; output[i] = chr + 97; - } else if (rotNumbers && chr >= 48 && chr <= 57) { // Numbers + } else if (rotNumbers && chr >= 48 && chr <= 57) { + // Numbers chr = (chr - 48 + amount) % 10; output[i] = chr + 48; } diff --git a/src/core/operations/ROT13BruteForce.mjs b/src/core/operations/ROT13BruteForce.mjs index 7468ee11..da9fdc8a 100644 --- a/src/core/operations/ROT13BruteForce.mjs +++ b/src/core/operations/ROT13BruteForce.mjs @@ -10,7 +10,6 @@ import Utils from "../Utils.mjs"; * ROT13 Brute Force operation. */ class ROT13BruteForce extends Operation { - /** * ROT13BruteForce constructor */ @@ -19,7 +18,8 @@ class ROT13BruteForce extends Operation { this.name = "ROT13 Brute Force"; this.module = "Default"; - this.description = "Try all meaningful amounts for ROT13.

    Optionally you can enter your known plaintext (crib) to filter the result."; + this.description + = "Try all meaningful amounts for ROT13.

    Optionally you can enter your known plaintext (crib) to filter the result."; this.infoURL = "https://wikipedia.org/wiki/ROT13"; this.inputType = "byteArray"; this.outputType = "string"; @@ -71,17 +71,19 @@ class ROT13BruteForce extends Operation { const [rotateLower, rotateUpper, rotateNum, sampleLength, sampleOffset, printAmount, crib] = args; const sample = input.slice(sampleOffset, sampleOffset + sampleLength); const cribLower = crib.toLowerCase(); - const lowerStart = "a".charCodeAt(0), upperStart = "A".charCodeAt(0), numStart = "0".charCodeAt(0); + const lowerStart = "a".charCodeAt(0), + upperStart = "A".charCodeAt(0), + numStart = "0".charCodeAt(0); const result = []; for (let amount = 1; amount < 26; amount++) { const rotated = sample.slice(); for (let i = 0; i < rotated.length; i++) { if (rotateLower && lowerStart <= rotated[i] && rotated[i] < lowerStart + 26) { - rotated[i] = (rotated[i] - lowerStart + amount) % 26 + lowerStart; + rotated[i] = ((rotated[i] - lowerStart + amount) % 26) + lowerStart; } else if (rotateUpper && upperStart <= rotated[i] && rotated[i] < upperStart + 26) { - rotated[i] = (rotated[i] - upperStart + amount) % 26 + upperStart; + rotated[i] = ((rotated[i] - upperStart + amount) % 26) + upperStart; } else if (rotateNum && numStart <= rotated[i] && rotated[i] < numStart + 10) { - rotated[i] = (rotated[i] - numStart + amount) % 10 + numStart; + rotated[i] = ((rotated[i] - numStart + amount) % 10) + numStart; } } const rotatedString = Utils.byteArrayToUtf8(rotated); diff --git a/src/core/operations/ROT47.mjs b/src/core/operations/ROT47.mjs index 39bf79a2..2915fa52 100644 --- a/src/core/operations/ROT47.mjs +++ b/src/core/operations/ROT47.mjs @@ -6,12 +6,10 @@ import Operation from "../Operation.mjs"; - /** * ROT47 operation. */ class ROT47 extends Operation { - /** * ROT47 constructor */ @@ -20,7 +18,8 @@ class ROT47 extends Operation { this.name = "ROT47"; this.module = "Default"; - this.description = "A slightly more complex variation of a caesar cipher, which includes ASCII characters from 33 '!' to 126 '~'. Default rotation: 47."; + this.description + = "A slightly more complex variation of a caesar cipher, which includes ASCII characters from 33 '!' to 126 '~'. Default rotation: 47."; this.infoURL = "https://wikipedia.org/wiki/ROT13#Variants"; this.inputType = "byteArray"; this.outputType = "byteArray"; @@ -29,7 +28,7 @@ class ROT47 extends Operation { name: "Amount", type: "number", value: 47 - }, + } ]; } diff --git a/src/core/operations/ROT47BruteForce.mjs b/src/core/operations/ROT47BruteForce.mjs index fa1e90dc..cc1911d3 100644 --- a/src/core/operations/ROT47BruteForce.mjs +++ b/src/core/operations/ROT47BruteForce.mjs @@ -10,7 +10,6 @@ import Utils from "../Utils.mjs"; * ROT47 Brute Force operation. */ class ROT47BruteForce extends Operation { - /** * ROT47BruteForce constructor */ @@ -19,7 +18,8 @@ class ROT47BruteForce extends Operation { this.name = "ROT47 Brute Force"; this.module = "Default"; - this.description = "Try all meaningful amounts for ROT47.

    Optionally you can enter your known plaintext (crib) to filter the result."; + this.description + = "Try all meaningful amounts for ROT47.

    Optionally you can enter your known plaintext (crib) to filter the result."; this.infoURL = "https://wikipedia.org/wiki/ROT13#Variants"; this.inputType = "byteArray"; this.outputType = "string"; @@ -61,7 +61,7 @@ class ROT47BruteForce extends Operation { const rotated = sample.slice(); for (let i = 0; i < rotated.length; i++) { if (33 <= rotated[i] && rotated[i] <= 126) { - rotated[i] = (rotated[i] - 33 + amount) % 94 + 33; + rotated[i] = ((rotated[i] - 33 + amount) % 94) + 33; } } const rotatedString = Utils.byteArrayToUtf8(rotated); diff --git a/src/core/operations/ROT8000.mjs b/src/core/operations/ROT8000.mjs index 322ceaa3..c5b6b615 100644 --- a/src/core/operations/ROT8000.mjs +++ b/src/core/operations/ROT8000.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * ROT8000 operation. */ class ROT8000 extends Operation { - /** * ROT8000 constructor */ @@ -19,7 +18,8 @@ class ROT8000 extends Operation { super(); this.name = "ROT8000"; this.module = "Default"; - this.description = "The simple Caesar-cypher encryption that replaces each Unicode character with the one 0x8000 places forward or back along the alphabet."; + this.description + = "The simple Caesar-cypher encryption that replaces each Unicode character with the one 0x8000 places forward or back along the alphabet."; this.infoURL = "https://rot8000.com/info"; this.inputType = "string"; this.outputType = "string"; @@ -60,10 +60,8 @@ class ROT8000 extends Operation { let startBlock = 0; for (const key in validCodePoints) { if (Object.prototype.hasOwnProperty.call(validCodePoints, key)) { - if (validCodePoints[key] === true) - hiddenBlocks.push({ start: startBlock, end: parseInt(key, 10) - 1 }); - else - startBlock = parseInt(key, 10); + if (validCodePoints[key] === true) hiddenBlocks.push({ start: startBlock, end: parseInt(key, 10) - 1 }); + else startBlock = parseInt(key, 10); } } const validIntList = []; // list of all valid chars @@ -77,8 +75,9 @@ class ROT8000 extends Operation { const rotateNum = Object.keys(validIntList).length / 2; // go through every valid char and find its match for (let i = 0; i < validIntList.length; i++) { - rotList[String.fromCharCode(validIntList[i])] = - String.fromCharCode(validIntList[(i + rotateNum) % (rotateNum * 2)]); + rotList[String.fromCharCode(validIntList[i])] = String.fromCharCode( + validIntList[(i + rotateNum) % (rotateNum * 2)] + ); } let output = ""; for (let count = 0; count < input.length; count++) { diff --git a/src/core/operations/RSADecrypt.mjs b/src/core/operations/RSADecrypt.mjs index 5b32b790..70f08394 100644 --- a/src/core/operations/RSADecrypt.mjs +++ b/src/core/operations/RSADecrypt.mjs @@ -13,7 +13,6 @@ import { MD_ALGORITHMS } from "../lib/RSA.mjs"; * RSA Decrypt operation */ class RSADecrypt extends Operation { - /** * RSADecrypt constructor */ @@ -52,7 +51,8 @@ class RSADecrypt extends Operation { { name: "RAW", off: [3] - }] + } + ] }, { name: "Message Digest Algorithm", @@ -74,13 +74,12 @@ class RSADecrypt extends Operation { } try { const privKey = forge.pki.decryptRsaPrivateKey(pemKey, password); - const dMsg = privKey.decrypt(input, scheme, {md: MD_ALGORITHMS[md].create()}); + const dMsg = privKey.decrypt(input, scheme, { md: MD_ALGORITHMS[md].create() }); return forge.util.decodeUtf8(dMsg); } catch (err) { throw new OperationError(err); } } - } export default RSADecrypt; diff --git a/src/core/operations/RSAEncrypt.mjs b/src/core/operations/RSAEncrypt.mjs index 859ce132..378bf590 100644 --- a/src/core/operations/RSAEncrypt.mjs +++ b/src/core/operations/RSAEncrypt.mjs @@ -13,7 +13,6 @@ import { MD_ALGORITHMS } from "../lib/RSA.mjs"; * RSA Encrypt operation */ class RSAEncrypt extends Operation { - /** * RSAEncrypt constructor */ @@ -47,7 +46,8 @@ class RSAEncrypt extends Operation { { name: "RAW", off: [2] - }] + } + ] }, { name: "Message Digest Algorithm", @@ -74,16 +74,17 @@ class RSAEncrypt extends Operation { // https://github.com/digitalbazaar/forge/issues/465#issuecomment-271097600 const plaintextBytes = forge.util.encodeUtf8(input); // Encrypt message - const eMsg = pubKey.encrypt(plaintextBytes, scheme, {md: MD_ALGORITHMS[md].create()}); + const eMsg = pubKey.encrypt(plaintextBytes, scheme, { md: MD_ALGORITHMS[md].create() }); return eMsg; } catch (err) { if (err.message === "RSAES-OAEP input message length is too long.") { - throw new OperationError(`RSAES-OAEP input message length (${err.length}) is longer than the maximum allowed length (${err.maxLength}).`); + throw new OperationError( + `RSAES-OAEP input message length (${err.length}) is longer than the maximum allowed length (${err.maxLength}).` + ); } throw new OperationError(err); } } - } export default RSAEncrypt; diff --git a/src/core/operations/RSASign.mjs b/src/core/operations/RSASign.mjs index 25160f53..dad23117 100644 --- a/src/core/operations/RSASign.mjs +++ b/src/core/operations/RSASign.mjs @@ -14,7 +14,6 @@ import { MD_ALGORITHMS } from "../lib/RSA.mjs"; * RSA Sign operation */ class RSASign extends Operation { - /** * RSASign constructor */ @@ -68,7 +67,6 @@ class RSASign extends Operation { throw new OperationError(err); } } - } export default RSASign; diff --git a/src/core/operations/RSAVerify.mjs b/src/core/operations/RSAVerify.mjs index 89b7d81f..e0a09e3d 100644 --- a/src/core/operations/RSAVerify.mjs +++ b/src/core/operations/RSAVerify.mjs @@ -13,7 +13,6 @@ import { MD_ALGORITHMS } from "../lib/RSA.mjs"; * RSA Verify operation */ class RSAVerify extends Operation { - /** * RSAVerify constructor */ @@ -66,12 +65,13 @@ class RSAVerify extends Operation { return result ? "Verified OK" : "Verification Failure"; } catch (err) { if (err.message === "Encrypted message length is invalid.") { - throw new OperationError(`Signature length (${err.length}) does not match expected length based on key (${err.expected}).`); + throw new OperationError( + `Signature length (${err.length}) does not match expected length based on key (${err.expected}).` + ); } throw new OperationError(err); } } - } export default RSAVerify; diff --git a/src/core/operations/Rabbit.mjs b/src/core/operations/Rabbit.mjs index 91ff24a3..a4b5deae 100644 --- a/src/core/operations/Rabbit.mjs +++ b/src/core/operations/Rabbit.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * Rabbit operation */ class Rabbit extends Operation { - /** * Rabbit constructor */ @@ -22,7 +21,8 @@ class Rabbit extends Operation { this.name = "Rabbit"; this.module = "Ciphers"; - this.description = "Rabbit is a high-speed stream cipher introduced in 2003 and defined in RFC 4503.

    The cipher uses a 128-bit key and an optional 64-bit initialization vector (IV).

    big-endian: based on RFC4503 and RFC3447
    little-endian: compatible with Crypto++"; + this.description + = "Rabbit is a high-speed stream cipher introduced in 2003 and defined in RFC 4503.

    The cipher uses a 128-bit key and an optional 64-bit initialization vector (IV).

    big-endian: based on RFC4503 and RFC3447
    little-endian: compatible with Crypto++"; this.infoURL = "https://wikipedia.org/wiki/Rabbit_(cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -79,15 +79,13 @@ class Rabbit extends Operation { } // Inner State - const X = new Uint32Array(8), C = new Uint32Array(8); + const X = new Uint32Array(8), + C = new Uint32Array(8); let b = 0; // Counter System - const A = [ - 0x4d34d34d, 0xd34d34d3, 0x34d34d34, 0x4d34d34d, - 0xd34d34d3, 0x34d34d34, 0x4d34d34d, 0xd34d34d3 - ]; - const counterUpdate = function() { + const A = [0x4d34d34d, 0xd34d34d3, 0x34d34d34, 0x4d34d34d, 0xd34d34d3, 0x34d34d34, 0x4d34d34d, 0xd34d34d3]; + const counterUpdate = function () { for (let j = 0; j < 8; j++) { const temp = C[j] + A[j] + b; b = (temp / ((1 << 30) * 4)) >>> 0; @@ -96,9 +94,10 @@ class Rabbit extends Operation { }; // Next-State Function - const g = function(u, v) { + const g = function (u, v) { const uv = (u + v) >>> 0; - const upper = uv >>> 16, lower = uv & 0xffff; + const upper = uv >>> 16, + lower = uv & 0xffff; const upperUpper = upper * upper; const upperLower2 = 2 * upper * lower; const lowerLower = lower * lower; @@ -108,17 +107,17 @@ class Rabbit extends Operation { const lsw = lswTemp >>> 0; return lsw ^ msw; }; - const leftRotate = function(value, width) { + const leftRotate = function (value, width) { return (value << width) | (value >>> (32 - width)); }; - const nextStateHelper1 = function(v0, v1, v2) { + const nextStateHelper1 = function (v0, v1, v2) { return v0 + leftRotate(v1, 16) + leftRotate(v2, 16); }; - const nextStateHelper2 = function(v0, v1, v2) { + const nextStateHelper2 = function (v0, v1, v2) { return v0 + leftRotate(v1, 8) + v2; }; const G = new Uint32Array(8); - const nextState = function() { + const nextState = function () { for (let j = 0; j < 8; j++) { G[j] = g(X[j], C[j]); } @@ -162,13 +161,11 @@ class Rabbit extends Operation { // IV Setup Scheme if (iv.length === 8) { - const getIVValue = function(a, b, c, d) { + const getIVValue = function (a, b, c, d) { if (littleEndian) { - return (iv[a] << 24) | (iv[b] << 16) | - (iv[c] << 8) | iv[d]; + return (iv[a] << 24) | (iv[b] << 16) | (iv[c] << 8) | iv[d]; } else { - return (iv[7 - a] << 24) | (iv[7 - b] << 16) | - (iv[7 - c] << 8) | iv[7 - d]; + return (iv[7 - a] << 24) | (iv[7 - b] << 16) | (iv[7 - c] << 8) | iv[7 - d]; } }; C[0] = C[0] ^ getIVValue(3, 2, 1, 0); @@ -187,9 +184,9 @@ class Rabbit extends Operation { // Extraction Scheme const S = new Uint8Array(16); - const extract = function() { + const extract = function () { let pos = 0; - const addPart = function(value) { + const addPart = function (value) { S[pos++] = value >>> 8; S[pos++] = value & 0xff; }; @@ -223,7 +220,7 @@ class Rabbit extends Operation { } } if (data.length % 16 !== 0) { - const offset = data.length - data.length % 16; + const offset = data.length - (data.length % 16); const length = data.length - offset; extract(); if (littleEndian) { @@ -241,7 +238,6 @@ class Rabbit extends Operation { } return Utils.byteArrayToChars(result); } - } export default Rabbit; diff --git a/src/core/operations/RailFenceCipherDecode.mjs b/src/core/operations/RailFenceCipherDecode.mjs index be54ee12..6c93ec7c 100644 --- a/src/core/operations/RailFenceCipherDecode.mjs +++ b/src/core/operations/RailFenceCipherDecode.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Rail Fence Cipher Decode operation */ class RailFenceCipherDecode extends Operation { - /** * RailFenceCipherDecode constructor */ @@ -74,8 +73,6 @@ class RailFenceCipherDecode extends Operation { return plaintext.join("").trim(); } - } - export default RailFenceCipherDecode; diff --git a/src/core/operations/RailFenceCipherEncode.mjs b/src/core/operations/RailFenceCipherEncode.mjs index 03651f85..ca948f13 100644 --- a/src/core/operations/RailFenceCipherEncode.mjs +++ b/src/core/operations/RailFenceCipherEncode.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Rail Fence Cipher Encode operation */ class RailFenceCipherEncode extends Operation { - /** * RailFenceCipherEncode constructor */ @@ -61,14 +60,13 @@ class RailFenceCipherEncode extends Operation { const rows = new Array(key).fill(""); for (let pos = 0; pos < plaintext.length; pos++) { - const rowIdx = key - 1 - Math.abs(cycle / 2 - (pos + offset) % cycle); + const rowIdx = key - 1 - Math.abs(cycle / 2 - ((pos + offset) % cycle)); rows[rowIdx] += plaintext[pos]; } return rows.join("").trim(); } - } export default RailFenceCipherEncode; diff --git a/src/core/operations/RandomizeColourPalette.mjs b/src/core/operations/RandomizeColourPalette.mjs index e3baf54b..44ffe093 100644 --- a/src/core/operations/RandomizeColourPalette.mjs +++ b/src/core/operations/RandomizeColourPalette.mjs @@ -16,7 +16,6 @@ import jimp from "jimp"; * Randomize Colour Palette operation */ class RandomizeColourPalette extends Operation { - /** * RandomizeColourPalette constructor */ @@ -25,7 +24,8 @@ class RandomizeColourPalette extends Operation { this.name = "Randomize Colour Palette"; this.module = "Image"; - this.description = "Randomizes each colour in an image's colour palette. This can often reveal text or symbols that were previously a very similar colour to their surroundings, a technique sometimes used in Steganography."; + this.description + = "Randomizes each colour in an image's colour palette. This can often reveal text or symbols that were previously a very similar colour to their surroundings, a technique sometimes used in Steganography."; this.infoURL = "https://wikipedia.org/wiki/Indexed_color"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -47,15 +47,15 @@ class RandomizeColourPalette extends Operation { async run(input, args) { if (!isImage(input)) throw new OperationError("Please enter a valid image file."); - const seed = args[0] || (Math.random().toString().substr(2)), + const seed = args[0] || Math.random().toString().substr(2), parsedImage = await jimp.read(input), width = parsedImage.bitmap.width, height = parsedImage.bitmap.height; let rgbString, rgbHash, rgbHex; - parsedImage.scan(0, 0, width, height, function(x, y, idx) { - rgbString = this.bitmap.data.slice(idx, idx+3).join("."); + parsedImage.scan(0, 0, width, height, function (x, y, idx) { + rgbString = this.bitmap.data.slice(idx, idx + 3).join("."); rgbHash = runHash("md5", Utils.strToArrayBuffer(seed + rgbString)); rgbHex = rgbHash.substr(0, 6) + "ff"; parsedImage.setPixelColor(parseInt(rgbHex, 16), x, y); @@ -77,7 +77,6 @@ class RandomizeColourPalette extends Operation { return ``; } - } export default RandomizeColourPalette; diff --git a/src/core/operations/RawDeflate.mjs b/src/core/operations/RawDeflate.mjs index 0df243f4..21867211 100644 --- a/src/core/operations/RawDeflate.mjs +++ b/src/core/operations/RawDeflate.mjs @@ -5,22 +5,21 @@ */ import Operation from "../Operation.mjs"; -import {COMPRESSION_TYPE} from "../lib/Zlib.mjs"; +import { COMPRESSION_TYPE } from "../lib/Zlib.mjs"; import rawdeflate from "zlibjs/bin/rawdeflate.min.js"; const Zlib = rawdeflate.Zlib; const RAW_COMPRESSION_TYPE_LOOKUP = { - "Fixed Huffman Coding": Zlib.RawDeflate.CompressionType.FIXED, + "Fixed Huffman Coding": Zlib.RawDeflate.CompressionType.FIXED, "Dynamic Huffman Coding": Zlib.RawDeflate.CompressionType.DYNAMIC, - "None (Store)": Zlib.RawDeflate.CompressionType.NONE, + "None (Store)": Zlib.RawDeflate.CompressionType.NONE }; /** * Raw Deflate operation */ class RawDeflate extends Operation { - /** * RawDeflate constructor */ @@ -53,7 +52,6 @@ class RawDeflate extends Operation { }); return new Uint8Array(deflate.compress()).buffer; } - } export default RawDeflate; diff --git a/src/core/operations/RawInflate.mjs b/src/core/operations/RawInflate.mjs index f5b57bde..7c20b0ac 100644 --- a/src/core/operations/RawInflate.mjs +++ b/src/core/operations/RawInflate.mjs @@ -5,21 +5,20 @@ */ import Operation from "../Operation.mjs"; -import {INFLATE_BUFFER_TYPE} from "../lib/Zlib.mjs"; +import { INFLATE_BUFFER_TYPE } from "../lib/Zlib.mjs"; import rawinflate from "zlibjs/bin/rawinflate.min.js"; const Zlib = rawinflate.Zlib; const RAW_BUFFER_TYPE_LOOKUP = { "Adaptive": Zlib.RawInflate.BufferType.ADAPTIVE, - "Block": Zlib.RawInflate.BufferType.BLOCK, + "Block": Zlib.RawInflate.BufferType.BLOCK }; /** * Raw Inflate operation */ class RawInflate extends Operation { - /** * RawInflate constructor */ @@ -84,7 +83,6 @@ class RawInflate extends Operation { return result.buffer; } - } export default RawInflate; diff --git a/src/core/operations/Register.mjs b/src/core/operations/Register.mjs index 2f696edd..2dac0472 100644 --- a/src/core/operations/Register.mjs +++ b/src/core/operations/Register.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Register operation */ class Register extends Operation { - /** * Register constructor */ @@ -23,7 +22,8 @@ class Register extends Operation { this.name = "Register"; this.flowControl = true; this.module = "Regex"; - this.description = "Extract data from the input and store it in registers which can then be passed into subsequent operations as arguments. Regular expression capture groups are used to select the data to extract.

    To use registers in arguments, refer to them using the notation $Rn where n is the register number, starting at 0.

    For example:
    Input: Test
    Extractor: (.*)
    Argument: $R0 becomes Test

    Registers can be escaped in arguments using a backslash. e.g. \\$R0 would become $R0 rather than Test."; + this.description + = "Extract data from the input and store it in registers which can then be passed into subsequent operations as arguments. Regular expression capture groups are used to select the data to extract.

    To use registers in arguments, refer to them using the notation $Rn where n is the register number, starting at 0.

    For example:
    Input: Test
    Extractor: (.*)
    Argument: $R0 becomes Test

    Registers can be escaped in arguments using a backslash. e.g. \\$R0 would become $R0 rather than Test."; this.infoURL = "https://wikipedia.org/wiki/Regular_expression#Syntax"; this.inputType = "string"; this.outputType = "string"; @@ -87,8 +87,7 @@ class Register extends Operation { // Replace references to registers ($Rn) with contents of registers return str.replace(/(\\*)\$R(\d{1,2})/g, (match, slashes, regNum) => { const index = parseInt(regNum, 10) + 1; - if (index <= state.numRegisters || index >= state.numRegisters + registers.length) - return match; + if (index <= state.numRegisters || index >= state.numRegisters + registers.length) return match; if (slashes.length % 2 !== 0) return match.slice(1); // Remove escape return slashes + registers[index - state.numRegisters]; }); @@ -99,7 +98,7 @@ class Register extends Operation { if (state.opList[i].disabled) continue; let args = state.opList[i].ingValues; - args = args.map(arg => { + args = args.map((arg) => { if (typeof arg !== "string" && typeof arg !== "object") return arg; if (typeof arg === "object" && Object.prototype.hasOwnProperty.call(arg, "string")) { @@ -114,7 +113,6 @@ class Register extends Operation { state.numRegisters += registers.length - 1; return state; } - } export default Register; diff --git a/src/core/operations/RegularExpression.mjs b/src/core/operations/RegularExpression.mjs index 18d3fda9..ffc6197b 100644 --- a/src/core/operations/RegularExpression.mjs +++ b/src/core/operations/RegularExpression.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * Regular expression operation */ class RegularExpression extends Operation { - /** * RegularExpression constructor */ @@ -22,7 +21,8 @@ class RegularExpression extends Operation { this.name = "Regular expression"; this.module = "Regex"; - this.description = "Define your own regular expression (regex) to search the input data with, optionally choosing from a list of pre-defined patterns.

    Supports extended regex syntax including the 'dot matches all' flag, named capture groups, full unicode coverage (including \\p{} categories and scripts as well as astral codes) and recursive matching."; + this.description + = "Define your own regular expression (regex) to search the input data with, optionally choosing from a list of pre-defined patterns.

    Supports extended regex syntax including the 'dot matches all' flag, named capture groups, full unicode coverage (including \\p{} categories and scripts as well as astral codes) and recursive matching."; this.infoURL = "https://wikipedia.org/wiki/Regular_expression"; this.inputType = "string"; this.outputType = "html"; @@ -49,7 +49,7 @@ class RegularExpression extends Operation { }, { name: "URL", - value: "([A-Za-z]+://)([-\\w]+(?:\\.\\w[-\\w]*)+)(:\\d+)?(/[^.!,?\"<>\\[\\]{}\\s\\x7F-\\xFF]*(?:[.!,?]+[^.!,?\"<>\\[\\]{}\\s\\x7F-\\xFF]+)*)?" + value: '([A-Za-z]+://)([-\\w]+(?:\\.\\w[-\\w]*)+)(:\\d+)?(/[^.!,?"<>\\[\\]{}\\s\\x7F-\\xFF]*(?:[.!,?]+[^.!,?"<>\\[\\]{}\\s\\x7F-\\xFF]+)*)?' }, { name: "Domain", @@ -81,12 +81,12 @@ class RegularExpression extends Operation { }, { name: "Strings", - value: "[A-Za-z\\d/\\-:.,_$%\\x27\"()<>= !\\[\\]{}@]{4,}" + value: '[A-Za-z\\d/\\-:.,_$%\\x27"()<>= !\\[\\]{}@]{4,}' }, { name: "UUID (any version)", value: "[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}" - }, + } ], "target": 1 }, @@ -128,7 +128,12 @@ class RegularExpression extends Operation { { "name": "Output format", "type": "option", - "value": ["Highlight matches", "List matches", "List capture groups", "List matches with capture groups"] + "value": [ + "Highlight matches", + "List matches", + "List capture groups", + "List matches with capture groups" + ] } ]; } @@ -139,12 +144,7 @@ class RegularExpression extends Operation { * @returns {html} */ run(input, args) { - const [, - userRegex, - i, m, s, u, a, - displayTotal, - outputFormat - ] = args; + const [, userRegex, i, m, s, u, a, displayTotal, outputFormat] = args; let modifiers = "g"; if (i) modifiers += "i"; @@ -176,7 +176,6 @@ class RegularExpression extends Operation { return Utils.escapeHtml(input); } } - } /** @@ -214,8 +213,7 @@ function regexList(input, regex, displayTotal, matches, captureGroups) { } } - if (displayTotal) - output = "Total found: " + total + "\n\n" + output; + if (displayTotal) output = "Total found: " + total + "\n\n" + output; return output.slice(0, -1); } @@ -245,7 +243,7 @@ function regexHighlight(input, regex, displayTotal) { if (groups.length) { title += "Groups:\n"; for (let i = 0; i < groups.length; i++) { - title += `\t${i+1}: ${Utils.escapeHtml(groups[i] || "")}\n`; + title += `\t${i + 1}: ${Utils.escapeHtml(groups[i] || "")}\n`; } } @@ -263,8 +261,7 @@ function regexHighlight(input, regex, displayTotal) { return captureGroups[i]; }); - if (displayTotal) - output = "Total found: " + total + "\n\n" + output; + if (displayTotal) output = "Total found: " + total + "\n\n" + output; return output; } diff --git a/src/core/operations/RemoveDiacritics.mjs b/src/core/operations/RemoveDiacritics.mjs index 859d86d7..b479af79 100644 --- a/src/core/operations/RemoveDiacritics.mjs +++ b/src/core/operations/RemoveDiacritics.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Remove Diacritics operation */ class RemoveDiacritics extends Operation { - /** * RemoveDiacritics constructor */ @@ -19,7 +18,8 @@ class RemoveDiacritics extends Operation { this.name = "Remove Diacritics"; this.module = "Default"; - this.description = "Replaces accented characters with their latin character equivalent. Accented characters are made up of Unicode combining characters, so unicode text formatting such as strikethroughs and underlines will also be removed."; + this.description + = "Replaces accented characters with their latin character equivalent. Accented characters are made up of Unicode combining characters, so unicode text formatting such as strikethroughs and underlines will also be removed."; this.infoURL = "https://wikipedia.org/wiki/Diacritic"; this.inputType = "string"; this.outputType = "string"; @@ -35,7 +35,6 @@ class RemoveDiacritics extends Operation { // reference: https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript/37511463 return input.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); } - } export default RemoveDiacritics; diff --git a/src/core/operations/RemoveEXIF.mjs b/src/core/operations/RemoveEXIF.mjs index fff4f6b5..a19be901 100644 --- a/src/core/operations/RemoveEXIF.mjs +++ b/src/core/operations/RemoveEXIF.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Remove EXIF operation */ class RemoveEXIF extends Operation { - /** * RemoveEXIF constructor */ @@ -24,7 +23,7 @@ class RemoveEXIF extends Operation { this.description = [ "Removes EXIF data from a JPEG image.", "

    ", - "EXIF data embedded in photos usually contains information about the image file itself as well as the device used to create it.", + "EXIF data embedded in photos usually contains information about the image file itself as well as the device used to create it." ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Exif"; this.inputType = "ArrayBuffer"; @@ -50,7 +49,6 @@ class RemoveEXIF extends Operation { throw new OperationError(`Could not remove EXIF data from image: ${err}`); } } - } export default RemoveEXIF; diff --git a/src/core/operations/RemoveLineNumbers.mjs b/src/core/operations/RemoveLineNumbers.mjs index 0fbf7115..66f4d627 100644 --- a/src/core/operations/RemoveLineNumbers.mjs +++ b/src/core/operations/RemoveLineNumbers.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Remove line numbers operation */ class RemoveLineNumbers extends Operation { - /** * RemoveLineNumbers constructor */ @@ -33,7 +32,6 @@ class RemoveLineNumbers extends Operation { run(input, args) { return input.replace(/^[ \t]{0,5}\d+[\s:|\-,.)\]]/gm, ""); } - } export default RemoveLineNumbers; diff --git a/src/core/operations/RemoveNullBytes.mjs b/src/core/operations/RemoveNullBytes.mjs index b633e82d..b22eb560 100644 --- a/src/core/operations/RemoveNullBytes.mjs +++ b/src/core/operations/RemoveNullBytes.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Remove null bytes operation */ class RemoveNullBytes extends Operation { - /** * RemoveNullBytes constructor */ @@ -38,7 +37,6 @@ class RemoveNullBytes extends Operation { } return output; } - } export default RemoveNullBytes; diff --git a/src/core/operations/RemoveWhitespace.mjs b/src/core/operations/RemoveWhitespace.mjs index 0689f766..a4ee4634 100644 --- a/src/core/operations/RemoveWhitespace.mjs +++ b/src/core/operations/RemoveWhitespace.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Remove whitespace operation */ class RemoveWhitespace extends Operation { - /** * RemoveWhitespace constructor */ @@ -19,7 +18,8 @@ class RemoveWhitespace extends Operation { this.name = "Remove whitespace"; this.module = "Default"; - this.description = "Optionally removes all spaces, carriage returns, line feeds, tabs and form feeds from the input data.

    This operation also supports the removal of full stops which are sometimes used to represent non-printable bytes in ASCII output."; + this.description + = "Optionally removes all spaces, carriage returns, line feeds, tabs and form feeds from the input data.

    This operation also supports the removal of full stops which are sometimes used to represent non-printable bytes in ASCII output."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -62,14 +62,8 @@ class RemoveWhitespace extends Operation { * @returns {string} */ run(input, args) { - const [ - removeSpaces, - removeCarriageReturns, - removeLineFeeds, - removeTabs, - removeFormFeeds, - removeFullStops - ] = args; + const [removeSpaces, removeCarriageReturns, removeLineFeeds, removeTabs, removeFormFeeds, removeFullStops] + = args; let data = input; if (removeSpaces) data = data.replace(/ /g, ""); @@ -80,7 +74,6 @@ class RemoveWhitespace extends Operation { if (removeFullStops) data = data.replace(/\./g, ""); return data; } - } export default RemoveWhitespace; diff --git a/src/core/operations/RenderImage.mjs b/src/core/operations/RenderImage.mjs index 5dee6d3c..1e3d1104 100644 --- a/src/core/operations/RenderImage.mjs +++ b/src/core/operations/RenderImage.mjs @@ -9,13 +9,12 @@ import { fromHex } from "../lib/Hex.mjs"; import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {isImage} from "../lib/FileType.mjs"; +import { isImage } from "../lib/FileType.mjs"; /** * Render Image operation */ class RenderImage extends Operation { - /** * RenderImage constructor */ @@ -24,7 +23,8 @@ class RenderImage extends Operation { this.name = "Render Image"; this.module = "Image"; - this.description = "Displays the input as an image. Supports the following formats:

    • jpg/jpeg
    • png
    • gif
    • webp
    • bmp
    • ico
    "; + this.description + = "Displays the input as an image. Supports the following formats:

    • jpg/jpeg
    • png
    • gif
    • webp
    • bmp
    • ico
    "; this.inputType = "string"; this.outputType = "byteArray"; this.presentType = "html"; @@ -37,7 +37,8 @@ class RenderImage extends Operation { ]; this.checks = [ { - pattern: "^(?:\\xff\\xd8\\xff|\\x89\\x50\\x4e\\x47|\\x47\\x49\\x46|.{8}\\x57\\x45\\x42\\x50|\\x42\\x4d)", + pattern: + "^(?:\\xff\\xd8\\xff|\\x89\\x50\\x4e\\x47|\\x47\\x49\\x46|.{8}\\x57\\x45\\x42\\x50|\\x42\\x4d)", flags: "", args: ["Raw"], useful: true, @@ -106,7 +107,6 @@ class RenderImage extends Operation { return ""; } - } export default RenderImage; diff --git a/src/core/operations/RenderMarkdown.mjs b/src/core/operations/RenderMarkdown.mjs index c656bf5b..82ce896f 100644 --- a/src/core/operations/RenderMarkdown.mjs +++ b/src/core/operations/RenderMarkdown.mjs @@ -12,7 +12,6 @@ import hljs from "highlight.js"; * Render Markdown operation */ class RenderMarkdown extends Operation { - /** * RenderMarkdown constructor */ @@ -49,7 +48,7 @@ class RenderMarkdown extends Operation { md = new MarkdownIt({ linkify: convertLinks, html: false, // Explicitly disable HTML rendering - highlight: function(str, lang) { + highlight: function (str, lang) { if (lang && hljs.getLanguage(lang) && enableHighlighting) { try { return hljs.highlight(lang, str).value; @@ -63,7 +62,6 @@ class RenderMarkdown extends Operation { return `
    ${rendered}
    `; } - } export default RenderMarkdown; diff --git a/src/core/operations/ResizeImage.mjs b/src/core/operations/ResizeImage.mjs index b2ed3bbf..73f19801 100644 --- a/src/core/operations/ResizeImage.mjs +++ b/src/core/operations/ResizeImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Resize Image operation */ class ResizeImage extends Operation { - /** * ResizeImage constructor */ @@ -55,13 +54,7 @@ class ResizeImage extends Operation { { name: "Resizing algorithm", type: "option", - value: [ - "Nearest Neighbour", - "Bilinear", - "Bicubic", - "Hermite", - "Bezier" - ], + value: ["Nearest Neighbour", "Bilinear", "Bicubic", "Hermite", "Bezier"], defaultIndex: 1 } ]; @@ -103,8 +96,7 @@ class ResizeImage extends Operation { height = image.getHeight() * (height / 100); } - if (isWorkerEnvironment()) - self.sendStatusMessage("Resizing image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Resizing image..."); if (aspect) { image.scaleToFit(width, height, resizeMap[resizeAlg]); } else { @@ -139,7 +131,6 @@ class ResizeImage extends Operation { return ``; } - } export default ResizeImage; diff --git a/src/core/operations/Return.mjs b/src/core/operations/Return.mjs index 2a1c6a38..5466e844 100644 --- a/src/core/operations/Return.mjs +++ b/src/core/operations/Return.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Return operation */ class Return extends Operation { - /** * Return constructor */ @@ -37,7 +36,6 @@ class Return extends Operation { state.progress = state.opList.length; return state; } - } export default Return; diff --git a/src/core/operations/Reverse.mjs b/src/core/operations/Reverse.mjs index 49c752a8..39ce5638 100644 --- a/src/core/operations/Reverse.mjs +++ b/src/core/operations/Reverse.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Reverse operation */ class Reverse extends Operation { - /** * Reverse constructor */ @@ -81,7 +80,6 @@ class Reverse extends Operation { return input.reverse(); } } - } export default Reverse; diff --git a/src/core/operations/RisonDecode.mjs b/src/core/operations/RisonDecode.mjs index 1b9741a8..c9a753cf 100644 --- a/src/core/operations/RisonDecode.mjs +++ b/src/core/operations/RisonDecode.mjs @@ -12,7 +12,6 @@ import rison from "rison"; * Rison Decode operation */ class RisonDecode extends Operation { - /** * RisonDecode constructor */ @@ -21,7 +20,8 @@ class RisonDecode extends Operation { this.name = "Rison Decode"; this.module = "Default"; - this.description = "Rison, a data serialization format optimized for compactness in URIs. Rison is a slight variation of JSON that looks vastly superior after URI encoding. Rison still expresses exactly the same set of data structures as JSON, so data can be translated back and forth without loss or guesswork."; + this.description + = "Rison, a data serialization format optimized for compactness in URIs. Rison is a slight variation of JSON that looks vastly superior after URI encoding. Rison still expresses exactly the same set of data structures as JSON, so data can be translated back and forth without loss or guesswork."; this.infoURL = "https://github.com/Nanonid/rison"; this.inputType = "string"; this.outputType = "Object"; @@ -30,11 +30,11 @@ class RisonDecode extends Operation { name: "Decode Option", type: "editableOption", value: [ - { name: "Decode", value: "Decode", }, - { name: "Decode Object", value: "Decode Object", }, - { name: "Decode Array", value: "Decode Array", }, + { name: "Decode", value: "Decode" }, + { name: "Decode Object", value: "Decode Object" }, + { name: "Decode Array", value: "Decode Array" } ] - }, + } ]; } diff --git a/src/core/operations/RisonEncode.mjs b/src/core/operations/RisonEncode.mjs index 36a61017..35fc857d 100644 --- a/src/core/operations/RisonEncode.mjs +++ b/src/core/operations/RisonEncode.mjs @@ -12,7 +12,6 @@ import rison from "rison"; * Rison Encode operation */ class RisonEncode extends Operation { - /** * RisonEncode constructor */ @@ -21,7 +20,8 @@ class RisonEncode extends Operation { this.name = "Rison Encode"; this.module = "Default"; - this.description = "Rison, a data serialization format optimized for compactness in URIs. Rison is a slight variation of JSON that looks vastly superior after URI encoding. Rison still expresses exactly the same set of data structures as JSON, so data can be translated back and forth without loss or guesswork."; + this.description + = "Rison, a data serialization format optimized for compactness in URIs. Rison is a slight variation of JSON that looks vastly superior after URI encoding. Rison still expresses exactly the same set of data structures as JSON, so data can be translated back and forth without loss or guesswork."; this.infoURL = "https://github.com/Nanonid/rison"; this.inputType = "Object"; this.outputType = "string"; @@ -30,12 +30,12 @@ class RisonEncode extends Operation { name: "Encode Option", type: "editableOption", value: [ - { name: "Encode", value: "Encode", }, - { name: "Encode Object", value: "Encode Object", }, - { name: "Encode Array", value: "Encode Array", }, - { name: "Encode URI", value: "Encode URI", } + { name: "Encode", value: "Encode" }, + { name: "Encode Object", value: "Encode Object" }, + { name: "Encode Array", value: "Encode Array" }, + { name: "Encode URI", value: "Encode URI" } ] - }, + } ]; } diff --git a/src/core/operations/RotateImage.mjs b/src/core/operations/RotateImage.mjs index a4659b12..42925474 100644 --- a/src/core/operations/RotateImage.mjs +++ b/src/core/operations/RotateImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Rotate Image operation */ class RotateImage extends Operation { - /** * RotateImage constructor */ @@ -57,8 +56,7 @@ class RotateImage extends Operation { throw new OperationError(`Error loading image. (${err})`); } try { - if (isWorkerEnvironment()) - self.sendStatusMessage("Rotating image..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Rotating image..."); image.rotate(degrees); let imageBuffer; @@ -89,7 +87,6 @@ class RotateImage extends Operation { return ``; } - } export default RotateImage; diff --git a/src/core/operations/RotateLeft.mjs b/src/core/operations/RotateLeft.mjs index e9ef8329..925be7eb 100644 --- a/src/core/operations/RotateLeft.mjs +++ b/src/core/operations/RotateLeft.mjs @@ -5,14 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {rot, rotl, rotlCarry} from "../lib/Rotate.mjs"; - +import { rot, rotl, rotlCarry } from "../lib/Rotate.mjs"; /** * Rotate left operation. */ class RotateLeft extends Operation { - /** * RotateLeft constructor */ @@ -21,7 +19,8 @@ class RotateLeft extends Operation { this.name = "Rotate left"; this.module = "Default"; - this.description = "Rotates each byte to the left by the number of bits specified, optionally carrying the excess bits over to the next byte. Currently only supports 8-bit values."; + this.description + = "Rotates each byte to the left by the number of bits specified, optionally carrying the excess bits over to the next byte. Currently only supports 8-bit values."; this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; this.inputType = "byteArray"; this.outputType = "byteArray"; diff --git a/src/core/operations/RotateRight.mjs b/src/core/operations/RotateRight.mjs index 4e9451fc..fbc9783e 100644 --- a/src/core/operations/RotateRight.mjs +++ b/src/core/operations/RotateRight.mjs @@ -5,14 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {rot, rotr, rotrCarry} from "../lib/Rotate.mjs"; - +import { rot, rotr, rotrCarry } from "../lib/Rotate.mjs"; /** * Rotate right operation. */ class RotateRight extends Operation { - /** * RotateRight constructor */ @@ -21,7 +19,8 @@ class RotateRight extends Operation { this.name = "Rotate right"; this.module = "Default"; - this.description = "Rotates each byte to the right by the number of bits specified, optionally carrying the excess bits over to the next byte. Currently only supports 8-bit values."; + this.description + = "Rotates each byte to the right by the number of bits specified, optionally carrying the excess bits over to the next byte. Currently only supports 8-bit values."; this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; this.inputType = "byteArray"; this.outputType = "byteArray"; diff --git a/src/core/operations/SHA0.mjs b/src/core/operations/SHA0.mjs index 7f712ad9..4eb4378c 100644 --- a/src/core/operations/SHA0.mjs +++ b/src/core/operations/SHA0.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * SHA0 operation */ class SHA0 extends Operation { - /** * SHA0 constructor */ @@ -20,7 +19,8 @@ class SHA0 extends Operation { this.name = "SHA0"; this.module = "Crypto"; - this.description = "SHA-0 is a retronym applied to the original version of the 160-bit hash function published in 1993 under the name 'SHA'. It was withdrawn shortly after publication due to an undisclosed 'significant flaw' and replaced by the slightly revised version SHA-1. The message digest algorithm consists, by default, of 80 rounds."; + this.description + = "SHA-0 is a retronym applied to the original version of the 160-bit hash function published in 1993 under the name 'SHA'. It was withdrawn shortly after publication due to an undisclosed 'significant flaw' and replaced by the slightly revised version SHA-1. The message digest algorithm consists, by default, of 80 rounds."; this.infoURL = "https://wikipedia.org/wiki/SHA-1#SHA-0"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -40,9 +40,8 @@ class SHA0 extends Operation { * @returns {string} */ run(input, args) { - return runHash("sha0", input, {rounds: args[0]}); + return runHash("sha0", input, { rounds: args[0] }); } - } export default SHA0; diff --git a/src/core/operations/SHA1.mjs b/src/core/operations/SHA1.mjs index 8c081f2f..043d298a 100644 --- a/src/core/operations/SHA1.mjs +++ b/src/core/operations/SHA1.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * SHA1 operation */ class SHA1 extends Operation { - /** * SHA1 constructor */ @@ -20,7 +19,8 @@ class SHA1 extends Operation { this.name = "SHA1"; this.module = "Crypto"; - this.description = "The SHA (Secure Hash Algorithm) hash functions were designed by the NSA. SHA-1 is the most established of the existing SHA hash functions and it is used in a variety of security applications and protocols.

    However, SHA-1's collision resistance has been weakening as new attacks are discovered or improved. The message digest algorithm consists, by default, of 80 rounds."; + this.description + = "The SHA (Secure Hash Algorithm) hash functions were designed by the NSA. SHA-1 is the most established of the existing SHA hash functions and it is used in a variety of security applications and protocols.

    However, SHA-1's collision resistance has been weakening as new attacks are discovered or improved. The message digest algorithm consists, by default, of 80 rounds."; this.infoURL = "https://wikipedia.org/wiki/SHA-1"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -40,9 +40,8 @@ class SHA1 extends Operation { * @returns {string} */ run(input, args) { - return runHash("sha1", input, {rounds: args[0]}); + return runHash("sha1", input, { rounds: args[0] }); } - } export default SHA1; diff --git a/src/core/operations/SHA2.mjs b/src/core/operations/SHA2.mjs index ecdc4cc5..5ab116e8 100644 --- a/src/core/operations/SHA2.mjs +++ b/src/core/operations/SHA2.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * SHA2 operation */ class SHA2 extends Operation { - /** * SHA2 constructor */ @@ -20,7 +19,8 @@ class SHA2 extends Operation { this.name = "SHA2"; this.module = "Crypto"; - this.description = "The SHA-2 (Secure Hash Algorithm 2) hash functions were designed by the NSA. SHA-2 includes significant changes from its predecessor, SHA-1. The SHA-2 family consists of hash functions with digests (hash values) that are 224, 256, 384 or 512 bits: SHA224, SHA256, SHA384, SHA512.

    • SHA-512 operates on 64-bit words.
    • SHA-256 operates on 32-bit words.
    • SHA-384 is largely identical to SHA-512 but is truncated to 384 bytes.
    • SHA-224 is largely identical to SHA-256 but is truncated to 224 bytes.
    • SHA-512/224 and SHA-512/256 are truncated versions of SHA-512, but the initial values are generated using the method described in Federal Information Processing Standards (FIPS) PUB 180-4.
    The message digest algorithm for SHA256 variants consists, by default, of 64 rounds, and for SHA512 variants, it is, by default, 160."; + this.description + = "The SHA-2 (Secure Hash Algorithm 2) hash functions were designed by the NSA. SHA-2 includes significant changes from its predecessor, SHA-1. The SHA-2 family consists of hash functions with digests (hash values) that are 224, 256, 384 or 512 bits: SHA224, SHA256, SHA384, SHA512.

    • SHA-512 operates on 64-bit words.
    • SHA-256 operates on 32-bit words.
    • SHA-384 is largely identical to SHA-512 but is truncated to 384 bytes.
    • SHA-224 is largely identical to SHA-256 but is truncated to 224 bytes.
    • SHA-512/224 and SHA-512/256 are truncated versions of SHA-512, but the initial values are generated using the method described in Federal Information Processing Standards (FIPS) PUB 180-4.
    The message digest algorithm for SHA256 variants consists, by default, of 64 rounds, and for SHA512 variants, it is, by default, 160."; this.infoURL = "https://wikipedia.org/wiki/SHA-2"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -83,10 +83,9 @@ class SHA2 extends Operation { */ run(input, args) { const size = args[0]; - const rounds = (size === "256" || size === "224") ? args[1] : args[2]; - return runHash("sha" + size, input, {rounds: rounds}); + const rounds = size === "256" || size === "224" ? args[1] : args[2]; + return runHash("sha" + size, input, { rounds: rounds }); } - } export default SHA2; diff --git a/src/core/operations/SHA3.mjs b/src/core/operations/SHA3.mjs index 0f3cdef7..e566ee5c 100644 --- a/src/core/operations/SHA3.mjs +++ b/src/core/operations/SHA3.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * SHA3 operation */ class SHA3 extends Operation { - /** * SHA3 constructor */ @@ -21,7 +20,8 @@ class SHA3 extends Operation { this.name = "SHA3"; this.module = "Crypto"; - this.description = "The SHA-3 (Secure Hash Algorithm 3) hash functions were released by NIST on August 5, 2015. Although part of the same series of standards, SHA-3 is internally quite different from the MD5-like structure of SHA-1 and SHA-2.

    SHA-3 is a subset of the broader cryptographic primitive family Keccak designed by Guido Bertoni, Joan Daemen, Micha\xebl Peeters, and Gilles Van Assche, building upon RadioGat\xfan."; + this.description + = "The SHA-3 (Secure Hash Algorithm 3) hash functions were released by NIST on August 5, 2015. Although part of the same series of standards, SHA-3 is internally quite different from the MD5-like structure of SHA-1 and SHA-2.

    SHA-3 is a subset of the broader cryptographic primitive family Keccak designed by Guido Bertoni, Joan Daemen, Micha\xebl Peeters, and Gilles Van Assche, building upon RadioGat\xfan."; this.infoURL = "https://wikipedia.org/wiki/SHA-3"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -62,7 +62,6 @@ class SHA3 extends Operation { return algo(input); } - } export default SHA3; diff --git a/src/core/operations/SIGABA.mjs b/src/core/operations/SIGABA.mjs index 274f09f6..4db731e1 100644 --- a/src/core/operations/SIGABA.mjs +++ b/src/core/operations/SIGABA.mjs @@ -7,14 +7,13 @@ */ import Operation from "../Operation.mjs"; -import {LETTERS} from "../lib/Enigma.mjs"; -import {NUMBERS, CR_ROTORS, I_ROTORS, SigabaMachine, CRRotor, IRotor} from "../lib/SIGABA.mjs"; +import { LETTERS } from "../lib/Enigma.mjs"; +import { NUMBERS, CR_ROTORS, I_ROTORS, SigabaMachine, CRRotor, IRotor } from "../lib/SIGABA.mjs"; /** * Sigaba operation */ class Sigaba extends Operation { - /** * Sigaba constructor */ @@ -23,7 +22,8 @@ class Sigaba extends Operation { this.name = "SIGABA"; this.module = "Bletchley"; - this.description = "Encipher/decipher with the WW2 SIGABA machine.

    SIGABA, otherwise known as ECM Mark II, was used by the United States for message encryption during WW2 up to the 1950s. It was developed in the 1930s by the US Army and Navy, and has up to this day never been broken. Consisting of 15 rotors: 5 cipher rotors and 10 rotors (5 control rotors and 5 index rotors) controlling the stepping of the cipher rotors, the rotor stepping for SIGABA is much more complex than other rotor machines of its time, such as Enigma. All example rotor wirings are random example sets.

    To configure rotor wirings, for the cipher and control rotors enter a string of letters which map from A to Z, and for the index rotors enter a sequence of numbers which map from 0 to 9. Note that encryption is not the same as decryption, so first choose the desired mode.

    Note: Whilst this has been tested against other software emulators, it has not been tested against hardware."; + this.description + = "Encipher/decipher with the WW2 SIGABA machine.

    SIGABA, otherwise known as ECM Mark II, was used by the United States for message encryption during WW2 up to the 1950s. It was developed in the 1930s by the US Army and Navy, and has up to this day never been broken. Consisting of 15 rotors: 5 cipher rotors and 10 rotors (5 control rotors and 5 index rotors) controlling the stepping of the cipher rotors, the rotor stepping for SIGABA is much more complex than other rotor machines of its time, such as Enigma. All example rotor wirings are random example sets.

    To configure rotor wirings, for the cipher and control rotors enter a string of letters which map from A to Z, and for the index rotors enter a sequence of numbers which map from 0 to 9. Note that encryption is not the same as decryption, so first choose the desired mode.

    Note: Whilst this has been tested against other software emulators, it has not been tested against hardware."; this.infoURL = "https://wikipedia.org/wiki/SIGABA"; this.inputType = "string"; this.outputType = "string"; @@ -261,17 +261,17 @@ class Sigaba extends Operation { const cipherRotors = []; const controlRotors = []; const indexRotors = []; - for (let i=0; i<5; i++) { - const rotorWiring = args[i*3]; - cipherRotors.push(new CRRotor(rotorWiring, args[i*3+2], args[i*3+1])); + for (let i = 0; i < 5; i++) { + const rotorWiring = args[i * 3]; + cipherRotors.push(new CRRotor(rotorWiring, args[i * 3 + 2], args[i * 3 + 1])); } - for (let i=5; i<10; i++) { - const rotorWiring = args[i*3]; - controlRotors.push(new CRRotor(rotorWiring, args[i*3+2], args[i*3+1])); + for (let i = 5; i < 10; i++) { + const rotorWiring = args[i * 3]; + controlRotors.push(new CRRotor(rotorWiring, args[i * 3 + 2], args[i * 3 + 1])); } - for (let i=15; i<20; i++) { - const rotorWiring = args[i*2]; - indexRotors.push(new IRotor(rotorWiring, args[i*2+1])); + for (let i = 15; i < 20; i++) { + const rotorWiring = args[i * 2]; + indexRotors.push(new IRotor(rotorWiring, args[i * 2 + 1])); } const sigaba = new SigabaMachine(cipherRotors, controlRotors, indexRotors); let result; @@ -282,6 +282,5 @@ class Sigaba extends Operation { } return result; } - } export default Sigaba; diff --git a/src/core/operations/SM3.mjs b/src/core/operations/SM3.mjs index 1441476a..9f8fcd35 100644 --- a/src/core/operations/SM3.mjs +++ b/src/core/operations/SM3.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import Sm3 from "crypto-api/src/hasher/sm3.mjs"; -import {toHex} from "crypto-api/src/encoder/hex.mjs"; +import { toHex } from "crypto-api/src/encoder/hex.mjs"; /** * SM3 operation */ class SM3 extends Operation { - /** * SM3 constructor */ @@ -22,7 +21,8 @@ class SM3 extends Operation { this.name = "SM3"; this.module = "Crypto"; - this.description = "SM3 is a cryptographic hash function used in the Chinese National Standard. SM3 is mainly used in digital signatures, message authentication codes, and pseudorandom number generators. The message digest algorithm consists, by default, of 64 rounds and length of 256."; + this.description + = "SM3 is a cryptographic hash function used in the Chinese National Standard. SM3 is mainly used in digital signatures, message authentication codes, and pseudorandom number generators. The message digest algorithm consists, by default, of 64 rounds and length of 256."; this.infoURL = "https://wikipedia.org/wiki/SM3_(hash_function)"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -48,7 +48,7 @@ class SM3 extends Operation { */ run(input, args) { const msg = Utils.arrayBufferToStr(input, false); - const hasher = new Sm3({length: args[0], rounds: args[1]}); + const hasher = new Sm3({ length: args[0], rounds: args[1] }); hasher.update(msg); return toHex(hasher.finalize()); } diff --git a/src/core/operations/SM4Decrypt.mjs b/src/core/operations/SM4Decrypt.mjs index a0853021..6269b749 100644 --- a/src/core/operations/SM4Decrypt.mjs +++ b/src/core/operations/SM4Decrypt.mjs @@ -14,7 +14,6 @@ import { decryptSM4 } from "../lib/SM4.mjs"; * SM4 Decrypt operation */ class SM4Decrypt extends Operation { - /** * SM4Encrypt constructor */ @@ -23,7 +22,8 @@ class SM4Decrypt extends Operation { this.name = "SM4 Decrypt"; this.module = "Ciphers"; - this.description = "SM4 is a 128-bit block cipher, currently established as a national standard (GB/T 32907-2016) of China."; + this.description + = "SM4 is a 128-bit block cipher, currently established as a national standard (GB/T 32907-2016) of China."; this.infoURL = "https://wikipedia.org/wiki/SM4_(cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -66,7 +66,7 @@ class SM4Decrypt extends Operation { run(input, args) { const key = Utils.convertToByteArray(args[0].string, args[0].option), iv = Utils.convertToByteArray(args[1].string, args[1].option), - [,, mode, inputType, outputType] = args; + [, , mode, inputType, outputType] = args; if (key.length !== 16) throw new OperationError(`Invalid key length: ${key.length} bytes @@ -82,7 +82,6 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); const output = decryptSM4(input, key, iv, mode.substring(0, 3), mode.endsWith("NoPadding")); return outputType === "Hex" ? toHex(output) : Utils.byteArrayToUtf8(output); } - } export default SM4Decrypt; diff --git a/src/core/operations/SM4Encrypt.mjs b/src/core/operations/SM4Encrypt.mjs index 0a58dfb9..d8680cb3 100644 --- a/src/core/operations/SM4Encrypt.mjs +++ b/src/core/operations/SM4Encrypt.mjs @@ -14,7 +14,6 @@ import { encryptSM4 } from "../lib/SM4.mjs"; * SM4 Encrypt operation */ class SM4Encrypt extends Operation { - /** * SM4Encrypt constructor */ @@ -23,7 +22,8 @@ class SM4Encrypt extends Operation { this.name = "SM4 Encrypt"; this.module = "Ciphers"; - this.description = "SM4 is a 128-bit block cipher, currently established as a national standard (GB/T 32907-2016) of China. Multiple block cipher modes are supported. When using CBC or ECB mode, the PKCS#7 padding scheme is used."; + this.description + = "SM4 is a 128-bit block cipher, currently established as a national standard (GB/T 32907-2016) of China. Multiple block cipher modes are supported. When using CBC or ECB mode, the PKCS#7 padding scheme is used."; this.infoURL = "https://wikipedia.org/wiki/SM4_(cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -66,7 +66,7 @@ class SM4Encrypt extends Operation { run(input, args) { const key = Utils.convertToByteArray(args[0].string, args[0].option), iv = Utils.convertToByteArray(args[1].string, args[1].option), - [,, mode, inputType, outputType] = args; + [, , mode, inputType, outputType] = args; if (key.length !== 16) throw new OperationError(`Invalid key length: ${key.length} bytes @@ -82,7 +82,6 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); const output = encryptSM4(input, key, iv, mode.substring(0, 3), mode.endsWith("NoPadding")); return outputType === "Hex" ? toHex(output) : Utils.byteArrayToUtf8(output); } - } export default SM4Encrypt; diff --git a/src/core/operations/SQLBeautify.mjs b/src/core/operations/SQLBeautify.mjs index 0f3d2e3c..0e00caea 100644 --- a/src/core/operations/SQLBeautify.mjs +++ b/src/core/operations/SQLBeautify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * SQL Beautify operation */ class SQLBeautify extends Operation { - /** * SQLBeautify constructor */ @@ -41,7 +40,6 @@ class SQLBeautify extends Operation { const indentStr = args[0]; return vkbeautify.sql(input, indentStr); } - } export default SQLBeautify; diff --git a/src/core/operations/SQLMinify.mjs b/src/core/operations/SQLMinify.mjs index 582ad43d..0ff90c2a 100644 --- a/src/core/operations/SQLMinify.mjs +++ b/src/core/operations/SQLMinify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * SQL Minify operation */ class SQLMinify extends Operation { - /** * SQLMinify constructor */ @@ -34,7 +33,6 @@ class SQLMinify extends Operation { run(input, args) { return vkbeautify.sqlmin(input); } - } export default SQLMinify; diff --git a/src/core/operations/SSDEEP.mjs b/src/core/operations/SSDEEP.mjs index 6a76a68b..77554d05 100644 --- a/src/core/operations/SSDEEP.mjs +++ b/src/core/operations/SSDEEP.mjs @@ -11,7 +11,6 @@ import ssdeepjs from "ssdeep.js"; * SSDEEP operation */ class SSDEEP extends Operation { - /** * SSDEEP constructor */ @@ -20,7 +19,8 @@ class SSDEEP extends Operation { this.name = "SSDEEP"; this.module = "Crypto"; - this.description = "SSDEEP is a program for computing context triggered piecewise hashes (CTPH). Also called fuzzy hashes, CTPH can match inputs that have homologies. Such inputs have sequences of identical bytes in the same order, although bytes in between these sequences may be different in both content and length.

    SSDEEP hashes are now widely used for simple identification purposes (e.g. the 'Basic Properties' section in VirusTotal). Although 'better' fuzzy hashes are available, SSDEEP is still one of the primary choices because of its speed and being a de facto standard.

    This operation is fundamentally the same as the CTPH operation, however their outputs differ in format."; + this.description + = "SSDEEP is a program for computing context triggered piecewise hashes (CTPH). Also called fuzzy hashes, CTPH can match inputs that have homologies. Such inputs have sequences of identical bytes in the same order, although bytes in between these sequences may be different in both content and length.

    SSDEEP hashes are now widely used for simple identification purposes (e.g. the 'Basic Properties' section in VirusTotal). Although 'better' fuzzy hashes are available, SSDEEP is still one of the primary choices because of its speed and being a de facto standard.

    This operation is fundamentally the same as the CTPH operation, however their outputs differ in format."; this.infoURL = "https://forensics.wiki/ssdeep"; this.inputType = "string"; this.outputType = "string"; @@ -35,7 +35,6 @@ class SSDEEP extends Operation { run(input, args) { return ssdeepjs.digest(input); } - } export default SSDEEP; diff --git a/src/core/operations/SUB.mjs b/src/core/operations/SUB.mjs index ef9777c6..71a750a4 100644 --- a/src/core/operations/SUB.mjs +++ b/src/core/operations/SUB.mjs @@ -12,7 +12,6 @@ import { bitOp, sub, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs"; * SUB operation */ class SUB extends Operation { - /** * SUB constructor */ @@ -71,7 +70,6 @@ class SUB extends Operation { highlightReverse(pos, args) { return pos; } - } export default SUB; diff --git a/src/core/operations/ScanForEmbeddedFiles.mjs b/src/core/operations/ScanForEmbeddedFiles.mjs index 2e83fcb9..e47a0285 100644 --- a/src/core/operations/ScanForEmbeddedFiles.mjs +++ b/src/core/operations/ScanForEmbeddedFiles.mjs @@ -13,7 +13,6 @@ import { FILE_SIGNATURES } from "../lib/FileSignatures.mjs"; * Scan for Embedded Files operation */ class ScanForEmbeddedFiles extends Operation { - /** * ScanForEmbeddedFiles constructor */ @@ -22,11 +21,12 @@ class ScanForEmbeddedFiles extends Operation { this.name = "Scan for Embedded Files"; this.module = "Default"; - this.description = "Scans the data for potential embedded files by looking for magic bytes at all offsets. This operation is prone to false positives.

    WARNING: Files over about 100KB in size will take a VERY long time to process."; + this.description + = "Scans the data for potential embedded files by looking for magic bytes at all offsets. This operation is prone to false positives.

    WARNING: Files over about 100KB in size will take a VERY long time to process."; this.infoURL = "https://wikipedia.org/wiki/List_of_file_signatures"; this.inputType = "ArrayBuffer"; this.outputType = "string"; - this.args = Object.keys(FILE_SIGNATURES).map(cat => { + this.args = Object.keys(FILE_SIGNATURES).map((cat) => { return { name: cat, type: "boolean", @@ -41,7 +41,8 @@ class ScanForEmbeddedFiles extends Operation { * @returns {string} */ run(input, args) { - let output = "Scanning data for 'magic bytes' which may indicate embedded files. The following results may be false positives and should not be treated as reliable. Any sufficiently long file is likely to contain these magic bytes coincidentally.\n", + let output + = "Scanning data for 'magic bytes' which may indicate embedded files. The following results may be false positives and should not be treated as reliable. Any sufficiently long file is likely to contain these magic bytes coincidentally.\n", numFound = 0; const categories = [], data = new Uint8Array(input); @@ -53,7 +54,7 @@ class ScanForEmbeddedFiles extends Operation { const types = scanForFileTypes(data, categories); if (types.length) { - types.forEach(type => { + types.forEach((type) => { numFound++; output += `\nOffset ${type.offset} (0x${Utils.hex(type.offset)}): File type: ${type.fileDetails.name} @@ -72,7 +73,6 @@ class ScanForEmbeddedFiles extends Operation { return output; } - } export default ScanForEmbeddedFiles; diff --git a/src/core/operations/ScatterChart.mjs b/src/core/operations/ScatterChart.mjs index fc0caf03..4e5d2ef7 100644 --- a/src/core/operations/ScatterChart.mjs +++ b/src/core/operations/ScatterChart.mjs @@ -7,19 +7,24 @@ import * as d3temp from "d3"; import * as nodomtemp from "nodom"; -import { getScatterValues, getScatterValuesWithColour, RECORD_DELIMITER_OPTIONS, COLOURS, FIELD_DELIMITER_OPTIONS } from "../lib/Charts.mjs"; +import { + getScatterValues, + getScatterValuesWithColour, + RECORD_DELIMITER_OPTIONS, + COLOURS, + FIELD_DELIMITER_OPTIONS +} from "../lib/Charts.mjs"; import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; const d3 = d3temp.default ? d3temp.default : d3temp; -const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp; +const nodom = nodomtemp.default ? nodomtemp.default : nodomtemp; /** * Scatter chart operation */ class ScatterChart extends Operation { - /** * ScatterChart constructor */ @@ -36,42 +41,42 @@ class ScatterChart extends Operation { { name: "Record delimiter", type: "option", - value: RECORD_DELIMITER_OPTIONS, + value: RECORD_DELIMITER_OPTIONS }, { name: "Field delimiter", type: "option", - value: FIELD_DELIMITER_OPTIONS, + value: FIELD_DELIMITER_OPTIONS }, { name: "Use column headers as labels", type: "boolean", - value: true, + value: true }, { name: "X label", type: "string", - value: "", + value: "" }, { name: "Y label", type: "string", - value: "", + value: "" }, { name: "Colour", type: "string", - value: COLOURS.max, + value: COLOURS.max }, { name: "Point radius", type: "number", - value: 10, + value: 10 }, { name: "Use colour from third column", type: "boolean", - value: false, + value: false } ]; } @@ -96,12 +101,7 @@ class ScatterChart extends Operation { yLabel = args[4]; const dataFunction = colourInInput ? getScatterValuesWithColour : getScatterValues; - const { headings, values } = dataFunction( - input, - recordDelimiter, - fieldDelimiter, - columnHeadingsAreIncluded - ); + const { headings, values } = dataFunction(input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded); if (headings) { xLabel = headings.x; @@ -110,7 +110,8 @@ class ScatterChart extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${dimension} ${dimension}`); @@ -119,31 +120,29 @@ class ScatterChart extends Operation { top: 10, right: 0, bottom: 40, - left: 30, + left: 30 }, width = dimension - margin.left - margin.right, height = dimension - margin.top - margin.bottom, - marginedSpace = svg.append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + marginedSpace = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")"); - const xExtent = d3.extent(values, d => d[0]), + const xExtent = d3.extent(values, (d) => d[0]), xDelta = xExtent[1] - xExtent[0], - yExtent = d3.extent(values, d => d[1]), + yExtent = d3.extent(values, (d) => d[1]), yDelta = yExtent[1] - yExtent[0], - xAxis = d3.scaleLinear() - .domain([xExtent[0] - (0.1 * xDelta), xExtent[1] + (0.1 * xDelta)]) + xAxis = d3 + .scaleLinear() + .domain([xExtent[0] - 0.1 * xDelta, xExtent[1] + 0.1 * xDelta]) .range([0, width]), - yAxis = d3.scaleLinear() - .domain([yExtent[0] - (0.1 * yDelta), yExtent[1] + (0.1 * yDelta)]) + yAxis = d3 + .scaleLinear() + .domain([yExtent[0] - 0.1 * yDelta, yExtent[1] + 0.1 * yDelta]) .range([height, 0]); - marginedSpace.append("clipPath") - .attr("id", "clip") - .append("rect") - .attr("width", width) - .attr("height", height); + marginedSpace.append("clipPath").attr("id", "clip").append("rect").attr("width", width).attr("height", height); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "points") .attr("clip-path", "url(#clip)") .selectAll("circle") @@ -152,14 +151,14 @@ class ScatterChart extends Operation { .append("circle") .attr("cx", (d) => xAxis(d[0])) .attr("cy", (d) => yAxis(d[1])) - .attr("r", d => radius) - .attr("fill", d => { + .attr("r", (d) => radius) + .attr("fill", (d) => { return colourInInput ? d[2] : fillColour; }) .attr("stroke", "rgba(0, 0, 0, 0.5)") .attr("stroke-width", "0.5") .append("title") - .text(d => { + .text((d) => { const x = d[0], y = d[1], tooltip = `X: ${x}\n @@ -168,9 +167,7 @@ class ScatterChart extends Operation { return tooltip; }); - marginedSpace.append("g") - .attr("class", "axis axis--y") - .call(d3.axisLeft(yAxis).tickSizeOuter(-width)); + marginedSpace.append("g").attr("class", "axis axis--y").call(d3.axisLeft(yAxis).tickSizeOuter(-width)); svg.append("text") .attr("transform", "rotate(-90)") @@ -180,7 +177,8 @@ class ScatterChart extends Operation { .style("text-anchor", "middle") .text(yLabel); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "axis axis--x") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(xAxis).tickSizeOuter(-height)); @@ -193,7 +191,6 @@ class ScatterChart extends Operation { return svg._groups[0][0].outerHTML; } - } export default ScatterChart; diff --git a/src/core/operations/Scrypt.mjs b/src/core/operations/Scrypt.mjs index 9c4ba304..d1499707 100644 --- a/src/core/operations/Scrypt.mjs +++ b/src/core/operations/Scrypt.mjs @@ -14,7 +14,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Scrypt operation */ class Scrypt extends Operation { - /** * Scrypt constructor */ @@ -23,7 +22,8 @@ class Scrypt extends Operation { this.name = "Scrypt"; this.module = "Crypto"; - this.description = "scrypt is a password-based key derivation function (PBKDF) created by Colin Percival. The algorithm was specifically designed to make it costly to perform large-scale custom hardware attacks by requiring large amounts of memory. In 2016, the scrypt algorithm was published by IETF as RFC 7914.

    Enter the password in the input to generate its hash."; + this.description + = "scrypt is a password-based key derivation function (PBKDF) created by Colin Percival. The algorithm was specifically designed to make it costly to perform large-scale custom hardware attacks by requiring large amounts of memory. In 2016, the scrypt algorithm was published by IETF as RFC 7914.

    Enter the password in the input to generate its hash."; this.infoURL = "https://wikipedia.org/wiki/Scrypt"; this.inputType = "string"; this.outputType = "string"; @@ -70,21 +70,16 @@ class Scrypt extends Operation { keyLength = args[4]; try { - const data = scryptsy( - input, salt, iterations, memFactor, parallelFactor, keyLength, - p => { - // Progress callback - if (isWorkerEnvironment()) - self.sendStatusMessage(`Progress: ${p.percent.toFixed(0)}%`); - } - ); + const data = scryptsy(input, salt, iterations, memFactor, parallelFactor, keyLength, (p) => { + // Progress callback + if (isWorkerEnvironment()) self.sendStatusMessage(`Progress: ${p.percent.toFixed(0)}%`); + }); return data.toString("hex"); } catch (err) { throw new OperationError("Error: " + err.toString()); } } - } export default Scrypt; diff --git a/src/core/operations/SeriesChart.mjs b/src/core/operations/SeriesChart.mjs index 7baf594c..f8836c86 100644 --- a/src/core/operations/SeriesChart.mjs +++ b/src/core/operations/SeriesChart.mjs @@ -13,13 +13,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; const d3 = d3temp.default ? d3temp.default : d3temp; -const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp; +const nodom = nodomtemp.default ? nodomtemp.default : nodomtemp; /** * Series chart operation */ class SeriesChart extends Operation { - /** * SeriesChart constructor */ @@ -28,35 +27,36 @@ class SeriesChart extends Operation { this.name = "Series chart"; this.module = "Charts"; - this.description = "A time series graph is a line graph of repeated measurements taken over regular time intervals."; + this.description + = "A time series graph is a line graph of repeated measurements taken over regular time intervals."; this.inputType = "string"; this.outputType = "html"; this.args = [ { name: "Record delimiter", type: "option", - value: RECORD_DELIMITER_OPTIONS, + value: RECORD_DELIMITER_OPTIONS }, { name: "Field delimiter", type: "option", - value: FIELD_DELIMITER_OPTIONS, + value: FIELD_DELIMITER_OPTIONS }, { name: "X label", type: "string", - value: "", + value: "" }, { name: "Point radius", type: "number", - value: 1, + value: 1 }, { name: "Series colours", type: "string", - value: "mediumseagreen, dodgerblue, tomato", - }, + value: "mediumseagreen, dodgerblue, tomato" + } ]; } @@ -89,22 +89,23 @@ class SeriesChart extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); - const xAxis = d3.scalePoint() - .domain(xValues) - .range([0, seriesWidth]); + const xAxis = d3.scalePoint().domain(xValues).range([0, seriesWidth]); svg.append("g") .attr("class", "axis axis--x") .attr("transform", `translate(${seriesLabelWidth}, ${xAxisHeight})`) .call( - d3.axisTop(xAxis).tickValues(xValues.filter((x, i) => { - return [0, Math.round(xValues.length / 2), xValues.length -1].indexOf(i) >= 0; - })) + d3.axisTop(xAxis).tickValues( + xValues.filter((x, i) => { + return [0, Math.round(xValues.length / 2), xValues.length - 1].indexOf(i) >= 0; + }) + ) ); svg.append("text") @@ -116,10 +117,10 @@ class SeriesChart extends Operation { const tooltipText = {}, tooltipAreaWidth = seriesWidth / xValues.length; - xValues.forEach(x => { + xValues.forEach((x) => { const tooltip = []; - series.forEach(serie => { + series.forEach((serie) => { const y = serie.data[x]; if (typeof y === "undefined") return; @@ -129,8 +130,7 @@ class SeriesChart extends Operation { tooltipText[x] = tooltip.join("\n"); }); - const chartArea = svg.append("g") - .attr("transform", `translate(${seriesLabelWidth}, ${xAxisHeight})`); + const chartArea = svg.append("g").attr("transform", `translate(${seriesLabelWidth}, ${xAxisHeight})`); chartArea .append("g") @@ -138,8 +138,8 @@ class SeriesChart extends Operation { .data(xValues) .enter() .append("rect") - .attr("x", x => { - return xAxis(x) - (tooltipAreaWidth / 2); + .attr("x", (x) => { + return xAxis(x) - tooltipAreaWidth / 2; }) .attr("y", 0) .attr("width", tooltipAreaWidth) @@ -147,36 +147,38 @@ class SeriesChart extends Operation { .attr("stroke", "none") .attr("fill", "transparent") .append("title") - .text(x => { + .text((x) => { return `${x}\n --\n ${tooltipText[x]}\n `.replace(/\s{2,}/g, "\n"); }); - const yAxesArea = svg.append("g") - .attr("transform", `translate(0, ${xAxisHeight})`); + const yAxesArea = svg.append("g").attr("transform", `translate(0, ${xAxisHeight})`); series.forEach((serie, seriesIndex) => { const yExtent = d3.extent(Object.values(serie.data)), - yAxis = d3.scaleLinear() - .domain(yExtent) - .range([seriesHeight, 0]); + yAxis = d3.scaleLinear().domain(yExtent).range([seriesHeight, 0]); const seriesGroup = chartArea .append("g") - .attr("transform", `translate(0, ${seriesHeight * seriesIndex + interSeriesPadding * (seriesIndex + 1)})`); + .attr( + "transform", + `translate(0, ${seriesHeight * seriesIndex + interSeriesPadding * (seriesIndex + 1)})` + ); let path = ""; xValues.forEach((x, xIndex) => { let nextX = xValues[xIndex + 1], y = serie.data[x], - nextY= serie.data[nextX]; + nextY = serie.data[nextX]; if (typeof y === "undefined" || typeof nextY === "undefined") return; - x = xAxis(x); nextX = xAxis(nextX); - y = yAxis(y); nextY = yAxis(nextY); + x = xAxis(x); + nextX = xAxis(nextX); + y = yAxis(y); + nextY = yAxis(nextY); path += `M ${x} ${y} L ${nextX} ${nextY} z `; }); @@ -188,7 +190,7 @@ class SeriesChart extends Operation { .attr("stroke", seriesColours[seriesIndex % seriesColours.length]) .attr("stroke-width", "1"); - xValues.forEach(x => { + xValues.forEach((x) => { const y = serie.data[x]; if (typeof y === "undefined") return; @@ -199,7 +201,7 @@ class SeriesChart extends Operation { .attr("r", pipRadius) .attr("fill", seriesColours[seriesIndex % seriesColours.length]) .append("title") - .text(d => { + .text((d) => { return `${x}\n --\n ${tooltipText[x]}\n @@ -209,13 +211,19 @@ class SeriesChart extends Operation { yAxesArea .append("g") - .attr("transform", `translate(${seriesLabelWidth - interSeriesPadding}, ${seriesHeight * seriesIndex + interSeriesPadding * (seriesIndex + 1)})`) + .attr( + "transform", + `translate(${seriesLabelWidth - interSeriesPadding}, ${seriesHeight * seriesIndex + interSeriesPadding * (seriesIndex + 1)})` + ) .attr("class", "axis axis--y") .call(d3.axisLeft(yAxis).ticks(5)); yAxesArea .append("g") - .attr("transform", `translate(0, ${seriesHeight / 2 + seriesHeight * seriesIndex + interSeriesPadding * (seriesIndex + 1)})`) + .attr( + "transform", + `translate(0, ${seriesHeight / 2 + seriesHeight * seriesIndex + interSeriesPadding * (seriesIndex + 1)})` + ) .append("text") .style("text-anchor", "middle") .attr("transform", "rotate(-90)") @@ -224,7 +232,6 @@ class SeriesChart extends Operation { return svg._groups[0][0].outerHTML; } - } export default SeriesChart; diff --git a/src/core/operations/SetDifference.mjs b/src/core/operations/SetDifference.mjs index dc46c079..02cc34c9 100644 --- a/src/core/operations/SetDifference.mjs +++ b/src/core/operations/SetDifference.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Set Difference operation */ class SetDifference extends Operation { - /** * Set Difference constructor */ @@ -34,7 +33,7 @@ class SetDifference extends Operation { name: "Item delimiter", type: "binaryString", value: "," - }, + } ]; } @@ -45,8 +44,10 @@ class SetDifference extends Operation { * @throws {Error} if not two sets */ validateSampleNumbers(sets) { - if (!sets || (sets.length !== 2)) { - throw new OperationError("Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?"); + if (!sets || sets.length !== 2) { + throw new OperationError( + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?" + ); } } @@ -64,7 +65,7 @@ class SetDifference extends Operation { this.validateSampleNumbers(sets); - return this.runSetDifference(...sets.map(s => s.split(this.itemDelimiter))); + return this.runSetDifference(...sets.map((s) => s.split(this.itemDelimiter))); } /** @@ -81,7 +82,6 @@ class SetDifference extends Operation { }) .join(this.itemDelimiter); } - } export default SetDifference; diff --git a/src/core/operations/SetIntersection.mjs b/src/core/operations/SetIntersection.mjs index 7e6dbe10..af12fe12 100644 --- a/src/core/operations/SetIntersection.mjs +++ b/src/core/operations/SetIntersection.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Set Intersection operation */ class SetIntersection extends Operation { - /** * Set Intersection constructor */ @@ -34,7 +33,7 @@ class SetIntersection extends Operation { name: "Item delimiter", type: "binaryString", value: "," - }, + } ]; } @@ -45,8 +44,10 @@ class SetIntersection extends Operation { * @throws {Error} if not two sets */ validateSampleNumbers(sets) { - if (!sets || (sets.length !== 2)) { - throw new OperationError("Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?"); + if (!sets || sets.length !== 2) { + throw new OperationError( + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?" + ); } } @@ -64,7 +65,7 @@ class SetIntersection extends Operation { this.validateSampleNumbers(sets); - return this.runIntersect(...sets.map(s => s.split(this.itemDelimiter))); + return this.runIntersect(...sets.map((s) => s.split(this.itemDelimiter))); } /** @@ -81,7 +82,6 @@ class SetIntersection extends Operation { }) .join(this.itemDelimiter); } - } export default SetIntersection; diff --git a/src/core/operations/SetUnion.mjs b/src/core/operations/SetUnion.mjs index 80913063..546b9799 100644 --- a/src/core/operations/SetUnion.mjs +++ b/src/core/operations/SetUnion.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Set Union operation */ class SetUnion extends Operation { - /** * Set Union constructor */ @@ -34,7 +33,7 @@ class SetUnion extends Operation { name: "Item delimiter", type: "binaryString", value: "," - }, + } ]; } @@ -45,8 +44,10 @@ class SetUnion extends Operation { * @throws {Error} if not two sets */ validateSampleNumbers(sets) { - if (!sets || (sets.length !== 2)) { - throw new OperationError("Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?"); + if (!sets || sets.length !== 2) { + throw new OperationError( + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?" + ); } } @@ -64,7 +65,7 @@ class SetUnion extends Operation { this.validateSampleNumbers(sets); - return this.runUnion(...sets.map(s => s.split(this.itemDelimiter))); + return this.runUnion(...sets.map((s) => s.split(this.itemDelimiter))); } /** diff --git a/src/core/operations/Shake.mjs b/src/core/operations/Shake.mjs index 69e034e6..670de9c8 100644 --- a/src/core/operations/Shake.mjs +++ b/src/core/operations/Shake.mjs @@ -12,7 +12,6 @@ import JSSHA3 from "js-sha3"; * Shake operation */ class Shake extends Operation { - /** * Shake constructor */ @@ -21,7 +20,8 @@ class Shake extends Operation { this.name = "Shake"; this.module = "Crypto"; - this.description = "Shake is an Extendable Output Function (XOF) of the SHA-3 hash algorithm, part of the Keccak family, allowing for variable output length/size."; + this.description + = "Shake is an Extendable Output Function (XOF) of the SHA-3 hash algorithm, part of the Keccak family, allowing for variable output length/size."; this.infoURL = "https://wikipedia.org/wiki/SHA-3#Instances"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -49,8 +49,7 @@ class Shake extends Operation { size = args[1]; let algo; - if (size < 0) - throw new OperationError("Size must be greater than 0"); + if (size < 0) throw new OperationError("Size must be greater than 0"); switch (capacity) { case 128: @@ -65,7 +64,6 @@ class Shake extends Operation { return algo(input, size); } - } export default Shake; diff --git a/src/core/operations/SharpenImage.mjs b/src/core/operations/SharpenImage.mjs index eb033ad2..491ad864 100644 --- a/src/core/operations/SharpenImage.mjs +++ b/src/core/operations/SharpenImage.mjs @@ -16,7 +16,6 @@ import jimp from "jimp"; * Sharpen Image operation */ class SharpenImage extends Operation { - /** * SharpenImage constructor */ @@ -74,18 +73,14 @@ class SharpenImage extends Operation { } try { - if (isWorkerEnvironment()) - self.sendStatusMessage("Sharpening image... (Cloning image)"); + if (isWorkerEnvironment()) self.sendStatusMessage("Sharpening image... (Cloning image)"); const blurMask = image.clone(); - if (isWorkerEnvironment()) - self.sendStatusMessage("Sharpening image... (Blurring cloned image)"); + if (isWorkerEnvironment()) self.sendStatusMessage("Sharpening image... (Blurring cloned image)"); const blurImage = gaussianBlur(image.clone(), radius); - - if (isWorkerEnvironment()) - self.sendStatusMessage("Sharpening image... (Creating unsharp mask)"); - blurMask.scan(0, 0, blurMask.bitmap.width, blurMask.bitmap.height, function(x, y, idx) { + if (isWorkerEnvironment()) self.sendStatusMessage("Sharpening image... (Creating unsharp mask)"); + blurMask.scan(0, 0, blurMask.bitmap.width, blurMask.bitmap.height, function (x, y, idx) { const blurRed = blurImage.bitmap.data[idx]; const blurGreen = blurImage.bitmap.data[idx + 1]; const blurBlue = blurImage.bitmap.data[idx + 2]; @@ -95,14 +90,13 @@ class SharpenImage extends Operation { const normalBlue = this.bitmap.data[idx + 2]; // Subtract blurred pixel value from normal image - this.bitmap.data[idx] = (normalRed > blurRed) ? normalRed - blurRed : 0; - this.bitmap.data[idx + 1] = (normalGreen > blurGreen) ? normalGreen - blurGreen : 0; - this.bitmap.data[idx + 2] = (normalBlue > blurBlue) ? normalBlue - blurBlue : 0; + this.bitmap.data[idx] = normalRed > blurRed ? normalRed - blurRed : 0; + this.bitmap.data[idx + 1] = normalGreen > blurGreen ? normalGreen - blurGreen : 0; + this.bitmap.data[idx + 2] = normalBlue > blurBlue ? normalBlue - blurBlue : 0; }); - if (isWorkerEnvironment()) - self.sendStatusMessage("Sharpening image... (Merging with unsharp mask)"); - image.scan(0, 0, image.bitmap.width, image.bitmap.height, function(x, y, idx) { + if (isWorkerEnvironment()) self.sendStatusMessage("Sharpening image... (Merging with unsharp mask)"); + image.scan(0, 0, image.bitmap.width, image.bitmap.height, function (x, y, idx) { let maskRed = blurMask.bitmap.data[idx]; let maskGreen = blurMask.bitmap.data[idx + 1]; let maskBlue = blurMask.bitmap.data[idx + 2]; @@ -112,8 +106,8 @@ class SharpenImage extends Operation { const normalBlue = this.bitmap.data[idx + 2]; // Calculate luminance - const maskLuminance = (0.2126 * maskRed + 0.7152 * maskGreen + 0.0722 * maskBlue); - const normalLuminance = (0.2126 * normalRed + 0.7152 * normalGreen + 0.0722 * normalBlue); + const maskLuminance = 0.2126 * maskRed + 0.7152 * maskGreen + 0.0722 * maskBlue; + const normalLuminance = 0.2126 * normalRed + 0.7152 * normalGreen + 0.0722 * normalBlue; let luminanceDiff; if (maskLuminance > normalLuminance) { @@ -129,9 +123,9 @@ class SharpenImage extends Operation { // Only change pixel value if the difference is higher than threshold if ((luminanceDiff / 255) * 100 >= threshold) { - this.bitmap.data[idx] = (normalRed + maskRed) <= 255 ? normalRed + maskRed : 255; - this.bitmap.data[idx + 1] = (normalGreen + maskGreen) <= 255 ? normalGreen + maskGreen : 255; - this.bitmap.data[idx + 2] = (normalBlue + maskBlue) <= 255 ? normalBlue + maskBlue : 255; + this.bitmap.data[idx] = normalRed + maskRed <= 255 ? normalRed + maskRed : 255; + this.bitmap.data[idx + 1] = normalGreen + maskGreen <= 255 ? normalGreen + maskGreen : 255; + this.bitmap.data[idx + 2] = normalBlue + maskBlue <= 255 ? normalBlue + maskBlue : 255; } }); @@ -163,7 +157,6 @@ class SharpenImage extends Operation { return ``; } - } export default SharpenImage; diff --git a/src/core/operations/ShowBase64Offsets.mjs b/src/core/operations/ShowBase64Offsets.mjs index 37d8a6ce..de8420b4 100644 --- a/src/core/operations/ShowBase64Offsets.mjs +++ b/src/core/operations/ShowBase64Offsets.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {fromBase64, toBase64} from "../lib/Base64.mjs"; +import { fromBase64, toBase64 } from "../lib/Base64.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * Show Base64 offsets operation */ class ShowBase64Offsets extends Operation { - /** * ShowBase64Offsets constructor */ @@ -22,7 +21,8 @@ class ShowBase64Offsets extends Operation { this.name = "Show Base64 offsets"; this.module = "Default"; - this.description = "When a string is within a block of data and the whole block is Base64'd, the string itself could be represented in Base64 in three distinct ways depending on its offset within the block.

    This operation shows all possible offsets for a given string so that each possible encoding can be considered."; + this.description + = "When a string is within a block of data and the whole block is Base64'd, the string itself could be represented in Base64 in three distinct ways depending on its offset within the block.

    This operation shows all possible offsets for a given string so that each possible encoding can be considered."; this.infoURL = "https://wikipedia.org/wiki/Base64#Output_padding"; this.inputType = "byteArray"; this.outputType = "html"; @@ -75,53 +75,94 @@ class ShowBase64Offsets extends Operation { // Highlight offset 0 if (len0 % 4 === 2) { staticSection = offset0.slice(0, -3); - offset0 = "" + - staticSection + "" + - "" + offset0.substr(offset0.length - 3, 1) + "" + - "" + offset0.substr(offset0.length - 2) + ""; + offset0 + = "" + + staticSection + + "" + + "" + + offset0.substr(offset0.length - 3, 1) + + "" + + "" + + offset0.substr(offset0.length - 2) + + ""; } else if (len0 % 4 === 3) { staticSection = offset0.slice(0, -2); - offset0 = "" + - staticSection + "" + - "" + offset0.substr(offset0.length - 2, 1) + "" + - "" + offset0.substr(offset0.length - 1) + ""; + offset0 + = "" + + staticSection + + "" + + "" + + offset0.substr(offset0.length - 2, 1) + + "" + + "" + + offset0.substr(offset0.length - 1) + + ""; } else { staticSection = offset0; - offset0 = "" + - staticSection + ""; + offset0 + = "" + + staticSection + + ""; } if (!showVariable) { offset0 = staticSection; } - // Highlight offset 1 - padding = "" + offset1.substr(0, 1) + "" + - "" + offset1.substr(1, 1) + ""; + padding + = "" + + offset1.substr(0, 1) + + "" + + "" + + offset1.substr(1, 1) + + ""; offset1 = offset1.substr(2); if (len1 % 4 === 2) { staticSection = offset1.slice(0, -3); - offset1 = padding + "" + - staticSection + "" + - "" + offset1.substr(offset1.length - 3, 1) + "" + - "" + offset1.substr(offset1.length - 2) + ""; + offset1 + = padding + + "" + + staticSection + + "" + + "" + + offset1.substr(offset1.length - 3, 1) + + "" + + "" + + offset1.substr(offset1.length - 2) + + ""; } else if (len1 % 4 === 3) { staticSection = offset1.slice(0, -2); - offset1 = padding + "" + - staticSection + "" + - "" + offset1.substr(offset1.length - 2, 1) + "" + - "" + offset1.substr(offset1.length - 1) + ""; + offset1 + = padding + + "" + + staticSection + + "" + + "" + + offset1.substr(offset1.length - 2, 1) + + "" + + "" + + offset1.substr(offset1.length - 1) + + ""; } else { staticSection = offset1; - offset1 = padding + "" + - staticSection + ""; + offset1 + = padding + + "" + + staticSection + + ""; } if (!showVariable) { @@ -129,45 +170,73 @@ class ShowBase64Offsets extends Operation { } // Highlight offset 2 - padding = "" + offset2.substr(0, 2) + "" + - "" + offset2.substr(2, 1) + ""; + padding + = "" + + offset2.substr(0, 2) + + "" + + "" + + offset2.substr(2, 1) + + ""; offset2 = offset2.substr(3); if (len2 % 4 === 2) { staticSection = offset2.slice(0, -3); - offset2 = padding + "" + - staticSection + "" + - "" + offset2.substr(offset2.length - 3, 1) + "" + - "" + offset2.substr(offset2.length - 2) + ""; + offset2 + = padding + + "" + + staticSection + + "" + + "" + + offset2.substr(offset2.length - 3, 1) + + "" + + "" + + offset2.substr(offset2.length - 2) + + ""; } else if (len2 % 4 === 3) { staticSection = offset2.slice(0, -2); - offset2 = padding + "" + - staticSection + "" + - "" + offset2.substr(offset2.length - 2, 1) + "" + - "" + offset2.substr(offset2.length - 1) + ""; + offset2 + = padding + + "" + + staticSection + + "" + + "" + + offset2.substr(offset2.length - 2, 1) + + "" + + "" + + offset2.substr(offset2.length - 1) + + ""; } else { staticSection = offset2; - offset2 = padding + "" + - staticSection + ""; + offset2 + = padding + + "" + + staticSection + + ""; } if (!showVariable) { offset2 = staticSection; } - return (showVariable ? "Characters highlighted in green could change if the input is surrounded by more data." + - "\nCharacters highlighted in red are for padding purposes only." + - "\nUnhighlighted characters are static." + - "\nHover over the static sections to see what they decode to on their own.\n" + - "\nOffset 0: " + offset0 + - "\nOffset 1: " + offset1 + - "\nOffset 2: " + offset2 + - script : - offset0 + "\n" + offset1 + "\n" + offset2); + return showVariable + ? "Characters highlighted in green could change if the input is surrounded by more data." + + "\nCharacters highlighted in red are for padding purposes only." + + "\nUnhighlighted characters are static." + + "\nHover over the static sections to see what they decode to on their own.\n" + + "\nOffset 0: " + + offset0 + + "\nOffset 1: " + + offset1 + + "\nOffset 2: " + + offset2 + + script + : offset0 + "\n" + offset1 + "\n" + offset2; } - } export default ShowBase64Offsets; diff --git a/src/core/operations/ShowOnMap.mjs b/src/core/operations/ShowOnMap.mjs index c2ac1c6e..33301185 100644 --- a/src/core/operations/ShowOnMap.mjs +++ b/src/core/operations/ShowOnMap.mjs @@ -5,14 +5,13 @@ */ import Operation from "../Operation.mjs"; -import {FORMATS, convertCoordinates} from "../lib/ConvertCoordinates.mjs"; +import { FORMATS, convertCoordinates } from "../lib/ConvertCoordinates.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * Show on map operation */ class ShowOnMap extends Operation { - /** * ShowOnMap constructor */ @@ -21,7 +20,8 @@ class ShowOnMap extends Operation { this.name = "Show on map"; this.module = "Hashing"; - this.description = "Displays co-ordinates on a slippy map.

    Co-ordinates will be converted to decimal degrees before being shown on the map.

    Supported formats:
    • Degrees Minutes Seconds (DMS)
    • Degrees Decimal Minutes (DDM)
    • Decimal Degrees (DD)
    • Geohash
    • Military Grid Reference System (MGRS)
    • Ordnance Survey National Grid (OSNG)
    • Universal Transverse Mercator (UTM)

    This operation will not work offline."; + this.description + = "Displays co-ordinates on a slippy map.

    Co-ordinates will be converted to decimal degrees before being shown on the map.

    Supported formats:
    • Degrees Minutes Seconds (DMS)
    • Degrees Decimal Minutes (DDM)
    • Decimal Degrees (DD)
    • Geohash
    • Military Grid Reference System (MGRS)
    • Ordnance Survey National Grid (OSNG)
    • Universal Transverse Mercator (UTM)

    This operation will not work offline."; this.infoURL = "https://foundation.wikimedia.org/wiki/Maps_Terms_of_Use"; this.inputType = "string"; this.outputType = "string"; @@ -40,15 +40,7 @@ class ShowOnMap extends Operation { { name: "Input Delimiter", type: "option", - value: [ - "Auto", - "Direction Preceding", - "Direction Following", - "\\n", - "Comma", - "Semi-colon", - "Colon" - ] + value: ["Auto", "Direction Preceding", "Direction Following", "\\n", "Comma", "Semi-colon", "Colon"] } ]; } @@ -86,7 +78,8 @@ class ShowOnMap extends Operation { } const zoomLevel = args[0]; const tileUrl = "https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png", - tileAttribution = "Wikimedia maps | © OpenStreetMap contributors", + tileAttribution + = 'Wikimedia maps | © OpenStreetMap contributors', leafletUrl = "https://unpkg.com/leaflet@1.5.0/dist/leaflet.js", leafletCssUrl = "https://unpkg.com/leaflet@1.5.0/dist/leaflet.css"; return ` diff --git a/src/core/operations/Shuffle.mjs b/src/core/operations/Shuffle.mjs index 14c4ffab..957b36e9 100644 --- a/src/core/operations/Shuffle.mjs +++ b/src/core/operations/Shuffle.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Shuffle operation */ class Shuffle extends Operation { - /** * Shuffle constructor */ @@ -44,18 +43,21 @@ class Shuffle extends Operation { if (input.length === 0) return input; // return a random number in [0, 1) - const rng = (typeof crypto) !== "undefined" && crypto.getRandomValues ? (function() { - const buf = new Uint32Array(2); - return function() { - // generate 53-bit random integer: 21 + 32 bits - crypto.getRandomValues(buf); - const value = (buf[0] >>> (32 - 21)) * ((1 << 30) * 4) + buf[1]; - return value / ((1 << 23) * (1 << 30)); - }; - })() : Math.random; + const rng + = typeof crypto !== "undefined" && crypto.getRandomValues + ? (function () { + const buf = new Uint32Array(2); + return function () { + // generate 53-bit random integer: 21 + 32 bits + crypto.getRandomValues(buf); + const value = (buf[0] >>> (32 - 21)) * ((1 << 30) * 4) + buf[1]; + return value / ((1 << 23) * (1 << 30)); + }; + })() + : Math.random; // return a random integer in [0, max) - const randint = function(max) { + const randint = function (max) { return Math.floor(rng() * max); }; @@ -72,7 +74,6 @@ class Shuffle extends Operation { return toShuffle.join(delim); } - } export default Shuffle; diff --git a/src/core/operations/Sleep.mjs b/src/core/operations/Sleep.mjs index 1e7b657a..2c3e89a3 100644 --- a/src/core/operations/Sleep.mjs +++ b/src/core/operations/Sleep.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Sleep operation */ class Sleep extends Operation { - /** * Sleep constructor */ @@ -19,7 +18,8 @@ class Sleep extends Operation { this.name = "Sleep"; this.module = "Default"; - this.description = "Sleep causes the recipe to wait for a specified number of milliseconds before continuing execution."; + this.description + = "Sleep causes the recipe to wait for a specified number of milliseconds before continuing execution."; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; this.args = [ @@ -38,10 +38,9 @@ class Sleep extends Operation { */ async run(input, args) { const ms = args[0]; - await new Promise(r => setTimeout(r, ms)); + await new Promise((r) => setTimeout(r, ms)); return input; } - } export default Sleep; diff --git a/src/core/operations/Snefru.mjs b/src/core/operations/Snefru.mjs index ae5859b3..9be438de 100644 --- a/src/core/operations/Snefru.mjs +++ b/src/core/operations/Snefru.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * Snefru operation */ class Snefru extends Operation { - /** * Snefru constructor */ @@ -20,7 +19,8 @@ class Snefru extends Operation { this.name = "Snefru"; this.module = "Crypto"; - this.description = "Snefru is a cryptographic hash function invented by Ralph Merkle in 1990 while working at Xerox PARC. The function supports 128-bit and 256-bit output. It was named after the Egyptian Pharaoh Sneferu, continuing the tradition of the Khufu and Khafre block ciphers.

    The original design of Snefru was shown to be insecure by Eli Biham and Adi Shamir who were able to use differential cryptanalysis to find hash collisions. The design was then modified by increasing the number of iterations of the main pass of the algorithm from two to eight."; + this.description + = "Snefru is a cryptographic hash function invented by Ralph Merkle in 1990 while working at Xerox PARC. The function supports 128-bit and 256-bit output. It was named after the Egyptian Pharaoh Sneferu, continuing the tradition of the Khufu and Khafre block ciphers.

    The original design of Snefru was shown to be insecure by Eli Biham and Adi Shamir who were able to use differential cryptanalysis to find hash collisions. The design was then modified by increasing the number of iterations of the main pass of the algorithm from two to eight."; this.infoURL = "https://wikipedia.org/wiki/Snefru"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -52,7 +52,6 @@ class Snefru extends Operation { rounds: args[1] }); } - } export default Snefru; diff --git a/src/core/operations/Sort.mjs b/src/core/operations/Sort.mjs index 7a4714be..bc824443 100644 --- a/src/core/operations/Sort.mjs +++ b/src/core/operations/Sort.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; -import {caseInsensitiveSort, ipSort, numericSort, hexadecimalSort, lengthSort} from "../lib/Sort.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; +import { caseInsensitiveSort, ipSort, numericSort, hexadecimalSort, lengthSort } from "../lib/Sort.mjs"; /** * Sort operation */ class Sort extends Operation { - /** * Sort constructor */ @@ -22,7 +21,8 @@ class Sort extends Operation { this.name = "Sort"; this.module = "Default"; - this.description = "Alphabetically sorts strings separated by the specified delimiter.

    The IP address option supports IPv4 only."; + this.description + = "Alphabetically sorts strings separated by the specified delimiter.

    The IP address option supports IPv4 only."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -39,7 +39,14 @@ class Sort extends Operation { { "name": "Order", "type": "option", - "value": ["Alphabetical (case sensitive)", "Alphabetical (case insensitive)", "IP address", "Numeric", "Numeric (hexadecimal)", "Length"] + "value": [ + "Alphabetical (case sensitive)", + "Alphabetical (case insensitive)", + "IP address", + "Numeric", + "Numeric (hexadecimal)", + "Length" + ] } ]; } @@ -72,7 +79,6 @@ class Sort extends Operation { if (sortReverse) sorted.reverse(); return sorted.join(delim); } - } export default Sort; diff --git a/src/core/operations/Split.mjs b/src/core/operations/Split.mjs index 0da1f101..017dab99 100644 --- a/src/core/operations/Split.mjs +++ b/src/core/operations/Split.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {SPLIT_DELIM_OPTIONS, JOIN_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { SPLIT_DELIM_OPTIONS, JOIN_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Split operation */ class Split extends Operation { - /** * Split constructor */ @@ -49,7 +48,6 @@ class Split extends Operation { return sections.join(joinDelim); } - } export default Split; diff --git a/src/core/operations/SplitColourChannels.mjs b/src/core/operations/SplitColourChannels.mjs index 339a356d..cc85fc44 100644 --- a/src/core/operations/SplitColourChannels.mjs +++ b/src/core/operations/SplitColourChannels.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {isImage} from "../lib/FileType.mjs"; +import { isImage } from "../lib/FileType.mjs"; import jimp from "jimp"; /** * Split Colour Channels operation */ class SplitColourChannels extends Operation { - /** * SplitColourChannels constructor */ @@ -48,11 +47,11 @@ class SplitColourChannels extends Operation { const split = parsedImage .clone() .color([ - {apply: "blue", params: [-255]}, - {apply: "green", params: [-255]} + { apply: "blue", params: [-255] }, + { apply: "green", params: [-255] } ]) .getBufferAsync(jimp.MIME_PNG); - resolve(new File([new Uint8Array((await split).values())], "red.png", {type: "image/png"})); + resolve(new File([new Uint8Array((await split).values())], "red.png", { type: "image/png" })); } catch (err) { reject(new OperationError(`Could not split red channel: ${err}`)); } @@ -60,12 +59,14 @@ class SplitColourChannels extends Operation { const green = new Promise(async (resolve, reject) => { try { - const split = parsedImage.clone() + const split = parsedImage + .clone() .color([ - {apply: "red", params: [-255]}, - {apply: "blue", params: [-255]}, - ]).getBufferAsync(jimp.MIME_PNG); - resolve(new File([new Uint8Array((await split).values())], "green.png", {type: "image/png"})); + { apply: "red", params: [-255] }, + { apply: "blue", params: [-255] } + ]) + .getBufferAsync(jimp.MIME_PNG); + resolve(new File([new Uint8Array((await split).values())], "green.png", { type: "image/png" })); } catch (err) { reject(new OperationError(`Could not split green channel: ${err}`)); } @@ -75,10 +76,11 @@ class SplitColourChannels extends Operation { try { const split = parsedImage .color([ - {apply: "red", params: [-255]}, - {apply: "green", params: [-255]}, - ]).getBufferAsync(jimp.MIME_PNG); - resolve(new File([new Uint8Array((await split).values())], "blue.png", {type: "image/png"})); + { apply: "red", params: [-255] }, + { apply: "green", params: [-255] } + ]) + .getBufferAsync(jimp.MIME_PNG); + resolve(new File([new Uint8Array((await split).values())], "blue.png", { type: "image/png" })); } catch (err) { reject(new OperationError(`Could not split blue channel: ${err}`)); } @@ -96,7 +98,6 @@ class SplitColourChannels extends Operation { async present(files) { return await Utils.displayFilesAsHTML(files); } - } export default SplitColourChannels; diff --git a/src/core/operations/StandardDeviation.mjs b/src/core/operations/StandardDeviation.mjs index d0509dcd..6f4a8efc 100644 --- a/src/core/operations/StandardDeviation.mjs +++ b/src/core/operations/StandardDeviation.mjs @@ -10,12 +10,10 @@ import Operation from "../Operation.mjs"; import { stdDev, createNumArray } from "../lib/Arithmetic.mjs"; import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; - /** * Standard Deviation operation */ class StandardDeviation extends Operation { - /** * StandardDeviation constructor */ @@ -24,7 +22,8 @@ class StandardDeviation extends Operation { this.name = "Standard Deviation"; this.module = "Default"; - this.description = "Computes the standard deviation of a number list. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 becomes 4.089281382128433"; + this.description + = "Computes the standard deviation of a number list. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 becomes 4.089281382128433"; this.infoURL = "https://wikipedia.org/wiki/Standard_deviation"; this.inputType = "string"; this.outputType = "BigNumber"; @@ -32,7 +31,7 @@ class StandardDeviation extends Operation { { "name": "Delimiter", "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, + "value": ARITHMETIC_DELIM_OPTIONS } ]; } @@ -45,9 +44,7 @@ class StandardDeviation extends Operation { run(input, args) { const val = stdDev(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); - } - } export default StandardDeviation; diff --git a/src/core/operations/Streebog.mjs b/src/core/operations/Streebog.mjs index b65accf6..b029ccc5 100644 --- a/src/core/operations/Streebog.mjs +++ b/src/core/operations/Streebog.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import GostDigest from "../vendor/gost/gostDigest.mjs"; -import {toHexFast} from "../lib/Hex.mjs"; +import { toHexFast } from "../lib/Hex.mjs"; /** * Streebog operation */ class Streebog extends Operation { - /** * Streebog constructor */ @@ -22,7 +21,8 @@ class Streebog extends Operation { this.name = "Streebog"; this.module = "Hashing"; - this.description = "Streebog is a cryptographic hash function defined in the Russian national standard GOST R 34.11-2012 Information Technology \u2013 Cryptographic Information Security \u2013 Hash Function. It was created to replace an obsolete GOST hash function defined in the old standard GOST R 34.11-94, and as an asymmetric reply to SHA-3 competition by the US National Institute of Standards and Technology."; + this.description + = "Streebog is a cryptographic hash function defined in the Russian national standard GOST R 34.11-2012 Information Technology \u2013 Cryptographic Information Security \u2013 Hash Function. It was created to replace an obsolete GOST hash function defined in the old standard GOST R 34.11-94, and as an asymmetric reply to SHA-3 competition by the US National Institute of Standards and Technology."; this.infoURL = "https://wikipedia.org/wiki/Streebog"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -57,7 +57,6 @@ class Streebog extends Operation { throw new OperationError(err); } } - } export default Streebog; diff --git a/src/core/operations/Strings.mjs b/src/core/operations/Strings.mjs index dca2433a..d15ed55b 100644 --- a/src/core/operations/Strings.mjs +++ b/src/core/operations/Strings.mjs @@ -13,7 +13,6 @@ import { caseInsensitiveSort } from "../lib/Sort.mjs"; * Strings operation */ class Strings extends Operation { - /** * Strings constructor */ @@ -41,8 +40,14 @@ class Strings extends Operation { name: "Match", type: "option", value: [ - "[ASCII]", "Alphanumeric + punctuation (A)", "All printable chars (A)", "Null-terminated strings (A)", - "[Unicode]", "Alphanumeric + punctuation (U)", "All printable chars (U)", "Null-terminated strings (U)" + "[ASCII]", + "Alphanumeric + punctuation (A)", + "All printable chars (A)", + "Null-terminated strings (A)", + "[Unicode]", + "Alphanumeric + punctuation (U)", + "All printable chars (U)", + "Null-terminated strings (U)" ] }, { @@ -119,13 +124,7 @@ class Strings extends Operation { } const regex = new XRegExp(strings, "ig"); - const results = search( - input, - regex, - null, - sort ? caseInsensitiveSort : null, - unique - ); + const results = search(input, regex, null, sort ? caseInsensitiveSort : null, unique); if (displayTotal) { return `Total found: ${results.length}\n\n${results.join("\n")}`; @@ -133,7 +132,6 @@ class Strings extends Operation { return results.join("\n"); } } - } export default Strings; diff --git a/src/core/operations/StripHTMLTags.mjs b/src/core/operations/StripHTMLTags.mjs index 9670cc3d..87087a75 100644 --- a/src/core/operations/StripHTMLTags.mjs +++ b/src/core/operations/StripHTMLTags.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Strip HTML tags operation */ class StripHTMLTags extends Operation { - /** * StripHTMLTags constructor */ @@ -37,9 +36,9 @@ class StripHTMLTags extends Operation { ]; this.checks = [ { - pattern: "(|
    |)", - flags: "i", - args: [true, true] + pattern: "(||)", + flags: "i", + args: [true, true] } ]; } @@ -66,7 +65,6 @@ class StripHTMLTags extends Operation { return input; } - } export default StripHTMLTags; diff --git a/src/core/operations/StripHTTPHeaders.mjs b/src/core/operations/StripHTTPHeaders.mjs index 2160e3e7..598c3842 100644 --- a/src/core/operations/StripHTTPHeaders.mjs +++ b/src/core/operations/StripHTTPHeaders.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Strip HTTP headers operation */ class StripHTTPHeaders extends Operation { - /** * StripHTTPHeaders constructor */ @@ -19,16 +18,17 @@ class StripHTTPHeaders extends Operation { this.name = "Strip HTTP headers"; this.module = "Default"; - this.description = "Removes HTTP headers from a request or response by looking for the first instance of a double newline."; + this.description + = "Removes HTTP headers from a request or response by looking for the first instance of a double newline."; this.infoURL = "https://wikipedia.org/wiki/Hypertext_Transfer_Protocol#Message_format"; this.inputType = "string"; this.outputType = "string"; this.args = []; this.checks = [ { - pattern: "^HTTP(.|\\s)+?(\\r?\\n){2}", - flags: "", - args: [] + pattern: "^HTTP(.|\\s)+?(\\r?\\n){2}", + flags: "", + args: [] } ]; } @@ -40,11 +40,10 @@ class StripHTTPHeaders extends Operation { */ run(input, args) { let headerEnd = input.indexOf("\r\n\r\n"); - headerEnd = (headerEnd < 0) ? input.indexOf("\n\n") + 2 : headerEnd + 4; + headerEnd = headerEnd < 0 ? input.indexOf("\n\n") + 2 : headerEnd + 4; - return (headerEnd < 2) ? input : input.slice(headerEnd, input.length); + return headerEnd < 2 ? input : input.slice(headerEnd, input.length); } - } export default StripHTTPHeaders; diff --git a/src/core/operations/Subsection.mjs b/src/core/operations/Subsection.mjs index a7da44b0..e2a52a7a 100644 --- a/src/core/operations/Subsection.mjs +++ b/src/core/operations/Subsection.mjs @@ -12,7 +12,6 @@ import Dish from "../Dish.mjs"; * Subsection operation */ class Subsection extends Operation { - /** * Subsection constructor */ @@ -22,7 +21,8 @@ class Subsection extends Operation { this.name = "Subsection"; this.flowControl = true; this.module = "Default"; - this.description = "Select a part of the input data using a regular expression (regex), and run all subsequent operations on each match separately.

    You can use up to one capture group, where the recipe will only be run on the data in the capture group. If there's more than one capture group, only the first one will be operated on.

    Use the Merge operation to reset the effects of subsection."; + this.description + = "Select a part of the input data using a regular expression (regex), and run all subsequent operations on each match separately.

    You can use up to one capture group, where the recipe will only be run on the data in the capture group. If there's more than one capture group, only the first one will be operated on.

    Use the Merge operation to reset the effects of subsection."; this.infoURL = ""; this.inputType = "string"; this.outputType = "string"; @@ -58,13 +58,13 @@ class Subsection extends Operation { * @returns {Object} - The updated state of the recipe */ async run(state) { - const opList = state.opList, - inputType = opList[state.progress].inputType, - outputType = opList[state.progress].outputType, - input = await state.dish.get(inputType), - ings = opList[state.progress].ingValues, + const opList = state.opList, + inputType = opList[state.progress].inputType, + outputType = opList[state.progress].outputType, + input = await state.dish.get(inputType), + ings = opList[state.progress].ingValues, [section, caseSensitive, global, ignoreErrors] = ings, - subOpList = []; + subOpList = []; if (input && section !== "") { // Set to 1 as if we are here, then there is one, the current one. @@ -74,14 +74,11 @@ class Subsection extends Operation { for (let i = state.progress + 1; i < opList.length; i++) { if (opList[i].name === "Merge" && !opList[i].disabled) { numOp--; - if (numOp === 0 || opList[i].ingValues[0]) - break; - else - // Not this subsection's Merge. - subOpList.push(opList[i]); + if (numOp === 0 || opList[i].ingValues[0]) break; + // Not this subsection's Merge. + else subOpList.push(opList[i]); } else { - if (opList[i].name === "Fork" || opList[i].name === "Subsection") - numOp++; + if (opList[i].name === "Fork" || opList[i].name === "Subsection") numOp++; subOpList.push(opList[i]); } } @@ -102,7 +99,7 @@ class Subsection extends Operation { state.forkOffset += state.progress + 1; // Take a deep(ish) copy of the ingredient values - const ingValues = subOpList.map(op => JSON.parse(JSON.stringify(op.ingValues))); + const ingValues = subOpList.map((op) => JSON.parse(JSON.stringify(op.ingValues))); let matched = false; // Run recipe over each match @@ -111,7 +108,8 @@ class Subsection extends Operation { // Add up to match let matchStr = m[0]; - if (m.length === 1) { // No capture groups + if (m.length === 1) { + // No capture groups output += input.slice(inOffset, m.index); inOffset = m.index + m[0].length; } else if (m.length >= 2) { @@ -155,7 +153,6 @@ class Subsection extends Operation { } return state; } - } export default Subsection; diff --git a/src/core/operations/Substitute.mjs b/src/core/operations/Substitute.mjs index 4a8cdc5d..8c37105b 100644 --- a/src/core/operations/Substitute.mjs +++ b/src/core/operations/Substitute.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Substitute operation */ class Substitute extends Operation { - /** * Substitute constructor */ @@ -20,7 +19,8 @@ class Substitute extends Operation { this.name = "Substitute"; this.module = "Default"; - this.description = "A substitution cipher allowing you to specify bytes to replace with other byte values. This can be used to create Caesar ciphers but is more powerful as any byte value can be substituted, not just letters, and the substitution values need not be in order.

    Enter the bytes you want to replace in the Plaintext field and the bytes to replace them with in the Ciphertext field.

    Non-printable bytes can be specified using string escape notation. For example, a line feed character can be written as either \\n or \\x0a.

    Byte ranges can be specified using a hyphen. For example, the sequence 0123456789 can be written as 0-9.

    Note that blackslash characters are used to escape special characters, so will need to be escaped themselves if you want to use them on their own (e.g.\\\\)."; + this.description + = "A substitution cipher allowing you to specify bytes to replace with other byte values. This can be used to create Caesar ciphers but is more powerful as any byte value can be substituted, not just letters, and the substitution values need not be in order.

    Enter the bytes you want to replace in the Plaintext field and the bytes to replace them with in the Ciphertext field.

    Non-printable bytes can be specified using string escape notation. For example, a line feed character can be written as either \\n or \\x0a.

    Byte ranges can be specified using a hyphen. For example, the sequence 0123456789 can be written as 0-9.

    Note that blackslash characters are used to escape special characters, so will need to be escaped themselves if you want to use them on their own (e.g.\\\\)."; this.infoURL = "https://wikipedia.org/wiki/Substitution_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -53,8 +53,7 @@ class Substitute extends Operation { * @returns {string} */ cipherSingleChar(char, dict, ignoreCase) { - if (!ignoreCase) - return dict[char] || char; + if (!ignoreCase) return dict[char] || char; const isUpperCase = char === char.toUpperCase(); @@ -67,17 +66,14 @@ class Substitute extends Operation { // check for the other case, if it is in the dictionary return the value with the right case if (isUpperCase) { - if (dict[char.toLowerCase()] !== undefined) - return dict[char.toLowerCase()].toUpperCase(); + if (dict[char.toLowerCase()] !== undefined) return dict[char.toLowerCase()].toUpperCase(); } else { - if (dict[char.toUpperCase()] !== undefined) - return dict[char.toUpperCase()].toLowerCase(); + if (dict[char.toUpperCase()] !== undefined) return dict[char.toUpperCase()].toLowerCase(); } return char; } - /** * @param {string} input * @param {Object[]} args @@ -106,7 +102,6 @@ class Substitute extends Operation { return output; } - } export default Substitute; diff --git a/src/core/operations/Subtract.mjs b/src/core/operations/Subtract.mjs index 3d9cb176..5be8980f 100644 --- a/src/core/operations/Subtract.mjs +++ b/src/core/operations/Subtract.mjs @@ -10,12 +10,10 @@ import Operation from "../Operation.mjs"; import { sub, createNumArray } from "../lib/Arithmetic.mjs"; import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; - /** * Subtract operation */ class Subtract extends Operation { - /** * Subtract constructor */ @@ -24,7 +22,8 @@ class Subtract extends Operation { this.name = "Subtract"; this.module = "Default"; - this.description = "Subtracts a list of numbers. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 becomes 1.5"; + this.description + = "Subtracts a list of numbers. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 becomes 1.5"; this.infoURL = "https://wikipedia.org/wiki/Subtraction"; this.inputType = "string"; this.outputType = "BigNumber"; @@ -32,7 +31,7 @@ class Subtract extends Operation { { "name": "Delimiter", "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, + "value": ARITHMETIC_DELIM_OPTIONS } ]; } @@ -46,7 +45,6 @@ class Subtract extends Operation { const val = sub(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Subtract; diff --git a/src/core/operations/Sum.mjs b/src/core/operations/Sum.mjs index dd7ebd3b..10f1292f 100644 --- a/src/core/operations/Sum.mjs +++ b/src/core/operations/Sum.mjs @@ -10,12 +10,10 @@ import Operation from "../Operation.mjs"; import { sum, createNumArray } from "../lib/Arithmetic.mjs"; import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; - /** * Sum operation */ class Sum extends Operation { - /** * Sum constructor */ @@ -24,7 +22,8 @@ class Sum extends Operation { this.name = "Sum"; this.module = "Default"; - this.description = "Adds together a list of numbers. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 becomes 18.5"; + this.description + = "Adds together a list of numbers. If an item in the string is not a number it is excluded from the list.

    e.g. 0x0a 8 .5 becomes 18.5"; this.infoURL = "https://wikipedia.org/wiki/Summation"; this.inputType = "string"; this.outputType = "BigNumber"; @@ -32,7 +31,7 @@ class Sum extends Operation { { "name": "Delimiter", "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, + "value": ARITHMETIC_DELIM_OPTIONS } ]; } @@ -46,7 +45,6 @@ class Sum extends Operation { const val = sum(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Sum; diff --git a/src/core/operations/SwapCase.mjs b/src/core/operations/SwapCase.mjs index 679d7703..85c1e5fe 100644 --- a/src/core/operations/SwapCase.mjs +++ b/src/core/operations/SwapCase.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Swap case operation */ class SwapCase extends Operation { - /** * SwapCase constructor */ @@ -70,7 +69,6 @@ class SwapCase extends Operation { highlightReverse(pos, args) { return pos; } - } export default SwapCase; diff --git a/src/core/operations/SwapEndianness.mjs b/src/core/operations/SwapEndianness.mjs index 872d3529..25ccc538 100644 --- a/src/core/operations/SwapEndianness.mjs +++ b/src/core/operations/SwapEndianness.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {toHex, fromHex} from "../lib/Hex.mjs"; +import { toHex, fromHex } from "../lib/Hex.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * Swap endianness operation */ class SwapEndianness extends Operation { - /** * SwapEndianness constructor */ @@ -22,7 +21,8 @@ class SwapEndianness extends Operation { this.name = "Swap endianness"; this.module = "Default"; - this.description = "Switches the data from big-endian to little-endian or vice-versa. Data can be read in as hexadecimal or raw bytes. It will be returned in the same format as it is entered."; + this.description + = "Switches the data from big-endian to little-endian or vice-versa. Data can be read in as hexadecimal or raw bytes. It will be returned in the same format as it is entered."; this.infoURL = "https://wikipedia.org/wiki/Endianness"; this.inputType = "string"; this.outputType = "string"; @@ -132,7 +132,6 @@ class SwapEndianness extends Operation { highlightReverse(pos, args) { return pos; } - } export default SwapEndianness; diff --git a/src/core/operations/SymmetricDifference.mjs b/src/core/operations/SymmetricDifference.mjs index f9044769..2cff68f9 100644 --- a/src/core/operations/SymmetricDifference.mjs +++ b/src/core/operations/SymmetricDifference.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Set Symmetric Difference operation */ class SymmetricDifference extends Operation { - /** * Symmetric Difference constructor */ @@ -35,7 +34,7 @@ class SymmetricDifference extends Operation { name: "Item delimiter", type: "binaryString", value: "," - }, + } ]; } @@ -46,8 +45,10 @@ class SymmetricDifference extends Operation { * @throws {Error} if not two sets */ validateSampleNumbers(sets) { - if (!sets || (sets.length !== 2)) { - throw new OperationError("Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?"); + if (!sets || sets.length !== 2) { + throw new OperationError( + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?" + ); } } @@ -65,7 +66,7 @@ class SymmetricDifference extends Operation { this.validateSampleNumbers(sets); - return this.runSymmetricDifference(...sets.map(s => s.split(this.itemDelimiter))); + return this.runSymmetricDifference(...sets.map((s) => s.split(this.itemDelimiter))); } /** @@ -89,11 +90,8 @@ class SymmetricDifference extends Operation { * @return {Object[]} */ runSymmetricDifference(a, b) { - return this.runSetDifference(a, b) - .concat(this.runSetDifference(b, a)) - .join(this.itemDelimiter); + return this.runSetDifference(a, b).concat(this.runSetDifference(b, a)).join(this.itemDelimiter); } - } export default SymmetricDifference; diff --git a/src/core/operations/SyntaxHighlighter.mjs b/src/core/operations/SyntaxHighlighter.mjs index b8c578d6..1e07db77 100644 --- a/src/core/operations/SyntaxHighlighter.mjs +++ b/src/core/operations/SyntaxHighlighter.mjs @@ -11,7 +11,6 @@ import hljs from "highlight.js"; * Syntax highlighter operation */ class SyntaxHighlighter extends Operation { - /** * SyntaxHighlighter constructor */ @@ -20,7 +19,8 @@ class SyntaxHighlighter extends Operation { this.name = "Syntax highlighter"; this.module = "Code"; - this.description = "Adds syntax highlighting to a range of source code languages. Note that this will not indent the code. Use one of the 'Beautify' operations for that."; + this.description + = "Adds syntax highlighting to a range of source code languages. Note that this will not indent the code. Use one of the 'Beautify' operations for that."; this.infoURL = "https://wikipedia.org/wiki/Syntax_highlighting"; this.inputType = "string"; this.outputType = "html"; @@ -73,7 +73,6 @@ class SyntaxHighlighter extends Operation { highlightReverse(pos, args) { return pos; } - } export default SyntaxHighlighter; diff --git a/src/core/operations/TCPIPChecksum.mjs b/src/core/operations/TCPIPChecksum.mjs index 0e5c6c60..c8a11867 100644 --- a/src/core/operations/TCPIPChecksum.mjs +++ b/src/core/operations/TCPIPChecksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * TCP/IP Checksum operation */ class TCPIPChecksum extends Operation { - /** * TCPIPChecksum constructor */ @@ -20,7 +19,8 @@ class TCPIPChecksum extends Operation { this.name = "TCP/IP Checksum"; this.module = "Crypto"; - this.description = "Calculates the checksum for a TCP (Transport Control Protocol) or IP (Internet Protocol) header from an input of raw bytes."; + this.description + = "Calculates the checksum for a TCP (Transport Control Protocol) or IP (Internet Protocol) header from an input of raw bytes."; this.infoURL = "https://wikipedia.org/wiki/IPv4_header_checksum"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -38,7 +38,7 @@ class TCPIPChecksum extends Operation { for (let i = 0; i < input.length; i++) { if (i % 2 === 0) { - csum += (input[i] << 8); + csum += input[i] << 8; } else { csum += input[i]; } @@ -48,7 +48,6 @@ class TCPIPChecksum extends Operation { return Utils.hex(0xffff - csum); } - } export default TCPIPChecksum; diff --git a/src/core/operations/Tail.mjs b/src/core/operations/Tail.mjs index 8a29bb2d..b2bb9f70 100644 --- a/src/core/operations/Tail.mjs +++ b/src/core/operations/Tail.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Tail operation */ class Tail extends Operation { - /** * Tail constructor */ @@ -21,7 +20,8 @@ class Tail extends Operation { this.name = "Tail"; this.module = "Default"; - this.description = "Like the UNIX tail utility.
    Gets the last n lines.
    Optionally you can select all lines after line n by entering a negative value for n.
    The delimiter can be changed so that instead of lines, fields (i.e. commas) are selected instead."; + this.description + = "Like the UNIX tail utility.
    Gets the last n lines.
    Optionally you can select all lines after line n by entering a negative value for n.
    The delimiter can be changed so that instead of lines, fields (i.e. commas) are selected instead."; this.infoURL = "https://wikipedia.org/wiki/Tail_(Unix)"; this.inputType = "string"; this.outputType = "string"; @@ -62,9 +62,7 @@ class Tail extends Operation { } }) .join(delimiter); - } - } export default Tail; diff --git a/src/core/operations/TakeBytes.mjs b/src/core/operations/TakeBytes.mjs index 431bbee1..6969edec 100644 --- a/src/core/operations/TakeBytes.mjs +++ b/src/core/operations/TakeBytes.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Take bytes operation */ class TakeBytes extends Operation { - /** * TakeBytes constructor */ @@ -54,11 +53,13 @@ class TakeBytes extends Operation { const applyToEachLine = args[2]; if (!applyToEachLine) { - if (start < 0) { // Take from the end + if (start < 0) { + // Take from the end start = input.byteLength + start; } - if (length < 0) { // Flip start point + if (length < 0) { + // Flip start point start = start + length; if (start < 0) { start = input.byteLength + start; @@ -68,7 +69,7 @@ class TakeBytes extends Operation { } } - return input.slice(start, start+length); + return input.slice(start, start + length); } // Split input into lines @@ -91,11 +92,13 @@ class TakeBytes extends Operation { let s = start, l = length; for (i = 0; i < lines.length; i++) { - if (s < 0) { // Take from the end + if (s < 0) { + // Take from the end s = lines[i].length + s; } - if (l < 0) { // Flip start point + if (l < 0) { + // Flip start point s = s + l; if (s < 0) { s = lines[i].length + s; @@ -104,14 +107,13 @@ class TakeBytes extends Operation { l = -l; } } - output = output.concat(lines[i].slice(s, s+l)); + output = output.concat(lines[i].slice(s, s + l)); output.push(0x0a); s = start; l = length; } - return new Uint8Array(output.slice(0, output.length-1)).buffer; + return new Uint8Array(output.slice(0, output.length - 1)).buffer; } - } export default TakeBytes; diff --git a/src/core/operations/Tar.mjs b/src/core/operations/Tar.mjs index 3078d959..a5d06921 100644 --- a/src/core/operations/Tar.mjs +++ b/src/core/operations/Tar.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Tar operation */ class Tar extends Operation { - /** * Tar constructor */ @@ -41,25 +40,25 @@ class Tar extends Operation { run(input, args) { input = new Uint8Array(input); - const Tarball = function() { + const Tarball = function () { this.bytes = new Array(512); this.position = 0; }; - Tarball.prototype.addEmptyBlock = function() { + Tarball.prototype.addEmptyBlock = function () { const filler = new Array(512); filler.fill(0); this.bytes = this.bytes.concat(filler); }; - Tarball.prototype.writeBytes = function(bytes) { + Tarball.prototype.writeBytes = function (bytes) { const self = this; if (this.position + bytes.length > this.bytes.length) { this.addEmptyBlock(); } - Array.prototype.forEach.call(bytes, function(b, i) { + Array.prototype.forEach.call(bytes, function (b, i) { if (typeof b.charCodeAt !== "undefined") { b = b.charCodeAt(); } @@ -69,7 +68,7 @@ class Tar extends Operation { }); }; - Tarball.prototype.writeEndBlocks = function() { + Tarball.prototype.writeEndBlocks = function () { const numEmptyBlocks = 2; for (let i = 0; i < numEmptyBlocks; i++) { this.addEmptyBlock(); @@ -96,13 +95,13 @@ class Tar extends Operation { ownerGroupName: Utils.padBytesRight("", 32), deviceMajor: Utils.padBytesRight("", 8), deviceMinor: Utils.padBytesRight("", 8), - fileNamePrefix: Utils.padBytesRight("", 155), + fileNamePrefix: Utils.padBytesRight("", 155) }; let checksum = 0; for (const key in file) { const bytes = file[key]; - Array.prototype.forEach.call(bytes, function(b) { + Array.prototype.forEach.call(bytes, function (b) { if (typeof b.charCodeAt !== "undefined") { checksum += b.charCodeAt(); } else { @@ -136,7 +135,6 @@ class Tar extends Operation { return new File([new Uint8Array(tarball.bytes)], args[0]); } - } export default Tar; diff --git a/src/core/operations/TextEncodingBruteForce.mjs b/src/core/operations/TextEncodingBruteForce.mjs index ae96fd0a..ff89856d 100644 --- a/src/core/operations/TextEncodingBruteForce.mjs +++ b/src/core/operations/TextEncodingBruteForce.mjs @@ -8,13 +8,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import cptable from "codepage"; -import {CHR_ENC_CODE_PAGES} from "../lib/ChrEnc.mjs"; +import { CHR_ENC_CODE_PAGES } from "../lib/ChrEnc.mjs"; /** * Text Encoding Brute Force operation */ class TextEncodingBruteForce extends Operation { - /** * TextEncodingBruteForce constructor */ @@ -28,7 +27,9 @@ class TextEncodingBruteForce extends Operation { "

    ", "Supported charsets are:", "" ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Character_encoding"; @@ -54,7 +55,7 @@ class TextEncodingBruteForce extends Operation { charsets = Object.keys(CHR_ENC_CODE_PAGES), mode = args[0]; - charsets.forEach(charset => { + charsets.forEach((charset) => { try { if (mode === "Decode") { output[charset] = cptable.utils.decode(CHR_ENC_CODE_PAGES[charset], input); @@ -76,7 +77,8 @@ class TextEncodingBruteForce extends Operation { * @returns {html} */ present(encodings) { - let table = ""; + let table + = "
    EncodingValue
    "; for (const enc in encodings) { const value = Utils.escapeHtml(Utils.escapeWhitespace(encodings[enc])); @@ -86,7 +88,6 @@ class TextEncodingBruteForce extends Operation { table += "
    EncodingValue
    "; return table; } - } export default TextEncodingBruteForce; diff --git a/src/core/operations/ToBCD.mjs b/src/core/operations/ToBCD.mjs index 3908742c..23c85766 100644 --- a/src/core/operations/ToBCD.mjs +++ b/src/core/operations/ToBCD.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ENCODING_SCHEME, ENCODING_LOOKUP, FORMAT} from "../lib/BCD.mjs"; +import { ENCODING_SCHEME, ENCODING_LOOKUP, FORMAT } from "../lib/BCD.mjs"; import BigNumber from "bignumber.js"; /** * To BCD operation */ class ToBCD extends Operation { - /** * ToBCD constructor */ @@ -23,7 +22,8 @@ class ToBCD extends Operation { this.name = "To BCD"; this.module = "Default"; - this.description = "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign"; + this.description + = "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign"; this.infoURL = "https://wikipedia.org/wiki/Binary-coded_decimal"; this.inputType = "BigNumber"; this.outputType = "string"; @@ -57,8 +57,7 @@ class ToBCD extends Operation { * @returns {string} */ run(input, args) { - if (input.isNaN()) - throw new OperationError("Invalid input"); + if (input.isNaN()) throw new OperationError("Invalid input"); if (!input.integerValue(BigNumber.ROUND_DOWN).isEqualTo(input)) throw new OperationError("Fractional values are not supported by BCD"); @@ -76,7 +75,7 @@ class ToBCD extends Operation { let nibbles = []; - digits.forEach(d => { + digits.forEach((d) => { const n = parseInt(d, 10); nibbles.push(encoding[n]); }); @@ -100,8 +99,8 @@ class ToBCD extends Operation { let encoded = 0, little = false; - nibbles.forEach(n => { - encoded ^= little ? n : (n << 4); + nibbles.forEach((n) => { + encoded ^= little ? n : n << 4; if (little) { bytes.push(encoded); encoded = 0; @@ -114,29 +113,34 @@ class ToBCD extends Operation { bytes = nibbles; // Add null high nibbles - nibbles = nibbles.map(n => { - return [0, n]; - }).reduce((a, b) => { - return a.concat(b); - }); + nibbles = nibbles + .map((n) => { + return [0, n]; + }) + .reduce((a, b) => { + return a.concat(b); + }); } // Output switch (outputFormat) { case "Nibbles": - return nibbles.map(n => { - return n.toString(2).padStart(4, "0"); - }).join(" "); + return nibbles + .map((n) => { + return n.toString(2).padStart(4, "0"); + }) + .join(" "); case "Bytes": - return bytes.map(b => { - return b.toString(2).padStart(8, "0"); - }).join(" "); + return bytes + .map((b) => { + return b.toString(2).padStart(8, "0"); + }) + .join(" "); case "Raw": default: return Utils.byteArrayToChars(bytes); } } - } export default ToBCD; diff --git a/src/core/operations/ToBase.mjs b/src/core/operations/ToBase.mjs index 09a91571..6309b6fa 100644 --- a/src/core/operations/ToBase.mjs +++ b/src/core/operations/ToBase.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * To Base operation */ class ToBase extends Operation { - /** * ToBase constructor */ @@ -48,7 +47,6 @@ class ToBase extends Operation { } return input.toString(radix); } - } export default ToBase; diff --git a/src/core/operations/ToBase32.mjs b/src/core/operations/ToBase32.mjs index fd36f550..d8a98531 100644 --- a/src/core/operations/ToBase32.mjs +++ b/src/core/operations/ToBase32.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * To Base32 operation */ class ToBase32 extends Operation { - /** * ToBase32 constructor */ @@ -20,7 +19,8 @@ class ToBase32 extends Operation { this.name = "To Base32"; this.module = "Default"; - this.description = "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7."; + this.description + = "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7."; this.infoURL = "https://wikipedia.org/wiki/Base32"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -44,8 +44,19 @@ class ToBase32 extends Operation { const alphabet = args[0] ? Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567="; let output = "", - chr1, chr2, chr3, chr4, chr5, - enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8, + chr1, + chr2, + chr3, + chr4, + chr5, + enc1, + enc2, + enc3, + enc4, + enc5, + enc6, + enc7, + enc8, i = 0; while (i < input.length) { chr1 = input[i++]; @@ -73,13 +84,18 @@ class ToBase32 extends Operation { enc8 = 32; } - output += alphabet.charAt(enc1) + alphabet.charAt(enc2) + alphabet.charAt(enc3) + - alphabet.charAt(enc4) + alphabet.charAt(enc5) + alphabet.charAt(enc6) + - alphabet.charAt(enc7) + alphabet.charAt(enc8); + output + += alphabet.charAt(enc1) + + alphabet.charAt(enc2) + + alphabet.charAt(enc3) + + alphabet.charAt(enc4) + + alphabet.charAt(enc5) + + alphabet.charAt(enc6) + + alphabet.charAt(enc7) + + alphabet.charAt(enc8); } return output; } - } export default ToBase32; diff --git a/src/core/operations/ToBase45.mjs b/src/core/operations/ToBase45.mjs index a1cd9d2f..b5bbf921 100644 --- a/src/core/operations/ToBase45.mjs +++ b/src/core/operations/ToBase45.mjs @@ -4,7 +4,7 @@ * @license Apache-2.0 */ -import {ALPHABET, highlightToBase45, highlightFromBase45} from "../lib/Base45.mjs"; +import { ALPHABET, highlightToBase45, highlightFromBase45 } from "../lib/Base45.mjs"; import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; @@ -12,7 +12,6 @@ import Utils from "../Utils.mjs"; * To Base45 operation */ class ToBase45 extends Operation { - /** * ToBase45 constructor */ @@ -21,7 +20,8 @@ class ToBase45 extends Operation { this.name = "To Base45"; this.module = "Default"; - this.description = "Base45 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system. Base45 is optimized for usage with QR codes."; + this.description + = "Base45 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system. Base45 is optimized for usage with QR codes."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -72,11 +72,8 @@ class ToBase45 extends Operation { } } - return res.join(""); - } - } export default ToBase45; diff --git a/src/core/operations/ToBase58.mjs b/src/core/operations/ToBase58.mjs index 5353c40e..7ce5b20d 100644 --- a/src/core/operations/ToBase58.mjs +++ b/src/core/operations/ToBase58.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ALPHABET_OPTIONS} from "../lib/Base58.mjs"; +import { ALPHABET_OPTIONS } from "../lib/Base58.mjs"; /** * To Base58 operation */ class ToBase58 extends Operation { - /** * ToBase58 constructor */ @@ -22,7 +21,8 @@ class ToBase58 extends Operation { this.name = "To Base58"; this.module = "Default"; - this.description = "Base58 (similar to Base64) is a notation for encoding arbitrary byte data. It differs from Base64 by removing easily misread characters (i.e. l, I, 0 and O) to improve human readability.

    This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).

    e.g. hello world becomes StV1DL6CwTryKyV

    Base58 is commonly used in cryptocurrencies (Bitcoin, Ripple, etc)."; + this.description + = "Base58 (similar to Base64) is a notation for encoding arbitrary byte data. It differs from Base64 by removing easily misread characters (i.e. l, I, 0 and O) to improve human readability.

    This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).

    e.g. hello world becomes StV1DL6CwTryKyV

    Base58 is commonly used in cryptocurrencies (Bitcoin, Ripple, etc)."; this.infoURL = "https://wikipedia.org/wiki/Base58"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -47,8 +47,7 @@ class ToBase58 extends Operation { alphabet = Utils.expandAlphRange(alphabet).join(""); - if (alphabet.length !== 58 || - [].unique.call(alphabet).length !== 58) { + if (alphabet.length !== 58 || [].unique.call(alphabet).length !== 58) { throw new OperationError("Error: alphabet must be of length 58"); } @@ -59,7 +58,7 @@ class ToBase58 extends Operation { zeroPrefix++; } - input.forEach(function(b) { + input.forEach(function (b) { let carry = (result[0] << 8) + b; result[0] = carry % 58; carry = (carry / 58) | 0; @@ -76,9 +75,12 @@ class ToBase58 extends Operation { } }); - result = result.map(function(b) { - return alphabet[b]; - }).reverse().join(""); + result = result + .map(function (b) { + return alphabet[b]; + }) + .reverse() + .join(""); while (zeroPrefix--) { result = alphabet[0] + result; @@ -86,7 +88,6 @@ class ToBase58 extends Operation { return result; } - } export default ToBase58; diff --git a/src/core/operations/ToBase62.mjs b/src/core/operations/ToBase62.mjs index a00d9275..9dab720f 100644 --- a/src/core/operations/ToBase62.mjs +++ b/src/core/operations/ToBase62.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import BigNumber from "bignumber.js"; import Utils from "../Utils.mjs"; -import {toHexFast} from "../lib/Hex.mjs"; +import { toHexFast } from "../lib/Hex.mjs"; /** * To Base62 operation */ class ToBase62 extends Operation { - /** * ToBase62 constructor */ @@ -22,7 +21,8 @@ class ToBase62 extends Operation { this.name = "To Base62"; this.module = "Default"; - this.description = "Base62 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system."; + this.description + = "Base62 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -56,7 +56,6 @@ class ToBase62 extends Operation { return number.toString(62); } - } export default ToBase62; diff --git a/src/core/operations/ToBase64.mjs b/src/core/operations/ToBase64.mjs index 53516a9f..c4c7089e 100644 --- a/src/core/operations/ToBase64.mjs +++ b/src/core/operations/ToBase64.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {toBase64, ALPHABET_OPTIONS} from "../lib/Base64.mjs"; +import { toBase64, ALPHABET_OPTIONS } from "../lib/Base64.mjs"; /** * To Base64 operation */ class ToBase64 extends Operation { - /** * ToBase64 constructor */ @@ -20,7 +19,8 @@ class ToBase64 extends Operation { this.name = "To Base64"; this.module = "Default"; - this.description = "Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.

    This operation encodes raw data into an ASCII Base64 string.

    e.g. hello becomes aGVsbG8="; + this.description + = "Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.

    This operation encodes raw data into an ASCII Base64 string.

    e.g. hello becomes aGVsbG8="; this.infoURL = "https://wikipedia.org/wiki/Base64"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -53,8 +53,8 @@ class ToBase64 extends Operation { * @returns {Object[]} pos */ highlight(pos, args) { - pos[0].start = Math.floor(pos[0].start / 3 * 4); - pos[0].end = Math.ceil(pos[0].end / 3 * 4); + pos[0].start = Math.floor((pos[0].start / 3) * 4); + pos[0].end = Math.ceil((pos[0].end / 3) * 4); return pos; } @@ -68,8 +68,8 @@ class ToBase64 extends Operation { * @returns {Object[]} pos */ highlightReverse(pos, args) { - pos[0].start = Math.ceil(pos[0].start / 4 * 3); - pos[0].end = Math.floor(pos[0].end / 4 * 3); + pos[0].start = Math.ceil((pos[0].start / 4) * 3); + pos[0].end = Math.floor((pos[0].end / 4) * 3); return pos; } } diff --git a/src/core/operations/ToBase85.mjs b/src/core/operations/ToBase85.mjs index 839ef1e4..e9bc86e6 100644 --- a/src/core/operations/ToBase85.mjs +++ b/src/core/operations/ToBase85.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {alphabetName, ALPHABET_OPTIONS} from "../lib/Base85.mjs"; +import { alphabetName, ALPHABET_OPTIONS } from "../lib/Base85.mjs"; /** * To Base85 operation */ class ToBase85 extends Operation { - /** * To Base85 constructor */ @@ -22,7 +21,8 @@ class ToBase85 extends Operation { this.name = "To Base85"; this.module = "Default"; - this.description = "Base85 (also called Ascii85) is a notation for encoding arbitrary byte data. It is usually more efficient that Base64.

    This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).

    e.g. hello world becomes BOu!rD]j7BEbo7

    Base85 is commonly used in Adobe's PostScript and PDF file formats.

    Options
    AlphabetInclude delimiter
    Adds a '<~' and '~>' delimiter to the start and end of the data. This is standard for Adobe's implementation of Base85."; + this.description + = "Base85 (also called Ascii85) is a notation for encoding arbitrary byte data. It is usually more efficient that Base64.

    This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).

    e.g. hello world becomes BOu!rD]j7BEbo7

    Base85 is commonly used in Adobe's PostScript and PDF file formats.

    Options
    AlphabetInclude delimiter
    Adds a '<~' and '~>' delimiter to the start and end of the data. This is standard for Adobe's implementation of Base85."; this.infoURL = "https://wikipedia.org/wiki/Ascii85"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -44,7 +44,7 @@ class ToBase85 extends Operation { * @param {ArrayBuffer} input * @param {Object[]} args * @returns {string} - */ + */ run(input, args) { input = new Uint8Array(input); const alphabet = Utils.expandAlphRange(args[0]).join(""), @@ -52,8 +52,7 @@ class ToBase85 extends Operation { includeDelim = args[1]; let result = ""; - if (alphabet.length !== 85 || - [].unique.call(alphabet).length !== 85) { + if (alphabet.length !== 85 || [].unique.call(alphabet).length !== 85) { throw new OperationError("Error: Alphabet must be of length 85"); } @@ -61,12 +60,9 @@ class ToBase85 extends Operation { let block; for (let i = 0; i < input.length; i += 4) { - block = ( - ((input[i]) << 24) + - ((input[i + 1] || 0) << 16) + - ((input[i + 2] || 0) << 8) + - ((input[i + 3] || 0)) - ) >>> 0; + block + = ((input[i] << 24) + ((input[i + 1] || 0) << 16) + ((input[i + 2] || 0) << 8) + (input[i + 3] || 0)) + >>> 0; if (encoding !== "Standard" || block > 0) { let digits = []; @@ -81,9 +77,9 @@ class ToBase85 extends Operation { digits.splice(input.length - (i + 4), 4); } - result += digits.map(digit => alphabet[digit]).join(""); + result += digits.map((digit) => alphabet[digit]).join(""); } else { - result += (encoding === "Standard") ? "z" : null; + result += encoding === "Standard" ? "z" : null; } } diff --git a/src/core/operations/ToBase92.mjs b/src/core/operations/ToBase92.mjs index bca8e872..54b4c271 100644 --- a/src/core/operations/ToBase92.mjs +++ b/src/core/operations/ToBase92.mjs @@ -19,7 +19,8 @@ class ToBase92 extends Operation { this.name = "To Base92"; this.module = "Default"; - this.description = "Base92 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers."; + this.description + = "Base92 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "string"; this.outputType = "byteArray"; @@ -39,8 +40,7 @@ class ToBase92 extends Operation { bitString += input[0].charCodeAt(0).toString(2).padStart(8, "0"); input = input.slice(1); } - if (bitString.length < 13) - break; + if (bitString.length < 13) break; const i = parseInt(bitString.slice(0, 13), 2); res.push(base92Chr(Math.floor(i / 91))); res.push(base92Chr(i % 91)); @@ -60,7 +60,6 @@ class ToBase92 extends Operation { } return res; - } } diff --git a/src/core/operations/ToBinary.mjs b/src/core/operations/ToBinary.mjs index ba72a55b..4e3e8ce7 100644 --- a/src/core/operations/ToBinary.mjs +++ b/src/core/operations/ToBinary.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {BIN_DELIM_OPTIONS} from "../lib/Delim.mjs"; -import {toBinary} from "../lib/Binary.mjs"; +import { BIN_DELIM_OPTIONS } from "../lib/Delim.mjs"; +import { toBinary } from "../lib/Binary.mjs"; /** * To Binary operation */ class ToBinary extends Operation { - /** * ToBinary constructor */ @@ -22,7 +21,8 @@ class ToBinary extends Operation { this.name = "To Binary"; this.module = "Default"; - this.description = "Displays the input data as a binary string.

    e.g. Hi becomes 01001000 01101001"; + this.description + = "Displays the input data as a binary string.

    e.g. Hi becomes 01001000 01101001"; this.infoURL = "https://wikipedia.org/wiki/Binary_code"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -82,7 +82,6 @@ class ToBinary extends Operation { pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / (8 + delim.length)); return pos; } - } export default ToBinary; diff --git a/src/core/operations/ToBraille.mjs b/src/core/operations/ToBraille.mjs index fcf13de2..47c3dfbf 100644 --- a/src/core/operations/ToBraille.mjs +++ b/src/core/operations/ToBraille.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {BRAILLE_LOOKUP} from "../lib/Braille.mjs"; +import { BRAILLE_LOOKUP } from "../lib/Braille.mjs"; /** * To Braille operation */ class ToBraille extends Operation { - /** * ToBraille constructor */ @@ -33,10 +32,13 @@ class ToBraille extends Operation { * @returns {string} */ run(input, args) { - return input.split("").map(c => { - const idx = BRAILLE_LOOKUP.ascii.indexOf(c.toUpperCase()); - return idx < 0 ? c : BRAILLE_LOOKUP.dot6[idx]; - }).join(""); + return input + .split("") + .map((c) => { + const idx = BRAILLE_LOOKUP.ascii.indexOf(c.toUpperCase()); + return idx < 0 ? c : BRAILLE_LOOKUP.dot6[idx]; + }) + .join(""); } /** @@ -64,7 +66,6 @@ class ToBraille extends Operation { highlightReverse(pos, args) { return pos; } - } export default ToBraille; diff --git a/src/core/operations/ToCamelCase.mjs b/src/core/operations/ToCamelCase.mjs index 8d7c5445..06437489 100644 --- a/src/core/operations/ToCamelCase.mjs +++ b/src/core/operations/ToCamelCase.mjs @@ -12,7 +12,6 @@ import { replaceVariableNames } from "../lib/Code.mjs"; * To Camel case operation */ class ToCamelCase extends Operation { - /** * ToCamelCase constructor */ @@ -21,7 +20,8 @@ class ToCamelCase extends Operation { this.name = "To Camel case"; this.module = "Code"; - this.description = "Converts the input string to camel case.\n

    \nCamel case is all lower case except letters after word boundaries which are uppercase.\n

    \ne.g. thisIsCamelCase\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; + this.description + = "Converts the input string to camel case.\n

    \nCamel case is all lower case except letters after word boundaries which are uppercase.\n

    \ne.g. thisIsCamelCase\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; this.infoURL = "https://wikipedia.org/wiki/Camel_case"; this.inputType = "string"; this.outputType = "string"; @@ -48,7 +48,6 @@ class ToCamelCase extends Operation { return camelCase(input); } } - } export default ToCamelCase; diff --git a/src/core/operations/ToCaseInsensitiveRegex.mjs b/src/core/operations/ToCaseInsensitiveRegex.mjs index 77b14172..fb929f60 100644 --- a/src/core/operations/ToCaseInsensitiveRegex.mjs +++ b/src/core/operations/ToCaseInsensitiveRegex.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * To Case Insensitive Regex operation */ class ToCaseInsensitiveRegex extends Operation { - /** * ToCaseInsensitiveRegex constructor */ @@ -21,7 +20,8 @@ class ToCaseInsensitiveRegex extends Operation { this.name = "To Case Insensitive Regex"; this.module = "Default"; - this.description = "Converts a case-sensitive regex string into a case-insensitive regex string in case the i flag is unavailable to you.

    e.g. Mozilla/[0-9].[0-9] .* becomes [mM][oO][zZ][iI][lL][lL][aA]/[0-9].[0-9] .*"; + this.description + = "Converts a case-sensitive regex string into a case-insensitive regex string in case the i flag is unavailable to you.

    e.g. Mozilla/[0-9].[0-9] .* becomes [mM][oO][zZ][iI][lL][lL][aA]/[0-9].[0-9] .*"; this.infoURL = "https://wikipedia.org/wiki/Regular_expression"; this.inputType = "string"; this.outputType = "string"; @@ -34,7 +34,6 @@ class ToCaseInsensitiveRegex extends Operation { * @returns {string} */ run(input, args) { - /** * Simulates look behind behaviour since javascript doesn't support it. * @@ -45,10 +44,9 @@ class ToCaseInsensitiveRegex extends Operation { let result = ""; for (let i = 0; i < input.length; i++) { const temp = input.charAt(i); - if (temp.match(/[a-zA-Z]/g) && (input.charAt(i-1) !== "-") && (input.charAt(i+1) !== "-")) + if (temp.match(/[a-zA-Z]/g) && input.charAt(i - 1) !== "-" && input.charAt(i + 1) !== "-") result += "[" + temp.toLowerCase() + temp.toUpperCase() + "]"; - else - result += temp; + else result += temp; } return result; } @@ -56,39 +54,44 @@ class ToCaseInsensitiveRegex extends Operation { try { RegExp(input); } catch (error) { - throw new OperationError("Invalid Regular Expression (Please note this version of node does not support look behinds)."); + throw new OperationError( + "Invalid Regular Expression (Please note this version of node does not support look behinds)." + ); } // Example: [test] -> [[tT][eE][sS][tT]] - return preProcess(input) + return ( + preProcess(input) + // Example: [A-Z] -> [A-Za-z] + .replace( + /([A-Z]-[A-Z]|[a-z]-[a-z])/g, + (m) => `${m[0].toUpperCase()}-${m[2].toUpperCase()}${m[0].toLowerCase()}-${m[2].toLowerCase()}` + ) - // Example: [A-Z] -> [A-Za-z] - .replace(/([A-Z]-[A-Z]|[a-z]-[a-z])/g, m => `${m[0].toUpperCase()}-${m[2].toUpperCase()}${m[0].toLowerCase()}-${m[2].toLowerCase()}`) + // Example: [H-d] -> [A-DH-dh-z] + .replace(/[A-Z]-[a-z]/g, (m) => `A-${m[2].toUpperCase()}${m}${m[0].toLowerCase()}-z`) - // Example: [H-d] -> [A-DH-dh-z] - .replace(/[A-Z]-[a-z]/g, m => `A-${m[2].toUpperCase()}${m}${m[0].toLowerCase()}-z`) + // Example: [!-D] -> [!-Da-d] + .replace(/\\?[ -@]-[A-Z]/g, (m) => `${m}a-${m[2].toLowerCase()}`) - // Example: [!-D] -> [!-Da-d] - .replace(/\\?[ -@]-[A-Z]/g, m => `${m}a-${m[2].toLowerCase()}`) + // Example: [%-^] -> [%-^a-z] + .replace(/\\?[ -@]-\\?[[-`]/g, (m) => `${m}a-z`) - // Example: [%-^] -> [%-^a-z] - .replace(/\\?[ -@]-\\?[[-`]/g, m => `${m}a-z`) + // Example: [K-`] -> [K-`k-z] + .replace(/[A-Z]-\\?[[-`]/g, (m) => `${m}${m[0].toLowerCase()}-z`) - // Example: [K-`] -> [K-`k-z] - .replace(/[A-Z]-\\?[[-`]/g, m => `${m}${m[0].toLowerCase()}-z`) + // Example: [[-}] -> [[-}A-Z] + .replace(/\\?[[-`]-\\?[{-~]/g, (m) => `${m}A-Z`) - // Example: [[-}] -> [[-}A-Z] - .replace(/\\?[[-`]-\\?[{-~]/g, m => `${m}A-Z`) + // Example: [b-}] -> [b-}B-Z] + .replace(/[a-z]-\\?[{-~]/g, (m) => `${m}${m[0].toUpperCase()}-Z`) - // Example: [b-}] -> [b-}B-Z] - .replace(/[a-z]-\\?[{-~]/g, m => `${m}${m[0].toUpperCase()}-Z`) - - // Example: [<-j] -> [<-z] - .replace(/\\?[ -@]-[a-z]/g, m => `${m[0]}-z`) - - // Example: [^-j] -> [A-J^-j] - .replace(/\\?[[-`]-[a-z]/g, m => `A-${m[2].toUpperCase()}${m}`); + // Example: [<-j] -> [<-z] + .replace(/\\?[ -@]-[a-z]/g, (m) => `${m[0]}-z`) + // Example: [^-j] -> [A-J^-j] + .replace(/\\?[[-`]-[a-z]/g, (m) => `A-${m[2].toUpperCase()}${m}`) + ); } } diff --git a/src/core/operations/ToCharcode.mjs b/src/core/operations/ToCharcode.mjs index a4806115..d0af00c3 100644 --- a/src/core/operations/ToCharcode.mjs +++ b/src/core/operations/ToCharcode.mjs @@ -14,7 +14,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * To Charcode operation */ class ToCharcode extends Operation { - /** * ToCharcode constructor */ @@ -23,7 +22,8 @@ class ToCharcode extends Operation { this.name = "To Charcode"; this.module = "Default"; - this.description = "Converts text to its unicode character code equivalent.

    e.g. Γειά σου becomes 0393 03b5 03b9 03ac 20 03c3 03bf 03c5"; + this.description + = "Converts text to its unicode character code equivalent.

    e.g. Γειά σου becomes 0393 03b5 03b9 03ac 20 03c3 03bf 03c5"; this.infoURL = "https://wikipedia.org/wiki/Plane_(Unicode)"; this.inputType = "string"; this.outputType = "string"; @@ -81,7 +81,6 @@ class ToCharcode extends Operation { return output.slice(0, -delim.length); } - } export default ToCharcode; diff --git a/src/core/operations/ToDecimal.mjs b/src/core/operations/ToDecimal.mjs index 65798a7c..e92abdfb 100644 --- a/src/core/operations/ToDecimal.mjs +++ b/src/core/operations/ToDecimal.mjs @@ -6,14 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; - +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * To Decimal operation */ class ToDecimal extends Operation { - /** * ToDecimal constructor */ @@ -22,7 +20,8 @@ class ToDecimal extends Operation { this.name = "To Decimal"; this.module = "Default"; - this.description = "Converts the input data to an ordinal integer array.

    e.g. Hello becomes 72 101 108 108 111"; + this.description + = "Converts the input data to an ordinal integer array.

    e.g. Hello becomes 72 101 108 108 111"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ @@ -49,11 +48,10 @@ class ToDecimal extends Operation { const delim = Utils.charRep(args[0]), signed = args[1]; if (signed) { - input = input.map(v => v > 0x7F ? v - 0xFF - 1 : v); + input = input.map((v) => (v > 0x7f ? v - 0xff - 1 : v)); } return input.join(delim); } - } export default ToDecimal; diff --git a/src/core/operations/ToHTMLEntity.mjs b/src/core/operations/ToHTMLEntity.mjs index f2a57a43..b1cf9f73 100644 --- a/src/core/operations/ToHTMLEntity.mjs +++ b/src/core/operations/ToHTMLEntity.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * To HTML Entity operation */ class ToHTMLEntity extends Operation { - /** * ToHTMLEntity constructor */ @@ -20,7 +19,8 @@ class ToHTMLEntity extends Operation { this.name = "To HTML Entity"; this.module = "Encodings"; - this.description = "Converts characters to HTML entities

    e.g. & becomes &amp;"; + this.description + = "Converts characters to HTML entities

    e.g. & becomes &amp;"; this.infoURL = "https://wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references"; this.inputType = "string"; this.outputType = "string"; @@ -71,16 +71,13 @@ class ToHTMLEntity extends Operation { output += Utils.chr(charcodes[i]); } } else { - output += byteToEntity[charcodes[i]] || ( - charcodes[i] > 255 ? - "&#" + charcodes[i] + ";" : - Utils.chr(charcodes[i]) - ); + output + += byteToEntity[charcodes[i]] + || (charcodes[i] > 255 ? "&#" + charcodes[i] + ";" : Utils.chr(charcodes[i])); } } return output; } - } /** diff --git a/src/core/operations/ToHex.mjs b/src/core/operations/ToHex.mjs index 092155a9..e5f32a61 100644 --- a/src/core/operations/ToHex.mjs +++ b/src/core/operations/ToHex.mjs @@ -5,14 +5,13 @@ */ import Operation from "../Operation.mjs"; -import {toHex, TO_HEX_DELIM_OPTIONS} from "../lib/Hex.mjs"; +import { toHex, TO_HEX_DELIM_OPTIONS } from "../lib/Hex.mjs"; import Utils from "../Utils.mjs"; /** * To Hex operation */ class ToHex extends Operation { - /** * ToHex constructor */ @@ -21,7 +20,8 @@ class ToHex extends Operation { this.name = "To Hex"; this.module = "Default"; - this.description = "Converts the input string to hexadecimal bytes separated by the specified delimiter.

    e.g. The UTF-8 encoded string Γειά σου becomes ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a"; + this.description + = "Converts the input string to hexadecimal bytes separated by the specified delimiter.

    e.g. The UTF-8 encoded string Γειά σου becomes ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a"; this.infoURL = "https://wikipedia.org/wiki/Hexadecimal"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -67,7 +67,8 @@ class ToHex extends Operation { * @returns {Object[]} pos */ highlight(pos, args) { - let delim, commaLen = 0; + let delim, + commaLen = 0; if (args[0] === "0x with comma") { delim = "0x"; commaLen = 1; @@ -78,9 +79,9 @@ class ToHex extends Operation { const lineSize = args[1], len = delim.length + commaLen; - const countLF = function(p) { + const countLF = function (p) { // Count the number of LFs from 0 upto p - return (p / lineSize | 0) - (p >= lineSize && p % lineSize === 0); + return ((p / lineSize) | 0) - (p >= lineSize && p % lineSize === 0); }; pos[0].start = pos[0].start * (2 + len) + countLF(pos[0].start); @@ -105,7 +106,8 @@ class ToHex extends Operation { * @returns {Object[]} pos */ highlightReverse(pos, args) { - let delim, commaLen = 0; + let delim, + commaLen = 0; if (args[0] === "0x with comma") { delim = "0x"; commaLen = 1; @@ -117,10 +119,10 @@ class ToHex extends Operation { len = delim.length + commaLen, width = len + 2; - const countLF = function(p) { + const countLF = function (p) { // Count the number of LFs from 0 up to p const lineLength = width * lineSize; - return (p / lineLength | 0) - (p >= lineLength && p % lineLength === 0); + return ((p / lineLength) | 0) - (p >= lineLength && p % lineLength === 0); }; pos[0].start = pos[0].start === 0 ? 0 : Math.round((pos[0].start - countLF(pos[0].start)) / width); diff --git a/src/core/operations/ToHexContent.mjs b/src/core/operations/ToHexContent.mjs index 9af09f24..02f1accd 100644 --- a/src/core/operations/ToHexContent.mjs +++ b/src/core/operations/ToHexContent.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {toHex} from "../lib/Hex.mjs"; +import { toHex } from "../lib/Hex.mjs"; /** * To Hex Content operation */ class ToHexContent extends Operation { - /** * ToHexContent constructor */ @@ -21,8 +20,10 @@ class ToHexContent extends Operation { this.name = "To Hex Content"; this.module = "Default"; - this.description = "Converts special characters in a string to hexadecimal. This format is used by SNORT for representing hex within ASCII text.

    e.g. foo=bar becomes foo|3d|bar."; - this.infoURL = "http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node32.html#SECTION00451000000000000000"; + this.description + = "Converts special characters in a string to hexadecimal. This format is used by SNORT for representing hex within ASCII text.

    e.g. foo=bar becomes foo|3d|bar."; + this.infoURL + = "http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node32.html#SECTION00451000000000000000"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ @@ -60,7 +61,13 @@ class ToHexContent extends Operation { const convertSpaces = convert === "Only special chars including spaces"; for (let i = 0; i < input.length; i++) { b = input[i]; - if ((b === 32 && convertSpaces) || (b < 48 && b !== 32) || (b > 57 && b < 65) || (b > 90 && b < 97) || b > 122) { + if ( + (b === 32 && convertSpaces) + || (b < 48 && b !== 32) + || (b > 57 && b < 65) + || (b > 90 && b < 97) + || b > 122 + ) { if (!inHex) { output += "|"; inHex = true; @@ -77,7 +84,6 @@ class ToHexContent extends Operation { if (inHex) output += "|"; return output; } - } export default ToHexContent; diff --git a/src/core/operations/ToHexdump.mjs b/src/core/operations/ToHexdump.mjs index a52b0451..925b727f 100644 --- a/src/core/operations/ToHexdump.mjs +++ b/src/core/operations/ToHexdump.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * To Hexdump operation */ class ToHexdump extends Operation { - /** * ToHexdump constructor */ @@ -21,7 +20,8 @@ class ToHexdump extends Operation { this.name = "To Hexdump"; this.module = "Default"; - this.description = "Creates a hexdump of the input data, displaying both the hexadecimal values of each byte and an ASCII representation alongside.

    The 'UNIX format' argument defines which subset of printable characters are displayed in the preview column."; + this.description + = "Creates a hexdump of the input data, displaying both the hexadecimal values of each byte and an ASCII representation alongside.

    The 'UNIX format' argument defines which subset of printable characters are displayed in the preview column."; this.infoURL = "https://wikipedia.org/wiki/Hex_dump"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -60,17 +60,16 @@ class ToHexdump extends Operation { const [length, upperCase, includeFinalLength, unixFormat] = args; const padding = 2; - if (length < 1 || Math.round(length) !== length) - throw new OperationError("Width must be a positive integer"); + if (length < 1 || Math.round(length) !== length) throw new OperationError("Width must be a positive integer"); const lines = []; for (let i = 0; i < data.length; i += length) { let lineNo = Utils.hex(i, 8); - const buff = data.slice(i, i+length); + const buff = data.slice(i, i + length); const hex = []; - buff.forEach(b => hex.push(Utils.hex(b, padding))); - let hexStr = hex.join(" ").padEnd(length*(padding+1), " "); + buff.forEach((b) => hex.push(Utils.hex(b, padding))); + let hexStr = hex.join(" ").padEnd(length * (padding + 1), " "); const ascii = Utils.printable(Utils.byteArrayToChars(buff), false, unixFormat); const asciiStr = ascii.padEnd(buff.length, " "); @@ -82,9 +81,8 @@ class ToHexdump extends Operation { lines.push(`${lineNo} ${hexStr} |${asciiStr}|`); - - if (includeFinalLength && i+buff.length === data.length) { - lines.push(Utils.hex(i+buff.length, 8)); + if (includeFinalLength && i + buff.length === data.length) { + lines.push(Utils.hex(i + buff.length, 8)); } } @@ -103,13 +101,13 @@ class ToHexdump extends Operation { highlight(pos, args) { // Calculate overall selection const w = args[0] || 16, - width = 14 + (w*4); + width = 14 + w * 4; let line = Math.floor(pos[0].start / w), offset = pos[0].start % w, start = 0, end = 0; - pos[0].start = line*width + 10 + offset*3; + pos[0].start = line * width + 10 + offset * 3; line = Math.floor(pos[0].end / w); offset = pos[0].end % w; @@ -117,7 +115,7 @@ class ToHexdump extends Operation { line--; offset = w; } - pos[0].end = line*width + 10 + offset*3 - 1; + pos[0].end = line * width + 10 + offset * 3 - 1; // Set up multiple selections for bytes let startLineNum = Math.floor(pos[0].start / width); @@ -127,12 +125,12 @@ class ToHexdump extends Operation { pos.push(pos[0]); } else { start = pos[0].start; - end = (startLineNum+1) * width - w - 5; + end = (startLineNum + 1) * width - w - 5; pos.push({ start: start, end: end }); while (end < pos[0].end) { startLineNum++; start = startLineNum * width + 10; - end = (startLineNum+1) * width - w - 5; + end = (startLineNum + 1) * width - w - 5; if (end > pos[0].end) end = pos[0].end; pos.push({ start: start, end: end }); } @@ -145,8 +143,8 @@ class ToHexdump extends Operation { end = 0; for (let i = 1; i < len; i++) { lineNum = Math.floor(pos[i].start / width); - start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); - end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); + start = (pos[i].start - lineNum * width - 10) / 3 + (width - w - 2) + lineNum * width; + end = (pos[i].end + 1 - lineNum * width - 10) / 3 + (width - w - 2) + lineNum * width; pos.push({ start: start, end: end }); } return pos; @@ -163,33 +161,38 @@ class ToHexdump extends Operation { */ highlightReverse(pos, args) { const w = args[0] || 16; - const width = 14 + (w*4); + const width = 14 + w * 4; let line = Math.floor(pos[0].start / width); let offset = pos[0].start % width; - if (offset < 10) { // In line number section - pos[0].start = line*w; - } else if (offset > 10+(w*3)) { // In ASCII section - pos[0].start = (line+1)*w; - } else { // In byte section - pos[0].start = line*w + Math.floor((offset-10)/3); + if (offset < 10) { + // In line number section + pos[0].start = line * w; + } else if (offset > 10 + w * 3) { + // In ASCII section + pos[0].start = (line + 1) * w; + } else { + // In byte section + pos[0].start = line * w + Math.floor((offset - 10) / 3); } line = Math.floor(pos[0].end / width); offset = pos[0].end % width; - if (offset < 10) { // In line number section - pos[0].end = line*w; - } else if (offset > 10+(w*3)) { // In ASCII section - pos[0].end = (line+1)*w; - } else { // In byte section - pos[0].end = line*w + Math.ceil((offset-10)/3); + if (offset < 10) { + // In line number section + pos[0].end = line * w; + } else if (offset > 10 + w * 3) { + // In ASCII section + pos[0].end = (line + 1) * w; + } else { + // In byte section + pos[0].end = line * w + Math.ceil((offset - 10) / 3); } return pos; } - } export default ToHexdump; diff --git a/src/core/operations/ToKebabCase.mjs b/src/core/operations/ToKebabCase.mjs index 27a8ecac..1b4b8cb4 100644 --- a/src/core/operations/ToKebabCase.mjs +++ b/src/core/operations/ToKebabCase.mjs @@ -12,7 +12,6 @@ import { replaceVariableNames } from "../lib/Code.mjs"; * To Kebab case operation */ class ToKebabCase extends Operation { - /** * ToKebabCase constructor */ @@ -21,7 +20,8 @@ class ToKebabCase extends Operation { this.name = "To Kebab case"; this.module = "Code"; - this.description = "Converts the input string to kebab case.\n

    \nKebab case is all lower case with dashes as word boundaries.\n

    \ne.g. this-is-kebab-case\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; + this.description + = "Converts the input string to kebab case.\n

    \nKebab case is all lower case with dashes as word boundaries.\n

    \ne.g. this-is-kebab-case\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; this.infoURL = "https://wikipedia.org/wiki/Kebab_case"; this.inputType = "string"; this.outputType = "string"; @@ -48,7 +48,6 @@ class ToKebabCase extends Operation { return kebabCase(input); } } - } export default ToKebabCase; diff --git a/src/core/operations/ToLowerCase.mjs b/src/core/operations/ToLowerCase.mjs index 82a99a48..87ecded6 100644 --- a/src/core/operations/ToLowerCase.mjs +++ b/src/core/operations/ToLowerCase.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * To Lower case operation */ class ToLowerCase extends Operation { - /** * ToLowerCase constructor */ @@ -59,7 +58,6 @@ class ToLowerCase extends Operation { highlightReverse(pos, args) { return pos; } - } export default ToLowerCase; diff --git a/src/core/operations/ToMessagePack.mjs b/src/core/operations/ToMessagePack.mjs index b56e408d..7a0952a9 100644 --- a/src/core/operations/ToMessagePack.mjs +++ b/src/core/operations/ToMessagePack.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * To MessagePack operation */ class ToMessagePack extends Operation { - /** * ToMessagePack constructor */ @@ -22,7 +21,8 @@ class ToMessagePack extends Operation { this.name = "To MessagePack"; this.module = "Code"; - this.description = "Converts JSON to MessagePack encoded byte buffer. MessagePack is a computer data interchange format. It is a binary form for representing simple data structures like arrays and associative arrays."; + this.description + = "Converts JSON to MessagePack encoded byte buffer. MessagePack is a computer data interchange format. It is a binary form for representing simple data structures like arrays and associative arrays."; this.infoURL = "https://wikipedia.org/wiki/MessagePack"; this.inputType = "JSON"; this.outputType = "ArrayBuffer"; @@ -41,13 +41,12 @@ class ToMessagePack extends Operation { } else { const res = notepack.encode(input); // Safely convert from Node Buffer to ArrayBuffer using the correct view of the data - return (new Uint8Array(res)).buffer; + return new Uint8Array(res).buffer; } } catch (err) { throw new OperationError(`Could not encode JSON to MessagePack: ${err}`); } } - } export default ToMessagePack; diff --git a/src/core/operations/ToMorseCode.mjs b/src/core/operations/ToMorseCode.mjs index ce3c6b5c..505ddfaf 100644 --- a/src/core/operations/ToMorseCode.mjs +++ b/src/core/operations/ToMorseCode.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {LETTER_DELIM_OPTIONS, WORD_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { LETTER_DELIM_OPTIONS, WORD_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * To Morse Code operation */ class ToMorseCode extends Operation { - /** * ToMorseCode constructor */ @@ -21,7 +20,8 @@ class ToMorseCode extends Operation { this.name = "To Morse Code"; this.module = "Default"; - this.description = "Translates alphanumeric characters into International Morse Code.

    Ignores non-Morse characters.

    e.g. SOS becomes ... --- ..."; + this.description + = "Translates alphanumeric characters into International Morse Code.

    Ignores non-Morse characters.

    e.g. SOS becomes ... --- ..."; this.infoURL = "https://wikipedia.org/wiki/Morse_code"; this.inputType = "string"; this.outputType = "string"; @@ -58,10 +58,10 @@ class ToMorseCode extends Operation { const wordDelim = Utils.charRep(args[2]); input = input.split(/\r?\n/); - input = Array.prototype.map.call(input, function(line) { + input = Array.prototype.map.call(input, function (line) { let words = line.split(/ +/); - words = Array.prototype.map.call(words, function(word) { - const letters = Array.prototype.map.call(word, function(character) { + words = Array.prototype.map.call(words, function (word) { + const letters = Array.prototype.map.call(word, function (character) { const letter = character.toUpperCase(); if (typeof MORSE_TABLE[letter] == "undefined") { return ""; @@ -77,21 +77,21 @@ class ToMorseCode extends Operation { }); input = input.join("\n"); - input = input.replace( - /|||/g, - function(match) { - switch (match) { - case "": return dash; - case "": return dot; - case "": return letterDelim; - case "": return wordDelim; - } + input = input.replace(/|||/g, function (match) { + switch (match) { + case "": + return dash; + case "": + return dot; + case "": + return letterDelim; + case "": + return wordDelim; } - ); + }); return input; } - } const MORSE_TABLE = { @@ -138,7 +138,7 @@ const MORSE_TABLE = { "!": "", "?": "", "'": "", - "\"": "", + '"': "", "/": "", "-": "", "+": "", diff --git a/src/core/operations/ToOctal.mjs b/src/core/operations/ToOctal.mjs index 2ed8ef97..0b9a884f 100644 --- a/src/core/operations/ToOctal.mjs +++ b/src/core/operations/ToOctal.mjs @@ -6,14 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; - +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * To Octal operation */ class ToOctal extends Operation { - /** * ToOctal constructor */ @@ -22,7 +20,8 @@ class ToOctal extends Operation { this.name = "To Octal"; this.module = "Default"; - this.description = "Converts the input string to octal bytes separated by the specified delimiter.

    e.g. The UTF-8 encoded string Γειά σου becomes 316 223 316 265 316 271 316 254 40 317 203 316 277 317 205"; + this.description + = "Converts the input string to octal bytes separated by the specified delimiter.

    e.g. The UTF-8 encoded string Γειά σου becomes 316 223 316 265 316 271 316 254 40 317 203 316 277 317 205"; this.infoURL = "https://wikipedia.org/wiki/Octal"; this.inputType = "byteArray"; this.outputType = "string"; @@ -42,9 +41,8 @@ class ToOctal extends Operation { */ run(input, args) { const delim = Utils.charRep(args[0] || "Space"); - return input.map(val => val.toString(8)).join(delim); + return input.map((val) => val.toString(8)).join(delim); } - } export default ToOctal; diff --git a/src/core/operations/ToPunycode.mjs b/src/core/operations/ToPunycode.mjs index 0e579079..a3d2cd92 100644 --- a/src/core/operations/ToPunycode.mjs +++ b/src/core/operations/ToPunycode.mjs @@ -11,7 +11,6 @@ import punycode from "punycode"; * To Punycode operation */ class ToPunycode extends Operation { - /** * ToPunycode constructor */ @@ -20,7 +19,8 @@ class ToPunycode extends Operation { this.name = "To Punycode"; this.module = "Encodings"; - this.description = "Punycode is a way to represent Unicode with the limited character subset of ASCII supported by the Domain Name System.

    e.g. m\xfcnchen encodes to mnchen-3ya"; + this.description + = "Punycode is a way to represent Unicode with the limited character subset of ASCII supported by the Domain Name System.

    e.g. m\xfcnchen encodes to mnchen-3ya"; this.infoURL = "https://wikipedia.org/wiki/Punycode"; this.inputType = "string"; this.outputType = "string"; @@ -47,7 +47,6 @@ class ToPunycode extends Operation { return punycode.encode(input); } } - } export default ToPunycode; diff --git a/src/core/operations/ToQuotedPrintable.mjs b/src/core/operations/ToQuotedPrintable.mjs index 9db5c5a5..080be017 100644 --- a/src/core/operations/ToQuotedPrintable.mjs +++ b/src/core/operations/ToQuotedPrintable.mjs @@ -14,7 +14,6 @@ import Operation from "../Operation.mjs"; * To Quoted Printable operation */ class ToQuotedPrintable extends Operation { - /** * ToQuotedPrintable constructor */ @@ -23,7 +22,8 @@ class ToQuotedPrintable extends Operation { this.name = "To Quoted Printable"; this.module = "Default"; - this.description = "Quoted-Printable, or QP encoding, is an encoding using printable ASCII characters (alphanumeric and the equals sign '=') to transmit 8-bit data over a 7-bit data path or, generally, over a medium which is not 8-bit clean. It is defined as a MIME content transfer encoding for use in e-mail.

    QP works by using the equals sign '=' as an escape character. It also limits line length to 76, as some software has limits on line length."; + this.description + = "Quoted-Printable, or QP encoding, is an encoding using printable ASCII characters (alphanumeric and the equals sign '=') to transmit 8-bit data over a 7-bit data path or, generally, over a medium which is not 8-bit clean. It is defined as a MIME content transfer encoding for use in e-mail.

    QP works by using the equals sign '=' as an escape character. It also limits line length to 76, as some software has limits on line length."; this.infoURL = "https://wikipedia.org/wiki/Quoted-printable"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -40,16 +40,17 @@ class ToQuotedPrintable extends Operation { let mimeEncodedStr = this.mimeEncode(input); // fix line breaks - mimeEncodedStr = mimeEncodedStr.replace(/\r?\n|\r/g, function() { - return "\r\n"; - }).replace(/[\t ]+$/gm, function(spaces) { - return spaces.replace(/ /g, "=20").replace(/\t/g, "=09"); - }); + mimeEncodedStr = mimeEncodedStr + .replace(/\r?\n|\r/g, function () { + return "\r\n"; + }) + .replace(/[\t ]+$/gm, function (spaces) { + return spaces.replace(/ /g, "=20").replace(/\t/g, "=09"); + }); return this._addSoftLinebreaks(mimeEncodedStr, "qp"); } - /** @license ======================================================================== mimelib: http://github.com/andris9/mimelib @@ -78,17 +79,7 @@ class ToQuotedPrintable extends Operation { * @returns {string} */ mimeEncode(buffer) { - const ranges = [ - [0x09], - [0x0A], - [0x0D], - [0x20], - [0x21], - [0x23, 0x3C], - [0x3E], - [0x40, 0x5E], - [0x60, 0x7E] - ]; + const ranges = [[0x09], [0x0a], [0x0d], [0x20], [0x21], [0x23, 0x3c], [0x3e], [0x40, 0x5e], [0x60, 0x7e]]; let result = ""; for (let i = 0, len = buffer.length; i < len; i++) { @@ -112,12 +103,9 @@ class ToQuotedPrintable extends Operation { */ _checkRanges(nr, ranges) { for (let i = ranges.length - 1; i >= 0; i--) { - if (!ranges[i].length) - continue; - if (ranges[i].length === 1 && nr === ranges[i][0]) - return true; - if (ranges[i].length === 2 && nr >= ranges[i][0] && nr <= ranges[i][1]) - return true; + if (!ranges[i].length) continue; + if (ranges[i].length === 1 && nr === ranges[i][0]) return true; + if (ranges[i].length === 2 && nr >= ranges[i][0] && nr <= ranges[i][1]) return true; } return false; } @@ -169,7 +157,9 @@ class ToQuotedPrintable extends Operation { const len = mimeEncodedStr.length, lineMargin = Math.floor(lineLengthMax / 3); let pos = 0, - match, code, line, + match, + code, + line, result = ""; // insert soft linebreaks where needed @@ -193,21 +183,28 @@ class ToQuotedPrintable extends Operation { result += line; pos += line.length; continue; - } else if (line.length > lineLengthMax - lineMargin && (match = line.substr(-lineMargin).match(/[ \t.,!?][^ \t.,!?]*$/))) { + } else if ( + line.length > lineLengthMax - lineMargin + && (match = line.substr(-lineMargin).match(/[ \t.,!?][^ \t.,!?]*$/)) + ) { // truncate to nearest space line = line.substr(0, line.length - (match[0].length - 1)); } else if (line.substr(-1) === "\r") { line = line.substr(0, line.length - 1); } else { if (line.match(/=[\da-f]{0,2}$/i)) { - // push incomplete encoding sequences to the next line if ((match = line.match(/=[\da-f]{0,1}$/i))) { line = line.substr(0, line.length - match[0].length); } // ensure that utf-8 sequences are not split - while (line.length > 3 && line.length < len - pos && !line.match(/^(?:=[\da-f]{2}){1,4}$/i) && (match = line.match(/=[\da-f]{2}$/ig))) { + while ( + line.length > 3 + && line.length < len - pos + && !line.match(/^(?:=[\da-f]{2}){1,4}$/i) + && (match = line.match(/=[\da-f]{2}$/gi)) + ) { code = parseInt(match[0].substr(1, 2), 16); if (code < 128) { break; @@ -215,11 +212,10 @@ class ToQuotedPrintable extends Operation { line = line.substr(0, line.length - 3); - if (code >= 0xC0) { + if (code >= 0xc0) { break; } } - } } @@ -240,7 +236,6 @@ class ToQuotedPrintable extends Operation { return result; } - } export default ToQuotedPrintable; diff --git a/src/core/operations/ToSnakeCase.mjs b/src/core/operations/ToSnakeCase.mjs index 5cb566af..589ab8de 100644 --- a/src/core/operations/ToSnakeCase.mjs +++ b/src/core/operations/ToSnakeCase.mjs @@ -12,7 +12,6 @@ import { replaceVariableNames } from "../lib/Code.mjs"; * To Snake case operation */ class ToSnakeCase extends Operation { - /** * ToSnakeCase constructor */ @@ -21,7 +20,8 @@ class ToSnakeCase extends Operation { this.name = "To Snake case"; this.module = "Code"; - this.description = "Converts the input string to snake case.\n

    \nSnake case is all lower case with underscores as word boundaries.\n

    \ne.g. this_is_snake_case\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; + this.description + = "Converts the input string to snake case.\n

    \nSnake case is all lower case with underscores as word boundaries.\n

    \ne.g. this_is_snake_case\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; this.infoURL = "https://wikipedia.org/wiki/Snake_case"; this.inputType = "string"; this.outputType = "string"; diff --git a/src/core/operations/ToTable.mjs b/src/core/operations/ToTable.mjs index 082c39bc..35540f85 100644 --- a/src/core/operations/ToTable.mjs +++ b/src/core/operations/ToTable.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * To Table operation */ class ToTable extends Operation { - /** * ToTable constructor */ @@ -20,7 +19,8 @@ class ToTable extends Operation { this.name = "To Table"; this.module = "Default"; - this.description = "Data can be split on different characters and rendered as an HTML, ASCII or Markdown table with an optional header row.

    Supports the CSV (Comma Separated Values) file format by default. Change the cell delimiter argument to \\t to support TSV (Tab Separated Values) or | for PSV (Pipe Separated Values).

    You can enter as many delimiters as you like. Each character will be treat as a separate possible delimiter."; + this.description + = "Data can be split on different characters and rendered as an HTML, ASCII or Markdown table with an optional header row.

    Supports the CSV (Comma Separated Values) file format by default. Change the cell delimiter argument to \\t to support TSV (Tab Separated Values) or | for PSV (Pipe Separated Values).

    You can enter as many delimiters as you like. Each character will be treat as a separate possible delimiter."; this.infoURL = "https://wikipedia.org/wiki/Comma-separated_values"; this.inputType = "string"; this.outputType = "html"; @@ -88,8 +88,8 @@ class ToTable extends Operation { const longestCells = []; // Find longestCells value per column to pad cells equally. - tableData.forEach(function(row, index) { - row.forEach(function(cell, cellIndex) { + tableData.forEach(function (row, index) { + row.forEach(function (cell, cellIndex) { if (longestCells[cellIndex] === undefined || cell.length > longestCells[cellIndex]) { longestCells[cellIndex] = cell.length; } @@ -108,7 +108,7 @@ class ToTable extends Operation { } // Add the rest of the table rows. - tableData.forEach(function(row, index) { + tableData.forEach(function (row, index) { output += outputRow(row, longestCells); }); @@ -122,7 +122,7 @@ class ToTable extends Operation { */ function outputRow(row, longestCells) { let rowOutput = verticalBorder; - row.forEach(function(cell, index) { + row.forEach(function (cell, index) { rowOutput += " " + cell + " ".repeat(longestCells[index] - cell.length) + " " + verticalBorder; }); rowOutput += "\n"; @@ -135,7 +135,7 @@ class ToTable extends Operation { */ function outputHorizontalBorder(longestCells) { let rowOutput = crossBorder; - longestCells.forEach(function(cellLength) { + longestCells.forEach(function (cellLength) { rowOutput += horizontalBorder.repeat(cellLength + 2) + crossBorder; }); rowOutput += "\n"; @@ -163,7 +163,7 @@ class ToTable extends Operation { // Output the rest of the rows in the
    . output += ""; - tableData.forEach(function(row, index) { + tableData.forEach(function (row, index) { output += outputRow(row, "td"); }); @@ -171,15 +171,15 @@ class ToTable extends Operation { output += "
    "; return output; - /** - * Outputs a table row. - * - * @param {string[]} row - * @param {string} cellType - */ + /** + * Outputs a table row. + * + * @param {string[]} row + * @param {string} cellType + */ function outputRow(row, cellType) { let output = ""; - row.forEach(function(cell) { + row.forEach(function (cell) { output += "<" + cellType + ">" + cell + ""; }); output += ""; @@ -201,8 +201,8 @@ class ToTable extends Operation { const longestCells = []; // Find longestCells value per column to pad cells equally. - tableData.forEach(function(row, index) { - row.forEach(function(cell, cellIndex) { + tableData.forEach(function (row, index) { + row.forEach(function (cell, cellIndex) { if (longestCells[cellIndex] === undefined || cell.length > longestCells[cellIndex]) { longestCells[cellIndex] = cell.length; } @@ -213,13 +213,13 @@ class ToTable extends Operation { const row = tableData.shift(); output += outputRow(row, longestCells); let rowOutput = verticalBorder; - row.forEach(function(cell, index) { - rowOutput += " " + headerDivider.repeat(longestCells[index]) + " " + verticalBorder; + row.forEach(function (cell, index) { + rowOutput += " " + headerDivider.repeat(longestCells[index]) + " " + verticalBorder; }); output += rowOutput += "\n"; // Add the rest of the table rows. - tableData.forEach(function(row, index) { + tableData.forEach(function (row, index) { output += outputRow(row, longestCells); }); @@ -230,17 +230,14 @@ class ToTable extends Operation { */ function outputRow(row, longestCells) { let rowOutput = verticalBorder; - row.forEach(function(cell, index) { + row.forEach(function (cell, index) { rowOutput += " " + cell + " ".repeat(longestCells[index] - cell.length) + " " + verticalBorder; }); rowOutput += "\n"; return rowOutput; } - } - } - } export default ToTable; diff --git a/src/core/operations/ToUNIXTimestamp.mjs b/src/core/operations/ToUNIXTimestamp.mjs index 3eaf2ba2..9e6ab9c1 100644 --- a/src/core/operations/ToUNIXTimestamp.mjs +++ b/src/core/operations/ToUNIXTimestamp.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import moment from "moment-timezone"; -import {UNITS} from "../lib/DateTime.mjs"; +import { UNITS } from "../lib/DateTime.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * To UNIX Timestamp operation */ class ToUNIXTimestamp extends Operation { - /** * ToUNIXTimestamp constructor */ @@ -22,7 +21,8 @@ class ToUNIXTimestamp extends Operation { this.name = "To UNIX Timestamp"; this.module = "Default"; - this.description = "Parses a datetime string in UTC and returns the corresponding UNIX timestamp.

    e.g. Mon 1 January 2001 11:00:00 becomes 978346800

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch)."; + this.description + = "Parses a datetime string in UTC and returns the corresponding UNIX timestamp.

    e.g. Mon 1 January 2001 11:00:00 becomes 978346800

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch)."; this.infoURL = "https://wikipedia.org/wiki/Unix_time"; this.inputType = "string"; this.outputType = "string"; @@ -72,7 +72,6 @@ class ToUNIXTimestamp extends Operation { return showDateTime ? `${result} (${d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss")} UTC)` : result.toString(); } - } export default ToUNIXTimestamp; diff --git a/src/core/operations/ToUpperCase.mjs b/src/core/operations/ToUpperCase.mjs index 8eb00731..b078b3ec 100644 --- a/src/core/operations/ToUpperCase.mjs +++ b/src/core/operations/ToUpperCase.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * To Upper case operation */ class ToUpperCase extends Operation { - /** * ToUpperCase constructor */ @@ -20,7 +19,8 @@ class ToUpperCase extends Operation { this.name = "To Upper case"; this.module = "Default"; - this.description = "Converts the input string to upper case, optionally limiting scope to only the first character in each word, sentence or paragraph."; + this.description + = "Converts the input string to upper case, optionally limiting scope to only the first character in each word, sentence or paragraph."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -59,7 +59,7 @@ class ToUpperCase extends Operation { } // Use the regex to capitalize the input - return input.replace(scopeRegex, function(m) { + return input.replace(scopeRegex, function (m) { return m.toUpperCase(); }); } @@ -89,7 +89,6 @@ class ToUpperCase extends Operation { highlightReverse(pos, args) { return pos; } - } export default ToUpperCase; diff --git a/src/core/operations/TranslateDateTimeFormat.mjs b/src/core/operations/TranslateDateTimeFormat.mjs index 70c76ac9..e37b6ac3 100644 --- a/src/core/operations/TranslateDateTimeFormat.mjs +++ b/src/core/operations/TranslateDateTimeFormat.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import moment from "moment-timezone"; -import {DATETIME_FORMATS, FORMAT_EXAMPLES} from "../lib/DateTime.mjs"; +import { DATETIME_FORMATS, FORMAT_EXAMPLES } from "../lib/DateTime.mjs"; /** * Translate DateTime Format operation */ class TranslateDateTimeFormat extends Operation { - /** * TranslateDateTimeFormat constructor */ @@ -22,7 +21,8 @@ class TranslateDateTimeFormat extends Operation { this.name = "Translate DateTime Format"; this.module = "Default"; - this.description = "Parses a datetime string in one format and re-writes it in another.

    Run with no input to see the relevant format string examples."; + this.description + = "Parses a datetime string in one format and re-writes it in another.

    Run with no input to see the relevant format string examples."; this.infoURL = "https://momentjs.com/docs/#/parsing/string-format/"; this.inputType = "string"; this.outputType = "string"; diff --git a/src/core/operations/TripleDESDecrypt.mjs b/src/core/operations/TripleDESDecrypt.mjs index 8487509f..d79cb57d 100644 --- a/src/core/operations/TripleDESDecrypt.mjs +++ b/src/core/operations/TripleDESDecrypt.mjs @@ -13,7 +13,6 @@ import forge from "node-forge"; * Triple DES Decrypt operation */ class TripleDESDecrypt extends Operation { - /** * TripleDESDecrypt constructor */ @@ -22,7 +21,8 @@ class TripleDESDecrypt extends Operation { this.name = "Triple DES Decrypt"; this.module = "Ciphers"; - this.description = "Triple DES applies DES three times to each block to increase key size.

    Key: Triple DES uses a key length of 24 bytes (192 bits).
    DES uses a key length of 8 bytes (64 bits).

    IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

    Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default."; + this.description + = "Triple DES applies DES three times to each block to increase key size.

    Key: Triple DES uses a key length of 24 bytes (192 bits).
    DES uses a key length of 8 bytes (64 bits).

    IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

    Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default."; this.infoURL = "https://wikipedia.org/wiki/Triple_DES"; this.inputType = "string"; this.outputType = "string"; @@ -85,17 +85,19 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); input = Utils.convertToByteString(input, inputType); - const decipher = forge.cipher.createDecipher("3DES-" + mode, - key.length === 16 ? key + key.substring(0, 8) : key); + const decipher = forge.cipher.createDecipher( + "3DES-" + mode, + key.length === 16 ? key + key.substring(0, 8) : key + ); /* Allow for a "no padding" mode */ if (noPadding) { - decipher.mode.unpad = function(output, options) { + decipher.mode.unpad = function (output, options) { return true; }; } - decipher.start({iv: iv}); + decipher.start({ iv: iv }); decipher.update(forge.util.createBuffer(input)); const result = decipher.finish(); @@ -105,7 +107,6 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); throw new OperationError("Unable to decrypt input with these parameters."); } } - } export default TripleDESDecrypt; diff --git a/src/core/operations/TripleDESEncrypt.mjs b/src/core/operations/TripleDESEncrypt.mjs index 720d155d..cd7e56c1 100644 --- a/src/core/operations/TripleDESEncrypt.mjs +++ b/src/core/operations/TripleDESEncrypt.mjs @@ -13,7 +13,6 @@ import forge from "node-forge"; * Triple DES Encrypt operation */ class TripleDESEncrypt extends Operation { - /** * TripleDESEncrypt constructor */ @@ -22,7 +21,8 @@ class TripleDESEncrypt extends Operation { this.name = "Triple DES Encrypt"; this.module = "Ciphers"; - this.description = "Triple DES applies DES three times to each block to increase key size.

    Key: Triple DES uses a key length of 24 bytes (192 bits).
    DES uses a key length of 8 bytes (64 bits).

    You can generate a password-based key using one of the KDF operations.

    IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

    Padding: In CBC and ECB mode, PKCS#7 padding will be used."; + this.description + = "Triple DES applies DES three times to each block to increase key size.

    Key: Triple DES uses a key length of 24 bytes (192 bits).
    DES uses a key length of 8 bytes (64 bits).

    You can generate a password-based key using one of the KDF operations.

    IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

    Padding: In CBC and ECB mode, PKCS#7 padding will be used."; this.infoURL = "https://wikipedia.org/wiki/Triple_DES"; this.inputType = "string"; this.outputType = "string"; @@ -84,15 +84,13 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); input = Utils.convertToByteString(input, inputType); - const cipher = forge.cipher.createCipher("3DES-" + mode, - key.length === 16 ? key + key.substring(0, 8) : key); - cipher.start({iv: iv}); + const cipher = forge.cipher.createCipher("3DES-" + mode, key.length === 16 ? key + key.substring(0, 8) : key); + cipher.start({ iv: iv }); cipher.update(forge.util.createBuffer(input)); cipher.finish(); return outputType === "Hex" ? cipher.output.toHex() : cipher.output.getBytes(); } - } export default TripleDESEncrypt; diff --git a/src/core/operations/Typex.mjs b/src/core/operations/Typex.mjs index 5c9d952e..77e6aeae 100644 --- a/src/core/operations/Typex.mjs +++ b/src/core/operations/Typex.mjs @@ -11,8 +11,8 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {LETTERS, Reflector} from "../lib/Enigma.mjs"; -import {ROTORS, REFLECTORS, TypexMachine, Plugboard, Rotor} from "../lib/Typex.mjs"; +import { LETTERS, Reflector } from "../lib/Enigma.mjs"; +import { ROTORS, REFLECTORS, TypexMachine, Plugboard, Rotor } from "../lib/Typex.mjs"; /** * Typex operation @@ -26,7 +26,8 @@ class Typex extends Operation { this.name = "Typex"; this.module = "Bletchley"; - this.description = "Encipher/decipher with the WW2 Typex machine.

    Typex was originally built by the British Royal Air Force prior to WW2, and is based on the Enigma machine with some improvements made, including using five rotors with more stepping points and interchangeable wiring cores. It was used across the British and Commonwealth militaries. A number of later variants were produced; here we simulate a WW2 era Mark 22 Typex with plugboards for the reflector and input. Typex rotors were changed regularly and none are public: a random example set are provided.

    To configure the reflector plugboard, enter a string of connected pairs of letters in the reflector box, e.g. AB CD EF connects A to B, C to D, and E to F (you'll need to connect every letter). There is also an input plugboard: unlike Enigma's plugboard, it's not restricted to pairs, so it's entered like a rotor (without stepping). To create your own rotor, enter the letters that the rotor maps A to Z to, in order, optionally followed by < then a list of stepping points.

    More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; + this.description + = "Encipher/decipher with the WW2 Typex machine.

    Typex was originally built by the British Royal Air Force prior to WW2, and is based on the Enigma machine with some improvements made, including using five rotors with more stepping points and interchangeable wiring cores. It was used across the British and Commonwealth militaries. A number of later variants were produced; here we simulate a WW2 era Mark 22 Typex with plugboards for the reflector and input. Typex rotors were changed regularly and none are public: a random example set are provided.

    To configure the reflector plugboard, enter a string of connected pairs of letters in the reflector box, e.g. AB CD EF connects A to B, C to D, and E to F (you'll need to connect every letter). There is also an input plugboard: unlike Enigma's plugboard, it's not restricted to pairs, so it's entered like a rotor (without stepping). To create your own rotor, enter the letters that the rotor maps A to Z to, in order, optionally followed by < then a list of stepping points.

    More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; this.infoURL = "https://wikipedia.org/wiki/Typex"; this.inputType = "string"; this.outputType = "string"; @@ -156,7 +157,7 @@ class Typex extends Operation { hint: "Remove non-alphabet letters and group output", type: "boolean", value: true - }, + } ]; } @@ -189,9 +190,9 @@ class Typex extends Operation { const typexKeyboard = args[22]; const removeOther = args[23]; const rotors = []; - for (let i=0; i<5; i++) { - const [rotorwiring, rotorsteps] = this.parseRotorStr(args[i*4]); - rotors.push(new Rotor(rotorwiring, rotorsteps, args[i*4 + 1], args[i*4+2], args[i*4+3])); + for (let i = 0; i < 5; i++) { + const [rotorwiring, rotorsteps] = this.parseRotorStr(args[i * 4]); + rotors.push(new Rotor(rotorwiring, rotorsteps, args[i * 4 + 1], args[i * 4 + 2], args[i * 4 + 3])); } // Rotors are handled in reverse rotors.reverse(); @@ -247,7 +248,6 @@ class Typex extends Operation { return pos; } } - } export default Typex; diff --git a/src/core/operations/UNIXTimestampToWindowsFiletime.mjs b/src/core/operations/UNIXTimestampToWindowsFiletime.mjs index ad88fb97..890f4593 100644 --- a/src/core/operations/UNIXTimestampToWindowsFiletime.mjs +++ b/src/core/operations/UNIXTimestampToWindowsFiletime.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * UNIX Timestamp to Windows Filetime operation */ class UNIXTimestampToWindowsFiletime extends Operation { - /** * UNIXTimestampToWindowsFiletime constructor */ @@ -21,7 +20,8 @@ class UNIXTimestampToWindowsFiletime extends Operation { this.name = "UNIX Timestamp to Windows Filetime"; this.module = "Default"; - this.description = "Converts a UNIX timestamp to a Windows Filetime value.

    A Windows Filetime is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 UTC.

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch).

    This operation also supports UNIX timestamps in milliseconds, microseconds and nanoseconds."; + this.description + = "Converts a UNIX timestamp to a Windows Filetime value.

    A Windows Filetime is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 UTC.

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch).

    This operation also supports UNIX timestamps in milliseconds, microseconds and nanoseconds."; this.infoURL = "https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx"; this.inputType = "string"; this.outputType = "string"; @@ -87,7 +87,6 @@ class UNIXTimestampToWindowsFiletime extends Operation { return result; } - } export default UNIXTimestampToWindowsFiletime; diff --git a/src/core/operations/URLDecode.mjs b/src/core/operations/URLDecode.mjs index 7d6544ac..8859d361 100644 --- a/src/core/operations/URLDecode.mjs +++ b/src/core/operations/URLDecode.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * URL Decode operation */ class URLDecode extends Operation { - /** * URLDecode constructor */ @@ -19,7 +18,8 @@ class URLDecode extends Operation { this.name = "URL Decode"; this.module = "URL"; - this.description = "Converts URI/URL percent-encoded characters back to their raw values.

    e.g. %3d becomes ="; + this.description + = "Converts URI/URL percent-encoded characters back to their raw values.

    e.g. %3d becomes ="; this.infoURL = "https://wikipedia.org/wiki/Percent-encoding"; this.inputType = "string"; this.outputType = "string"; @@ -29,7 +29,7 @@ class URLDecode extends Operation { pattern: ".*(?:%[\\da-f]{2}.*){4}", flags: "i", args: [] - }, + } ]; } @@ -46,7 +46,6 @@ class URLDecode extends Operation { return unescape(data); } } - } export default URLDecode; diff --git a/src/core/operations/URLEncode.mjs b/src/core/operations/URLEncode.mjs index a5efd213..ceeb5d48 100644 --- a/src/core/operations/URLEncode.mjs +++ b/src/core/operations/URLEncode.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * URL Encode operation */ class URLEncode extends Operation { - /** * URLEncode constructor */ @@ -19,7 +18,8 @@ class URLEncode extends Operation { this.name = "URL Encode"; this.module = "URL"; - this.description = "Encodes problematic characters into percent-encoding, a format supported by URIs/URLs.

    e.g. = becomes %3d"; + this.description + = "Encodes problematic characters into percent-encoding, a format supported by URIs/URLs.

    e.g. = becomes %3d"; this.infoURL = "https://wikipedia.org/wiki/Percent-encoding"; this.inputType = "string"; this.outputType = "string"; @@ -48,7 +48,7 @@ class URLEncode extends Operation { * @param {string} str * @returns {string} */ - encodeAllChars (str) { + encodeAllChars(str) { // TODO Do this programmatically return encodeURIComponent(str) .replace(/!/g, "%21") @@ -62,8 +62,6 @@ class URLEncode extends Operation { .replace(/_/g, "%5F") .replace(/~/g, "%7E"); } - } - export default URLEncode; diff --git a/src/core/operations/UnescapeString.mjs b/src/core/operations/UnescapeString.mjs index 8fafb446..3f593aab 100644 --- a/src/core/operations/UnescapeString.mjs +++ b/src/core/operations/UnescapeString.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Unescape string operation */ class UnescapeString extends Operation { - /** * UnescapeString constructor */ @@ -20,7 +19,8 @@ class UnescapeString extends Operation { this.name = "Unescape string"; this.module = "Default"; - this.description = "Unescapes characters in a string that have been escaped. For example, Don\\'t stop me now becomes Don't stop me now.

    Supports the following escape sequences:"; + this.description + = "Unescapes characters in a string that have been escaped. For example, Don\\'t stop me now becomes Don't stop me now.

    Supports the following escape sequences:"; this.infoURL = "https://wikipedia.org/wiki/Escape_sequence"; this.inputType = "string"; this.outputType = "string"; @@ -35,7 +35,6 @@ class UnescapeString extends Operation { run(input, args) { return Utils.parseEscapedChars(input); } - } export default UnescapeString; diff --git a/src/core/operations/UnescapeUnicodeCharacters.mjs b/src/core/operations/UnescapeUnicodeCharacters.mjs index 5bb0e5ac..b2c9ca17 100644 --- a/src/core/operations/UnescapeUnicodeCharacters.mjs +++ b/src/core/operations/UnescapeUnicodeCharacters.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Unescape Unicode Characters operation */ class UnescapeUnicodeCharacters extends Operation { - /** * UnescapeUnicodeCharacters constructor */ @@ -20,7 +19,8 @@ class UnescapeUnicodeCharacters extends Operation { this.name = "Unescape Unicode Characters"; this.module = "Default"; - this.description = "Converts unicode-escaped character notation back into raw characters.

    Supports the prefixes:e.g. \\u03c3\\u03bf\\u03c5 becomes σου"; + this.description + = "Converts unicode-escaped character notation back into raw characters.

    Supports the prefixes:e.g. \\u03c3\\u03bf\\u03c5 becomes σου"; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -39,7 +39,7 @@ class UnescapeUnicodeCharacters extends Operation { */ run(input, args) { const prefix = prefixToRegex[args[0]], - regex = new RegExp(prefix+"([a-f\\d]{4})", "ig"); + regex = new RegExp(prefix + "([a-f\\d]{4})", "ig"); let output = "", m, i = 0; @@ -59,7 +59,6 @@ class UnescapeUnicodeCharacters extends Operation { return output; } - } /** diff --git a/src/core/operations/UnicodeTextFormat.mjs b/src/core/operations/UnicodeTextFormat.mjs index 2c18848f..6dc7e417 100644 --- a/src/core/operations/UnicodeTextFormat.mjs +++ b/src/core/operations/UnicodeTextFormat.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Unicode Text Format operation */ class UnicodeTextFormat extends Operation { - /** * UnicodeTextFormat constructor */ @@ -45,15 +44,15 @@ class UnicodeTextFormat extends Operation { */ run(input, args) { const [underline, strikethrough] = args; - let output = input.map(char => [char]); + let output = input.map((char) => [char]); if (strikethrough) { - output = output.map(charFormat => { + output = output.map((charFormat) => { charFormat.push(...Utils.strToUtf8ByteArray("\u0336")); return charFormat; }); } if (underline) { - output = output.map(charFormat => { + output = output.map((charFormat) => { charFormat.push(...Utils.strToUtf8ByteArray("\u0332")); return charFormat; }); @@ -61,7 +60,6 @@ class UnicodeTextFormat extends Operation { // return output.flat(); - Not supported in Node 10, polyfilled return [].concat(...output); } - } export default UnicodeTextFormat; diff --git a/src/core/operations/Unique.mjs b/src/core/operations/Unique.mjs index 7ca2db66..7486c400 100644 --- a/src/core/operations/Unique.mjs +++ b/src/core/operations/Unique.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Unique operation */ class Unique extends Operation { - /** * Unique constructor */ @@ -57,12 +56,13 @@ class Unique extends Operation { return acc; }, {}); - return Object.keys(valMap).map(val => `${valMap[val]} ${val}`).join(delim); + return Object.keys(valMap) + .map((val) => `${valMap[val]} ${val}`) + .join(delim); } else { return input.split(delim).unique().join(delim); } } - } export default Unique; diff --git a/src/core/operations/Untar.mjs b/src/core/operations/Untar.mjs index 4e6af250..adc76687 100644 --- a/src/core/operations/Untar.mjs +++ b/src/core/operations/Untar.mjs @@ -12,7 +12,6 @@ import Stream from "../lib/Stream.mjs"; * Untar operation */ class Untar extends Operation { - /** * Untar constructor */ @@ -59,7 +58,7 @@ class Untar extends Operation { checksum: stream.readString(8), type: stream.readString(1), linkedFileName: stream.readString(100), - USTARFormat: stream.readString(6).indexOf("ustar") >= 0, + USTARFormat: stream.readString(6).indexOf("ustar") >= 0 }; if (file.USTARFormat) { @@ -103,7 +102,6 @@ class Untar extends Operation { async present(files) { return await Utils.displayFilesAsHTML(files); } - } export default Untar; diff --git a/src/core/operations/Unzip.mjs b/src/core/operations/Unzip.mjs index 2e8be411..d07c6e07 100644 --- a/src/core/operations/Unzip.mjs +++ b/src/core/operations/Unzip.mjs @@ -14,7 +14,6 @@ const Zlib = unzip.Zlib; * Unzip operation */ class Unzip extends Operation { - /** * Unzip constructor */ @@ -23,7 +22,8 @@ class Unzip extends Operation { this.name = "Unzip"; this.module = "Compression"; - this.description = "Decompresses data using the PKZIP algorithm and displays it per file, with support for passwords."; + this.description + = "Decompresses data using the PKZIP algorithm and displays it per file, with support for passwords."; this.infoURL = "https://wikipedia.org/wiki/Zip_(file_format)"; this.inputType = "ArrayBuffer"; this.outputType = "List"; @@ -62,7 +62,7 @@ class Unzip extends Operation { unzip = new Zlib.Unzip(new Uint8Array(input), options), filenames = unzip.getFilenames(); - return filenames.map(fileName => { + return filenames.map((fileName) => { const bytes = unzip.decompress(fileName); return new File([bytes], fileName); }); @@ -77,7 +77,6 @@ class Unzip extends Operation { async present(files) { return await Utils.displayFilesAsHTML(files); } - } export default Unzip; diff --git a/src/core/operations/VarIntDecode.mjs b/src/core/operations/VarIntDecode.mjs index 46c99cb7..a4eb54f7 100644 --- a/src/core/operations/VarIntDecode.mjs +++ b/src/core/operations/VarIntDecode.mjs @@ -12,7 +12,6 @@ import Protobuf from "../lib/Protobuf.mjs"; * VarInt Decode operation */ class VarIntDecode extends Operation { - /** * VarIntDecode constructor */ @@ -21,7 +20,8 @@ class VarIntDecode extends Operation { this.name = "VarInt Decode"; this.module = "Default"; - this.description = "Decodes a VarInt encoded integer. VarInt is an efficient way of encoding variable length integers and is commonly used with Protobuf."; + this.description + = "Decodes a VarInt encoded integer. VarInt is an efficient way of encoding variable length integers and is commonly used with Protobuf."; this.infoURL = "https://developers.google.com/protocol-buffers/docs/encoding#varints"; this.inputType = "byteArray"; this.outputType = "number"; @@ -40,7 +40,6 @@ class VarIntDecode extends Operation { throw new OperationError(err); } } - } export default VarIntDecode; diff --git a/src/core/operations/VarIntEncode.mjs b/src/core/operations/VarIntEncode.mjs index d86d33f5..66a33f09 100644 --- a/src/core/operations/VarIntEncode.mjs +++ b/src/core/operations/VarIntEncode.mjs @@ -12,7 +12,6 @@ import Protobuf from "../lib/Protobuf.mjs"; * VarInt Encode operation */ class VarIntEncode extends Operation { - /** * VarIntEncode constructor */ @@ -21,7 +20,8 @@ class VarIntEncode extends Operation { this.name = "VarInt Encode"; this.module = "Default"; - this.description = "Encodes a Vn integer as a VarInt. VarInt is an efficient way of encoding variable length integers and is commonly used with Protobuf."; + this.description + = "Encodes a Vn integer as a VarInt. VarInt is an efficient way of encoding variable length integers and is commonly used with Protobuf."; this.infoURL = "https://developers.google.com/protocol-buffers/docs/encoding#varints"; this.inputType = "number"; this.outputType = "byteArray"; @@ -40,7 +40,6 @@ class VarIntEncode extends Operation { throw new OperationError(err); } } - } export default VarIntEncode; diff --git a/src/core/operations/ViewBitPlane.mjs b/src/core/operations/ViewBitPlane.mjs index acdd6cdd..a6c2ff9f 100644 --- a/src/core/operations/ViewBitPlane.mjs +++ b/src/core/operations/ViewBitPlane.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * View Bit Plane operation */ class ViewBitPlane extends Operation { - /** * ViewBitPlane constructor */ @@ -24,7 +23,8 @@ class ViewBitPlane extends Operation { this.name = "View Bit Plane"; this.module = "Image"; - this.description = "Extracts and displays a bit plane of any given image. These show only a single bit from each pixel, and can be used to hide messages in Steganography."; + this.description + = "Extracts and displays a bit plane of any given image. These show only a single bit from each pixel, and can be used to hide messages in Steganography."; this.infoURL = "https://wikipedia.org/wiki/Bit_plane"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -56,7 +56,7 @@ class ViewBitPlane extends Operation { width = parsedImage.bitmap.width, height = parsedImage.bitmap.height, colourIndex = COLOUR_OPTIONS.indexOf(colour), - bitIndex = 7-bit; + bitIndex = 7 - bit; if (bit < 0 || bit > 7) { throw new OperationError("Error: Bit argument must be between 0 and 7"); @@ -64,18 +64,17 @@ class ViewBitPlane extends Operation { let pixel, bin, newPixelValue; - parsedImage.scan(0, 0, width, height, function(x, y, idx) { + parsedImage.scan(0, 0, width, height, function (x, y, idx) { pixel = this.bitmap.data[idx + colourIndex]; bin = Utils.bin(pixel); newPixelValue = 255; if (bin.charAt(bitIndex) === "1") newPixelValue = 0; - for (let i=0; i < 3; i++) { + for (let i = 0; i < 3; i++) { this.bitmap.data[idx + i] = newPixelValue; } this.bitmap.data[idx + 3] = 255; - }); const imageBuffer = await parsedImage.getBufferAsync(jimp.AUTO); @@ -94,14 +93,8 @@ class ViewBitPlane extends Operation { return ``; } - } -const COLOUR_OPTIONS = [ - "Red", - "Green", - "Blue", - "Alpha" -]; +const COLOUR_OPTIONS = ["Red", "Green", "Blue", "Alpha"]; export default ViewBitPlane; diff --git a/src/core/operations/VigenèreDecode.mjs b/src/core/operations/VigenèreDecode.mjs index 8abaeed8..dbe77470 100644 --- a/src/core/operations/VigenèreDecode.mjs +++ b/src/core/operations/VigenèreDecode.mjs @@ -10,7 +10,6 @@ import OperationError from "../errors/OperationError.mjs"; * Vigenère Decode operation */ class VigenèreDecode extends Operation { - /** * VigenèreDecode constructor */ @@ -19,7 +18,8 @@ class VigenèreDecode extends Operation { this.name = "Vigenère Decode"; this.module = "Ciphers"; - this.description = "The Vigenere cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution."; + this.description + = "The Vigenere cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution."; this.infoURL = "https://wikipedia.org/wiki/Vigenère_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -96,7 +96,6 @@ class VigenèreDecode extends Operation { highlightReverse(pos, args) { return pos; } - } export default VigenèreDecode; diff --git a/src/core/operations/VigenèreEncode.mjs b/src/core/operations/VigenèreEncode.mjs index db212fe2..25a18536 100644 --- a/src/core/operations/VigenèreEncode.mjs +++ b/src/core/operations/VigenèreEncode.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Vigenère Encode operation */ class VigenèreEncode extends Operation { - /** * VigenèreEncode constructor */ @@ -20,7 +19,8 @@ class VigenèreEncode extends Operation { this.name = "Vigenère Encode"; this.module = "Ciphers"; - this.description = "The Vigenere cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution."; + this.description + = "The Vigenere cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution."; this.infoURL = "https://wikipedia.org/wiki/Vigenère_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -101,7 +101,6 @@ class VigenèreEncode extends Operation { highlightReverse(pos, args) { return pos; } - } export default VigenèreEncode; diff --git a/src/core/operations/Whirlpool.mjs b/src/core/operations/Whirlpool.mjs index c2364912..82537c59 100644 --- a/src/core/operations/Whirlpool.mjs +++ b/src/core/operations/Whirlpool.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * Whirlpool operation */ class Whirlpool extends Operation { - /** * Whirlpool constructor */ @@ -20,7 +19,8 @@ class Whirlpool extends Operation { this.name = "Whirlpool"; this.module = "Crypto"; - this.description = "Whirlpool is a cryptographic hash function designed by Vincent Rijmen (co-creator of AES) and Paulo S. L. M. Barreto, who first described it in 2000.

    Several variants exist:
    • Whirlpool-0 is the original version released in 2000.
    • Whirlpool-T is the first revision, released in 2001, improving the generation of the s-box.
    • Whirlpool is the latest revision, released in 2003, fixing a flaw in the diffusion matrix.
    "; + this.description + = "Whirlpool is a cryptographic hash function designed by Vincent Rijmen (co-creator of AES) and Paulo S. L. M. Barreto, who first described it in 2000.

    Several variants exist:
    • Whirlpool-0 is the original version released in 2000.
    • Whirlpool-T is the first revision, released in 2001, improving the generation of the s-box.
    • Whirlpool is the latest revision, released in 2003, fixing a flaw in the diffusion matrix.
    "; this.infoURL = "https://wikipedia.org/wiki/Whirlpool_(cryptography)"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -47,9 +47,8 @@ class Whirlpool extends Operation { */ run(input, args) { const variant = args[0].toLowerCase(); - return runHash(variant, input, {rounds: args[1]}); + return runHash(variant, input, { rounds: args[1] }); } - } export default Whirlpool; diff --git a/src/core/operations/WindowsFiletimeToUNIXTimestamp.mjs b/src/core/operations/WindowsFiletimeToUNIXTimestamp.mjs index 786cbcce..43a7e936 100644 --- a/src/core/operations/WindowsFiletimeToUNIXTimestamp.mjs +++ b/src/core/operations/WindowsFiletimeToUNIXTimestamp.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Windows Filetime to UNIX Timestamp operation */ class WindowsFiletimeToUNIXTimestamp extends Operation { - /** * WindowsFiletimeToUNIXTimestamp constructor */ @@ -21,7 +20,8 @@ class WindowsFiletimeToUNIXTimestamp extends Operation { this.name = "Windows Filetime to UNIX Timestamp"; this.module = "Default"; - this.description = "Converts a Windows Filetime value to a UNIX timestamp.

    A Windows Filetime is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 UTC.

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch).

    This operation also supports UNIX timestamps in milliseconds, microseconds and nanoseconds."; + this.description + = "Converts a Windows Filetime value to a UNIX timestamp.

    A Windows Filetime is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 UTC.

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch).

    This operation also supports UNIX timestamps in milliseconds, microseconds and nanoseconds."; this.infoURL = "https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx"; this.inputType = "string"; this.outputType = "string"; @@ -55,7 +55,7 @@ class WindowsFiletimeToUNIXTimestamp extends Operation { if (input.length % 2 !== 0) { result += input.charAt(input.length - 1); } - for (let i = input.length - input.length % 2 - 2; i >= 0; i -= 2) { + for (let i = input.length - (input.length % 2) - 2; i >= 0; i -= 2) { result += input.charAt(i); result += input.charAt(i + 1); } @@ -84,7 +84,6 @@ class WindowsFiletimeToUNIXTimestamp extends Operation { return input.toFixed(); } - } export default WindowsFiletimeToUNIXTimestamp; diff --git a/src/core/operations/XKCDRandomNumber.mjs b/src/core/operations/XKCDRandomNumber.mjs index ba9b5e27..efd5d551 100644 --- a/src/core/operations/XKCDRandomNumber.mjs +++ b/src/core/operations/XKCDRandomNumber.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * XKCD Random Number operation */ class XKCDRandomNumber extends Operation { - /** * XKCDRandomNumber constructor */ @@ -33,9 +32,8 @@ class XKCDRandomNumber extends Operation { */ run(input, args) { return 4; // chosen by fair dice roll. - // guaranteed to be random. + // guaranteed to be random. } - } export default XKCDRandomNumber; diff --git a/src/core/operations/XMLBeautify.mjs b/src/core/operations/XMLBeautify.mjs index 2cabb9b2..0548723d 100644 --- a/src/core/operations/XMLBeautify.mjs +++ b/src/core/operations/XMLBeautify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * XML Beautify operation */ class XMLBeautify extends Operation { - /** * XMLBeautify constructor */ @@ -41,7 +40,6 @@ class XMLBeautify extends Operation { const indentStr = args[0]; return vkbeautify.xml(input, indentStr); } - } export default XMLBeautify; diff --git a/src/core/operations/XMLMinify.mjs b/src/core/operations/XMLMinify.mjs index 5c710951..8c8b938f 100644 --- a/src/core/operations/XMLMinify.mjs +++ b/src/core/operations/XMLMinify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * XML Minify operation */ class XMLMinify extends Operation { - /** * XMLMinify constructor */ @@ -41,7 +40,6 @@ class XMLMinify extends Operation { const preserveComments = args[0]; return vkbeautify.xmlmin(input, preserveComments); } - } export default XMLMinify; diff --git a/src/core/operations/XOR.mjs b/src/core/operations/XOR.mjs index aa228842..71d5eaf3 100644 --- a/src/core/operations/XOR.mjs +++ b/src/core/operations/XOR.mjs @@ -12,7 +12,6 @@ import { bitOp, xor, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs"; * XOR operation */ class XOR extends Operation { - /** * XOR constructor */ @@ -21,7 +20,8 @@ class XOR extends Operation { this.name = "XOR"; this.module = "Default"; - this.description = "XOR the input with the given key.
    e.g. fe023da5

    Options
    Null preserving: If the current byte is 0x00 or the same as the key, skip it.

    Scheme:
    • Standard - key is unchanged after each round
    • Input differential - key is set to the value of the previous unprocessed byte
    • Output differential - key is set to the value of the previous processed byte
    • Cascade - key is set to the input byte shifted by one
    "; + this.description + = "XOR the input with the given key.
    e.g. fe023da5

    Options
    Null preserving: If the current byte is 0x00 or the same as the key, skip it.

    Scheme:
    • Standard - key is unchanged after each round
    • Input differential - key is set to the value of the previous unprocessed byte
    • Output differential - key is set to the value of the previous processed byte
    • Cascade - key is set to the input byte shifted by one
    "; this.infoURL = "https://wikipedia.org/wiki/XOR"; this.inputType = "ArrayBuffer"; this.outputType = "byteArray"; @@ -83,7 +83,6 @@ class XOR extends Operation { highlightReverse(pos, args) { return pos; } - } export default XOR; diff --git a/src/core/operations/XORBruteForce.mjs b/src/core/operations/XORBruteForce.mjs index 8c097731..21376999 100644 --- a/src/core/operations/XORBruteForce.mjs +++ b/src/core/operations/XORBruteForce.mjs @@ -14,7 +14,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * XOR Brute Force operation */ class XORBruteForce extends Operation { - /** * XORBruteForce constructor */ @@ -23,7 +22,8 @@ class XORBruteForce extends Operation { this.name = "XOR Brute Force"; this.module = "Default"; - this.description = "Enumerate all possible XOR solutions. Current maximum key length is 2 due to browser performance.

    Optionally enter a string that you expect to find in the plaintext to filter results (crib)."; + this.description + = "Enumerate all possible XOR solutions. Current maximum key length is 2 due to browser performance.

    Optionally enter a string that you expect to find in the plaintext to filter results (crib)."; this.infoURL = "https://wikipedia.org/wiki/Exclusive_or"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -78,16 +78,7 @@ class XORBruteForce extends Operation { */ run(input, args) { input = new Uint8Array(input); - const [ - keyLength, - sampleLength, - sampleOffset, - scheme, - nullPreserving, - printKey, - outputHex, - rawCrib - ] = args, + const [keyLength, sampleLength, sampleOffset, scheme, nullPreserving, printKey, outputHex, rawCrib] = args, crib = rawCrib.toLowerCase(), output = []; let result, @@ -96,8 +87,7 @@ class XORBruteForce extends Operation { input = input.slice(sampleOffset, sampleOffset + sampleLength); - if (isWorkerEnvironment()) - self.sendStatusMessage("Calculating " + Math.pow(256, keyLength) + " values..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Calculating " + Math.pow(256, keyLength) + " values..."); /** * Converts an integer to an array of bytes expressing that number. @@ -117,7 +107,7 @@ class XORBruteForce extends Operation { for (let key = 1, l = Math.pow(256, keyLength); key < l; key++) { if (key % 10000 === 0 && isWorkerEnvironment()) { - self.sendStatusMessage("Calculating " + l + " values... " + Math.floor(key / l * 100) + "%"); + self.sendStatusMessage("Calculating " + l + " values... " + Math.floor((key / l) * 100) + "%"); } result = bitOp(input, intToByteArray(key, keyLength), xor, nullPreserving, scheme); @@ -125,7 +115,7 @@ class XORBruteForce extends Operation { record = ""; if (crib && resultUtf8.toLowerCase().indexOf(crib) < 0) continue; - if (printKey) record += "Key = " + Utils.hex(key, (2*keyLength)) + ": "; + if (printKey) record += "Key = " + Utils.hex(key, 2 * keyLength) + ": "; record += outputHex ? toHex(result) : Utils.escapeWhitespace(resultUtf8); output.push(record); @@ -133,7 +123,6 @@ class XORBruteForce extends Operation { return output.join("\n"); } - } export default XORBruteForce; diff --git a/src/core/operations/XPathExpression.mjs b/src/core/operations/XPathExpression.mjs index 7bfe3ee1..1b377422 100644 --- a/src/core/operations/XPathExpression.mjs +++ b/src/core/operations/XPathExpression.mjs @@ -13,7 +13,6 @@ import xpath from "xpath"; * XPath expression operation */ class XPathExpression extends Operation { - /** * XPathExpression constructor */ @@ -74,13 +73,12 @@ class XPathExpression extends Operation { throw new OperationError(`Invalid XPath. Details:\n${err.message}.`); } - const nodeToString = function(node) { + const nodeToString = function (node) { return node.toString(); }; return nodes.map(nodeToString).join(delimiter); } - } export default XPathExpression; diff --git a/src/core/operations/YARARules.mjs b/src/core/operations/YARARules.mjs index d91f50ae..987ba652 100644 --- a/src/core/operations/YARARules.mjs +++ b/src/core/operations/YARARules.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * YARA Rules operation */ class YARARules extends Operation { - /** * YARARules constructor */ @@ -22,7 +21,8 @@ class YARARules extends Operation { this.name = "YARA Rules"; this.module = "Yara"; - this.description = "YARA is a tool developed at VirusTotal, primarily aimed at helping malware researchers to identify and classify malware samples. It matches based on rules specified by the user containing textual or binary patterns and a boolean expression. For help on writing rules, see the YARA documentation."; + this.description + = "YARA is a tool developed at VirusTotal, primarily aimed at helping malware researchers to identify and classify malware samples. It matches based on rules specified by the user containing textual or binary patterns and a boolean expression. For help on writing rules, see the YARA documentation."; this.infoURL = "https://wikipedia.org/wiki/YARA"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -62,7 +62,7 @@ class YARARules extends Operation { name: "Show console module messages", type: "boolean", value: true - }, + } ]; } @@ -72,11 +72,10 @@ class YARARules extends Operation { * @returns {string} */ async run(input, args) { - if (isWorkerEnvironment()) - self.sendStatusMessage("Instantiating YARA..."); + if (isWorkerEnvironment()) self.sendStatusMessage("Instantiating YARA..."); const [rules, showStrings, showLengths, showMeta, showCounts, showRuleWarns, showConsole] = args; return new Promise((resolve, reject) => { - Yara().then(yara => { + Yara().then((yara) => { if (isWorkerEnvironment()) self.sendStatusMessage("Converting data for YARA."); let matchString = ""; @@ -92,7 +91,9 @@ class YARARules extends Operation { for (let i = 0; i < resp.compileErrors.size(); i++) { const compileError = resp.compileErrors.get(i); if (!compileError.warning) { - reject(new OperationError(`Error on line ${compileError.lineNumber}: ${compileError.message}`)); + reject( + new OperationError(`Error on line ${compileError.lineNumber}: ${compileError.message}`) + ); } else if (showRuleWarns) { matchString += `Warning on line ${compileError.lineNumber}: ${compileError.message}\n`; } @@ -118,9 +119,14 @@ class YARARules extends Operation { } meta = meta.slice(0, -2) + "]"; } - const countString = matches.size() === 0 ? "" : (showCounts ? ` (${matches.size()} time${matches.size() > 1 ? "s" : ""})` : ""); + const countString + = matches.size() === 0 + ? "" + : showCounts + ? ` (${matches.size()} time${matches.size() > 1 ? "s" : ""})` + : ""; if (matches.size() === 0 || !(showStrings || showLengths)) { - matchString += `Input matches rule "${rule.ruleName}"${meta}${countString.length > 0 ? ` ${countString}`: ""}.\n`; + matchString += `Input matches rule "${rule.ruleName}"${meta}${countString.length > 0 ? ` ${countString}` : ""}.\n`; } else { matchString += `Rule "${rule.ruleName}"${meta} matches${countString}:\n`; for (let j = 0; j < matches.size(); j++) { @@ -135,7 +141,6 @@ class YARARules extends Operation { }); }); } - } export default YARARules; diff --git a/src/core/operations/Zip.mjs b/src/core/operations/Zip.mjs index dbe51462..a9c322dc 100644 --- a/src/core/operations/Zip.mjs +++ b/src/core/operations/Zip.mjs @@ -6,19 +6,19 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {COMPRESSION_TYPE, ZLIB_COMPRESSION_TYPE_LOOKUP} from "../lib/Zlib.mjs"; +import { COMPRESSION_TYPE, ZLIB_COMPRESSION_TYPE_LOOKUP } from "../lib/Zlib.mjs"; import zip from "zlibjs/bin/zip.min.js"; const Zlib = zip.Zlib; const ZIP_COMPRESSION_METHOD_LOOKUP = { - "Deflate": Zlib.Zip.CompressionMethod.DEFLATE, + "Deflate": Zlib.Zip.CompressionMethod.DEFLATE, "None (Store)": Zlib.Zip.CompressionMethod.STORE }; const ZIP_OS_LOOKUP = { - "MSDOS": Zlib.Zip.OperatingSystem.MSDOS, - "Unix": Zlib.Zip.OperatingSystem.UNIX, + "MSDOS": Zlib.Zip.OperatingSystem.MSDOS, + "Unix": Zlib.Zip.OperatingSystem.UNIX, "Macintosh": Zlib.Zip.OperatingSystem.MACINTOSH }; @@ -26,7 +26,6 @@ const ZIP_OS_LOOKUP = { * Zip operation */ class Zip extends Operation { - /** * Zip constructor */ @@ -35,7 +34,8 @@ class Zip extends Operation { this.name = "Zip"; this.module = "Compression"; - this.description = "Compresses data using the PKZIP algorithm with the given filename.

    No support for multiple files at this time."; + this.description + = "Compresses data using the PKZIP algorithm with the given filename.

    No support for multiple files at this time."; this.infoURL = "https://wikipedia.org/wiki/Zip_(file_format)"; this.inputType = "ArrayBuffer"; this.outputType = "File"; @@ -88,16 +88,14 @@ class Zip extends Operation { os: ZIP_OS_LOOKUP[args[4]], deflateOption: { compressionType: ZLIB_COMPRESSION_TYPE_LOOKUP[args[5]] - }, + } }, zip = new Zlib.Zip(); - if (password.length) - zip.setPassword(password); + if (password.length) zip.setPassword(password); zip.addFile(new Uint8Array(input), options); return new File([zip.compress()], filename); } - } export default Zip; diff --git a/src/core/operations/ZlibDeflate.mjs b/src/core/operations/ZlibDeflate.mjs index 4436d84a..4b351a4d 100644 --- a/src/core/operations/ZlibDeflate.mjs +++ b/src/core/operations/ZlibDeflate.mjs @@ -5,7 +5,7 @@ */ import Operation from "../Operation.mjs"; -import {COMPRESSION_TYPE, ZLIB_COMPRESSION_TYPE_LOOKUP} from "../lib/Zlib.mjs"; +import { COMPRESSION_TYPE, ZLIB_COMPRESSION_TYPE_LOOKUP } from "../lib/Zlib.mjs"; import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min.js"; const Zlib = zlibAndGzip.Zlib; @@ -14,7 +14,6 @@ const Zlib = zlibAndGzip.Zlib; * Zlib Deflate operation */ class ZlibDeflate extends Operation { - /** * ZlibDeflate constructor */ @@ -47,7 +46,6 @@ class ZlibDeflate extends Operation { }); return new Uint8Array(deflate.compress()).buffer; } - } export default ZlibDeflate; diff --git a/src/core/operations/ZlibInflate.mjs b/src/core/operations/ZlibInflate.mjs index a24d7476..8eb1985c 100644 --- a/src/core/operations/ZlibInflate.mjs +++ b/src/core/operations/ZlibInflate.mjs @@ -5,21 +5,20 @@ */ import Operation from "../Operation.mjs"; -import {INFLATE_BUFFER_TYPE} from "../lib/Zlib.mjs"; +import { INFLATE_BUFFER_TYPE } from "../lib/Zlib.mjs"; import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min.js"; const Zlib = zlibAndGzip.Zlib; const ZLIB_BUFFER_TYPE_LOOKUP = { "Adaptive": Zlib.Inflate.BufferType.ADAPTIVE, - "Block": Zlib.Inflate.BufferType.BLOCK, + "Block": Zlib.Inflate.BufferType.BLOCK }; /** * Zlib Inflate operation */ class ZlibInflate extends Operation { - /** * ZlibInflate constructor */ @@ -64,7 +63,7 @@ class ZlibInflate extends Operation { pattern: "^\\x78(\\x01|\\x9c|\\xda|\\x5e)", flags: "", args: [0, 0, "Adaptive", false, false] - }, + } ]; } @@ -83,7 +82,6 @@ class ZlibInflate extends Operation { }); return new Uint8Array(inflate.decompress()).buffer; } - } export default ZlibInflate; diff --git a/src/core/vendor/DisassembleX86-64.mjs b/src/core/vendor/DisassembleX86-64.mjs index 5f0ac65d..51a5336c 100644 --- a/src/core/vendor/DisassembleX86-64.mjs +++ b/src/core/vendor/DisassembleX86-64.mjs @@ -25,7 +25,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------------------------------------------------*/ - /*------------------------------------------------------------------------------------------------------------------------- Binary byte code array. --------------------------------------------------------------------------------------------------------------------------- @@ -57,7 +56,8 @@ into the BinCode array using the Function ^LoadBinCode()^. The function ^SetBasePosition()^ sets the base location in Pos64, and Pos32, and Code Segment. -------------------------------------------------------------------------------------------------------------------------*/ -var Pos64 = 0x00000000, Pos32 = 0x00000000; +var Pos64 = 0x00000000, + Pos32 = 0x00000000; /*------------------------------------------------------------------------------------------------------------------------- Code Segment is used in 16 bit binaries in which the segment is times 16 (Left Shift 4) added to the 16 bit address position. @@ -157,1157 +157,2676 @@ The function ^DecodeOpcode()^ Gives back the instructions name. --------------------------------------------------------------------------------------------------------------------------*/ const Mnemonics = [ - /*------------------------------------------------------------------------------------------------------------------------ + /*------------------------------------------------------------------------------------------------------------------------ First Byte operations 0 to 255. ------------------------------------------------------------------------------------------------------------------------*/ - "ADD","ADD","ADD","ADD","ADD","ADD","PUSH ES","POP ES", - "OR","OR","OR","OR","OR","OR","PUSH CS" - , - "" //*Two byte instructions prefix sets opcode 01,000000000 next byte read is added to the lower 8 bit's. - , - "ADC","ADC","ADC","ADC","ADC","ADC","PUSH SS","POP SS", - "SBB","SBB","SBB","SBB","SBB","SBB","PUSH DS","POP DS", - "AND","AND","AND","AND","AND","AND", - "ES:[", //Extra segment override sets SegOveride "ES:[". - "DAA", - "SUB","SUB","SUB","SUB","SUB","SUB", - "CS:[", //Code segment override sets SegOveride "CS:[". - "DAS", - "XOR","XOR","XOR","XOR","XOR","XOR", - "SS:[", //Stack segment override sets SegOveride "SS:[". - "AAA", - "CMP","CMP","CMP","CMP","CMP","CMP", - "DS:[", //Data Segment override sets SegOveride "DS:[". - "AAS", - /*------------------------------------------------------------------------------------------------------------------------ + "ADD", + "ADD", + "ADD", + "ADD", + "ADD", + "ADD", + "PUSH ES", + "POP ES", + "OR", + "OR", + "OR", + "OR", + "OR", + "OR", + "PUSH CS", + "", //*Two byte instructions prefix sets opcode 01,000000000 next byte read is added to the lower 8 bit's. + "ADC", + "ADC", + "ADC", + "ADC", + "ADC", + "ADC", + "PUSH SS", + "POP SS", + "SBB", + "SBB", + "SBB", + "SBB", + "SBB", + "SBB", + "PUSH DS", + "POP DS", + "AND", + "AND", + "AND", + "AND", + "AND", + "AND", + "ES:[", //Extra segment override sets SegOveride "ES:[". + "DAA", + "SUB", + "SUB", + "SUB", + "SUB", + "SUB", + "SUB", + "CS:[", //Code segment override sets SegOveride "CS:[". + "DAS", + "XOR", + "XOR", + "XOR", + "XOR", + "XOR", + "XOR", + "SS:[", //Stack segment override sets SegOveride "SS:[". + "AAA", + "CMP", + "CMP", + "CMP", + "CMP", + "CMP", + "CMP", + "DS:[", //Data Segment override sets SegOveride "DS:[". + "AAS", + /*------------------------------------------------------------------------------------------------------------------------ Start of Rex Prefix adjustment setting uses opcodes 40 to 4F. These opcodes are only decoded as adjustment settings by the function ^DecodePrefixAdjustments()^ while in 64 bit mode. If not in 64 bit mode the codes are not read by the function ^DecodePrefixAdjustments()^ which allows the opcode to be set 40 to 4F hex in which the defined instructions bellow are used by ^DecodeOpcode()^. ------------------------------------------------------------------------------------------------------------------------*/ - "INC","INC","INC","INC","INC","INC","INC","INC", - "DEC","DEC","DEC","DEC","DEC","DEC","DEC","DEC", - /*------------------------------------------------------------------------------------------------------------------------ + "INC", + "INC", + "INC", + "INC", + "INC", + "INC", + "INC", + "INC", + "DEC", + "DEC", + "DEC", + "DEC", + "DEC", + "DEC", + "DEC", + "DEC", + /*------------------------------------------------------------------------------------------------------------------------ End of the Rex Prefix adjustment setting opcodes. ------------------------------------------------------------------------------------------------------------------------*/ - "PUSH","PUSH","PUSH","PUSH","PUSH","PUSH","PUSH","PUSH", - "POP","POP","POP","POP","POP","POP","POP","POP", - ["PUSHA","PUSHAD",""],["POPA","POPAD",""], - ["BOUND","BOUND",""], //EVEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined BOUND instruction is used. - "MOVSXD", - "FS:[","GS:[", //Sets SegOveride "FS:[" next opcode sets "GS:[". - "","", //Operand Size, and Address size adjustment to ModR/M. - "PUSH","IMUL","PUSH","IMUL", - "INS","INS","OUTS","OUTS", - "JO","JNO","JB","JAE","JE","JNE","JBE","JA", - "JS","JNS","JP","JNP","JL","JGE","JLE","JG", - ["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"], //Group opcode uses the ModR/M register selection 0 though 7 giving 8 instruction in one opcode. - ["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"], - ["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"], - ["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"], - "TEST","TEST","XCHG","XCHG", - "MOV","MOV","MOV","MOV","MOV", - ["LEA","???"], //*ModR/M Register, and memory mode separation. - "MOV", - ["POP","???","???","???","???","???","???","???"], - [["NOP","","",""],["NOP","","",""],["PAUSE","","",""],["NOP","","",""]], - "XCHG","XCHG","XCHG","XCHG","XCHG","XCHG","XCHG", - ["CWDE","CBW","CDQE"], //*Opcode 0 to 3 for instructions that change name by size setting. - ["CDQ","CWD","CQO"], - "CALL","WAIT", - ["PUSHFQ","PUSHF","PUSHFQ"], - ["POPFQ","POPF","POPFQ"], - "SAHF","LAHF", - "MOV","MOV","MOV","MOV", - "MOVS","MOVS", - "CMPS","CMPS", - "TEST","TEST", - "STOS","STOS", - "LODS","LODS", - "SCAS","SCAS", - "MOV","MOV","MOV","MOV","MOV","MOV","MOV","MOV", - "MOV","MOV","MOV","MOV","MOV","MOV","MOV","MOV", - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - "RET","RET", - "LES", //VEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined instruction is used. - "LDS", //VEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined instruction is used. - [ - "MOV","???","???","???","???","???","???", - ["XABORT","XABORT","XABORT","XABORT","XABORT","XABORT","XABORT","XABORT"] - ], - [ - "MOV","???","???","???","???","???","???", - ["XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN"] - ], - "ENTER","LEAVE","RETF","RETF","INT","INT","INTO", - ["IRETD","IRET","IRETQ"], - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - "AAMB","AADB","???", - "XLAT", - /*------------------------------------------------------------------------------------------------------------------------ + "PUSH", + "PUSH", + "PUSH", + "PUSH", + "PUSH", + "PUSH", + "PUSH", + "PUSH", + "POP", + "POP", + "POP", + "POP", + "POP", + "POP", + "POP", + "POP", + ["PUSHA", "PUSHAD", ""], + ["POPA", "POPAD", ""], + ["BOUND", "BOUND", ""], //EVEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined BOUND instruction is used. + "MOVSXD", + "FS:[", + "GS:[", //Sets SegOveride "FS:[" next opcode sets "GS:[". + "", + "", //Operand Size, and Address size adjustment to ModR/M. + "PUSH", + "IMUL", + "PUSH", + "IMUL", + "INS", + "INS", + "OUTS", + "OUTS", + "JO", + "JNO", + "JB", + "JAE", + "JE", + "JNE", + "JBE", + "JA", + "JS", + "JNS", + "JP", + "JNP", + "JL", + "JGE", + "JLE", + "JG", + ["ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"], //Group opcode uses the ModR/M register selection 0 though 7 giving 8 instruction in one opcode. + ["ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"], + ["ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"], + ["ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"], + "TEST", + "TEST", + "XCHG", + "XCHG", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + ["LEA", "???"], //*ModR/M Register, and memory mode separation. + "MOV", + ["POP", "???", "???", "???", "???", "???", "???", "???"], + [ + ["NOP", "", "", ""], + ["NOP", "", "", ""], + ["PAUSE", "", "", ""], + ["NOP", "", "", ""] + ], + "XCHG", + "XCHG", + "XCHG", + "XCHG", + "XCHG", + "XCHG", + "XCHG", + ["CWDE", "CBW", "CDQE"], //*Opcode 0 to 3 for instructions that change name by size setting. + ["CDQ", "CWD", "CQO"], + "CALL", + "WAIT", + ["PUSHFQ", "PUSHF", "PUSHFQ"], + ["POPFQ", "POPF", "POPFQ"], + "SAHF", + "LAHF", + "MOV", + "MOV", + "MOV", + "MOV", + "MOVS", + "MOVS", + "CMPS", + "CMPS", + "TEST", + "TEST", + "STOS", + "STOS", + "LODS", + "LODS", + "SCAS", + "SCAS", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + "RET", + "RET", + "LES", //VEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined instruction is used. + "LDS", //VEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined instruction is used. + [ + "MOV", + "???", + "???", + "???", + "???", + "???", + "???", + ["XABORT", "XABORT", "XABORT", "XABORT", "XABORT", "XABORT", "XABORT", "XABORT"] + ], + [ + "MOV", + "???", + "???", + "???", + "???", + "???", + "???", + ["XBEGIN", "XBEGIN", "XBEGIN", "XBEGIN", "XBEGIN", "XBEGIN", "XBEGIN", "XBEGIN"] + ], + "ENTER", + "LEAVE", + "RETF", + "RETF", + "INT", + "INT", + "INTO", + ["IRETD", "IRET", "IRETQ"], + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + "AAMB", + "AADB", + "???", + "XLAT", + /*------------------------------------------------------------------------------------------------------------------------ X87 FPU. ------------------------------------------------------------------------------------------------------------------------*/ - [ - ["FADD","FMUL","FCOM","FCOMP","FSUB","FSUBR","FDIV","FDIVR"], - ["FADD","FMUL","FCOM","FCOMP","FSUB","FSUBR","FDIV","FDIVR"] - ], - [ - ["FLD","???","FST","FSTP","FLDENV","FLDCW","FNSTENV","FNSTCW"], [ - "FLD","FXCH", - ["FNOP","???","???","???","???","???","???","???"], - "FSTP1", - ["FCHS","FABS","???","???","FTST","FXAM","???","???"], - ["FLD1","FLDL2T","FLDL2E","FLDPI","FLDLG2","FLDLN2","FLDZ","???"], - ["F2XM1","FYL2X","FPTAN","FPATAN","FXTRACT","FPREM1","FDECSTP","FINCSTP"], - ["FPREM","FYL2XP1","FSQRT","FSINCOS","FRNDINT","FSCALE","FSIN","FCOS"] - ] - ], - [ - ["FIADD","FIMUL","FICOM","FICOMP","FISUB","FISUBR","FIDIV","FIDIVR"], + ["FADD", "FMUL", "FCOM", "FCOMP", "FSUB", "FSUBR", "FDIV", "FDIVR"], + ["FADD", "FMUL", "FCOM", "FCOMP", "FSUB", "FSUBR", "FDIV", "FDIVR"] + ], [ - "FCMOVB","FCMOVE","FCMOVBE","FCMOVU","???", - ["???","FUCOMPP","???","???","???","???","???","???"], - "???","???" - ] - ], - [ - ["FILD","FISTTP","FIST","FISTP","???","FLD","???","FSTP"], + ["FLD", "???", "FST", "FSTP", "FLDENV", "FLDCW", "FNSTENV", "FNSTCW"], + [ + "FLD", + "FXCH", + ["FNOP", "???", "???", "???", "???", "???", "???", "???"], + "FSTP1", + ["FCHS", "FABS", "???", "???", "FTST", "FXAM", "???", "???"], + ["FLD1", "FLDL2T", "FLDL2E", "FLDPI", "FLDLG2", "FLDLN2", "FLDZ", "???"], + ["F2XM1", "FYL2X", "FPTAN", "FPATAN", "FXTRACT", "FPREM1", "FDECSTP", "FINCSTP"], + ["FPREM", "FYL2XP1", "FSQRT", "FSINCOS", "FRNDINT", "FSCALE", "FSIN", "FCOS"] + ] + ], [ - "CMOVNB","FCMOVNE","FCMOVNBE","FCMOVNU", - ["FENI","FDISI","FNCLEX","FNINIT","FSETPM","???","???","???"], - "FUCOMI","FCOMI","???" - ] - ], - [ - ["FADD","FMUL","FCOM","DCOMP","FSUB","FSUBR","FDIV","FDIVR"], - ["FADD","FMUL","FCOM2","FCOMP3","FSUBR","FSUB","FDIVR","FDIV"] - ], - [ - ["FLD","FISTTP","FST","FSTP","FRSTOR","???","FNSAVE","FNSTSW"], - ["FFREE","FXCH4","FST","FSTP","FUCOM","FUCOMP","???","???"] - ], - [ - ["FIADD","FIMUL","FICOM","FICOMP","FISUB","FISUBR","FIDIV","FIDIVR"], + ["FIADD", "FIMUL", "FICOM", "FICOMP", "FISUB", "FISUBR", "FIDIV", "FIDIVR"], + [ + "FCMOVB", + "FCMOVE", + "FCMOVBE", + "FCMOVU", + "???", + ["???", "FUCOMPP", "???", "???", "???", "???", "???", "???"], + "???", + "???" + ] + ], [ - "FADDP","FMULP","FCOMP5", - ["???","FCOMPP","???","???","???","???","???","???"], - "FSUBRP","FSUBP","FDIVRP","FDIVP" - ] - ], - [ - ["FILD","FISTTP","FIST","FISTP","FBLD","FILD","FBSTP","FISTP"], + ["FILD", "FISTTP", "FIST", "FISTP", "???", "FLD", "???", "FSTP"], + [ + "CMOVNB", + "FCMOVNE", + "FCMOVNBE", + "FCMOVNU", + ["FENI", "FDISI", "FNCLEX", "FNINIT", "FSETPM", "???", "???", "???"], + "FUCOMI", + "FCOMI", + "???" + ] + ], [ - "FFREEP","FXCH7","FSTP8","FSTP9", - ["FNSTSW","???","???","???","???","???","???","???"], - "FUCOMIP","FCOMIP","???" - ] - ], - /*------------------------------------------------------------------------------------------------------------------------ + ["FADD", "FMUL", "FCOM", "DCOMP", "FSUB", "FSUBR", "FDIV", "FDIVR"], + ["FADD", "FMUL", "FCOM2", "FCOMP3", "FSUBR", "FSUB", "FDIVR", "FDIV"] + ], + [ + ["FLD", "FISTTP", "FST", "FSTP", "FRSTOR", "???", "FNSAVE", "FNSTSW"], + ["FFREE", "FXCH4", "FST", "FSTP", "FUCOM", "FUCOMP", "???", "???"] + ], + [ + ["FIADD", "FIMUL", "FICOM", "FICOMP", "FISUB", "FISUBR", "FIDIV", "FIDIVR"], + [ + "FADDP", + "FMULP", + "FCOMP5", + ["???", "FCOMPP", "???", "???", "???", "???", "???", "???"], + "FSUBRP", + "FSUBP", + "FDIVRP", + "FDIVP" + ] + ], + [ + ["FILD", "FISTTP", "FIST", "FISTP", "FBLD", "FILD", "FBSTP", "FISTP"], + [ + "FFREEP", + "FXCH7", + "FSTP8", + "FSTP9", + ["FNSTSW", "???", "???", "???", "???", "???", "???", "???"], + "FUCOMIP", + "FCOMIP", + "???" + ] + ], + /*------------------------------------------------------------------------------------------------------------------------ End of X87 FPU. ------------------------------------------------------------------------------------------------------------------------*/ - "LOOPNE","LOOPE","LOOP","JRCXZ", - "IN","IN","OUT","OUT", - "CALL","JMP","JMP","JMP", - "IN","IN","OUT","OUT", - /*------------------------------------------------------------------------------------------------------------------------ + "LOOPNE", + "LOOPE", + "LOOP", + "JRCXZ", + "IN", + "IN", + "OUT", + "OUT", + "CALL", + "JMP", + "JMP", + "JMP", + "IN", + "IN", + "OUT", + "OUT", + /*------------------------------------------------------------------------------------------------------------------------ The Repeat, and lock prefix opcodes apply to the next opcode. ------------------------------------------------------------------------------------------------------------------------*/ - "LOCK", //Adds LOCK to the start of instruction. When Opcode F0 hex is read by function ^DecodePrefixAdjustments()^ sets PrefixG2 to LOCK. - "ICEBP", //Instruction ICEBP. - "REPNE", //Adds REPNE (Opcode F2 hex) to the start of instruction. Read by function ^DecodePrefixAdjustments()^ sets PrefixG1 to REPNE. - "REP", //Adds REP (Opcode F3 hex) to the start of instruction. Read by function ^DecodePrefixAdjustments()^ sets PrefixG1 to REP. - /*------------------------------------------------------------------------------------------------------------------------ + "LOCK", //Adds LOCK to the start of instruction. When Opcode F0 hex is read by function ^DecodePrefixAdjustments()^ sets PrefixG2 to LOCK. + "ICEBP", //Instruction ICEBP. + "REPNE", //Adds REPNE (Opcode F2 hex) to the start of instruction. Read by function ^DecodePrefixAdjustments()^ sets PrefixG1 to REPNE. + "REP", //Adds REP (Opcode F3 hex) to the start of instruction. Read by function ^DecodePrefixAdjustments()^ sets PrefixG1 to REP. + /*------------------------------------------------------------------------------------------------------------------------ End of Repeat, and lock instruction adjustment codes. ------------------------------------------------------------------------------------------------------------------------*/ - "HLT","CMC", - ["TEST","???","NOT","NEG","MUL","IMUL","DIV","IDIV"], - ["TEST","???","NOT","NEG","MUL","IMUL","DIV","IDIV"], - "CLC","STC","CLI","STI","CLD","STD", - ["INC","DEC","???","???","???","???","???","???"], - [ - ["INC","DEC","CALL","CALL","JMP","JMP","PUSH","???"], - ["INC","DEC","CALL","???","JMP","???","PUSH","???"] - ], - /*------------------------------------------------------------------------------------------------------------------------ + "HLT", + "CMC", + ["TEST", "???", "NOT", "NEG", "MUL", "IMUL", "DIV", "IDIV"], + ["TEST", "???", "NOT", "NEG", "MUL", "IMUL", "DIV", "IDIV"], + "CLC", + "STC", + "CLI", + "STI", + "CLD", + "STD", + ["INC", "DEC", "???", "???", "???", "???", "???", "???"], + [ + ["INC", "DEC", "CALL", "CALL", "JMP", "JMP", "PUSH", "???"], + ["INC", "DEC", "CALL", "???", "JMP", "???", "PUSH", "???"] + ], + /*------------------------------------------------------------------------------------------------------------------------ Two Byte Opcodes 256 to 511. Opcodes plus 256 goes to 511 used by escape code "0F", Or set directly by adding map bits "01" because "01 00000000" bin = 256 plus opcode. ------------------------------------------------------------------------------------------------------------------------*/ - [ - ["SLDT","STR","LLDT","LTR","VERR","VERW","JMPE","???"], - ["SLDT","STR","LLDT","LTR","VERR","VERW","JMPE","???"] - ], - [ - ["SGDT","SIDT","LGDT","LIDT","SMSW","???","LMSW","INVLPG"], [ - ["???","VMCALL","VMLAUNCH","VMRESUME","VMXOFF","???","???","???"], - ["MONITOR","MWAIT","CLAC","STAC","???","???","???","ENCLS"], - ["XGETBV","XSETBV","???","???","VMFUNC","XEND","XTEST","ENCLU"], - ["VMRUN","VMMCALL","VMLOAD","VMSAVE","STGI","CLGI","SKINIT","INVLPGA"], - "SMSW","???","LMSW", - ["SWAPGS","RDTSCP","MONITORX","MWAITX","???","???","???","???"] - ] - ], - ["LAR","LAR"],["LSL","LSL"],"???", - "SYSCALL","CLTS","SYSRET","INVD", - "WBINVD","???","UD2","???", - [["PREFETCH","PREFETCHW","???","???","???","???","???","???"],"???"], - "FEMMS", - "", //3DNow Instruction name is encoded by the IMM8 operand. - [ - ["MOVUPS","MOVUPD","MOVSS","MOVSD"], - ["MOVUPS","MOVUPD","MOVSS","MOVSD"] - ], - [ - ["MOVUPS","MOVUPD","MOVSS","MOVSD"], - ["MOVUPS","MOVUPD","MOVSS","MOVSD"] - ], - [ - ["MOVLPS","MOVLPD","MOVSLDUP","MOVDDUP"], - ["MOVHLPS","???","MOVSLDUP","MOVDDUP"] - ], - [["MOVLPS","MOVLPD","???","???"],"???"], - ["UNPCKLPS","UNPCKLPD","???","???"], //An instruction with 4 operations uses the 4 SIMD modes as an Vector instruction. - ["UNPCKHPS","UNPCKHPD","???","???"], - [["MOVHPS","MOVHPD","MOVSHDUP","???"],["MOVLHPS","???","MOVSHDUP","???"]], - [["MOVHPS","MOVHPD","???","???"],"???"], - [["PREFETCHNTA","PREFETCHT0","PREFETCHT1","PREFETCHT2","???","???","???","???"],"???"], - "???", - [[["BNDLDX","","",""],["BNDMOV","","",""],["BNDCL","","",""],["BNDCU","","",""]], - ["???",["BNDMOV","","",""],["BNDCL","","",""],["BNDCU","","",""]]], - [[["BNDSTX","","",""],["BNDMOV","","",""],["BNDMK","","",""],["BNDCN","","",""]], - ["???",["BNDMOV","","",""],"???",["BNDCN","","",""]]], - "???","???","???", - "NOP", - ["???","MOV"],["???","MOV"], //CR and DR register Move - ["???","MOV"],["???","MOV"], //CR and DR register Move - ["???","MOV"],"???", //TR (TEST REGISTER) register Move - ["???","MOV"],"???", //TR (TEST REGISTER) register Move - [ - ["MOVAPS","MOVAPS","MOVAPS","MOVAPS"], - ["MOVAPD","MOVAPD","MOVAPD","MOVAPD"], - "???","???" - ], - [ - [ - ["MOVAPS","MOVAPS","MOVAPS","MOVAPS"], - ["MOVAPD","MOVAPD","MOVAPD","MOVAPD"], - ["","","",["MOVNRAPS","MOVNRNGOAPS","MOVNRAPS"]], - ["","","",["MOVNRAPD","MOVNRNGOAPD","MOVNRAPD"]] + ["SLDT", "STR", "LLDT", "LTR", "VERR", "VERW", "JMPE", "???"], + ["SLDT", "STR", "LLDT", "LTR", "VERR", "VERW", "JMPE", "???"] ], [ - ["MOVAPS","MOVAPS","MOVAPS","MOVAPS"], - ["MOVAPD","MOVAPD","MOVAPD","MOVAPD"], - "???","???" - ] - ], - [ - ["CVTPI2PS","","",""],["CVTPI2PD","","",""], //Is not allowed to be Vector encoded. - "CVTSI2SS","CVTSI2SD" - ], - [ - [ - "MOVNTPS","MOVNTPD", - ["MOVNTSS","","",""],["MOVNTSD","","",""] //SSE4a can not be vector encoded. - ],"???" - ], - [ - ["CVTTPS2PI","","",""],["CVTTPD2PI","","",""], //Is not allowed to be Vector encoded. - "CVTTSS2SI","CVTTSD2SI" - ], - [ - ["CVTPS2PI","","",""],["CVTPD2PI","","",""], //Is not allowed to be Vector encoded. - "CVTSS2SI","CVTSD2SI" - ], - ["UCOMISS","UCOMISD","???","???"], - ["COMISS","COMISD","???","???"], - "WRMSR","RDTSC","RDMSR","RDPMC", - "SYSENTER","SYSEXIT","???", - "GETSEC", - "", //*Three byte instructions prefix combo 0F 38 (Opcode = 01,00111000) sets opcode 10,000000000 next byte read is added to the lower 8 bit's. - "???", - "", //*Three byte instructions prefix combo 0F 3A (Opcode = 01,00111010) sets opcode 11,000000000 next byte read is added to the lower 8 bit's. - "???","???","???","???","???", - "CMOVO", - [ - ["CMOVNO",["KANDW","","KANDQ"],"",""], - ["CMOVNO",["KANDB","","KANDD"],"",""],"","" - ], - [ - ["CMOVB",["KANDNW","","KANDNQ"],"",""], - ["CMOVB",["KANDNB","","KANDND"],"",""],"","" - ], - [["CMOVAE","KANDNR","",""],"","",""], - [ - ["CMOVE",["KNOTW","","KNOTQ"],"",""], - ["CMOVE",["KNOTB","","KNOTD"],"",""],"","" - ], - [ - ["CMOVNE",["KORW","","KORQ"],"",""], - ["CMOVNE",["KORB","","KORD"],"",""],"","" - ], - [ - ["CMOVBE",["KXNORW","","KXNORQ"],"",""], - ["CMOVBE",["KXNORB","","KXNORD"],"",""],"","" - ], - [ - ["CMOVA",["KXORW","","KXORQ"],"",""], - ["CMOVA",["KXORB","","KXORD"],"",""],"","" - ], - [["CMOVS","KMERGE2L1H","",""],"","",""], - [["CMOVNS","KMERGE2L1L","",""],"","",""], - [ - ["CMOVP",["KADDW","","KADDQ"],"",""], - ["CMOVP",["KADDB","","KADDD"],"",""],"","" - ], - [ - ["CMOVNP",["KUNPCKWD","","KUNPCKDQ"],"",""], - ["CMOVNP",["KUNPCKBW","","???"],"",""],"","" - ], - "CMOVL","CMOVGE","CMOVLE","CMOVG", - [ + ["SGDT", "SIDT", "LGDT", "LIDT", "SMSW", "???", "LMSW", "INVLPG"], + [ + ["???", "VMCALL", "VMLAUNCH", "VMRESUME", "VMXOFF", "???", "???", "???"], + ["MONITOR", "MWAIT", "CLAC", "STAC", "???", "???", "???", "ENCLS"], + ["XGETBV", "XSETBV", "???", "???", "VMFUNC", "XEND", "XTEST", "ENCLU"], + ["VMRUN", "VMMCALL", "VMLOAD", "VMSAVE", "STGI", "CLGI", "SKINIT", "INVLPGA"], + "SMSW", + "???", + "LMSW", + ["SWAPGS", "RDTSCP", "MONITORX", "MWAITX", "???", "???", "???", "???"] + ] + ], + ["LAR", "LAR"], + ["LSL", "LSL"], "???", + "SYSCALL", + "CLTS", + "SYSRET", + "INVD", + "WBINVD", + "???", + "UD2", + "???", + [["PREFETCH", "PREFETCHW", "???", "???", "???", "???", "???", "???"], "???"], + "FEMMS", + "", //3DNow Instruction name is encoded by the IMM8 operand. [ - ["MOVMSKPS","MOVMSKPS","",""],["MOVMSKPD","MOVMSKPD","",""], - "???","???" - ] - ], - ["SQRTPS","SQRTPD","SQRTSS","SQRTSD"], - [ - ["RSQRTPS","RSQRTPS","",""],"???", - ["RSQRTSS","RSQRTSS","",""],"???" - ], - [ - ["RCPPS","RCPPS","",""],"???", - ["RCPSS","RCPSS","",""],"???" - ], - ["ANDPS","ANDPD","???","???"], - ["ANDNPS","ANDNPD","???","???"], - ["ORPS","ORPD","???","???"], - ["XORPS","XORPD","???","???"], - [ - ["ADDPS","ADDPS","ADDPS","ADDPS"], - ["ADDPD","ADDPD","ADDPD","ADDPD"], - "ADDSS","ADDSD" - ], - [ - ["MULPS","MULPS","MULPS","MULPS"], - ["MULPD","MULPD","MULPD","MULPD"], - "MULSS","MULSD" - ], - [ - ["CVTPS2PD","CVTPS2PD","CVTPS2PD","CVTPS2PD"], - ["CVTPD2PS","CVTPD2PS","CVTPD2PS","CVTPD2PS"], - "CVTSS2SD","CVTSD2SS" - ], - [["CVTDQ2PS","","CVTQQ2PS"],["CVTPS2DQ","","???"],"CVTTPS2DQ","???"], - [ - ["SUBPS","SUBPS","SUBPS","SUBPS"], - ["SUBPD","SUBPD","SUBPD","SUBPD"], - "SUBSS","SUBSD" - ], - ["MINPS","MINPD","MINSS","MINSD"], - ["DIVPS","DIVPD","DIVSS","DIVSD"], - ["MAXPS","MAXPD","MAXSS","MAXSD"], - [["PUNPCKLBW","","",""],"PUNPCKLBW","",""], - [["PUNPCKLWD","","",""],"PUNPCKLWD","",""], - [["PUNPCKLDQ","","",""],"PUNPCKLDQ","",""], - [["PACKSSWB","","",""],"PACKSSWB","",""], - [["PCMPGTB","","",""],["PCMPGTB","PCMPGTB","PCMPGTB",""],"",""], - [["PCMPGTW","","",""],["PCMPGTW","PCMPGTW","PCMPGTW",""],"",""], - [["PCMPGTD","","",""],["PCMPGTD","PCMPGTD",["PCMPGTD","","???"],["PCMPGTD","","???"]],"",""], - [["PACKUSWB","","",""],"PACKUSWB","",""], - [["PUNPCKHBW","","",""],"PUNPCKHBW","",""], - [["PUNPCKHWD","","",""],"PUNPCKHWD","",""], - [["PUNPCKHDQ","","",""],["PUNPCKHDQ","","???"],"",""], - [["PACKSSDW","","",""],["PACKSSDW","","???"],"",""], - ["???","PUNPCKLQDQ","???","???"], - ["???","PUNPCKHQDQ","???","???"], - [["MOVD","","",""],["MOVD","","MOVQ"],"",""], - [ - [ - ["MOVQ","","",""], - ["MOVDQA","MOVDQA",["MOVDQA32","","MOVDQA64"],["MOVDQA32","","MOVDQA64"]], - ["MOVDQU","MOVDQU",["MOVDQU32","","MOVDQU64"],""], - ["","",["MOVDQU8","","MOVDQU16"],""] + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"] ], [ - ["MOVQ","","",""], - ["MOVDQA","MOVDQA",["MOVDQA32","","MOVDQA64"],["MOVDQA32","","MOVDQA64"]], - ["MOVDQU","MOVDQU",["MOVDQU32","","MOVDQU64"],""], - ["","",["MOVDQU8","","MOVDQU16"],""] - ] - ], - [ - ["PSHUFW","","",""], - ["PSHUFD","PSHUFD",["PSHUFD","","???"],["PSHUFD","","???"]], - "PSHUFHW", - "PSHUFLW" - ], - [ - "???", - [ - "???","???", - [["PSRLW","","",""],"PSRLW","",""],"???", - [["PSRAW","","",""],"PSRAW","",""],"???", - [["PSLLW","","",""],"PSLLW","",""],"???" - ] - ], - [ - ["???",["","",["PRORD","","PRORQ"],""],"???","???"], - ["???",["","",["PROLD","","PROLQ"],""],"???","???"], - [["PSRLD","","",""],["PSRLD","PSRLD",["PSRLD","","???"],["PSRLD","","???"]],"",""], - "???", - [["PSRAD","","",""],["PSRAD","PSRAD",["PSRAD","","PSRAQ"],["PSRAD","","???"]],"",""], - "???", - [["PSLLD","","",""],["PSLLD","PSLLD",["PSLLD","","???"],["PSLLD","","???"]],"",""], - "???" - ], - [ - "???", - [ - "???","???", - [["PSRLQ","PSRLQ","",""],"PSRLQ","",""],["???","PSRLDQ","???","???"], - "???","???", - [["PSLLQ","PSLLQ","",""],"PSLLQ","",""],["???","PSLLDQ","???","???"] - ] - ], - [["PCMPEQB","","",""],["PCMPEQB","PCMPEQB","PCMPEQB",""],"",""], - [["PCMPEQW","","",""],["PCMPEQW","PCMPEQW","PCMPEQW",""],"",""], - [["PCMPEQD","","",""],["PCMPEQD","PCMPEQD",["PCMPEQD","","???"],["PCMPEQD","","???"]],"",""], - [["EMMS",["ZEROUPPER","ZEROALL",""],"",""],"???","???","???"], - [ - ["VMREAD","",["CVTTPS2UDQ","","CVTTPD2UDQ"],""], - ["EXTRQ","",["CVTTPS2UQQ","","CVTTPD2UQQ"],""], - ["???","","CVTTSS2USI",""], - ["INSERTQ","","CVTTSD2USI",""] - ], - [ - ["VMWRITE","",["CVTPS2UDQ","","CVTPD2UDQ"], ""], - ["EXTRQ","",["CVTPS2UQQ","","CVTPD2UQQ"],""], - ["???","","CVTSS2USI",""], - ["INSERTQ","","CVTSD2USI",""] - ], - [ - "???", - ["","",["CVTTPS2QQ","","CVTTPD2QQ"],""], - ["","",["CVTUDQ2PD","","CVTUQQ2PD"],"CVTUDQ2PD"], - ["","",["CVTUDQ2PS","","CVTUQQ2PS"],""] - ], - [ - "???", - ["","",["CVTPS2QQ","","CVTPD2QQ"],""], - ["","","CVTUSI2SS",""], - ["","","CVTUSI2SD",""] - ], - [ - "???",["HADDPD","HADDPD","",""], - "???",["HADDPS","HADDPS","",""] - ], - [ - "???",["HSUBPD","HSUBPD","",""], - "???",["HSUBPS","HSUBPS","",""] - ], - [["MOVD","","",""],["MOVD","","MOVQ"],["MOVQ","MOVQ",["???","","MOVQ"],""],"???"], - [ - ["MOVQ","","",""], - ["MOVDQA","MOVDQA",["MOVDQA32","","MOVDQA64"],["MOVDQA32","","MOVDQA64"]], - ["MOVDQU","MOVDQU",["MOVDQU32","","MOVDQU64"],""], - ["???","",["MOVDQU8","","MOVDQU16"],""] - ], - "JO","JNO","JB","JAE", - [["JE","JKZD","",""],"","",""],[["JNE","JKNZD","",""],"","",""], //K1OM. - "JBE","JA","JS","JNS","JP","JNP","JL","JGE","JLE","JG", - [ - ["SETO",["KMOVW","","KMOVQ"],"",""], - ["SETO",["KMOVB","","KMOVD"],"",""],"","" - ], - [ - ["SETNO",["KMOVW","","KMOVQ"],"",""], - ["SETNO",["KMOVB","","KMOVD"],"",""],"","" - ], - [ - ["SETB",["KMOVW","","???"],"",""], - ["SETB",["KMOVB","","???"],"",""],"", - ["SETB",["KMOVD","","KMOVQ"],"",""] - ], - [ - ["SETAE",["KMOVW","","???"],"",""], - ["SETAE",["KMOVB","","???"],"",""],"", - ["SETAE",["KMOVD","","KMOVQ"],"",""] - ], - "SETE",[["SETNE","KCONCATH","",""],"","",""], - "SETBE",[["SETA","KCONCATL","",""],"","",""], - [ - ["SETS",["KORTESTW","","KORTESTQ"],"",""], - ["SETS",["KORTESTB","","KORTESTD"],"",""],"","" - ], - [ - ["SETNS",["KTESTW","","KTESTQ"],"",""], - ["SETNS",["KTESTB","","KTESTD"],"",""],"","" - ], - "SETP","SETNP","SETL","SETGE","SETLE","SETG", - "PUSH","POP", - "CPUID", //Identifies the CPU and which Instructions the current CPU can use. - "BT", - "SHLD","SHLD", - "XBTS","IBTS", - "PUSH","POP", - "RSM", - "BTS", - "SHRD","SHRD", - [ - [ - ["FXSAVE","???","FXSAVE64"],["FXRSTOR","???","FXRSTOR64"], - "LDMXCSR","STMXCSR", - ["XSAVE","","XSAVE64"],["XRSTOR","","XRSTOR64"], - ["XSAVEOPT","CLWB","XSAVEOPT64"], - ["CLFLUSHOPT","CLFLUSH",""] + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"] ], [ - ["???","???",["RDFSBASE","","",""],"???"],["???","???",["RDGSBASE","","",""],"???"], - ["???","???",["WRFSBASE","","",""],"???"],["???","???",["WRGSBASE","","",""],"???"], - "???", - ["LFENCE","???","???","???","???","???","???","???"], - ["MFENCE","???","???","???","???","???","???","???"], - ["SFENCE","???","???","???","???","???","???","???"] - ] - ], - "IMUL", - "CMPXCHG","CMPXCHG", - ["LSS","???"], - "BTR", - ["LFS","???"], - ["LGS","???"], - "MOVZX","MOVZX", - [ - ["JMPE","","",""],"???", - ["POPCNT","POPCNT","",""],"???" - ], - "???", - ["???","???","???","???","BT","BTS","BTR","BTC"], - "BTC", - [ - ["BSF","","",""],"???", - ["TZCNT","TZCNT","",""],["BSF","TZCNTI","",""] - ], - [ - ["BSR","","",""],"???", - ["LZCNT","LZCNT","",""],["BSR","","",""] - ], - "MOVSX","MOVSX", - "XADD","XADD", - [ - ["CMP,PS,","CMP,PS,","CMP,PS,","CMP,PS,"], - ["CMP,PD,","CMP,PD,","CMP,PD,","CMP,PD,"], - ["CMP,SS,","CMP,SS,","CMP,SS,",""], - ["CMP,SD,","CMP,SD,","CMP,SD,",""] - ], - ["MOVNTI","???"], - [["PINSRW","","",""],"PINSRW","",""], - ["???",[["PEXTRW","","",""],"PEXTRW","",""]], - ["SHUFPS","SHUFPD","???","???"], - [ + ["MOVLPS", "MOVLPD", "MOVSLDUP", "MOVDDUP"], + ["MOVHLPS", "???", "MOVSLDUP", "MOVDDUP"] + ], + [["MOVLPS", "MOVLPD", "???", "???"], "???"], + ["UNPCKLPS", "UNPCKLPD", "???", "???"], //An instruction with 4 operations uses the 4 SIMD modes as an Vector instruction. + ["UNPCKHPS", "UNPCKHPD", "???", "???"], [ - "???", - ["CMPXCHG8B","","CMPXCHG16B"], - "???", - ["XRSTORS","","XRSTORS64"], - ["XSAVEC","","XSAVEC64"], - ["XSAVES","","XSAVES64"], - ["VMPTRLD","VMCLEAR","VMXON","???"],["VMPTRST","???","???","???"] + ["MOVHPS", "MOVHPD", "MOVSHDUP", "???"], + ["MOVLHPS", "???", "MOVSHDUP", "???"] + ], + [["MOVHPS", "MOVHPD", "???", "???"], "???"], + [["PREFETCHNTA", "PREFETCHT0", "PREFETCHT1", "PREFETCHT2", "???", "???", "???", "???"], "???"], + "???", + [ + [ + ["BNDLDX", "", "", ""], + ["BNDMOV", "", "", ""], + ["BNDCL", "", "", ""], + ["BNDCU", "", "", ""] + ], + ["???", ["BNDMOV", "", "", ""], ["BNDCL", "", "", ""], ["BNDCU", "", "", ""]] ], [ - "???", - ["SSS","???","???","???","???","???","???","???"], //Synthetic virtual machine operation codes. - "???","???","???","???", - "RDRAND","RDSEED" - ] - ], - "BSWAP","BSWAP","BSWAP","BSWAP","BSWAP","BSWAP","BSWAP","BSWAP", - ["???",["ADDSUBPD","ADDSUBPD","",""],"???",["ADDSUBPS","ADDSUBPS","",""]], - [["PSRLW","","",""],"PSRLW","",""], - [["PSRLD","","",""],["PSRLD","PSRLD",["PSRLD","","???"],""],"",""], - [["PSRLQ","","",""],"PSRLQ","",""], - [["PADDQ","","",""],"PADDQ","",""], - [["PMULLW","","",""],"PMULLW","",""], - [ - ["???","MOVQ","???","???"], - ["???","MOVQ",["MOVQ2DQ","","",""],["MOVDQ2Q","","",""]] - ], - ["???",[["PMOVMSKB","","",""],["PMOVMSKB","PMOVMSKB","",""],"???","???"]], - [["PSUBUSB","","",""],"PSUBUSB","",""], - [["PSUBUSW","","",""],"PSUBUSW","",""], - [["PMINUB","","",""],"PMINUB","",""], - [["PAND","","",""],["PAND","PAND",["PANDD","","PANDQ"],["PANDD","","PANDQ"]],"",""], - [["PADDUSB","","",""],"PADDUSB","",""], - [["PADDUSW","","",""],"PADDUSW","",""], - [["PMAXUB","","",""],"PMAXUB","",""], - [["PANDN","","",""],["PANDN","PANDN",["PANDND","","PANDNQ"],["PANDND","","PANDNQ"]],"",""], - [["PAVGB","","",""],"PAVGB","",""], - [ - [["PSRAW","","",""],["PSRAW","PSRAW","PSRAW",""],"",""], - [["PSRAW","","",""],["PSRAW","PSRAW","PSRAW",""],"",""] - ], - [["PSRAD","","",""],["PSRAD","PSRAD",["PSRAD","","PSRAQ"],""],"",""], - [["PAVGW","","",""],"PAVGW","",""], - [["PMULHUW","","",""],"PMULHUW","",""], - [["PMULHW","","",""],"PMULHW","",""], - [ + [ + ["BNDSTX", "", "", ""], + ["BNDMOV", "", "", ""], + ["BNDMK", "", "", ""], + ["BNDCN", "", "", ""] + ], + ["???", ["BNDMOV", "", "", ""], "???", ["BNDCN", "", "", ""]] + ], "???", - ["CVTTPD2DQ","CVTTPD2DQ","CVTTPD2DQ",""], - ["CVTDQ2PD","CVTDQ2PD",["CVTDQ2PD","CVTDQ2PD","CVTQQ2PD"],"CVTDQ2PD"], - "CVTPD2DQ" - ], - [[["MOVNTQ","","",""],["MOVNTDQ","","???"],"???","???"],"???"], - [["PSUBSB","","",""],"PSUBSB","",""], - [["PSUBSW","","",""],"PSUBSW","",""], - [["PMINSW","","",""],"PMINSW","",""], - [["POR","","",""],["POR","POR",["PORD","","PORQ"],["PORD","","PORQ"]],"",""], - [["PADDSB","","",""],"PADDSB","",""], - [["PADDSW","","",""],"PADDSW","",""], - [["PMAXSW","","",""],"PMAXSW","",""], - [["PXOR","","",""],["PXOR","PXOR",["PXORD","","PXORQ"],["PXORD","","PXORQ"]],"",""], - [["???","???","???",["LDDQU","LDDQU","",""]],"???"], - [["PSLLW","","",""],"PSLLW","",""], - [["PSLLD","","",""],["PSLLD","","???"],"",""], - [["PSLLQ","","",""],"PSLLQ","",""], - [["PMULUDQ","","",""],"PMULUDQ","",""], - [["PMADDWD","","",""],"PMADDWD","",""], - [["PSADBW","","",""],"PSADBW","",""], - ["???",[["MASKMOVQ","","",""],["MASKMOVDQU","MASKMOVDQU","",""],"???","???"]], - [["PSUBB","","",""],"PSUBB","",""], - [["PSUBW","","",""],"PSUBW","",""], - [["PSUBD","","",""],["PSUBD","PSUBD",["PSUBD","","???"],["PSUBD","","???"]],"",""], - [["PSUBQ","","",""],"PSUBQ","",""], - [["PADDB","","",""],"PADDB","",""], - [["PADDW","","",""],"PADDW","",""], - [["PADDD","","",""],["PADDD","PADDD",["PADDD","","???"],["PADDD","","???"]],"",""], - "???", - /*------------------------------------------------------------------------------------------------------------------------ + "???", + "???", + "NOP", + ["???", "MOV"], + ["???", "MOV"], //CR and DR register Move + ["???", "MOV"], + ["???", "MOV"], //CR and DR register Move + ["???", "MOV"], + "???", //TR (TEST REGISTER) register Move + ["???", "MOV"], + "???", //TR (TEST REGISTER) register Move + [["MOVAPS", "MOVAPS", "MOVAPS", "MOVAPS"], ["MOVAPD", "MOVAPD", "MOVAPD", "MOVAPD"], "???", "???"], + [ + [ + ["MOVAPS", "MOVAPS", "MOVAPS", "MOVAPS"], + ["MOVAPD", "MOVAPD", "MOVAPD", "MOVAPD"], + ["", "", "", ["MOVNRAPS", "MOVNRNGOAPS", "MOVNRAPS"]], + ["", "", "", ["MOVNRAPD", "MOVNRNGOAPD", "MOVNRAPD"]] + ], + [["MOVAPS", "MOVAPS", "MOVAPS", "MOVAPS"], ["MOVAPD", "MOVAPD", "MOVAPD", "MOVAPD"], "???", "???"] + ], + [ + ["CVTPI2PS", "", "", ""], + ["CVTPI2PD", "", "", ""], //Is not allowed to be Vector encoded. + "CVTSI2SS", + "CVTSI2SD" + ], + [ + [ + "MOVNTPS", + "MOVNTPD", + ["MOVNTSS", "", "", ""], + ["MOVNTSD", "", "", ""] //SSE4a can not be vector encoded. + ], + "???" + ], + [ + ["CVTTPS2PI", "", "", ""], + ["CVTTPD2PI", "", "", ""], //Is not allowed to be Vector encoded. + "CVTTSS2SI", + "CVTTSD2SI" + ], + [ + ["CVTPS2PI", "", "", ""], + ["CVTPD2PI", "", "", ""], //Is not allowed to be Vector encoded. + "CVTSS2SI", + "CVTSD2SI" + ], + ["UCOMISS", "UCOMISD", "???", "???"], + ["COMISS", "COMISD", "???", "???"], + "WRMSR", + "RDTSC", + "RDMSR", + "RDPMC", + "SYSENTER", + "SYSEXIT", + "???", + "GETSEC", + "", //*Three byte instructions prefix combo 0F 38 (Opcode = 01,00111000) sets opcode 10,000000000 next byte read is added to the lower 8 bit's. + "???", + "", //*Three byte instructions prefix combo 0F 3A (Opcode = 01,00111010) sets opcode 11,000000000 next byte read is added to the lower 8 bit's. + "???", + "???", + "???", + "???", + "???", + "CMOVO", + [["CMOVNO", ["KANDW", "", "KANDQ"], "", ""], ["CMOVNO", ["KANDB", "", "KANDD"], "", ""], "", ""], + [["CMOVB", ["KANDNW", "", "KANDNQ"], "", ""], ["CMOVB", ["KANDNB", "", "KANDND"], "", ""], "", ""], + [["CMOVAE", "KANDNR", "", ""], "", "", ""], + [["CMOVE", ["KNOTW", "", "KNOTQ"], "", ""], ["CMOVE", ["KNOTB", "", "KNOTD"], "", ""], "", ""], + [["CMOVNE", ["KORW", "", "KORQ"], "", ""], ["CMOVNE", ["KORB", "", "KORD"], "", ""], "", ""], + [["CMOVBE", ["KXNORW", "", "KXNORQ"], "", ""], ["CMOVBE", ["KXNORB", "", "KXNORD"], "", ""], "", ""], + [["CMOVA", ["KXORW", "", "KXORQ"], "", ""], ["CMOVA", ["KXORB", "", "KXORD"], "", ""], "", ""], + [["CMOVS", "KMERGE2L1H", "", ""], "", "", ""], + [["CMOVNS", "KMERGE2L1L", "", ""], "", "", ""], + [["CMOVP", ["KADDW", "", "KADDQ"], "", ""], ["CMOVP", ["KADDB", "", "KADDD"], "", ""], "", ""], + [["CMOVNP", ["KUNPCKWD", "", "KUNPCKDQ"], "", ""], ["CMOVNP", ["KUNPCKBW", "", "???"], "", ""], "", ""], + "CMOVL", + "CMOVGE", + "CMOVLE", + "CMOVG", + ["???", [["MOVMSKPS", "MOVMSKPS", "", ""], ["MOVMSKPD", "MOVMSKPD", "", ""], "???", "???"]], + ["SQRTPS", "SQRTPD", "SQRTSS", "SQRTSD"], + [["RSQRTPS", "RSQRTPS", "", ""], "???", ["RSQRTSS", "RSQRTSS", "", ""], "???"], + [["RCPPS", "RCPPS", "", ""], "???", ["RCPSS", "RCPSS", "", ""], "???"], + ["ANDPS", "ANDPD", "???", "???"], + ["ANDNPS", "ANDNPD", "???", "???"], + ["ORPS", "ORPD", "???", "???"], + ["XORPS", "XORPD", "???", "???"], + [["ADDPS", "ADDPS", "ADDPS", "ADDPS"], ["ADDPD", "ADDPD", "ADDPD", "ADDPD"], "ADDSS", "ADDSD"], + [["MULPS", "MULPS", "MULPS", "MULPS"], ["MULPD", "MULPD", "MULPD", "MULPD"], "MULSS", "MULSD"], + [ + ["CVTPS2PD", "CVTPS2PD", "CVTPS2PD", "CVTPS2PD"], + ["CVTPD2PS", "CVTPD2PS", "CVTPD2PS", "CVTPD2PS"], + "CVTSS2SD", + "CVTSD2SS" + ], + [["CVTDQ2PS", "", "CVTQQ2PS"], ["CVTPS2DQ", "", "???"], "CVTTPS2DQ", "???"], + [["SUBPS", "SUBPS", "SUBPS", "SUBPS"], ["SUBPD", "SUBPD", "SUBPD", "SUBPD"], "SUBSS", "SUBSD"], + ["MINPS", "MINPD", "MINSS", "MINSD"], + ["DIVPS", "DIVPD", "DIVSS", "DIVSD"], + ["MAXPS", "MAXPD", "MAXSS", "MAXSD"], + [["PUNPCKLBW", "", "", ""], "PUNPCKLBW", "", ""], + [["PUNPCKLWD", "", "", ""], "PUNPCKLWD", "", ""], + [["PUNPCKLDQ", "", "", ""], "PUNPCKLDQ", "", ""], + [["PACKSSWB", "", "", ""], "PACKSSWB", "", ""], + [["PCMPGTB", "", "", ""], ["PCMPGTB", "PCMPGTB", "PCMPGTB", ""], "", ""], + [["PCMPGTW", "", "", ""], ["PCMPGTW", "PCMPGTW", "PCMPGTW", ""], "", ""], + [["PCMPGTD", "", "", ""], ["PCMPGTD", "PCMPGTD", ["PCMPGTD", "", "???"], ["PCMPGTD", "", "???"]], "", ""], + [["PACKUSWB", "", "", ""], "PACKUSWB", "", ""], + [["PUNPCKHBW", "", "", ""], "PUNPCKHBW", "", ""], + [["PUNPCKHWD", "", "", ""], "PUNPCKHWD", "", ""], + [["PUNPCKHDQ", "", "", ""], ["PUNPCKHDQ", "", "???"], "", ""], + [["PACKSSDW", "", "", ""], ["PACKSSDW", "", "???"], "", ""], + ["???", "PUNPCKLQDQ", "???", "???"], + ["???", "PUNPCKHQDQ", "???", "???"], + [["MOVD", "", "", ""], ["MOVD", "", "MOVQ"], "", ""], + [ + [ + ["MOVQ", "", "", ""], + ["MOVDQA", "MOVDQA", ["MOVDQA32", "", "MOVDQA64"], ["MOVDQA32", "", "MOVDQA64"]], + ["MOVDQU", "MOVDQU", ["MOVDQU32", "", "MOVDQU64"], ""], + ["", "", ["MOVDQU8", "", "MOVDQU16"], ""] + ], + [ + ["MOVQ", "", "", ""], + ["MOVDQA", "MOVDQA", ["MOVDQA32", "", "MOVDQA64"], ["MOVDQA32", "", "MOVDQA64"]], + ["MOVDQU", "MOVDQU", ["MOVDQU32", "", "MOVDQU64"], ""], + ["", "", ["MOVDQU8", "", "MOVDQU16"], ""] + ] + ], + [["PSHUFW", "", "", ""], ["PSHUFD", "PSHUFD", ["PSHUFD", "", "???"], ["PSHUFD", "", "???"]], "PSHUFHW", "PSHUFLW"], + [ + "???", + [ + "???", + "???", + [["PSRLW", "", "", ""], "PSRLW", "", ""], + "???", + [["PSRAW", "", "", ""], "PSRAW", "", ""], + "???", + [["PSLLW", "", "", ""], "PSLLW", "", ""], + "???" + ] + ], + [ + ["???", ["", "", ["PRORD", "", "PRORQ"], ""], "???", "???"], + ["???", ["", "", ["PROLD", "", "PROLQ"], ""], "???", "???"], + [["PSRLD", "", "", ""], ["PSRLD", "PSRLD", ["PSRLD", "", "???"], ["PSRLD", "", "???"]], "", ""], + "???", + [["PSRAD", "", "", ""], ["PSRAD", "PSRAD", ["PSRAD", "", "PSRAQ"], ["PSRAD", "", "???"]], "", ""], + "???", + [["PSLLD", "", "", ""], ["PSLLD", "PSLLD", ["PSLLD", "", "???"], ["PSLLD", "", "???"]], "", ""], + "???" + ], + [ + "???", + [ + "???", + "???", + [["PSRLQ", "PSRLQ", "", ""], "PSRLQ", "", ""], + ["???", "PSRLDQ", "???", "???"], + "???", + "???", + [["PSLLQ", "PSLLQ", "", ""], "PSLLQ", "", ""], + ["???", "PSLLDQ", "???", "???"] + ] + ], + [["PCMPEQB", "", "", ""], ["PCMPEQB", "PCMPEQB", "PCMPEQB", ""], "", ""], + [["PCMPEQW", "", "", ""], ["PCMPEQW", "PCMPEQW", "PCMPEQW", ""], "", ""], + [["PCMPEQD", "", "", ""], ["PCMPEQD", "PCMPEQD", ["PCMPEQD", "", "???"], ["PCMPEQD", "", "???"]], "", ""], + [["EMMS", ["ZEROUPPER", "ZEROALL", ""], "", ""], "???", "???", "???"], + [ + ["VMREAD", "", ["CVTTPS2UDQ", "", "CVTTPD2UDQ"], ""], + ["EXTRQ", "", ["CVTTPS2UQQ", "", "CVTTPD2UQQ"], ""], + ["???", "", "CVTTSS2USI", ""], + ["INSERTQ", "", "CVTTSD2USI", ""] + ], + [ + ["VMWRITE", "", ["CVTPS2UDQ", "", "CVTPD2UDQ"], ""], + ["EXTRQ", "", ["CVTPS2UQQ", "", "CVTPD2UQQ"], ""], + ["???", "", "CVTSS2USI", ""], + ["INSERTQ", "", "CVTSD2USI", ""] + ], + [ + "???", + ["", "", ["CVTTPS2QQ", "", "CVTTPD2QQ"], ""], + ["", "", ["CVTUDQ2PD", "", "CVTUQQ2PD"], "CVTUDQ2PD"], + ["", "", ["CVTUDQ2PS", "", "CVTUQQ2PS"], ""] + ], + ["???", ["", "", ["CVTPS2QQ", "", "CVTPD2QQ"], ""], ["", "", "CVTUSI2SS", ""], ["", "", "CVTUSI2SD", ""]], + ["???", ["HADDPD", "HADDPD", "", ""], "???", ["HADDPS", "HADDPS", "", ""]], + ["???", ["HSUBPD", "HSUBPD", "", ""], "???", ["HSUBPS", "HSUBPS", "", ""]], + [["MOVD", "", "", ""], ["MOVD", "", "MOVQ"], ["MOVQ", "MOVQ", ["???", "", "MOVQ"], ""], "???"], + [ + ["MOVQ", "", "", ""], + ["MOVDQA", "MOVDQA", ["MOVDQA32", "", "MOVDQA64"], ["MOVDQA32", "", "MOVDQA64"]], + ["MOVDQU", "MOVDQU", ["MOVDQU32", "", "MOVDQU64"], ""], + ["???", "", ["MOVDQU8", "", "MOVDQU16"], ""] + ], + "JO", + "JNO", + "JB", + "JAE", + [["JE", "JKZD", "", ""], "", "", ""], + [["JNE", "JKNZD", "", ""], "", "", ""], //K1OM. + "JBE", + "JA", + "JS", + "JNS", + "JP", + "JNP", + "JL", + "JGE", + "JLE", + "JG", + [["SETO", ["KMOVW", "", "KMOVQ"], "", ""], ["SETO", ["KMOVB", "", "KMOVD"], "", ""], "", ""], + [["SETNO", ["KMOVW", "", "KMOVQ"], "", ""], ["SETNO", ["KMOVB", "", "KMOVD"], "", ""], "", ""], + [ + ["SETB", ["KMOVW", "", "???"], "", ""], + ["SETB", ["KMOVB", "", "???"], "", ""], + "", + ["SETB", ["KMOVD", "", "KMOVQ"], "", ""] + ], + [ + ["SETAE", ["KMOVW", "", "???"], "", ""], + ["SETAE", ["KMOVB", "", "???"], "", ""], + "", + ["SETAE", ["KMOVD", "", "KMOVQ"], "", ""] + ], + "SETE", + [["SETNE", "KCONCATH", "", ""], "", "", ""], + "SETBE", + [["SETA", "KCONCATL", "", ""], "", "", ""], + [["SETS", ["KORTESTW", "", "KORTESTQ"], "", ""], ["SETS", ["KORTESTB", "", "KORTESTD"], "", ""], "", ""], + [["SETNS", ["KTESTW", "", "KTESTQ"], "", ""], ["SETNS", ["KTESTB", "", "KTESTD"], "", ""], "", ""], + "SETP", + "SETNP", + "SETL", + "SETGE", + "SETLE", + "SETG", + "PUSH", + "POP", + "CPUID", //Identifies the CPU and which Instructions the current CPU can use. + "BT", + "SHLD", + "SHLD", + "XBTS", + "IBTS", + "PUSH", + "POP", + "RSM", + "BTS", + "SHRD", + "SHRD", + [ + [ + ["FXSAVE", "???", "FXSAVE64"], + ["FXRSTOR", "???", "FXRSTOR64"], + "LDMXCSR", + "STMXCSR", + ["XSAVE", "", "XSAVE64"], + ["XRSTOR", "", "XRSTOR64"], + ["XSAVEOPT", "CLWB", "XSAVEOPT64"], + ["CLFLUSHOPT", "CLFLUSH", ""] + ], + [ + ["???", "???", ["RDFSBASE", "", "", ""], "???"], + ["???", "???", ["RDGSBASE", "", "", ""], "???"], + ["???", "???", ["WRFSBASE", "", "", ""], "???"], + ["???", "???", ["WRGSBASE", "", "", ""], "???"], + "???", + ["LFENCE", "???", "???", "???", "???", "???", "???", "???"], + ["MFENCE", "???", "???", "???", "???", "???", "???", "???"], + ["SFENCE", "???", "???", "???", "???", "???", "???", "???"] + ] + ], + "IMUL", + "CMPXCHG", + "CMPXCHG", + ["LSS", "???"], + "BTR", + ["LFS", "???"], + ["LGS", "???"], + "MOVZX", + "MOVZX", + [["JMPE", "", "", ""], "???", ["POPCNT", "POPCNT", "", ""], "???"], + "???", + ["???", "???", "???", "???", "BT", "BTS", "BTR", "BTC"], + "BTC", + [["BSF", "", "", ""], "???", ["TZCNT", "TZCNT", "", ""], ["BSF", "TZCNTI", "", ""]], + [["BSR", "", "", ""], "???", ["LZCNT", "LZCNT", "", ""], ["BSR", "", "", ""]], + "MOVSX", + "MOVSX", + "XADD", + "XADD", + [ + ["CMP,PS,", "CMP,PS,", "CMP,PS,", "CMP,PS,"], + ["CMP,PD,", "CMP,PD,", "CMP,PD,", "CMP,PD,"], + ["CMP,SS,", "CMP,SS,", "CMP,SS,", ""], + ["CMP,SD,", "CMP,SD,", "CMP,SD,", ""] + ], + ["MOVNTI", "???"], + [["PINSRW", "", "", ""], "PINSRW", "", ""], + ["???", [["PEXTRW", "", "", ""], "PEXTRW", "", ""]], + ["SHUFPS", "SHUFPD", "???", "???"], + [ + [ + "???", + ["CMPXCHG8B", "", "CMPXCHG16B"], + "???", + ["XRSTORS", "", "XRSTORS64"], + ["XSAVEC", "", "XSAVEC64"], + ["XSAVES", "", "XSAVES64"], + ["VMPTRLD", "VMCLEAR", "VMXON", "???"], + ["VMPTRST", "???", "???", "???"] + ], + [ + "???", + ["SSS", "???", "???", "???", "???", "???", "???", "???"], //Synthetic virtual machine operation codes. + "???", + "???", + "???", + "???", + "RDRAND", + "RDSEED" + ] + ], + "BSWAP", + "BSWAP", + "BSWAP", + "BSWAP", + "BSWAP", + "BSWAP", + "BSWAP", + "BSWAP", + ["???", ["ADDSUBPD", "ADDSUBPD", "", ""], "???", ["ADDSUBPS", "ADDSUBPS", "", ""]], + [["PSRLW", "", "", ""], "PSRLW", "", ""], + [["PSRLD", "", "", ""], ["PSRLD", "PSRLD", ["PSRLD", "", "???"], ""], "", ""], + [["PSRLQ", "", "", ""], "PSRLQ", "", ""], + [["PADDQ", "", "", ""], "PADDQ", "", ""], + [["PMULLW", "", "", ""], "PMULLW", "", ""], + [ + ["???", "MOVQ", "???", "???"], + ["???", "MOVQ", ["MOVQ2DQ", "", "", ""], ["MOVDQ2Q", "", "", ""]] + ], + ["???", [["PMOVMSKB", "", "", ""], ["PMOVMSKB", "PMOVMSKB", "", ""], "???", "???"]], + [["PSUBUSB", "", "", ""], "PSUBUSB", "", ""], + [["PSUBUSW", "", "", ""], "PSUBUSW", "", ""], + [["PMINUB", "", "", ""], "PMINUB", "", ""], + [["PAND", "", "", ""], ["PAND", "PAND", ["PANDD", "", "PANDQ"], ["PANDD", "", "PANDQ"]], "", ""], + [["PADDUSB", "", "", ""], "PADDUSB", "", ""], + [["PADDUSW", "", "", ""], "PADDUSW", "", ""], + [["PMAXUB", "", "", ""], "PMAXUB", "", ""], + [["PANDN", "", "", ""], ["PANDN", "PANDN", ["PANDND", "", "PANDNQ"], ["PANDND", "", "PANDNQ"]], "", ""], + [["PAVGB", "", "", ""], "PAVGB", "", ""], + [ + [["PSRAW", "", "", ""], ["PSRAW", "PSRAW", "PSRAW", ""], "", ""], + [["PSRAW", "", "", ""], ["PSRAW", "PSRAW", "PSRAW", ""], "", ""] + ], + [["PSRAD", "", "", ""], ["PSRAD", "PSRAD", ["PSRAD", "", "PSRAQ"], ""], "", ""], + [["PAVGW", "", "", ""], "PAVGW", "", ""], + [["PMULHUW", "", "", ""], "PMULHUW", "", ""], + [["PMULHW", "", "", ""], "PMULHW", "", ""], + [ + "???", + ["CVTTPD2DQ", "CVTTPD2DQ", "CVTTPD2DQ", ""], + ["CVTDQ2PD", "CVTDQ2PD", ["CVTDQ2PD", "CVTDQ2PD", "CVTQQ2PD"], "CVTDQ2PD"], + "CVTPD2DQ" + ], + [[["MOVNTQ", "", "", ""], ["MOVNTDQ", "", "???"], "???", "???"], "???"], + [["PSUBSB", "", "", ""], "PSUBSB", "", ""], + [["PSUBSW", "", "", ""], "PSUBSW", "", ""], + [["PMINSW", "", "", ""], "PMINSW", "", ""], + [["POR", "", "", ""], ["POR", "POR", ["PORD", "", "PORQ"], ["PORD", "", "PORQ"]], "", ""], + [["PADDSB", "", "", ""], "PADDSB", "", ""], + [["PADDSW", "", "", ""], "PADDSW", "", ""], + [["PMAXSW", "", "", ""], "PMAXSW", "", ""], + [["PXOR", "", "", ""], ["PXOR", "PXOR", ["PXORD", "", "PXORQ"], ["PXORD", "", "PXORQ"]], "", ""], + [["???", "???", "???", ["LDDQU", "LDDQU", "", ""]], "???"], + [["PSLLW", "", "", ""], "PSLLW", "", ""], + [["PSLLD", "", "", ""], ["PSLLD", "", "???"], "", ""], + [["PSLLQ", "", "", ""], "PSLLQ", "", ""], + [["PMULUDQ", "", "", ""], "PMULUDQ", "", ""], + [["PMADDWD", "", "", ""], "PMADDWD", "", ""], + [["PSADBW", "", "", ""], "PSADBW", "", ""], + ["???", [["MASKMOVQ", "", "", ""], ["MASKMOVDQU", "MASKMOVDQU", "", ""], "???", "???"]], + [["PSUBB", "", "", ""], "PSUBB", "", ""], + [["PSUBW", "", "", ""], "PSUBW", "", ""], + [["PSUBD", "", "", ""], ["PSUBD", "PSUBD", ["PSUBD", "", "???"], ["PSUBD", "", "???"]], "", ""], + [["PSUBQ", "", "", ""], "PSUBQ", "", ""], + [["PADDB", "", "", ""], "PADDB", "", ""], + [["PADDW", "", "", ""], "PADDW", "", ""], + [["PADDD", "", "", ""], ["PADDD", "PADDD", ["PADDD", "", "???"], ["PADDD", "", "???"]], "", ""], + "???", + /*------------------------------------------------------------------------------------------------------------------------ Three Byte operations 0F38. Opcodes plus 512 goes to 767 used by escape codes "0F,38", Or set directly by adding map bits "10" because "10 00000000" bin = 512 plus opcode. ------------------------------------------------------------------------------------------------------------------------*/ - [["PSHUFB","","",""],"PSHUFB","???","???"], - [["PHADDW","","",""],["PHADDW","PHADDW","",""],"???","???"], - [["PHADDD","","",""],["PHADDD","PHADDD","",""],"???","???"], - [["PHADDSW","","",""],["PHADDSW","PHADDSW","",""],"???","???"], - [["PMADDUBSW","","",""],"PMADDUBSW","???","???"], - [["PHSUBW","","",""],["PHSUBW","PHSUBW","",""],"???","???"], - [["PHSUBD","","",""],["PHSUBD","PHSUBD","",""],"???","???"], - [["PHSUBSW","","",""],["PHSUBSW","PHSUBSW","",""],"???","???"], - [["PSIGNB","","",""],["PSIGNB","PSIGNB","",""],"???","???"], - [["PSIGNW","","",""],["PSIGNW","PSIGNW","",""],"???","???"], - [["PSIGND","","",""],["PSIGND","PSIGND","",""],"???","???"], - [["PMULHRSW","","",""],"PMULHRSW","???","???"], - ["???",["","PERMILPS",["PERMILPS","","???"],""],"???","???"], - ["???",["","PERMILPD","PERMILPD",""],"???","???"], - ["???",["","TESTPS","",""],"???","???"], - ["???",["","TESTPD","",""],"???","???"], - ["???",["PBLENDVB","PBLENDVB","PSRLVW",""],["","","PMOVUSWB",""],"???"], - ["???",["","","PSRAVW",""],["","","PMOVUSDB",""],"???"], - ["???",["","","PSLLVW",""],["","","PMOVUSQB",""],"???"], - ["???",["","CVTPH2PS",["CVTPH2PS","","???"],""],["","","PMOVUSDW",""],"???"], - ["???",["BLENDVPS","BLENDVPS",["PRORVD","","PRORVQ"],""],["","","PMOVUSQW",""],"???"], - ["???",["BLENDVPD","BLENDVPD",["PROLVD","","PROLVQ"],""],["","","PMOVUSQD",""],"???"], - ["???",["","PERMPS",["PERMPS","","PERMPD"],""],"???","???"], - ["???",["PTEST","PTEST","",""],"???","???"], - ["???",["","BROADCASTSS",["BROADCASTSS","","???"],["BROADCASTSS","","???"]],"???","???"], - ["???",["","BROADCASTSD",["BROADCASTF32X2","","BROADCASTSD"],["???","","BROADCASTSD"]],"???","???"], - ["???",["","BROADCASTF128",["BROADCASTF32X4","","BROADCASTF64X2"],["BROADCASTF32X4","","???"]],"???","???"], - ["???",["","",["BROADCASTF32X8","","BROADCASTF64X4"],["???","","BROADCASTF64X4"]],"???","???"], - [["PABSB","","",""],"PABSB","???","???"], - [["PABSW","","",""],"PABSW","???","???"], - [["PABSD","","",""],["PABSD","","???"],"???","???"], - ["???",["","","PABSQ",""],"???","???"], - ["???","PMOVSXBW",["","","PMOVSWB",""],"???"], - ["???","PMOVSXBD",["","","PMOVSDB",""],"???"], - ["???","PMOVSXBQ",["","","PMOVSQB",""],"???"], - ["???","PMOVSXWD",["","","PMOVSDW",""],"???"], - ["???","PMOVSXWQ",["","","PMOVSQW",""],"???"], - ["???","PMOVSXDQ",["","","PMOVSQD",""],"???"], - ["???",["","",["PTESTMB","","PTESTMW"],""],["","",["PTESTNMB","","PTESTNMW"],""],"???"], - ["???",["","",["PTESTMD","","PTESTMQ"],["PTESTMD","","???"]],["","",["PTESTNMD","","PTESTNMQ"],""],"???"], - ["???","PMULDQ",["","",["PMOVM2B","","PMOVM2W"],""],"???"], - ["???",["PCMPEQQ","PCMPEQQ","PCMPEQQ",""],["","",["PMOVB2M","","PMOVW2M"],""],"???"], - [["???",["MOVNTDQA","","???"],"???","???"],["???","???",["","",["???","","PBROADCASTMB2Q"],""],"???"]], - ["???",["PACKUSDW","","???"],"???","???"], - ["???",["","MASKMOVPS",["SCALEFPS","","SCALEFPD"],""],"???","???"], - ["???",["","MASKMOVPD",["SCALEFSS","","SCALEFSD"],""],"???","???"], - ["???",["","MASKMOVPS","",""],"???","???"], - ["???",["","MASKMOVPD","",""],"???","???"], - ["???","PMOVZXBW",["","","PMOVWB",""],"???"], - ["???","PMOVZXBD",["","","PMOVDB",""],"???"], - ["???","PMOVZXBQ",["","","PMOVQB",""],"???"], - ["???","PMOVZXWD",["","","PMOVDW",""],"???"], - ["???","PMOVZXWQ",["","","PMOVQW",""],"???"], - ["???","PMOVZXDQ",["","",["PMOVQD","PMOVQD",""],""],"???"], - ["???",["","PERMD",["PERMD","","PERMQ"],["PERMD","","???"]],"???","???"], - ["???",["PCMPGTQ","PCMPGTQ","PCMPGTQ",""],"???","???"], - ["???","PMINSB",["","",["PMOVM2D","","PMOVM2Q"],""],"???"], - ["???",["PMINSD","PMINSD",["PMINSD","","PMINSQ"],["PMINSD","","???"]],["","",["PMOVD2M","","PMOVQ2M"],""],"???"], - ["???","PMINUW",["","","PBROADCASTMW2D",""],"???"], - ["???",["PMINUD","PMINUD",["PMINUD","","PMINUQ"],["PMINUD","","???"]],"???","???"], - ["???","PMAXSB","???","???"], - ["???",["PMAXSD","PMAXSD",["PMAXSD","","PMAXSQ"],["PMAXSD","","???"]],"???","???"], - ["???","PMAXUW","???","???"], - ["???",["PMAXUD","PMAXUD",["PMAXUD","","PMAXUQ"],["PMAXUD","","???"]],"???","???"], - ["???",["PMULLD","PMULLD",["PMULLD","","PMULLQ"],["PMULLD","",""]],"???","???"], - ["???",["PHMINPOSUW",["PHMINPOSUW","PHMINPOSUW",""],"",""],"???","???"], - ["???",["","",["GETEXPPS","","GETEXPPD"],["GETEXPPS","","GETEXPPD"]],"???","???"], - ["???",["","",["GETEXPSS","","GETEXPSD"],""],"???","???"], - ["???",["","",["PLZCNTD","","PLZCNTQ"],""],"???","???"], - ["???",["",["PSRLVD","","PSRLVQ"],["PSRLVD","","PSRLVQ"],["PSRLVD","","???"]],"???","???"], - ["???",["",["PSRAVD","",""],["PSRAVD","","PSRAVQ"],["PSRAVD","","???"]],"???","???"], - ["???",["",["PSLLVD","","PSLLVQ"],["PSLLVD","","PSLLVQ"],["PSLLVD","","???"]],"???","???"], - "???","???","???","???", - ["???",["","",["RCP14PS","","RCP14PD"],""],"???","???"], - ["???",["","",["RCP14SS","","RCP14SD"],""],"???","???"], - ["???",["","",["RSQRT14PS","","RSQRT14PD"],""],"???","???"], - ["???",["","",["RSQRT14SS","","RSQRT14SD"],""],"???","???"], - ["???",["","","",["ADDNPS","","ADDNPD"]],"???","???"], - ["???",["","","",["GMAXABSPS","","???"]],"???","???"], - ["???",["","","",["GMINPS","","GMINPD"]],"???","???"], - ["???",["","","",["GMAXPS","","GMAXPD"]],"???","???"], - "", - ["???",["","","",["FIXUPNANPS","","FIXUPNANPD"]],"???","???"], - "","", - ["???",["","PBROADCASTD",["PBROADCASTD","","???"],["PBROADCASTD","","???"]],"???","???"], - ["???",["","PBROADCASTQ",["BROADCASTI32X2","","PBROADCASTQ"],["???","","PBROADCASTQ"]],"???","???"], - ["???",["","BROADCASTI128",["BROADCASTI32X4","","BROADCASTI64X2"],["BROADCASTI32X4","","???"]],"???","???"], - ["???",["","",["BROADCASTI32X8","","BROADCASTI64X4"],["???","","BROADCASTI64X4"]],"???","???"], - ["???",["","","",["PADCD","","???"]],"???","???"], - ["???",["","","",["PADDSETCD","","???"]],"???","???"], - ["???",["","","",["PSBBD","","???"]],"???","???"], - ["???",["","","",["PSUBSETBD","","???"]],"???","???"], - "???","???","???","???", - ["???",["","",["PBLENDMD","","PBLENDMQ"],["PBLENDMD","","PBLENDMQ"]],"???","???"], - ["???",["","",["BLENDMPS","","BLENDMPD"],["BLENDMPS","","BLENDMPD"]],"???","???"], - ["???",["","",["PBLENDMB","","PBLENDMW"],""],"???","???"], - "???","???","???","???","???", - ["???",["","","",["PSUBRD","","???"]],"???","???"], - ["???",["","","",["SUBRPS","","SUBRPD"]],"???","???"], - ["???",["","","",["PSBBRD","","???"]],"???","???"], - ["???",["","","",["PSUBRSETBD","","???"]],"???","???"], - "???","???","???","???", - ["???",["","","",["PCMPLTD","","???"]],"???","???"], - ["???",["","",["PERMI2B","","PERMI2W"],""],"???","???"], - ["???",["","",["PERMI2D","","PERMI2Q"],""],"???","???"], - ["???",["","",["PERMI2PS","","PERMI2PD"],""],"???","???"], - ["???",["","PBROADCASTB",["PBROADCASTB","","???"],""],"???","???"], - ["???",["","PBROADCASTW",["PBROADCASTW","","???"],""],"???","???"], - ["???",["???",["","",["PBROADCASTB","","???"],""],"???","???"]], - ["???",["???",["","",["PBROADCASTW","","???"],""],"???","???"]], - ["???",["","",["PBROADCASTD","","PBROADCASTQ"],""],"???","???"], - ["???",["","",["PERMT2B","","PERMT2W"],""],"???","???"], - ["???",["","",["PERMT2D","","PERMT2Q"],""],"???","???"], - ["???",["","",["PERMT2PS","","PERMT2PD"],""],"???","???"], - [["???","INVEPT","???","???"],"???"], - [["???","INVVPID","???","???"],"???"], - [["???","INVPCID","???","???"],"???"], - ["???",["???","???","PMULTISHIFTQB","???"],"???","???"], - ["???",["","","",["SCALEPS","","???"]],"???","???"], - "???", - ["???",["","","",["PMULHUD","","???"]],"???","???"], - ["???",["","","",["PMULHD","","???"]],"???","???"], - ["???",["","",["EXPANDPS","","EXPANDPD"],""],"???","???"], - ["???",["","",["PEXPANDD","","PEXPANDQ"],""],"???","???"], - ["???",["","",["COMPRESSPS","","COMPRESSPD"],""],"???","???"], - ["???",["","",["PCOMPRESSD","","PCOMPRESSQ"],""],"???","???"], - "???", - ["???",["","",["PERMB","","PERMW"],""],"???","???"], - "???","???", - ["???",["",["PGATHERDD","","PGATHERDQ"],["PGATHERDD","","PGATHERDQ"],["PGATHERDD","","PGATHERDQ"]],"???","???"], - ["???",["",["PGATHERQD","","PGATHERQQ"],["PGATHERQD","","PGATHERQQ"],""],"???","???"], - ["???",["",["GATHERDPS","","GATHERDPD"],["GATHERDPS","","GATHERDPD"],["GATHERDPS","","GATHERDPD"]],"???","???"], - ["???",["",["GATHERQPS","","GATHERQPD"],["GATHERQPS","","GATHERQPD"],""],"???","???"], - "???","???", - ["???",["",["FMADDSUB132PS","","FMADDSUB132PD"],["FMADDSUB132PS","","FMADDSUB132PD"],""],"???","???"], - ["???",["",["FMSUBADD132PS","","FMSUBADD132PD"],["FMSUBADD132PS","","FMSUBADD132PD"],""],"???","???"], - ["???",["",["FMADD132PS","","FMADD132PD"],["FMADD132PS","","FMADD132PD"],["FMADD132PS","","FMADD132PD"]],"???","???"], - ["???",["",["FMADD132SS","","FMADD132SD"],["FMADD132SS","","FMADD132SD"],""],"???","???"], - ["???",["",["FMSUB132PS","","FMSUB132PD"],["FMSUB132PS","","FMSUB132PD"],["FMSUB132PS","","FMSUB132PD"]],"???","???"], - ["???",["",["FMSUB132SS","","FMSUB132SD"],["FMSUB132SS","","FMSUB132SD"],""],"???","???"], - ["???",["",["FNMADD132PS","","FNMADD132PD"],["FNMADD132PS","","FNMADD132PD"],["NMADD132PS","","FNMADD132PD"]],"???","???"], - ["???",["",["FNMADD132SS","","FNMADD132SD"],["FNMADD132SS","","FNMADD132SD"],""],"???","???"], - ["???",["",["FNMSUB132PS","","FNMSUB132PD"],["FNMSUB132PS","","FNMSUB132PD"],["FNMSUB132PS","","FNMSUB132PS"]],"???","???"], - ["???",["",["FNMSUB132SS","","FNMSUB132SD"],["FNMSUB132SS","","FNMSUB132SD"],""],"???","???"], - ["???",["","",["PSCATTERDD","","PSCATTERDQ"],["PSCATTERDD","","PSCATTERDQ"]],"???","???"], - ["???",["","",["PSCATTERQD","","PSCATTERQQ"],""],"???","???"], - ["???",["","",["SCATTERDPS","","SCATTERDPD"],["SCATTERDPS","","SCATTERDPD"]],"???","???"], - ["???",["","",["SCATTERQPS","","SCATTERQPD"],""],"???","???"], - ["???",["","","",["FMADD233PS","","???"]],"???","???"], - "???", - ["???",["",["FMADDSUB213PS","","FMADDSUB213PD"],["FMADDSUB213PS","","FMADDSUB213PD"],""],"???","???"], - ["???",["",["FMSUBADD213PS","","FMSUBADD213PD"],["FMSUBADD213PS","","FMSUBADD213PD"],""],"???","???"], - ["???",["",["FMADD213PS","","FMADD213PD"],["FMADD213PS","","FMADD213PD"],["FMADD213PS","","FMADD213PD"]],"???","???"], - ["???",["",["FMADD213SS","","FMADD213SD"],["FMADD213SS","","FMADD213SD"],""],"???","???"], - ["???",["",["FMSUB213PS","","FMSUB213PD"],["FMSUB213PS","","FMSUB213PD"],["FMSUB213PS","","FMSUB213PD"]],"???","???"], - ["???",["",["FMSUB213SS","","FMSUB213SD"],["FMSUB213SS","","FMSUB213SD"],""],"???","???"], - ["???",["",["FNMADD213PS","","FNMADD213PD"],["FNMADD213PS","","FNMADD213PD"],["FNMADD213PS","","FNMADD213PD"]],"???","???"], - ["???",["",["FNMADD213SS","","FNMADD213SD"],["FNMADD213SS","","FNMADD213SD"],""],"???","???"], - ["???",["",["FNMSUB213PS","","FNMSUB213PD"],["FNMSUB213PS","","FNMSUB213PD"],["FNMSUB213PS","","FNMSUB213PD"]],"???","???"], - ["???",["",["FNMSUB213SS","","FNMSUB213SD"],["FNMSUB213SS","","FNMSUB213SD"],""],"???","???"], - "???","???","???","???", - ["???",["","","PMADD52LUQ",["PMADD233D","","???"]],"???","???"], - ["???",["","","PMADD52HUQ",["PMADD231D","","???"]],"???","???"], - ["???",["",["FMADDSUB231PS","","FMADDSUB231PD"],["FMADDSUB231PS","","FMADDSUB231PD"],""],"???","???"], - ["???",["",["FMSUBADD231PS","","FMSUBADD231PD"],["FMSUBADD231PS","","FMSUBADD231PD"],""],"???","???"], - ["???",["",["FMADD231PS","","FMADD231PD"],["FMADD231PS","","FMADD231PD"],["FMADD231PS","","FMADD231PD"]],"???","???"], - ["???",["",["FMADD231SS","","FMADD231SD"],["FMADD231SS","","FMADD231SD"],""],"???","???"], - ["???",["",["FMSUB231PS","","FMSUB231PD"],["FMSUB231PS","","FMSUB231PD"],["FMSUB231PS","","FMSUB231PD"]],"???","???"], - ["???",["",["FMSUB231SS","","FMSUB231SD"],["FMSUB231SS","","FMSUB231SD"],""],"???","???"], - ["???",["",["FNMADD231PS","","FNMADD231PD"],["FNMADD231PS","","FNMADD231PD"],["FNMADD231PS","","FNMADD231PD"]],"???","???"], - ["???",["",["FNMADD231SS","","FNMADD231SD"],["FNMADD231SS","","FNMADD231SD"],""],"???","???"], - ["???",["",["FNMSUB231PS","","FNMSUB231PD"],["FNMSUB231PS","","FNMSUB231PD"],["FNMSUB231PS","","FNMSUB231PD"]],"???","???"], - ["???",["",["FNMSUB231SS","","FNMSUB231SD"],["FNMSUB231SS","","FNMSUB231SD"],""],"???","???"], - "???","???","???","???", - ["???",["","",["PCONFLICTD","","PCONFLICTQ"],""],"???","???"], - "???", - [ + [["PSHUFB", "", "", ""], "PSHUFB", "???", "???"], + [["PHADDW", "", "", ""], ["PHADDW", "PHADDW", "", ""], "???", "???"], + [["PHADDD", "", "", ""], ["PHADDD", "PHADDD", "", ""], "???", "???"], + [["PHADDSW", "", "", ""], ["PHADDSW", "PHADDSW", "", ""], "???", "???"], + [["PMADDUBSW", "", "", ""], "PMADDUBSW", "???", "???"], + [["PHSUBW", "", "", ""], ["PHSUBW", "PHSUBW", "", ""], "???", "???"], + [["PHSUBD", "", "", ""], ["PHSUBD", "PHSUBD", "", ""], "???", "???"], + [["PHSUBSW", "", "", ""], ["PHSUBSW", "PHSUBSW", "", ""], "???", "???"], + [["PSIGNB", "", "", ""], ["PSIGNB", "PSIGNB", "", ""], "???", "???"], + [["PSIGNW", "", "", ""], ["PSIGNW", "PSIGNW", "", ""], "???", "???"], + [["PSIGND", "", "", ""], ["PSIGND", "PSIGND", "", ""], "???", "???"], + [["PMULHRSW", "", "", ""], "PMULHRSW", "???", "???"], + ["???", ["", "PERMILPS", ["PERMILPS", "", "???"], ""], "???", "???"], + ["???", ["", "PERMILPD", "PERMILPD", ""], "???", "???"], + ["???", ["", "TESTPS", "", ""], "???", "???"], + ["???", ["", "TESTPD", "", ""], "???", "???"], + ["???", ["PBLENDVB", "PBLENDVB", "PSRLVW", ""], ["", "", "PMOVUSWB", ""], "???"], + ["???", ["", "", "PSRAVW", ""], ["", "", "PMOVUSDB", ""], "???"], + ["???", ["", "", "PSLLVW", ""], ["", "", "PMOVUSQB", ""], "???"], + ["???", ["", "CVTPH2PS", ["CVTPH2PS", "", "???"], ""], ["", "", "PMOVUSDW", ""], "???"], + ["???", ["BLENDVPS", "BLENDVPS", ["PRORVD", "", "PRORVQ"], ""], ["", "", "PMOVUSQW", ""], "???"], + ["???", ["BLENDVPD", "BLENDVPD", ["PROLVD", "", "PROLVQ"], ""], ["", "", "PMOVUSQD", ""], "???"], + ["???", ["", "PERMPS", ["PERMPS", "", "PERMPD"], ""], "???", "???"], + ["???", ["PTEST", "PTEST", "", ""], "???", "???"], + ["???", ["", "BROADCASTSS", ["BROADCASTSS", "", "???"], ["BROADCASTSS", "", "???"]], "???", "???"], + ["???", ["", "BROADCASTSD", ["BROADCASTF32X2", "", "BROADCASTSD"], ["???", "", "BROADCASTSD"]], "???", "???"], [ - ["???",["","","",["GATHERPF0HINTDPS","","GATHERPF0HINTDPD"]],"???","???"], - ["???",["","",["GATHERPF0DPS","","GATHERPF0DPD"],["GATHERPF0DPS","",""]],"???","???"], - ["???",["","",["GATHERPF1DPS","","GATHERPF1DPD"],["GATHERPF1DPS","",""]],"???","???"], - "???", - ["???",["","","",["SCATTERPF0HINTDPS","","SCATTERPF0HINTDPD"]],"???","???"], - ["???",["","",["SCATTERPF0DPS","","SCATTERPF0DPD"],["VSCATTERPF0DPS","",""]],"???","???"], - ["???",["","",["SCATTERPF1DPS","","SCATTERPF1DPD"],["VSCATTERPF1DPS","",""]],"???","???"], - "???" - ],"???" - ], - [ + "???", + ["", "BROADCASTF128", ["BROADCASTF32X4", "", "BROADCASTF64X2"], ["BROADCASTF32X4", "", "???"]], + "???", + "???" + ], + ["???", ["", "", ["BROADCASTF32X8", "", "BROADCASTF64X4"], ["???", "", "BROADCASTF64X4"]], "???", "???"], + [["PABSB", "", "", ""], "PABSB", "???", "???"], + [["PABSW", "", "", ""], "PABSW", "???", "???"], + [["PABSD", "", "", ""], ["PABSD", "", "???"], "???", "???"], + ["???", ["", "", "PABSQ", ""], "???", "???"], + ["???", "PMOVSXBW", ["", "", "PMOVSWB", ""], "???"], + ["???", "PMOVSXBD", ["", "", "PMOVSDB", ""], "???"], + ["???", "PMOVSXBQ", ["", "", "PMOVSQB", ""], "???"], + ["???", "PMOVSXWD", ["", "", "PMOVSDW", ""], "???"], + ["???", "PMOVSXWQ", ["", "", "PMOVSQW", ""], "???"], + ["???", "PMOVSXDQ", ["", "", "PMOVSQD", ""], "???"], + ["???", ["", "", ["PTESTMB", "", "PTESTMW"], ""], ["", "", ["PTESTNMB", "", "PTESTNMW"], ""], "???"], [ - "???", - ["???",["","",["GATHERPF0QPS","","GATHERPF0QPD"],""],"???","???"], - ["???",["","",["GATHERPF1QPS","","GATHERPF1QPD"],""],"???","???"], - "???","???", - ["???",["","",["SCATTERPF0QPS","","SCATTERPF0QPD"],""],"???","???"], - ["???",["","",["SCATTERPF1QPS","","SCATTERPF1QPD"],""],"???","???"], - "???" - ],"???" - ], - [["SHA1NEXTE","","",""],["","",["EXP2PS","","EXP2PD"],["EXP223PS","","???"]],"???","???"], - [["SHA1MSG1","","",""],["","","",["LOG2PS","","???"]],"???","???"], - [["SHA1MSG2","","",""],["","",["RCP28PS","","RCP28PD"],["RCP23PS","","???"]],"???","???"], - [["SHA256RNDS2","","",""],["","",["RCP28SS","","RCP28SD"],["RSQRT23PS","","???"]],"???","???"], - [["SHA256MSG1","","",""],["","",["RSQRT28PS","","RSQRT28PD"],["ADDSETSPS","","???"]],"???","???"], - [["SHA256MSG2","","",""],["","",["RSQRT28SS","","RSQRT28SD"],["PADDSETSD","","???"]],"???","???"], - "???","???", - [[["","","",["LOADUNPACKLD","","LOADUNPACKLQ"]],["","","",["PACKSTORELD","","PACKSTORELQ"]],"???","???"],"???"], - [[["","","",["LOADUNPACKLPS","","LOADUNPACKLPD"]],["","","",["PACKSTORELPS","","PACKSTORELPD"]],"???","???"],"???"], - "???","???", - [[["","","",["LOADUNPACKHD","","LOADUNPACKHQ"]],["","","",["PACKSTOREHD","","PACKSTOREHQ"]],"???","???"],"???"], - [[["","","",["LOADUNPACKHPS","","LOADUNPACKHPD"]],["","","",["PACKSTOREHPS","","PACKSTOREHPD"]],"???","???"],"???"], - "???","???","???","???","???", - ["???",["AESIMC","AESIMC","",""],"???","???"], - ["???",["AESENC","AESENC","",""],"???","???"], - ["???",["AESENCLAST","AESENCLAST","",""],"???","???"], - ["???",["AESDEC","AESDEC","",""],"???","???"], - ["???",["AESDECLAST","AESDECLAST","",""],"???","???"], - "???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???", - [ - ["MOVBE","","",""], - ["MOVBE","","",""],"???", - ["CRC32","","",""] - ], - [ - ["MOVBE","","",""], - ["MOVBE","","",""],"???", - ["CRC32","","",""] - ], - ["???",["","ANDN","",""],"???","???"], - [ + "???", + ["", "", ["PTESTMD", "", "PTESTMQ"], ["PTESTMD", "", "???"]], + ["", "", ["PTESTNMD", "", "PTESTNMQ"], ""], + "???" + ], + ["???", "PMULDQ", ["", "", ["PMOVM2B", "", "PMOVM2W"], ""], "???"], + ["???", ["PCMPEQQ", "PCMPEQQ", "PCMPEQQ", ""], ["", "", ["PMOVB2M", "", "PMOVW2M"], ""], "???"], + [ + ["???", ["MOVNTDQA", "", "???"], "???", "???"], + ["???", "???", ["", "", ["???", "", "PBROADCASTMB2Q"], ""], "???"] + ], + ["???", ["PACKUSDW", "", "???"], "???", "???"], + ["???", ["", "MASKMOVPS", ["SCALEFPS", "", "SCALEFPD"], ""], "???", "???"], + ["???", ["", "MASKMOVPD", ["SCALEFSS", "", "SCALEFSD"], ""], "???", "???"], + ["???", ["", "MASKMOVPS", "", ""], "???", "???"], + ["???", ["", "MASKMOVPD", "", ""], "???", "???"], + ["???", "PMOVZXBW", ["", "", "PMOVWB", ""], "???"], + ["???", "PMOVZXBD", ["", "", "PMOVDB", ""], "???"], + ["???", "PMOVZXBQ", ["", "", "PMOVQB", ""], "???"], + ["???", "PMOVZXWD", ["", "", "PMOVDW", ""], "???"], + ["???", "PMOVZXWQ", ["", "", "PMOVQW", ""], "???"], + ["???", "PMOVZXDQ", ["", "", ["PMOVQD", "PMOVQD", ""], ""], "???"], + ["???", ["", "PERMD", ["PERMD", "", "PERMQ"], ["PERMD", "", "???"]], "???", "???"], + ["???", ["PCMPGTQ", "PCMPGTQ", "PCMPGTQ", ""], "???", "???"], + ["???", "PMINSB", ["", "", ["PMOVM2D", "", "PMOVM2Q"], ""], "???"], + [ + "???", + ["PMINSD", "PMINSD", ["PMINSD", "", "PMINSQ"], ["PMINSD", "", "???"]], + ["", "", ["PMOVD2M", "", "PMOVQ2M"], ""], + "???" + ], + ["???", "PMINUW", ["", "", "PBROADCASTMW2D", ""], "???"], + ["???", ["PMINUD", "PMINUD", ["PMINUD", "", "PMINUQ"], ["PMINUD", "", "???"]], "???", "???"], + ["???", "PMAXSB", "???", "???"], + ["???", ["PMAXSD", "PMAXSD", ["PMAXSD", "", "PMAXSQ"], ["PMAXSD", "", "???"]], "???", "???"], + ["???", "PMAXUW", "???", "???"], + ["???", ["PMAXUD", "PMAXUD", ["PMAXUD", "", "PMAXUQ"], ["PMAXUD", "", "???"]], "???", "???"], + ["???", ["PMULLD", "PMULLD", ["PMULLD", "", "PMULLQ"], ["PMULLD", "", ""]], "???", "???"], + ["???", ["PHMINPOSUW", ["PHMINPOSUW", "PHMINPOSUW", ""], "", ""], "???", "???"], + ["???", ["", "", ["GETEXPPS", "", "GETEXPPD"], ["GETEXPPS", "", "GETEXPPD"]], "???", "???"], + ["???", ["", "", ["GETEXPSS", "", "GETEXPSD"], ""], "???", "???"], + ["???", ["", "", ["PLZCNTD", "", "PLZCNTQ"], ""], "???", "???"], + ["???", ["", ["PSRLVD", "", "PSRLVQ"], ["PSRLVD", "", "PSRLVQ"], ["PSRLVD", "", "???"]], "???", "???"], + ["???", ["", ["PSRAVD", "", ""], ["PSRAVD", "", "PSRAVQ"], ["PSRAVD", "", "???"]], "???", "???"], + ["???", ["", ["PSLLVD", "", "PSLLVQ"], ["PSLLVD", "", "PSLLVQ"], ["PSLLVD", "", "???"]], "???", "???"], "???", - ["???",["","BLSR","",""],"???","???"], - ["???",["","BLSMSK","",""],"???","???"], - ["???",["","BLSI","",""],"???","???"], - "???","???","???","???" - ],"???", - [ - ["","BZHI","",""],"???", - ["","PEXT","",""], - ["","PDEP","",""] - ], - [ "???", - ["ADCX","","",""], - ["ADOX","","",""], - ["","MULX","",""] - ], - [ - ["","BEXTR","",""], - ["","SHLX","",""], - ["","SARX","",""], - ["","SHRX","",""] - ], - "???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------ + "???", + "???", + ["???", ["", "", ["RCP14PS", "", "RCP14PD"], ""], "???", "???"], + ["???", ["", "", ["RCP14SS", "", "RCP14SD"], ""], "???", "???"], + ["???", ["", "", ["RSQRT14PS", "", "RSQRT14PD"], ""], "???", "???"], + ["???", ["", "", ["RSQRT14SS", "", "RSQRT14SD"], ""], "???", "???"], + ["???", ["", "", "", ["ADDNPS", "", "ADDNPD"]], "???", "???"], + ["???", ["", "", "", ["GMAXABSPS", "", "???"]], "???", "???"], + ["???", ["", "", "", ["GMINPS", "", "GMINPD"]], "???", "???"], + ["???", ["", "", "", ["GMAXPS", "", "GMAXPD"]], "???", "???"], + "", + ["???", ["", "", "", ["FIXUPNANPS", "", "FIXUPNANPD"]], "???", "???"], + "", + "", + ["???", ["", "PBROADCASTD", ["PBROADCASTD", "", "???"], ["PBROADCASTD", "", "???"]], "???", "???"], + ["???", ["", "PBROADCASTQ", ["BROADCASTI32X2", "", "PBROADCASTQ"], ["???", "", "PBROADCASTQ"]], "???", "???"], + [ + "???", + ["", "BROADCASTI128", ["BROADCASTI32X4", "", "BROADCASTI64X2"], ["BROADCASTI32X4", "", "???"]], + "???", + "???" + ], + ["???", ["", "", ["BROADCASTI32X8", "", "BROADCASTI64X4"], ["???", "", "BROADCASTI64X4"]], "???", "???"], + ["???", ["", "", "", ["PADCD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["PADDSETCD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["PSBBD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["PSUBSETBD", "", "???"]], "???", "???"], + "???", + "???", + "???", + "???", + ["???", ["", "", ["PBLENDMD", "", "PBLENDMQ"], ["PBLENDMD", "", "PBLENDMQ"]], "???", "???"], + ["???", ["", "", ["BLENDMPS", "", "BLENDMPD"], ["BLENDMPS", "", "BLENDMPD"]], "???", "???"], + ["???", ["", "", ["PBLENDMB", "", "PBLENDMW"], ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + ["???", ["", "", "", ["PSUBRD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["SUBRPS", "", "SUBRPD"]], "???", "???"], + ["???", ["", "", "", ["PSBBRD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["PSUBRSETBD", "", "???"]], "???", "???"], + "???", + "???", + "???", + "???", + ["???", ["", "", "", ["PCMPLTD", "", "???"]], "???", "???"], + ["???", ["", "", ["PERMI2B", "", "PERMI2W"], ""], "???", "???"], + ["???", ["", "", ["PERMI2D", "", "PERMI2Q"], ""], "???", "???"], + ["???", ["", "", ["PERMI2PS", "", "PERMI2PD"], ""], "???", "???"], + ["???", ["", "PBROADCASTB", ["PBROADCASTB", "", "???"], ""], "???", "???"], + ["???", ["", "PBROADCASTW", ["PBROADCASTW", "", "???"], ""], "???", "???"], + ["???", ["???", ["", "", ["PBROADCASTB", "", "???"], ""], "???", "???"]], + ["???", ["???", ["", "", ["PBROADCASTW", "", "???"], ""], "???", "???"]], + ["???", ["", "", ["PBROADCASTD", "", "PBROADCASTQ"], ""], "???", "???"], + ["???", ["", "", ["PERMT2B", "", "PERMT2W"], ""], "???", "???"], + ["???", ["", "", ["PERMT2D", "", "PERMT2Q"], ""], "???", "???"], + ["???", ["", "", ["PERMT2PS", "", "PERMT2PD"], ""], "???", "???"], + [["???", "INVEPT", "???", "???"], "???"], + [["???", "INVVPID", "???", "???"], "???"], + [["???", "INVPCID", "???", "???"], "???"], + ["???", ["???", "???", "PMULTISHIFTQB", "???"], "???", "???"], + ["???", ["", "", "", ["SCALEPS", "", "???"]], "???", "???"], + "???", + ["???", ["", "", "", ["PMULHUD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["PMULHD", "", "???"]], "???", "???"], + ["???", ["", "", ["EXPANDPS", "", "EXPANDPD"], ""], "???", "???"], + ["???", ["", "", ["PEXPANDD", "", "PEXPANDQ"], ""], "???", "???"], + ["???", ["", "", ["COMPRESSPS", "", "COMPRESSPD"], ""], "???", "???"], + ["???", ["", "", ["PCOMPRESSD", "", "PCOMPRESSQ"], ""], "???", "???"], + "???", + ["???", ["", "", ["PERMB", "", "PERMW"], ""], "???", "???"], + "???", + "???", + [ + "???", + ["", ["PGATHERDD", "", "PGATHERDQ"], ["PGATHERDD", "", "PGATHERDQ"], ["PGATHERDD", "", "PGATHERDQ"]], + "???", + "???" + ], + ["???", ["", ["PGATHERQD", "", "PGATHERQQ"], ["PGATHERQD", "", "PGATHERQQ"], ""], "???", "???"], + [ + "???", + ["", ["GATHERDPS", "", "GATHERDPD"], ["GATHERDPS", "", "GATHERDPD"], ["GATHERDPS", "", "GATHERDPD"]], + "???", + "???" + ], + ["???", ["", ["GATHERQPS", "", "GATHERQPD"], ["GATHERQPS", "", "GATHERQPD"], ""], "???", "???"], + "???", + "???", + ["???", ["", ["FMADDSUB132PS", "", "FMADDSUB132PD"], ["FMADDSUB132PS", "", "FMADDSUB132PD"], ""], "???", "???"], + ["???", ["", ["FMSUBADD132PS", "", "FMSUBADD132PD"], ["FMSUBADD132PS", "", "FMSUBADD132PD"], ""], "???", "???"], + [ + "???", + ["", ["FMADD132PS", "", "FMADD132PD"], ["FMADD132PS", "", "FMADD132PD"], ["FMADD132PS", "", "FMADD132PD"]], + "???", + "???" + ], + ["???", ["", ["FMADD132SS", "", "FMADD132SD"], ["FMADD132SS", "", "FMADD132SD"], ""], "???", "???"], + [ + "???", + ["", ["FMSUB132PS", "", "FMSUB132PD"], ["FMSUB132PS", "", "FMSUB132PD"], ["FMSUB132PS", "", "FMSUB132PD"]], + "???", + "???" + ], + ["???", ["", ["FMSUB132SS", "", "FMSUB132SD"], ["FMSUB132SS", "", "FMSUB132SD"], ""], "???", "???"], + [ + "???", + ["", ["FNMADD132PS", "", "FNMADD132PD"], ["FNMADD132PS", "", "FNMADD132PD"], ["NMADD132PS", "", "FNMADD132PD"]], + "???", + "???" + ], + ["???", ["", ["FNMADD132SS", "", "FNMADD132SD"], ["FNMADD132SS", "", "FNMADD132SD"], ""], "???", "???"], + [ + "???", + [ + "", + ["FNMSUB132PS", "", "FNMSUB132PD"], + ["FNMSUB132PS", "", "FNMSUB132PD"], + ["FNMSUB132PS", "", "FNMSUB132PS"] + ], + "???", + "???" + ], + ["???", ["", ["FNMSUB132SS", "", "FNMSUB132SD"], ["FNMSUB132SS", "", "FNMSUB132SD"], ""], "???", "???"], + ["???", ["", "", ["PSCATTERDD", "", "PSCATTERDQ"], ["PSCATTERDD", "", "PSCATTERDQ"]], "???", "???"], + ["???", ["", "", ["PSCATTERQD", "", "PSCATTERQQ"], ""], "???", "???"], + ["???", ["", "", ["SCATTERDPS", "", "SCATTERDPD"], ["SCATTERDPS", "", "SCATTERDPD"]], "???", "???"], + ["???", ["", "", ["SCATTERQPS", "", "SCATTERQPD"], ""], "???", "???"], + ["???", ["", "", "", ["FMADD233PS", "", "???"]], "???", "???"], + "???", + ["???", ["", ["FMADDSUB213PS", "", "FMADDSUB213PD"], ["FMADDSUB213PS", "", "FMADDSUB213PD"], ""], "???", "???"], + ["???", ["", ["FMSUBADD213PS", "", "FMSUBADD213PD"], ["FMSUBADD213PS", "", "FMSUBADD213PD"], ""], "???", "???"], + [ + "???", + ["", ["FMADD213PS", "", "FMADD213PD"], ["FMADD213PS", "", "FMADD213PD"], ["FMADD213PS", "", "FMADD213PD"]], + "???", + "???" + ], + ["???", ["", ["FMADD213SS", "", "FMADD213SD"], ["FMADD213SS", "", "FMADD213SD"], ""], "???", "???"], + [ + "???", + ["", ["FMSUB213PS", "", "FMSUB213PD"], ["FMSUB213PS", "", "FMSUB213PD"], ["FMSUB213PS", "", "FMSUB213PD"]], + "???", + "???" + ], + ["???", ["", ["FMSUB213SS", "", "FMSUB213SD"], ["FMSUB213SS", "", "FMSUB213SD"], ""], "???", "???"], + [ + "???", + [ + "", + ["FNMADD213PS", "", "FNMADD213PD"], + ["FNMADD213PS", "", "FNMADD213PD"], + ["FNMADD213PS", "", "FNMADD213PD"] + ], + "???", + "???" + ], + ["???", ["", ["FNMADD213SS", "", "FNMADD213SD"], ["FNMADD213SS", "", "FNMADD213SD"], ""], "???", "???"], + [ + "???", + [ + "", + ["FNMSUB213PS", "", "FNMSUB213PD"], + ["FNMSUB213PS", "", "FNMSUB213PD"], + ["FNMSUB213PS", "", "FNMSUB213PD"] + ], + "???", + "???" + ], + ["???", ["", ["FNMSUB213SS", "", "FNMSUB213SD"], ["FNMSUB213SS", "", "FNMSUB213SD"], ""], "???", "???"], + "???", + "???", + "???", + "???", + ["???", ["", "", "PMADD52LUQ", ["PMADD233D", "", "???"]], "???", "???"], + ["???", ["", "", "PMADD52HUQ", ["PMADD231D", "", "???"]], "???", "???"], + ["???", ["", ["FMADDSUB231PS", "", "FMADDSUB231PD"], ["FMADDSUB231PS", "", "FMADDSUB231PD"], ""], "???", "???"], + ["???", ["", ["FMSUBADD231PS", "", "FMSUBADD231PD"], ["FMSUBADD231PS", "", "FMSUBADD231PD"], ""], "???", "???"], + [ + "???", + ["", ["FMADD231PS", "", "FMADD231PD"], ["FMADD231PS", "", "FMADD231PD"], ["FMADD231PS", "", "FMADD231PD"]], + "???", + "???" + ], + ["???", ["", ["FMADD231SS", "", "FMADD231SD"], ["FMADD231SS", "", "FMADD231SD"], ""], "???", "???"], + [ + "???", + ["", ["FMSUB231PS", "", "FMSUB231PD"], ["FMSUB231PS", "", "FMSUB231PD"], ["FMSUB231PS", "", "FMSUB231PD"]], + "???", + "???" + ], + ["???", ["", ["FMSUB231SS", "", "FMSUB231SD"], ["FMSUB231SS", "", "FMSUB231SD"], ""], "???", "???"], + [ + "???", + [ + "", + ["FNMADD231PS", "", "FNMADD231PD"], + ["FNMADD231PS", "", "FNMADD231PD"], + ["FNMADD231PS", "", "FNMADD231PD"] + ], + "???", + "???" + ], + ["???", ["", ["FNMADD231SS", "", "FNMADD231SD"], ["FNMADD231SS", "", "FNMADD231SD"], ""], "???", "???"], + [ + "???", + [ + "", + ["FNMSUB231PS", "", "FNMSUB231PD"], + ["FNMSUB231PS", "", "FNMSUB231PD"], + ["FNMSUB231PS", "", "FNMSUB231PD"] + ], + "???", + "???" + ], + ["???", ["", ["FNMSUB231SS", "", "FNMSUB231SD"], ["FNMSUB231SS", "", "FNMSUB231SD"], ""], "???", "???"], + "???", + "???", + "???", + "???", + ["???", ["", "", ["PCONFLICTD", "", "PCONFLICTQ"], ""], "???", "???"], + "???", + [ + [ + ["???", ["", "", "", ["GATHERPF0HINTDPS", "", "GATHERPF0HINTDPD"]], "???", "???"], + ["???", ["", "", ["GATHERPF0DPS", "", "GATHERPF0DPD"], ["GATHERPF0DPS", "", ""]], "???", "???"], + ["???", ["", "", ["GATHERPF1DPS", "", "GATHERPF1DPD"], ["GATHERPF1DPS", "", ""]], "???", "???"], + "???", + ["???", ["", "", "", ["SCATTERPF0HINTDPS", "", "SCATTERPF0HINTDPD"]], "???", "???"], + ["???", ["", "", ["SCATTERPF0DPS", "", "SCATTERPF0DPD"], ["VSCATTERPF0DPS", "", ""]], "???", "???"], + ["???", ["", "", ["SCATTERPF1DPS", "", "SCATTERPF1DPD"], ["VSCATTERPF1DPS", "", ""]], "???", "???"], + "???" + ], + "???" + ], + [ + [ + "???", + ["???", ["", "", ["GATHERPF0QPS", "", "GATHERPF0QPD"], ""], "???", "???"], + ["???", ["", "", ["GATHERPF1QPS", "", "GATHERPF1QPD"], ""], "???", "???"], + "???", + "???", + ["???", ["", "", ["SCATTERPF0QPS", "", "SCATTERPF0QPD"], ""], "???", "???"], + ["???", ["", "", ["SCATTERPF1QPS", "", "SCATTERPF1QPD"], ""], "???", "???"], + "???" + ], + "???" + ], + [["SHA1NEXTE", "", "", ""], ["", "", ["EXP2PS", "", "EXP2PD"], ["EXP223PS", "", "???"]], "???", "???"], + [["SHA1MSG1", "", "", ""], ["", "", "", ["LOG2PS", "", "???"]], "???", "???"], + [["SHA1MSG2", "", "", ""], ["", "", ["RCP28PS", "", "RCP28PD"], ["RCP23PS", "", "???"]], "???", "???"], + [["SHA256RNDS2", "", "", ""], ["", "", ["RCP28SS", "", "RCP28SD"], ["RSQRT23PS", "", "???"]], "???", "???"], + [["SHA256MSG1", "", "", ""], ["", "", ["RSQRT28PS", "", "RSQRT28PD"], ["ADDSETSPS", "", "???"]], "???", "???"], + [["SHA256MSG2", "", "", ""], ["", "", ["RSQRT28SS", "", "RSQRT28SD"], ["PADDSETSD", "", "???"]], "???", "???"], + "???", + "???", + [ + [ + ["", "", "", ["LOADUNPACKLD", "", "LOADUNPACKLQ"]], + ["", "", "", ["PACKSTORELD", "", "PACKSTORELQ"]], + "???", + "???" + ], + "???" + ], + [ + [ + ["", "", "", ["LOADUNPACKLPS", "", "LOADUNPACKLPD"]], + ["", "", "", ["PACKSTORELPS", "", "PACKSTORELPD"]], + "???", + "???" + ], + "???" + ], + "???", + "???", + [ + [ + ["", "", "", ["LOADUNPACKHD", "", "LOADUNPACKHQ"]], + ["", "", "", ["PACKSTOREHD", "", "PACKSTOREHQ"]], + "???", + "???" + ], + "???" + ], + [ + [ + ["", "", "", ["LOADUNPACKHPS", "", "LOADUNPACKHPD"]], + ["", "", "", ["PACKSTOREHPS", "", "PACKSTOREHPD"]], + "???", + "???" + ], + "???" + ], + "???", + "???", + "???", + "???", + "???", + ["???", ["AESIMC", "AESIMC", "", ""], "???", "???"], + ["???", ["AESENC", "AESENC", "", ""], "???", "???"], + ["???", ["AESENCLAST", "AESENCLAST", "", ""], "???", "???"], + ["???", ["AESDEC", "AESDEC", "", ""], "???", "???"], + ["???", ["AESDECLAST", "AESDECLAST", "", ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + [["MOVBE", "", "", ""], ["MOVBE", "", "", ""], "???", ["CRC32", "", "", ""]], + [["MOVBE", "", "", ""], ["MOVBE", "", "", ""], "???", ["CRC32", "", "", ""]], + ["???", ["", "ANDN", "", ""], "???", "???"], + [ + "???", + ["???", ["", "BLSR", "", ""], "???", "???"], + ["???", ["", "BLSMSK", "", ""], "???", "???"], + ["???", ["", "BLSI", "", ""], "???", "???"], + "???", + "???", + "???", + "???" + ], + "???", + [["", "BZHI", "", ""], "???", ["", "PEXT", "", ""], ["", "PDEP", "", ""]], + ["???", ["ADCX", "", "", ""], ["ADOX", "", "", ""], ["", "MULX", "", ""]], + [ + ["", "BEXTR", "", ""], + ["", "SHLX", "", ""], + ["", "SARX", "", ""], + ["", "SHRX", "", ""] + ], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------ Three Byte operations 0F38. Opcodes plus 768 goes to 767 used by escape codes "0F, 3A", Or set directly by adding map bits "11" because "11 00000000" bin = 768 plus opcode. ------------------------------------------------------------------------------------------------------------------------*/ - ["???",["","PERMQ","PERMQ",""],"???","???"], - ["???",["","PERMPD","PERMPD",""],"???","???"], - ["???",["",["PBLENDD","",""],"",""],"???","???"], - ["???",["","",["ALIGND","","ALIGNQ"],["ALIGND","","???"]],"???","???"], - ["???",["","PERMILPS",["PERMILPS","","???"],""],"???","???"], - ["???",["","PERMILPD","PERMILPD",""],"???","???"], - ["???",["","PERM2F128","",""],"???","???"], - ["???",["","","",["PERMF32X4","","???"]],"???","???"], - ["???",["ROUNDPS","ROUNDPS",["RNDSCALEPS","","???"],""],"???","???"], - ["???",["ROUNDPD","ROUNDPD","RNDSCALEPD",""],"???","???"], - ["???",["ROUNDSS","ROUNDSS",["RNDSCALESS","","???"],""],"???","???"], - ["???",["ROUNDSD","ROUNDSD","RNDSCALESD",""],"???","???"], - ["???",["BLENDPS","BLENDPS","",""],"???","???"], - ["???",["BLENDPD","BLENDPD","",""],"???","???"], - ["???",["PBLENDW","PBLENDW","",""],"???","???"], - [["PALIGNR","","",""],"PALIGNR","???","???"], - "???","???","???","???", - [["???","PEXTRB","???","???"],["???","PEXTRB","???","???"]], - [["???","PEXTRW","???","???"],["???","PEXTRW","???","???"]], - ["???",["PEXTRD","","PEXTRQ"],"???","???"], - ["???","EXTRACTPS","???","???"], - ["???",["","INSERTF128",["INSERTF32X4","","INSERTF64X2"],""],"???","???"], - ["???",["","EXTRACTF128",["EXTRACTF32X4","","EXTRACTF64X2"],""],"???","???"], - ["???",["","",["INSERTF32X8","","INSERTF64X4"],""],"???","???"], - ["???",["","",["EXTRACTF32X8","","EXTRACTF64X4"],""],"???","???"], - "???", - ["???",["","CVTPS2PH",["CVTPS2PH","","???"],""],"???","???"], - ["???",["","",["PCMP,UD,","","PCMP,UQ,"],["PCMP,UD,","","???"]],"???","???"], - ["???",["","",["PCM,PD,","","PCM,PQ,"],["PCM,PD,","","???"]],"???","???"], - ["???","PINSRB","???","???"], - ["???",["INSERTPS","","???"],"???","???"], - ["???",["",["PINSRD","","PINSRQ"],["PINSRD","","PINSRQ"],""],"???","???"], - ["???",["","",["SHUFF32X4","","SHUFF64X2"],""],"???","???"], - "???", - ["???",["","",["PTERNLOGD","","PTERNLOGQ"],""],"???","???"], - ["???",["","",["GETMANTPS","","GETMANTPD"],["GETMANTPS","","GETMANTPD"]],"???","???"], - ["???",["","",["GETMANTSS","","GETMANTSD"],""],"???","???"], - "???","???","???","???","???","???","???","???", - ["???",["",["KSHIFTRB","","KSHIFTRW"],"",""],"???","???"], - ["???",["",["KSHIFTRD","","KSHIFTRQ"],"",""],"???","???"], - ["???",["",["KSHIFTLB","","KSHIFTLW"],"",""],"???","???"], - ["???",["",["KSHIFTLD","","KSHIFTLQ"],"",""],"???","???"], - "???","???","???","???", - ["???",["","INSERTI128",["INSERTI32X4","","INSERTI64X2"],""],"???","???"], - ["???",["","EXTRACTI128",["EXTRACTI32X4","","EXTRACTI64X2"],""],"???","???"], - ["???",["","",["INSERTI32X8","","INSERTI64X4"],""],"???","???"], - ["???",["","",["EXTRACTI32X8","","EXTRACTI64X4"],""],"???","???"], - "???","???", - ["???",["","KEXTRACT",["PCMP,UB,","","PCMP,UW,"],""],"???","???"], - ["???",["","",["PCM,PB,","","PCM,PW,"],""],"???","???"], - ["???",["DPPS","DPPS","",""],"???","???"], - ["???",["DPPD","DPPD","",""],"???","???"], - ["???",["MPSADBW","MPSADBW",["DBPSADBW","","???"],""],"???","???"], - ["???",["","",["SHUFI32X4","","SHUFI64X2"],""],"???","???"], - ["???",["PCLMULQDQ","PCLMULQDQ","",""],"???","???"], - "???", - ["???",["","PERM2I128","",""],"???","???"], - "???", - ["???",["",["PERMIL2PS","","PERMIL2PS"],"",""],"???","???"], - ["???",["",["PERMIL2PD","","PERMIL2PD"],"",""],"???","???"], - ["???",["","BLENDVPS","",""],"???","???"], - ["???",["","BLENDVPD","",""],"???","???"], - ["???",["","PBLENDVB","",""],"???","???"], - "???","???","???", - ["???",["","",["RANGEPS","","RANGEPD"],""],"???","???"], - ["???",["","",["RANGESS","","RANGESD"],""],"???","???"], - ["???",["","","",["RNDFXPNTPS","","RNDFXPNTPD"]],"???","???"], - "???", - ["???",["","",["FIXUPIMMPS","","FIXUPIMMPD"],""],"???","???"], - ["???",["","",["FIXUPIMMSS","","FIXUPIMMSD"],""],"???","???"], - ["???",["","",["REDUCEPS","","REDUCEPD"],""],"???","???"], - ["???",["","",["REDUCESS","","REDUCESD"],""],"???","???"], - "???","???","???","???", - ["???",["",["FMADDSUBPS","","FMADDSUBPS"],"",""],"???","???"], - ["???",["",["FMADDSUBPD","","FMADDSUBPD"],"",""],"???","???"], - ["???",["",["FMSUBADDPS","","FMSUBADDPS"],"",""],"???","???"], - ["???",["",["FMSUBADDPD","","FMSUBADDPD"],"",""],"???","???"], - ["???",["PCMPESTRM","PCMPESTRM","",""],"???","???"], - ["???",["PCMPESTRI","PCMPESTRI","",""],"???","???"], - ["???",["PCMPISTRM","PCMPISTRM","",""],"???","???"], - ["???",["PCMPISTRI","PCMPISTRI","",""],"???","???"], - "???","???", - ["???",["","",["FPCLASSPS","","FPCLASSPD"],""],"???","???"], - ["???",["","",["FPCLASSSS","","FPCLASSSD"],""],"???","???"], - ["???",["",["FMADDPS","","FMADDPS"],"",""],"???","???"], - ["???",["",["FMADDPD","","FMADDPD"],"",""],"???","???"], - ["???",["",["FMADDSS","","FMADDSS"],"",""],"???","???"], - ["???",["",["FMADDSD","","FMADDSD"],"",""],"???","???"], - ["???",["",["FMSUBPS","","FMSUBPS"],"",""],"???","???"], - ["???",["",["FMSUBPD","","FMSUBPD"],"",""],"???","???"], - ["???",["",["FMSUBSS","","FMSUBSS"],"",""],"???","???"], - ["???",["",["FMSUBSD","","FMSUBSD"],"",""],"???","???"], - "???","???","???","???","???","???","???","???", - ["???",["",["FNMADDPS","","FNMADDPS"],"",""],"???","???"], - ["???",["",["FNMADDPD","","FNMADDPD"],"",""],"???","???"], - ["???",["",["FNMADDSS","","FNMADDSS"],"",""],"???","???"], - ["???",["",["FNMADDSD","","FNMADDSD"],"",""],"???","???"], - ["???",["",["FNMSUBPS","","FNMSUBPS"],"",""],"???","???"], - ["???",["",["FNMSUBPD","","FNMSUBPD"],"",""],"???","???"], - ["???",["",["FNMSUBSS","","FNMSUBSS"],"",""],"???","???"], - ["???",["",["FNMSUBSD","","FNMSUBSD"],"",""],"???","???"], - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???", - [["","","","CVTFXPNTUDQ2PS"],["","","",["CVTFXPNTPS2UDQ","","???"]],"???",["","","","CVTFXPNTPD2UDQ"]], - [["","","","CVTFXPNTDQ2PS"],["","","",["CVTFXPNTPS2DQ","","???"]],"???","???"], - "SHA1RNDS4", - "???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - ["???",["AESKEYGENASSIST","AESKEYGENASSIST","",""],"???","???"], - "???","???","???","???","???","???", - ["???","???","???",["","","","CVTFXPNTPD2DQ"]], - "???","???","???","???","???","???","???","???","???", - ["???","???","???",["","RORX","",""]], - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------ + ["???", ["", "PERMQ", "PERMQ", ""], "???", "???"], + ["???", ["", "PERMPD", "PERMPD", ""], "???", "???"], + ["???", ["", ["PBLENDD", "", ""], "", ""], "???", "???"], + ["???", ["", "", ["ALIGND", "", "ALIGNQ"], ["ALIGND", "", "???"]], "???", "???"], + ["???", ["", "PERMILPS", ["PERMILPS", "", "???"], ""], "???", "???"], + ["???", ["", "PERMILPD", "PERMILPD", ""], "???", "???"], + ["???", ["", "PERM2F128", "", ""], "???", "???"], + ["???", ["", "", "", ["PERMF32X4", "", "???"]], "???", "???"], + ["???", ["ROUNDPS", "ROUNDPS", ["RNDSCALEPS", "", "???"], ""], "???", "???"], + ["???", ["ROUNDPD", "ROUNDPD", "RNDSCALEPD", ""], "???", "???"], + ["???", ["ROUNDSS", "ROUNDSS", ["RNDSCALESS", "", "???"], ""], "???", "???"], + ["???", ["ROUNDSD", "ROUNDSD", "RNDSCALESD", ""], "???", "???"], + ["???", ["BLENDPS", "BLENDPS", "", ""], "???", "???"], + ["???", ["BLENDPD", "BLENDPD", "", ""], "???", "???"], + ["???", ["PBLENDW", "PBLENDW", "", ""], "???", "???"], + [["PALIGNR", "", "", ""], "PALIGNR", "???", "???"], + "???", + "???", + "???", + "???", + [ + ["???", "PEXTRB", "???", "???"], + ["???", "PEXTRB", "???", "???"] + ], + [ + ["???", "PEXTRW", "???", "???"], + ["???", "PEXTRW", "???", "???"] + ], + ["???", ["PEXTRD", "", "PEXTRQ"], "???", "???"], + ["???", "EXTRACTPS", "???", "???"], + ["???", ["", "INSERTF128", ["INSERTF32X4", "", "INSERTF64X2"], ""], "???", "???"], + ["???", ["", "EXTRACTF128", ["EXTRACTF32X4", "", "EXTRACTF64X2"], ""], "???", "???"], + ["???", ["", "", ["INSERTF32X8", "", "INSERTF64X4"], ""], "???", "???"], + ["???", ["", "", ["EXTRACTF32X8", "", "EXTRACTF64X4"], ""], "???", "???"], + "???", + ["???", ["", "CVTPS2PH", ["CVTPS2PH", "", "???"], ""], "???", "???"], + ["???", ["", "", ["PCMP,UD,", "", "PCMP,UQ,"], ["PCMP,UD,", "", "???"]], "???", "???"], + ["???", ["", "", ["PCM,PD,", "", "PCM,PQ,"], ["PCM,PD,", "", "???"]], "???", "???"], + ["???", "PINSRB", "???", "???"], + ["???", ["INSERTPS", "", "???"], "???", "???"], + ["???", ["", ["PINSRD", "", "PINSRQ"], ["PINSRD", "", "PINSRQ"], ""], "???", "???"], + ["???", ["", "", ["SHUFF32X4", "", "SHUFF64X2"], ""], "???", "???"], + "???", + ["???", ["", "", ["PTERNLOGD", "", "PTERNLOGQ"], ""], "???", "???"], + ["???", ["", "", ["GETMANTPS", "", "GETMANTPD"], ["GETMANTPS", "", "GETMANTPD"]], "???", "???"], + ["???", ["", "", ["GETMANTSS", "", "GETMANTSD"], ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["???", ["", ["KSHIFTRB", "", "KSHIFTRW"], "", ""], "???", "???"], + ["???", ["", ["KSHIFTRD", "", "KSHIFTRQ"], "", ""], "???", "???"], + ["???", ["", ["KSHIFTLB", "", "KSHIFTLW"], "", ""], "???", "???"], + ["???", ["", ["KSHIFTLD", "", "KSHIFTLQ"], "", ""], "???", "???"], + "???", + "???", + "???", + "???", + ["???", ["", "INSERTI128", ["INSERTI32X4", "", "INSERTI64X2"], ""], "???", "???"], + ["???", ["", "EXTRACTI128", ["EXTRACTI32X4", "", "EXTRACTI64X2"], ""], "???", "???"], + ["???", ["", "", ["INSERTI32X8", "", "INSERTI64X4"], ""], "???", "???"], + ["???", ["", "", ["EXTRACTI32X8", "", "EXTRACTI64X4"], ""], "???", "???"], + "???", + "???", + ["???", ["", "KEXTRACT", ["PCMP,UB,", "", "PCMP,UW,"], ""], "???", "???"], + ["???", ["", "", ["PCM,PB,", "", "PCM,PW,"], ""], "???", "???"], + ["???", ["DPPS", "DPPS", "", ""], "???", "???"], + ["???", ["DPPD", "DPPD", "", ""], "???", "???"], + ["???", ["MPSADBW", "MPSADBW", ["DBPSADBW", "", "???"], ""], "???", "???"], + ["???", ["", "", ["SHUFI32X4", "", "SHUFI64X2"], ""], "???", "???"], + ["???", ["PCLMULQDQ", "PCLMULQDQ", "", ""], "???", "???"], + "???", + ["???", ["", "PERM2I128", "", ""], "???", "???"], + "???", + ["???", ["", ["PERMIL2PS", "", "PERMIL2PS"], "", ""], "???", "???"], + ["???", ["", ["PERMIL2PD", "", "PERMIL2PD"], "", ""], "???", "???"], + ["???", ["", "BLENDVPS", "", ""], "???", "???"], + ["???", ["", "BLENDVPD", "", ""], "???", "???"], + ["???", ["", "PBLENDVB", "", ""], "???", "???"], + "???", + "???", + "???", + ["???", ["", "", ["RANGEPS", "", "RANGEPD"], ""], "???", "???"], + ["???", ["", "", ["RANGESS", "", "RANGESD"], ""], "???", "???"], + ["???", ["", "", "", ["RNDFXPNTPS", "", "RNDFXPNTPD"]], "???", "???"], + "???", + ["???", ["", "", ["FIXUPIMMPS", "", "FIXUPIMMPD"], ""], "???", "???"], + ["???", ["", "", ["FIXUPIMMSS", "", "FIXUPIMMSD"], ""], "???", "???"], + ["???", ["", "", ["REDUCEPS", "", "REDUCEPD"], ""], "???", "???"], + ["???", ["", "", ["REDUCESS", "", "REDUCESD"], ""], "???", "???"], + "???", + "???", + "???", + "???", + ["???", ["", ["FMADDSUBPS", "", "FMADDSUBPS"], "", ""], "???", "???"], + ["???", ["", ["FMADDSUBPD", "", "FMADDSUBPD"], "", ""], "???", "???"], + ["???", ["", ["FMSUBADDPS", "", "FMSUBADDPS"], "", ""], "???", "???"], + ["???", ["", ["FMSUBADDPD", "", "FMSUBADDPD"], "", ""], "???", "???"], + ["???", ["PCMPESTRM", "PCMPESTRM", "", ""], "???", "???"], + ["???", ["PCMPESTRI", "PCMPESTRI", "", ""], "???", "???"], + ["???", ["PCMPISTRM", "PCMPISTRM", "", ""], "???", "???"], + ["???", ["PCMPISTRI", "PCMPISTRI", "", ""], "???", "???"], + "???", + "???", + ["???", ["", "", ["FPCLASSPS", "", "FPCLASSPD"], ""], "???", "???"], + ["???", ["", "", ["FPCLASSSS", "", "FPCLASSSD"], ""], "???", "???"], + ["???", ["", ["FMADDPS", "", "FMADDPS"], "", ""], "???", "???"], + ["???", ["", ["FMADDPD", "", "FMADDPD"], "", ""], "???", "???"], + ["???", ["", ["FMADDSS", "", "FMADDSS"], "", ""], "???", "???"], + ["???", ["", ["FMADDSD", "", "FMADDSD"], "", ""], "???", "???"], + ["???", ["", ["FMSUBPS", "", "FMSUBPS"], "", ""], "???", "???"], + ["???", ["", ["FMSUBPD", "", "FMSUBPD"], "", ""], "???", "???"], + ["???", ["", ["FMSUBSS", "", "FMSUBSS"], "", ""], "???", "???"], + ["???", ["", ["FMSUBSD", "", "FMSUBSD"], "", ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["???", ["", ["FNMADDPS", "", "FNMADDPS"], "", ""], "???", "???"], + ["???", ["", ["FNMADDPD", "", "FNMADDPD"], "", ""], "???", "???"], + ["???", ["", ["FNMADDSS", "", "FNMADDSS"], "", ""], "???", "???"], + ["???", ["", ["FNMADDSD", "", "FNMADDSD"], "", ""], "???", "???"], + ["???", ["", ["FNMSUBPS", "", "FNMSUBPS"], "", ""], "???", "???"], + ["???", ["", ["FNMSUBPD", "", "FNMSUBPD"], "", ""], "???", "???"], + ["???", ["", ["FNMSUBSS", "", "FNMSUBSS"], "", ""], "???", "???"], + ["???", ["", ["FNMSUBSD", "", "FNMSUBSD"], "", ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + [ + ["", "", "", "CVTFXPNTUDQ2PS"], + ["", "", "", ["CVTFXPNTPS2UDQ", "", "???"]], + "???", + ["", "", "", "CVTFXPNTPD2UDQ"] + ], + [["", "", "", "CVTFXPNTDQ2PS"], ["", "", "", ["CVTFXPNTPS2DQ", "", "???"]], "???", "???"], + "SHA1RNDS4", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["???", ["AESKEYGENASSIST", "AESKEYGENASSIST", "", ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + ["???", "???", "???", ["", "", "", "CVTFXPNTPD2DQ"]], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["???", "???", "???", ["", "RORX", "", ""]], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP 8. ------------------------------------------------------------------------------------------------------------------------*/ - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VPMACSSWW","VPMACSSWD","VPMACSSDQL","???","???","???","???","???","???", - "VPMACSSDD","VPMACSSDQH","???","???","???","???","???","VPMACSWW","VPMACSWD","VPMACSDQL", - "???","???","???","???","???","???","VPMACSDD","VPMACSDQH", - "???","???",["VPCMOV","","VPCMOV"],["VPPERM","","VPPERM"],"???","???","VPMADCSSWD", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VPMADCSWD","???","???","???","???","???","???","???","???","???", - "VPROTB","VPROTW","VPROTD","VPROTQ","???","???","???","???","???","???","???","???", - "VPCOM,B,","VPCOM,W,","VPCOM,D,","VPCOM,Q,","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VPCOM,UB,","VPCOM,UW,","VPCOM,UD,","VPCOM,UQ,", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------ + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPMACSSWW", + "VPMACSSWD", + "VPMACSSDQL", + "???", + "???", + "???", + "???", + "???", + "???", + "VPMACSSDD", + "VPMACSSDQH", + "???", + "???", + "???", + "???", + "???", + "VPMACSWW", + "VPMACSWD", + "VPMACSDQL", + "???", + "???", + "???", + "???", + "???", + "???", + "VPMACSDD", + "VPMACSDQH", + "???", + "???", + ["VPCMOV", "", "VPCMOV"], + ["VPPERM", "", "VPPERM"], + "???", + "???", + "VPMADCSSWD", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPMADCSWD", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPROTB", + "VPROTW", + "VPROTD", + "VPROTQ", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPCOM,B,", + "VPCOM,W,", + "VPCOM,D,", + "VPCOM,Q,", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPCOM,UB,", + "VPCOM,UW,", + "VPCOM,UD,", + "VPCOM,UQ,", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP 9. ------------------------------------------------------------------------------------------------------------------------*/ - "???", - ["???","BLCFILL","BLSFILL","BLCS","TZMSK","BLCIC","BLSIC","T1MSKC"],["???","BLCMSK","???","???","???","???","BLCI","???"], - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - ["???",["LLWPCB","SLWPCB","???","???","???","???","???","???"]], - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VFRCZPS","VFRCZPD","VFRCZSS","VFRCZSD","???","???","???","???","???","???","???","???","???","???","???","???", - ["VPROTB","","VPROTB"],["VPROTW","","VPROTW"],["VPROTD","","VPROTD"],["VPROTQ","","VPROTQ"], - ["VPSHLB","","VPSHLB"],["VPSHLW","","VPSHLW"],["VPSHLD","","VPSHLD"],["VPSHLQ","","VPSHLQ"], - ["VPSHAB","","VPSHAB"],["VPSHAW","","VPSHAW"],["VPSHAD","","VPSHAD"],["VPSHAQ","","VPSHAQ"], - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VPHADDBW","VPHADDBD","VPHADDBQ","???","???","VPHADDWD","VPHADDWQ","???","???","???","VPHADDDQ","???","???","???","???","???", - "VPHADDUBWD","VPHADDUBD","VPHADDUBQ","???","???","VPHADDUWD","VPHADDUWQ","???","???","???","VPHADDUDQ","???","???","???","???","???", - "VPHSUBBW","VPHSUBWD","VPHSUBDQ","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------ + "???", + ["???", "BLCFILL", "BLSFILL", "BLCS", "TZMSK", "BLCIC", "BLSIC", "T1MSKC"], + ["???", "BLCMSK", "???", "???", "???", "???", "BLCI", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["???", ["LLWPCB", "SLWPCB", "???", "???", "???", "???", "???", "???"]], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VFRCZPS", + "VFRCZPD", + "VFRCZSS", + "VFRCZSD", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["VPROTB", "", "VPROTB"], + ["VPROTW", "", "VPROTW"], + ["VPROTD", "", "VPROTD"], + ["VPROTQ", "", "VPROTQ"], + ["VPSHLB", "", "VPSHLB"], + ["VPSHLW", "", "VPSHLW"], + ["VPSHLD", "", "VPSHLD"], + ["VPSHLQ", "", "VPSHLQ"], + ["VPSHAB", "", "VPSHAB"], + ["VPSHAW", "", "VPSHAW"], + ["VPSHAD", "", "VPSHAD"], + ["VPSHAQ", "", "VPSHAQ"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPHADDBW", + "VPHADDBD", + "VPHADDBQ", + "???", + "???", + "VPHADDWD", + "VPHADDWQ", + "???", + "???", + "???", + "VPHADDDQ", + "???", + "???", + "???", + "???", + "???", + "VPHADDUBWD", + "VPHADDUBD", + "VPHADDUBQ", + "???", + "???", + "VPHADDUWD", + "VPHADDUWQ", + "???", + "???", + "???", + "VPHADDUDQ", + "???", + "???", + "???", + "???", + "???", + "VPHSUBBW", + "VPHSUBWD", + "VPHSUBDQ", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP A. ------------------------------------------------------------------------------------------------------------------------*/ - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "BEXTR","???",["LWPINS","LWPVAL","???","???","???","???","???","???"], - "???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------- + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "BEXTR", + "???", + ["LWPINS", "LWPVAL", "???", "???", "???", "???", "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------- L1OM Vector. -------------------------------------------------------------------------------------------------------------------------*/ - "???","???","???","???","DELAY","???","???","???","???","???","???","???","???","???","???","???", - [["VLOADD","VLOADQ","",""],"???"],"???", - [["VLOADUNPACKLD","VLOADUNPACKLQ","",""],"???"], - [["VLOADUNPACKHD","VLOADUNPACKHQ","",""],"???"], - [["VSTORED","VSTOREQ","",""],"???"],"???", - [["VPACKSTORELD","VPACKSTORELQ","",""],"???"], - [["VPACKSTOREHD","VPACKSTOREHQ","",""],"???"], - ["VGATHERD","???"],["VGATHERPFD","???"],"???",["VGATHERPF2D","???"], - ["VSCATTERD","???"],["VSCATTERPFD","???"],"???",["VSCATTERPF2D","???"], - ["VCMP,PS,","VCMP,PD,","",""],"VCMP,PI,","VCMP,PU,","???", - ["VCMP,PS,","VCMP,PD,","",""],"VCMP,PI,","VCMP,PU,","???", - "???","???","???","???","???","???","???","???", - "VTESTPI","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - ["VADDPS","VADDPD","",""],"VADDPI","???","VADDSETCPI","???","VADCPI","VADDSETSPS","VADDSETSPI", - ["VADDNPS","VADDNPD","",""],"???","???","???","???","???","???","???", - ["VSUBPS","VSUBPD","",""],"VSUBPI","???","VSUBSETBPI","???","VSBBPI","???","???", - ["VSUBRPS","VSUBRPD","",""],"VSUBRPI","???","VSUBRSETBPI","???","VSBBRPI","???","???", - ["VMADD231PS","VMADD231PD","",""],"VMADD231PI", - ["VMADD213PS","VMADD213PD","",""],"???", - ["VMADD132PS","VMADD132PD","",""],"???", - "VMADD233PS","VMADD233PI", - ["VMSUB231PS","VMSUB231PD","",""],"???", - ["VMSUB213PS","VMSUB213PD","",""],"???", - ["VMSUB132PS","VMSUB132PD","",""],"???","???","???", - ["VMADDN231PS","VMADDN231PD","",""],"???", - ["VMADDN213PS","VMADDN213PD","",""],"???", - ["VMADDN132PS","VMADDN132PD","",""],"???","???","???", - ["VMSUBR231PS","VMSUBR231PD","",""],"???", - ["VMSUBR213PS","VMSUBR213PD","",""],"???", - ["VMSUBR132PS","VMSUBR132PD","",""],"???", - ["VMSUBR23C1PS","VMSUBR23C1PD","",""],"???", - ["VMULPS","VMULPD","",""],"VMULHPI","VMULHPU","VMULLPI","???","???","VCLAMPZPS","VCLAMPZPI", - ["VMAXPS","VMAXPD","",""],"VMAXPI","VMAXPU","???", - ["VMINPS","VMINPD","",""],"VMINPI","VMINPU","???", - ["???","VCVT,PD2PS,","",""],["VCVTPS2PI","VCVT,PD2PI,","",""],["VCVTPS2PU","VCVT,PD2PU,","",""],"???", - ["???","VCVT,PS2PD,","",""],["VCVTPI2PS","VCVT,PI2PD,","",""],["VCVTPU2PS","VCVT,PU2PD,","",""],"???", - "VROUNDPS","???","VCVTINSPS2U10","VCVTINSPS2F11","???","VCVTPS2SRGB8","VMAXABSPS","???", - "VSLLPI","VSRAPI","VSRLPI","???", - ["VANDNPI","VANDNPQ","",""],["VANDPI","VANDPQ","",""], - ["VORPI","VORPQ","",""],["VXORPI","VXORPQ","",""], - "VBINTINTERLEAVE11PI","VBINTINTERLEAVE21PI","???","???","???","???","???","???", - "VEXP2LUTPS","VLOG2LUTPS","VRSQRTLUTPS","???","VGETEXPPS","???","???","???", - "VSCALEPS","???","???","???","???","???","???","???", - "VRCPRESPS","???","VRCPREFINEPS","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VFIXUPPS","VSHUF128X32","VINSERTFIELDPI","VROTATEFIELDPI","???","???","???","???", - "???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------- + "???", + "???", + "???", + "???", + "DELAY", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + [["VLOADD", "VLOADQ", "", ""], "???"], + "???", + [["VLOADUNPACKLD", "VLOADUNPACKLQ", "", ""], "???"], + [["VLOADUNPACKHD", "VLOADUNPACKHQ", "", ""], "???"], + [["VSTORED", "VSTOREQ", "", ""], "???"], + "???", + [["VPACKSTORELD", "VPACKSTORELQ", "", ""], "???"], + [["VPACKSTOREHD", "VPACKSTOREHQ", "", ""], "???"], + ["VGATHERD", "???"], + ["VGATHERPFD", "???"], + "???", + ["VGATHERPF2D", "???"], + ["VSCATTERD", "???"], + ["VSCATTERPFD", "???"], + "???", + ["VSCATTERPF2D", "???"], + ["VCMP,PS,", "VCMP,PD,", "", ""], + "VCMP,PI,", + "VCMP,PU,", + "???", + ["VCMP,PS,", "VCMP,PD,", "", ""], + "VCMP,PI,", + "VCMP,PU,", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VTESTPI", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["VADDPS", "VADDPD", "", ""], + "VADDPI", + "???", + "VADDSETCPI", + "???", + "VADCPI", + "VADDSETSPS", + "VADDSETSPI", + ["VADDNPS", "VADDNPD", "", ""], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["VSUBPS", "VSUBPD", "", ""], + "VSUBPI", + "???", + "VSUBSETBPI", + "???", + "VSBBPI", + "???", + "???", + ["VSUBRPS", "VSUBRPD", "", ""], + "VSUBRPI", + "???", + "VSUBRSETBPI", + "???", + "VSBBRPI", + "???", + "???", + ["VMADD231PS", "VMADD231PD", "", ""], + "VMADD231PI", + ["VMADD213PS", "VMADD213PD", "", ""], + "???", + ["VMADD132PS", "VMADD132PD", "", ""], + "???", + "VMADD233PS", + "VMADD233PI", + ["VMSUB231PS", "VMSUB231PD", "", ""], + "???", + ["VMSUB213PS", "VMSUB213PD", "", ""], + "???", + ["VMSUB132PS", "VMSUB132PD", "", ""], + "???", + "???", + "???", + ["VMADDN231PS", "VMADDN231PD", "", ""], + "???", + ["VMADDN213PS", "VMADDN213PD", "", ""], + "???", + ["VMADDN132PS", "VMADDN132PD", "", ""], + "???", + "???", + "???", + ["VMSUBR231PS", "VMSUBR231PD", "", ""], + "???", + ["VMSUBR213PS", "VMSUBR213PD", "", ""], + "???", + ["VMSUBR132PS", "VMSUBR132PD", "", ""], + "???", + ["VMSUBR23C1PS", "VMSUBR23C1PD", "", ""], + "???", + ["VMULPS", "VMULPD", "", ""], + "VMULHPI", + "VMULHPU", + "VMULLPI", + "???", + "???", + "VCLAMPZPS", + "VCLAMPZPI", + ["VMAXPS", "VMAXPD", "", ""], + "VMAXPI", + "VMAXPU", + "???", + ["VMINPS", "VMINPD", "", ""], + "VMINPI", + "VMINPU", + "???", + ["???", "VCVT,PD2PS,", "", ""], + ["VCVTPS2PI", "VCVT,PD2PI,", "", ""], + ["VCVTPS2PU", "VCVT,PD2PU,", "", ""], + "???", + ["???", "VCVT,PS2PD,", "", ""], + ["VCVTPI2PS", "VCVT,PI2PD,", "", ""], + ["VCVTPU2PS", "VCVT,PU2PD,", "", ""], + "???", + "VROUNDPS", + "???", + "VCVTINSPS2U10", + "VCVTINSPS2F11", + "???", + "VCVTPS2SRGB8", + "VMAXABSPS", + "???", + "VSLLPI", + "VSRAPI", + "VSRLPI", + "???", + ["VANDNPI", "VANDNPQ", "", ""], + ["VANDPI", "VANDPQ", "", ""], + ["VORPI", "VORPQ", "", ""], + ["VXORPI", "VXORPQ", "", ""], + "VBINTINTERLEAVE11PI", + "VBINTINTERLEAVE21PI", + "???", + "???", + "???", + "???", + "???", + "???", + "VEXP2LUTPS", + "VLOG2LUTPS", + "VRSQRTLUTPS", + "???", + "VGETEXPPS", + "???", + "???", + "???", + "VSCALEPS", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VRCPRESPS", + "???", + "VRCPREFINEPS", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VFIXUPPS", + "VSHUF128X32", + "VINSERTFIELDPI", + "VROTATEFIELDPI", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------- L1OM Mask, Mem, and bit opcodes. -------------------------------------------------------------------------------------------------------------------------*/ - ["???","BSFI"],["???","BSFI"],["???","BSFI"],["???","BSFI"], - ["???","BSRI"],["???","BSRI"],["???","BSRI"],["???","BSRI"], - ["???","BSFF"],["???","BSFF"],["???","BSFF"],["???","BSFF"], - ["???","BSRF"],["???","BSRF"],["???","BSRF"],["???","BSRF"], - ["???","BITINTERLEAVE11"],["???","BITINTERLEAVE11"],["???","BITINTERLEAVE11"],["???","BITINTERLEAVE11"], - ["???","BITINTERLEAVE21"],["???","BITINTERLEAVE21"],["???","BITINTERLEAVE21"],["???","BITINTERLEAVE21"], - ["???","INSERTFIELD"],["???","INSERTFIELD"],["???","INSERTFIELD"],["???","INSERTFIELD"], - ["???","ROTATEFIELD"],["???","ROTATEFIELD"],["???","ROTATEFIELD"],["???","ROTATEFIELD"], - ["???","COUNTBITS"],["???","COUNTBITS"],["???","COUNTBITS"],["???","COUNTBITS"], - ["???","QUADMASK16"],["???","QUADMASK16"],["???","QUADMASK16"],["???","QUADMASK16"], - "???","???","???","???", - "VKMOVLHB", - [["CLEVICT1","CLEVICT2","LDVXCSR","STVXCSR","???","???","???","???"],"???"], - [["VPREFETCH1","VPREFETCH2","???","???","???","???","???","???"],"???"], - [["VPREFETCH1","VPREFETCH2","???","???","???","???","???","???"],"???"], - "VKMOV","VKMOV","VKMOV","VKMOV", - "VKNOT","VKANDNR","VKANDN","VKAND", - "VKXNOR","VKXOR","VKORTEST","VKOR", - "???","VKSWAPB", - ["???",["DELAY","SPFLT","???","???","???","???","???","???"]], - ["???",["DELAY","SPFLT","???","???","???","???","???","???"]] + ["???", "BSFI"], + ["???", "BSFI"], + ["???", "BSFI"], + ["???", "BSFI"], + ["???", "BSRI"], + ["???", "BSRI"], + ["???", "BSRI"], + ["???", "BSRI"], + ["???", "BSFF"], + ["???", "BSFF"], + ["???", "BSFF"], + ["???", "BSFF"], + ["???", "BSRF"], + ["???", "BSRF"], + ["???", "BSRF"], + ["???", "BSRF"], + ["???", "BITINTERLEAVE11"], + ["???", "BITINTERLEAVE11"], + ["???", "BITINTERLEAVE11"], + ["???", "BITINTERLEAVE11"], + ["???", "BITINTERLEAVE21"], + ["???", "BITINTERLEAVE21"], + ["???", "BITINTERLEAVE21"], + ["???", "BITINTERLEAVE21"], + ["???", "INSERTFIELD"], + ["???", "INSERTFIELD"], + ["???", "INSERTFIELD"], + ["???", "INSERTFIELD"], + ["???", "ROTATEFIELD"], + ["???", "ROTATEFIELD"], + ["???", "ROTATEFIELD"], + ["???", "ROTATEFIELD"], + ["???", "COUNTBITS"], + ["???", "COUNTBITS"], + ["???", "COUNTBITS"], + ["???", "COUNTBITS"], + ["???", "QUADMASK16"], + ["???", "QUADMASK16"], + ["???", "QUADMASK16"], + ["???", "QUADMASK16"], + "???", + "???", + "???", + "???", + "VKMOVLHB", + [["CLEVICT1", "CLEVICT2", "LDVXCSR", "STVXCSR", "???", "???", "???", "???"], "???"], + [["VPREFETCH1", "VPREFETCH2", "???", "???", "???", "???", "???", "???"], "???"], + [["VPREFETCH1", "VPREFETCH2", "???", "???", "???", "???", "???", "???"], "???"], + "VKMOV", + "VKMOV", + "VKMOV", + "VKMOV", + "VKNOT", + "VKANDNR", + "VKANDN", + "VKAND", + "VKXNOR", + "VKXOR", + "VKORTEST", + "VKOR", + "???", + "VKSWAPB", + ["???", ["DELAY", "SPFLT", "???", "???", "???", "???", "???", "???"]], + ["???", ["DELAY", "SPFLT", "???", "???", "???", "???", "???", "???"]] ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -1334,1123 +2853,2900 @@ Used by function ^DecodeOpcode()^ after ^DecodePrefixAdjustments()^. -------------------------------------------------------------------------------------------------------------------------*/ const Operands = [ - //------------------------------------------------------------------------------------------------------------------------ - //First Byte operations. - //------------------------------------------------------------------------------------------------------------------------ - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A00","070E0B0E","0A000600","0B0E070E","16000C00","170E0DE6","","", - "03060003","03060003","03060003","03060003","03060003","03060003","03060003","03060003", - "03060003","03060003","03060003","03060003","03060003","03060003","03060003","03060003", - "030A","030A","030A","030A","030A","030A","030A","030A", - "030A","030A","030A","030A","030A","030A","030A","030A", - ["","",""],["","",""], - ["0A020606","0A010604",""], - "0B0E0704", - "","","","", - "0DE6","0B0E070E0DE6", - "0DA1","0B0E070E0DE1", - "22001A01","230E1A01","1A012000","1A01210E", - "10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C", - "10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C", - ["06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C00"], - ["070E0DE60003","070E0DE60003","070E0DE60003","070E0DE60003","070E0DE60003","070E0DE60003","070E0DE60003","070E0DE6"], - ["06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C00"], - ["070E0DE10003","070E0DE10003","070E0DE10003","070E0DE10003","070E0DE10003","070E0DE10003","070E0DE10003","070E0DE1"], - "06000A00","070E0B0E", - "0A0006000003","0B0E070E0003", - "06000A000001","070E0B0E0001", - "0A0006000001","0B0E070E0001", - "06020A080001", - ["0B0E0601",""], - "0A0806020001", - ["070A","","","","","","",""], - [["","","",""],["","","",""],["","","",""],["","","",""]], - "170E030E0003","170E030E0003","170E030E0003","170E030E0003","170E030E0003","170E030E0003","170E030E0003", - ["","",""],["","",""], - "0D060C01", //CALL Ap (w:z). - "", - ["","",""],["","",""], - "","", - "160004000001","170E050E0001", - "040016000001","050E170E0001", - "22002000","230E210E", - "22002000","230E210E", - "16000C00","170E0DE6", - "22001600","230E170E","16002000","170E210E","16002200","170E230E", - "02000C000001","02000C000001","02000C000001","02000C000001","02000C000001","02000C000001","02000C000001","02000C000001", - "030E0D0E0001","030E0D0E0001","030E0D0E0001","030E0D0E0001","030E0D0E0001","030E0D0E0001","030E0D0E0001","030E0D0E0001", - ["06000C00","06000C00","06000C00","06000C00","06000C00","06000C00","06000C00","06000C00"], - ["070E0C00","070E0C00","070E0C00","070E0C00","070E0C00","070E0C00","070E0C00","070E0C00"], - "0C010008","0008", - "0B060906","0B060906", - [ - "06000C000001","","","","","","", - ["0C00","0C00","0C00","0C00","0C00","0C00","0C00","0C00"] - ], - [ - "070E0D060001","","","","","","", - ["1002","1002","1002","1002","1002","1002","1002","1002"] - ], - "0C010C00","", - "0C01","","2C00", - "0C00","", - ["","",""], - ["06002A00","06002A00","06002A00","06002A00","06002A00","06002A00","06002A00","06002A00"], - ["070E2A00","070E2A00","070E2A00","070E2A00","070E2A00","070E2A00","070E2A00","070E2A00"], - ["06001800","06001800","06001800","06001800","06001800","06001800","06001800","06001800"], - ["070E1800","070E1800","070E1800","070E1800","070E1800","070E1800","070E1800","070E1800"], - "0C00","0C00","", - "1E00", - /*------------------------------------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------------------------------------ + //First Byte operations. + //------------------------------------------------------------------------------------------------------------------------ + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A00", + "070E0B0E", + "0A000600", + "0B0E070E", + "16000C00", + "170E0DE6", + "", + "", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + ["", "", ""], + ["", "", ""], + ["0A020606", "0A010604", ""], + "0B0E0704", + "", + "", + "", + "", + "0DE6", + "0B0E070E0DE6", + "0DA1", + "0B0E070E0DE1", + "22001A01", + "230E1A01", + "1A012000", + "1A01210E", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + [ + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C00" + ], + [ + "070E0DE60003", + "070E0DE60003", + "070E0DE60003", + "070E0DE60003", + "070E0DE60003", + "070E0DE60003", + "070E0DE60003", + "070E0DE6" + ], + [ + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C00" + ], + [ + "070E0DE10003", + "070E0DE10003", + "070E0DE10003", + "070E0DE10003", + "070E0DE10003", + "070E0DE10003", + "070E0DE10003", + "070E0DE1" + ], + "06000A00", + "070E0B0E", + "0A0006000003", + "0B0E070E0003", + "06000A000001", + "070E0B0E0001", + "0A0006000001", + "0B0E070E0001", + "06020A080001", + ["0B0E0601", ""], + "0A0806020001", + ["070A", "", "", "", "", "", "", ""], + [ + ["", "", "", ""], + ["", "", "", ""], + ["", "", "", ""], + ["", "", "", ""] + ], + "170E030E0003", + "170E030E0003", + "170E030E0003", + "170E030E0003", + "170E030E0003", + "170E030E0003", + "170E030E0003", + ["", "", ""], + ["", "", ""], + "0D060C01", //CALL Ap (w:z). + "", + ["", "", ""], + ["", "", ""], + "", + "", + "160004000001", + "170E050E0001", + "040016000001", + "050E170E0001", + "22002000", + "230E210E", + "22002000", + "230E210E", + "16000C00", + "170E0DE6", + "22001600", + "230E170E", + "16002000", + "170E210E", + "16002200", + "170E230E", + "02000C000001", + "02000C000001", + "02000C000001", + "02000C000001", + "02000C000001", + "02000C000001", + "02000C000001", + "02000C000001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + ["06000C00", "06000C00", "06000C00", "06000C00", "06000C00", "06000C00", "06000C00", "06000C00"], + ["070E0C00", "070E0C00", "070E0C00", "070E0C00", "070E0C00", "070E0C00", "070E0C00", "070E0C00"], + "0C010008", + "0008", + "0B060906", + "0B060906", + ["06000C000001", "", "", "", "", "", "", ["0C00", "0C00", "0C00", "0C00", "0C00", "0C00", "0C00", "0C00"]], + ["070E0D060001", "", "", "", "", "", "", ["1002", "1002", "1002", "1002", "1002", "1002", "1002", "1002"]], + "0C010C00", + "", + "0C01", + "", + "2C00", + "0C00", + "", + ["", "", ""], + ["06002A00", "06002A00", "06002A00", "06002A00", "06002A00", "06002A00", "06002A00", "06002A00"], + ["070E2A00", "070E2A00", "070E2A00", "070E2A00", "070E2A00", "070E2A00", "070E2A00", "070E2A00"], + ["06001800", "06001800", "06001800", "06001800", "06001800", "06001800", "06001800", "06001800"], + ["070E1800", "070E1800", "070E1800", "070E1800", "070E1800", "070E1800", "070E1800", "070E1800"], + "0C00", + "0C00", + "", + "1E00", + /*------------------------------------------------------------------------------------------------------------------------ X87 FPU. ------------------------------------------------------------------------------------------------------------------------*/ - [ - ["0604","0604","0604","0604","0604","0604","0604","0604"], - ["24080609","24080609","0609","0609","24080609","24080609","24080609","24080609"] - ], - [ - ["0604","","0604","0604","0601","0602","0601","0602"], [ - "0609","0609", - ["","","","","","","",""], - "0609", - ["","","","","","","",""], - ["","","","","","","",""], - ["","","","","","","",""], - ["","","","","","","",""] - ] - ], - [ - ["0604","0604","0604","0604","0604","0604","0604","0604"], + ["0604", "0604", "0604", "0604", "0604", "0604", "0604", "0604"], + ["24080609", "24080609", "0609", "0609", "24080609", "24080609", "24080609", "24080609"] + ], [ - "24080609","24080609","24080609","24080609","", - ["","","","","","","",""],"","" - ] - ], - [ - ["0604","0604","0604","0604","","0607","","0607",""], + ["0604", "", "0604", "0604", "0601", "0602", "0601", "0602"], + [ + "0609", + "0609", + ["", "", "", "", "", "", "", ""], + "0609", + ["", "", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""] + ] + ], [ - "24080609","24080609","24080609","24080609", - ["","","","","","","",""], - "24080609","24080609","" - ] - ], - [ - ["0606","0606","0606","0606","0606","0606","0606","0606"], - ["06092408","06092408","0609","0609","06092408","06092408","06092408","06092408"] - ], - [ - ["0606","0606","0606","0606","0606","","0601","0602"], - ["0609","0609","0609","0609","0609","0609","",""] - ], - [ - ["0602","0602","0602","0602","0602","0602","0602","0602"], + ["0604", "0604", "0604", "0604", "0604", "0604", "0604", "0604"], + ["24080609", "24080609", "24080609", "24080609", "", ["", "", "", "", "", "", "", ""], "", ""] + ], [ - "06092408","06092408","0609", - ["","","","","","","",""], - "06092408","06092408","06092408","06092408" - ] - ], - [ - ["0602","0602","0602","0602","0607","0606","0607","0606"], + ["0604", "0604", "0604", "0604", "", "0607", "", "0607", ""], + ["24080609", "24080609", "24080609", "24080609", ["", "", "", "", "", "", "", ""], "24080609", "24080609", ""] + ], [ - "0609","0609","0609","0609", - ["1601","","","","","","",""], - "24080609","24080609", - "" - ] - ], - /*------------------------------------------------------------------------------------------------------------------------ + ["0606", "0606", "0606", "0606", "0606", "0606", "0606", "0606"], + ["06092408", "06092408", "0609", "0609", "06092408", "06092408", "06092408", "06092408"] + ], + [ + ["0606", "0606", "0606", "0606", "0606", "", "0601", "0602"], + ["0609", "0609", "0609", "0609", "0609", "0609", "", ""] + ], + [ + ["0602", "0602", "0602", "0602", "0602", "0602", "0602", "0602"], + [ + "06092408", + "06092408", + "0609", + ["", "", "", "", "", "", "", ""], + "06092408", + "06092408", + "06092408", + "06092408" + ] + ], + [ + ["0602", "0602", "0602", "0602", "0607", "0606", "0607", "0606"], + ["0609", "0609", "0609", "0609", ["1601", "", "", "", "", "", "", ""], "24080609", "24080609", ""] + ], + /*------------------------------------------------------------------------------------------------------------------------ End of X87 FPU. ------------------------------------------------------------------------------------------------------------------------*/ - "10000004","10000004","10000004","10000004", - "16000C00","170E0C00","0C001600","0C00170E", - "110E0008", - "110E0008", - "0D060C01", //JMP Ap (w:z). - "100000040004", - "16001A01","170E1A01", - "1A011600","1A01170E", - "","","","","","", - ["06000C00","","06000003","06000003","16000600","0600","16000600","0600"], - ["070E0D06","","070E0003","070E0003","170E070E","070E","170E070E","170E070E"], - "","","","","","", - ["06000003","06000003","","","","","",""], - [ - ["070E0003","070E0003","070A0004","090E0008","070A0008","090E0008","070A",""], - ["070E0003","070E0003","070A0008","","070A0008","","070A",""] - ], - /*------------------------------------------------------------------------------------------------------------------------ + "10000004", + "10000004", + "10000004", + "10000004", + "16000C00", + "170E0C00", + "0C001600", + "0C00170E", + "110E0008", + "110E0008", + "0D060C01", //JMP Ap (w:z). + "100000040004", + "16001A01", + "170E1A01", + "1A011600", + "1A01170E", + "", + "", + "", + "", + "", + "", + ["06000C00", "", "06000003", "06000003", "16000600", "0600", "16000600", "0600"], + ["070E0D06", "", "070E0003", "070E0003", "170E070E", "070E", "170E070E", "170E070E"], + "", + "", + "", + "", + "", + "", + ["06000003", "06000003", "", "", "", "", "", ""], + [ + ["070E0003", "070E0003", "070A0004", "090E0008", "070A0008", "090E0008", "070A", ""], + ["070E0003", "070E0003", "070A0008", "", "070A0008", "", "070A", ""] + ], + /*------------------------------------------------------------------------------------------------------------------------ Two Byte operations. ------------------------------------------------------------------------------------------------------------------------*/ - [ - ["0602","0602","0602","0602","0602","0602","070E",""], - ["070E","070E","0601","0601","0601","0601","070E",""] - ], - [ - ["0908","0908","0908","0908","0602","","0602","0601"], [ - ["","","","","","","",""], - ["170819081B08","17081908","","","","","",""], - ["","","","","","","",""], - ["1708","","1708","1708","","","1602","17081802"], - "070E","","0601", - ["","","170819081B08","170819081B08","","","",""] - ] - ], - ["0B0E0612","0B0E070E"],["0B0E0612","0B0E070E"],"", - "","","","", - "","","","", - [["0601","0601","","","","","",""],""], - "", - "0A0A06A9", //3DNow takes ModR/M, IMM8. - [ - ["0B700770","0B700770","0A040603","0A040609"], - ["0B700770","0B700770","0A0412040604","0A0412040604"] - ], - [ - ["07700B70","07700B70","06030A04","06090A04"], - ["07700B70","07700B70","060412040A04","060412040A04"] - ], - [ - ["0A0412040606","0A0412040606","0B700770","0B700768"], - ["0A0412040604","","0B700770","0B700770"] - ], - [["06060A04","06060A04","",""],""], - ["0B70137007700140","0B70137007700140","",""], - ["0B70137007700140","0B70137007700140","",""], - [["0A0412040606","0A0412040606","0B700770",""],["0A0412040604","","0B700770",""]], - [["06060A04","06060A04","",""],""], - [["0601","0601","0601","0601","","","",""],""], - "", - [[["0A0B07080180","","",""],["0A0B07100180","","",""],["0A0B07080180","","",""],["0A0B07080180","","",""]], - ["",["0A0B060B","","",""],["0A0B07080180","","",""],["0A0B07080180","","",""]]], - [[["07080A0B0180","","",""],["07100A0B0180","","",""],["0A0B07080180","","",""],["0A0B07080180","","",""]], - ["",["0A0B060B","","",""],"",["0A0B07080180","","",""]]], - "","","", - "070E", - ["","07080A0C0001"],["","07080A0D0001"], - ["","0A0C07080001"],["","0A0D07080001"], - ["","07080A0E0001"],"", - ["","0A0E07080001"],"", - [ - ["0A040648","0B300730","0B700770","0A06066C0130"], - ["0A040648","0B300730","0B700770","0A06066C0130"], - "","" - ], - [ - [ - ["06480A04","07300B30","07700B70","066C0A060130"], - ["06480A04","07300B30","07700B70","066C0A060130"], - ["","","",["066C0A060138","066C0A060138","066C0A060138"]], - ["","","",["066C0A060138","066C0A060138","066C0A060138"]] + ["0602", "0602", "0602", "0602", "0602", "0602", "070E", ""], + ["070E", "070E", "0601", "0601", "0601", "0601", "070E", ""] ], [ - ["06480A04","07300B30","07700B70","066C0A06"], - ["06480A04","07300B30","07700B70","066C0A06"], - "","" - ] - ], - [ - ["0A0406A9","","",""],["0A0406A9","","",""], //Not Allowed to be Vector encoded. - "0A041204070C010A","0A041204070C010A" - ], - [ + ["0908", "0908", "0908", "0908", "0602", "", "0602", "0601"], + [ + ["", "", "", "", "", "", "", ""], + ["170819081B08", "17081908", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""], + ["1708", "", "1708", "1708", "", "", "1602", "17081802"], + "070E", + "", + "0601", + ["", "", "170819081B08", "170819081B08", "", "", "", ""] + ] + ], + ["0B0E0612", "0B0E070E"], + ["0B0E0612", "0B0E070E"], + "", + "", + "", + "", + "", + "", + "", + "", + "", + [["0601", "0601", "", "", "", "", "", ""], ""], + "", + "0A0A06A9", //3DNow takes ModR/M, IMM8. [ - "07700B70","07700B70", - ["06030A04","","",""],["06060A04","","",""] //SSE4a can not be vector encoded. - ],"" - ], - [ - ["0A0A0649","","",""],["0A0A0648","","",""], //Not allowed to be Vector encoded. - "0B0C06430109","0B0C06490109" - ], - [ - ["0A0A0649","","",""],["0A0A0648","","",""], //Not allowed to be vector encoded. - "0B0C0643010A","0B0C0649010A" - ], - ["0A0406430101","0A0406490101","",""], - ["0A0406430101","0A0406490101","",""], - "","","","", - "","","", - "", - "",//Three byte opcodes 0F38 - "", - "",//Three byte opcodes 0F3A - "","","","","", - "0B0E070E", - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [["0B0E070E0180","0A0F06FF","",""],"","",""], - [ - ["0B0E070E0180",["0A0F06FF","","0A0F06FF"],"",""], - ["0B0E070E0180",["0A0F06FF","","0A0F06FF"],"",""],"","" - ], - [ - ["0A02070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0A02070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [["0B0E070E0180","0A0F06FF","",""],"","",""], - [["0B0E070E0180","0A0F06FF","",""],"","",""], - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","",""],"",""],"","" - ], - "0B0E070E","0B0E070E","0B0E070E","0B0E070E", - ["",[["0B0C0648","0B0C0730","",""],["0B0C0648","0B0C0730","",""],"",""]], - ["0B7007700142","0B7007700142","0A04120406430102","0A04120406490102"], - [ - ["0A040648","0A040648","",""],"", - ["0A040643","0A0412040643","",""],"" - ], - [ - ["0A040648","0A040648","",""],"", - ["0A040643","0A0412040643","",""],"" - ], - ["0B70137007700140","0B70137007700140","",""], - ["0B70137007700140","0B70137007700140","",""], - ["0B70137007700140","0B70137007700140","",""], - ["0B70137007700140","0B70137007700140","",""], - [ - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - "0A04120406430102","0A04120406460102" - ], - [ - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - "0A04120406430102","0A04120406460102" - ], - [ - ["0A040648","0B300718","0B7007380151","0A06065A0171"], - ["0A040648","0B180730","0B3807700152","0A05066C0152"], - "0A04120406430101","0A04120406460102" - ], - [["0B7007700142","","0B380770014A"],["0B700770014A","",""],"0B7007700141",""], - [ - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - "0A04120406430102","0A04120406460102" - ], - ["0B70137007700141","0B70137007700141","0A04120406430101","0A04120406460101"], - ["0B70137007700142","0B70137007700142","0A04120406430102","0A04120406460102"], - ["0B70137007700141","0B70137007700141","0A04120406430101","0A04120406460101"], - [["0A0A06A3","","",""],"0B70137007700108","",""], - [["0A0A06A3","","",""],"0B70137007700108","",""], - [["0A0A06A3","","",""],"0B701370077001400108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","0A0F137007700108",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","0A0F137007700108",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0A0F137007700148","",""],["0A0F1206066C0148","",""]],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0B70137007700148","",""],"",""], - [["0A0A06A9","","",""],["0B70137007700148","",""],"",""], - ["","0B70137007700140","",""], - ["","0B70137007700140","",""], - [["0A0A070C","","",""],["0A04070C0108","","0A04070C0108"],"",""], - [ - [ - ["0A0A06A9","", "",""], - ["0B700770","0B700770",["0B7007700108","","0B700770"],["0A06066C0128","","0A06066C0120"]], - ["0A040710","0B700770",["0B700770","","0B7007700108"],""], - ["","",["0B7007700108","","0B700770"],""] + ["0B700770", "0B700770", "0A040603", "0A040609"], + ["0B700770", "0B700770", "0A0412040604", "0A0412040604"] ], [ - ["0A0A06A9","", "",""], - ["0B700770","0B700770",["0B7007700108","","0B700770"],["0A06066C0148","","0A06066C0140"]], - ["0A040710","0B700770",["0B700770","","0B7007700108"],""], - ["","",["0B7007700108","","0B700770"],""] - ] - ], - [ - ["0A0A06A90C00","","",""], - ["0A0406480C00","0B3007300C00",["0B7007700C000108","",""],["0A06066C0C000108","",""]], - "0B7007700C000108", - "0B7007700C000108" - ], - [ - "", - [ - "","", - [["060A0C00","","",""],"137007700C000108","",""],"", - [["060A0C00","","",""],"137007700C000108","",""],"", - [["060A0C00","","",""],"137007700C000108","",""],"" - ] - ], - [ - ["",["","",["137007700C000148","","137007700C000140"],""],"",""], - ["",["","",["137007700C000148","","137007700C000140"],""],"",""], - [["060A0C00","","",""],["06480C00","133007300C00",["137007700C000148","",""],["1206066C0C000148","",""]],"",""], - "", - [["060A0C00","","",""],["06480C00","133007300C00",["137007700C000148","","137007700C000140"],["1206066C0C000148","",""]],"",""], - "", - [["060A0C00","","",""],["06480C00","133007300C00",["137007700C000148","",""],["1206066C0C000148","",""]],"",""], - "" - ], - [ - "", - [ - "","", - [["137007700C00","137007700C00","",""],"137007700C000140","",""],["","137007700C000108","",""], - "","", - [["137007700C00","137007700C00","",""],"137007100C000140","",""],["","137007700C000108","",""] - ] - ], - [["0A0A06A9","","",""],["0A040710","13300B300730","0A0F137007700108",""],"",""], - [["0A0A06A9","","",""],["0A040710","13300B300730","0A0F137007700108",""],"",""], - [["0A0A06A9","","",""],["0A040710","13300B300730",["0A0F137007700148","",""],["0A0F1206066C0148","",""]],"",""], - [["",["","",""],"",""],"","",""], - [ - ["07080B080180","",["0B7007700141","","0B3807700149"],""], - ["064F0C000C00","",["0B7007380149","","0B7007700141"],""], - ["","","0B0C06440109",""], - ["0A04064F0C000C00","","0B0C06460109",""] - ], - [ - ["0B0807080180","",["0B7007700142","","0B380770014A"],""], - ["0A04064F","",["0B700738014A","","0B7007700142"],""], - ["","","0B0C0644010A",""], - ["0A04064F","","0B0C0646010A",""] - ], - [ - "", - ["","",["0B7007380149","","0B7007700141"],""], - ["","",["0B7007380142","","0B700770014A"],"0A06065A0170"], - ["","",["0B700770014A","","0B3807700142"],""] - ], - [ - "", - ["","",["0B700738014A","","0B7007700142"],""], - ["","","0A041204070C010A",""], - ["","","0A041204070C010A",""] - ], - [ - "",["0A040604","0B7013700770","",""], - "",["0A040604","0B7013700770","",""] - ], - [ - "",["0A040604","0B7013700770","",""], - "",["0A040604","0B7013700770","",""] - ], - [["070C0A0A","","",""],["06240A040108","","06360A040108"],["0A040646","0A040646",["","","0A0406460108"],""],""], - [ - ["06A90A0A","","",""], - ["06480A04","07300B30",["07700B700108","","07700B70"],["066C0A060128","","066C0A060120"]], - ["06480A04","07300B30",["07700B70","","07700B700108"],""], - ["","",["07700B700108","","07700B70"],""] - ], - "1106000C","1106000C","1106000C","1106000C", - [["1106000C","120F1002","",""],"","",""],[["1106000C","120F1002","",""],"","",""], - "1106000C","1106000C","1106000C","1106000C","1106000C","1106000C","1106000C","1106000C","1106000C","1106000C", - [ - ["0600",["0A0F06F2","","0A0F06F6"],"",""], - ["0600",["0A0F06F0","","0A0F06F4"],"",""],"","" - ], - [ - ["0600",["06120A0F","","06360A0F"],"",""], - ["0600",["06000A0F","","06240A0F"],"",""],"","" - ], - [ - ["0600",["0A0F062F","",""],"",""], - ["0600",["0A0F062F","",""],"",""],"", - ["0600",["0A0F062F","","0A0F063F"],"",""] - ], - [ - ["0600",["062F0A0F","",""],"",""], - ["0600",["062F0A0F","",""],"",""],"", - ["0600",["062F0A0F","","063F0A0F"],"",""] - ], - "0600",[["0600","0A03120F06FF","",""],"","",""], - "0600",[["0600","0A03120F06FF","",""],"","",""], - [ - ["0600",["0A0F06FF","","0A0F06FF"],"",""], - ["0600",["0A0F06FF","","0A0F06FF"],"",""],"","" - ], - [ - ["0600",["0A0F06FF","","0A0F06FF"],"",""], - ["0600",["0A0F06FF","","0A0F06FF"],"",""],"","" - ], - "0600","0600","0600","0600","0600","0600", - "2608","2608", - "", - "070E0B0E0003", - "070E0B0E0C00","070E0B0E1800", - "0B0E070E","070E0B0E", - "2808","2808", - "", - "070E0B0E0003", - "070E0B0E0C00","070E0B0E1800", - [ - [ - ["0601","","0601"],["0601","","0601"], - "0603","0603", - ["0601","","0601"],["0601","","0601"], - ["0601","0601","0601"], - ["0601","0601",""] + ["07700B70", "07700B70", "06030A04", "06090A04"], + ["07700B70", "07700B70", "060412040A04", "060412040A04"] ], [ - ["","",["0602","","",""],""],["","",["0602","","",""],""], - ["","",["0602","","",""],""],["","",["0602","","",""],""], - "", - ["","","","","","","",""], - ["","","","","","","",""], - ["","","","","","","",""] - ] - ], - "0B0E070E", - "06000A000003","070E0B0E0003", - ["0B0E090E",""], - "070E0B0E0003", - ["0B0E090E",""], - ["0B0E090E",""], - "0B0E0600","0B0E0602", - [ - ["1002","","",""],"", - ["0B060706","0A020602","",""],"" - ],"", - ["","","","","070E0C000003","070E0C000003","070E0C000003","070E0C000003"], - "0B0E070E0003", - [ - ["0B0E070E0180","","",""],"", - ["0B0E070E0180","0A020602","",""],["0B0E070E0180","0A020602","",""] - ], - [ - ["0B0E070E0180","","",""],"", - ["0B0E070E0180","0A020602","",""],["0B0E070E0180","","",""] - ], - "0B0E0600","0B0E0602", - "06000A000003","070E0B0E0003", - [ - ["0A0406480C00","0B30133007300C00","0A0F137007700C000151","0A0F066C0C000151"], - ["0A0406480C00","0B30133007300C00","0A0F137007700C000151","0A0F066C0C000151"], - ["0A0406440C00","0A04120406480C00","0A0F120406440C000151",""], - ["0A0406490C00","0A04120406480C00","0A0F120406460C000151",""] - ], - ["06030A02",""], - [["0A0A06220C00","","",""],"0A04120406220C000108","",""], - ["",[["06020A0A0C00","","",""],"06020A040C000108","",""]], - ["0B70137007700C000140","0B70137007700C000140","",""], - [ + ["0A0412040606", "0A0412040606", "0B700770", "0B700768"], + ["0A0412040604", "", "0B700770", "0B700770"] + ], + [["06060A04", "06060A04", "", ""], ""], + ["0B70137007700140", "0B70137007700140", "", ""], + ["0B70137007700140", "0B70137007700140", "", ""], [ - "", - ["06060003","","060B0003"], - "", - ["0601","","0601"], - ["0601","","0601"], - ["0601","","0601"], - ["0606","0606","0606",""],["0606","","",""] + ["0A0412040606", "0A0412040606", "0B700770", ""], + ["0A0412040604", "", "0B700770", ""] + ], + [["06060A04", "06060A04", "", ""], ""], + [["0601", "0601", "0601", "0601", "", "", "", ""], ""], + "", + [ + [ + ["0A0B07080180", "", "", ""], + ["0A0B07100180", "", "", ""], + ["0A0B07080180", "", "", ""], + ["0A0B07080180", "", "", ""] + ], + ["", ["0A0B060B", "", "", ""], ["0A0B07080180", "", "", ""], ["0A0B07080180", "", "", ""]] ], [ - "", - ["","","","","","","",""], - "","","","", - "070E","070E" - ] - ], - "030E","030E","030E","030E","030E","030E","030E","030E", - ["",["0A040648","0B3013300730","",""],"",["0A040648","0B3013300730","",""]], - [["0A0A06A9","","",""],"0B70137006480108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300648",["0B70137006480108","",""],""],"",""], - [["0A0A06A9","","",""],"0B70137006480100","",""], - [["0A0A06A9","","",""],"0B70137007700140","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [ - ["","06490A040100","",""], - ["","06490A040100",["0A040649","","",""],["0A040649","","",""]] - ], - ["",[["0B0C06A0","","",""],["0B0C0640","0B0C0730","",""],"",""]], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","","0A061206066C0140"]],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","","0A061206066C0140"]],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [ - [["0A0A06A9","","",""],["0A040648","0B3013300648","0B70137006480108",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","0B70137006480108",""],"",""] - ], - [["0A0A06A9","","",""],["0A040648","0B3013300648",["0B70137006480108","","0B7013700648"],""],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [ + [ + ["07080A0B0180", "", "", ""], + ["07100A0B0180", "", "", ""], + ["0A0B07080180", "", "", ""], + ["0A0B07080180", "", "", ""] + ], + ["", ["0A0B060B", "", "", ""], "", ["0A0B07080180", "", "", ""]] + ], "", - ["0A040648","0A040730","0B3807700141",""], - ["0A040649","0B300738",["0A0406480140","0B7007380140","0B700770014A"],"0A06065A0170"], - "0B3807700142" - ], - [[["06090A0A","","",""],["07700B700108","",""],"",""],""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","","0A061206066C0140"]],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","","0A061206066C0140"]],"",""], - [["","","",["0A040648","0A040730","",""]],"0000"], - [["0A0A06A9","","",""],"0B70137006480108","",""], - [["0A0A06A9","","",""],["0B70137006480108","",""],"",""], - [["0A0A06A9","","",""],"0B7013700648","",""], - [["0A0A06A9","","",""],"0B70137007700140","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - ["",[["0A0A060A","","",""],["0B040648","0B040648","",""],"",""]], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","",""],["0A061206066C0148","",""]],"",""], - [["0A0A06A9","","",""],"0B70137007700140","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","",""],["0A061206066C0148","",""]],"",""], - "", - /*------------------------------------------------------------------------------------------------------------------------ + "", + "", + "070E", + ["", "07080A0C0001"], + ["", "07080A0D0001"], + ["", "0A0C07080001"], + ["", "0A0D07080001"], + ["", "07080A0E0001"], + "", + ["", "0A0E07080001"], + "", + [ + ["0A040648", "0B300730", "0B700770", "0A06066C0130"], + ["0A040648", "0B300730", "0B700770", "0A06066C0130"], + "", + "" + ], + [ + [ + ["06480A04", "07300B30", "07700B70", "066C0A060130"], + ["06480A04", "07300B30", "07700B70", "066C0A060130"], + ["", "", "", ["066C0A060138", "066C0A060138", "066C0A060138"]], + ["", "", "", ["066C0A060138", "066C0A060138", "066C0A060138"]] + ], + [["06480A04", "07300B30", "07700B70", "066C0A06"], ["06480A04", "07300B30", "07700B70", "066C0A06"], "", ""] + ], + [ + ["0A0406A9", "", "", ""], + ["0A0406A9", "", "", ""], //Not Allowed to be Vector encoded. + "0A041204070C010A", + "0A041204070C010A" + ], + [ + [ + "07700B70", + "07700B70", + ["06030A04", "", "", ""], + ["06060A04", "", "", ""] //SSE4a can not be vector encoded. + ], + "" + ], + [ + ["0A0A0649", "", "", ""], + ["0A0A0648", "", "", ""], //Not allowed to be Vector encoded. + "0B0C06430109", + "0B0C06490109" + ], + [ + ["0A0A0649", "", "", ""], + ["0A0A0648", "", "", ""], //Not allowed to be vector encoded. + "0B0C0643010A", + "0B0C0649010A" + ], + ["0A0406430101", "0A0406490101", "", ""], + ["0A0406430101", "0A0406490101", "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + "", //Three byte opcodes 0F38 + "", + "", //Three byte opcodes 0F3A + "", + "", + "", + "", + "", + "0B0E070E", + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "" + ], + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "" + ], + [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""], + [ + ["0B0E070E0180", ["0A0F06FF", "", "0A0F06FF"], "", ""], + ["0B0E070E0180", ["0A0F06FF", "", "0A0F06FF"], "", ""], + "", + "" + ], + [ + ["0A02070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0A02070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "" + ], + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "" + ], + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "" + ], + [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""], + [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""], + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "" + ], + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", ""], "", ""], + "", + "" + ], + "0B0E070E", + "0B0E070E", + "0B0E070E", + "0B0E070E", + ["", [["0B0C0648", "0B0C0730", "", ""], ["0B0C0648", "0B0C0730", "", ""], "", ""]], + ["0B7007700142", "0B7007700142", "0A04120406430102", "0A04120406490102"], + [["0A040648", "0A040648", "", ""], "", ["0A040643", "0A0412040643", "", ""], ""], + [["0A040648", "0A040648", "", ""], "", ["0A040643", "0A0412040643", "", ""], ""], + ["0B70137007700140", "0B70137007700140", "", ""], + ["0B70137007700140", "0B70137007700140", "", ""], + ["0B70137007700140", "0B70137007700140", "", ""], + ["0B70137007700140", "0B70137007700140", "", ""], + [ + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + "0A04120406430102", + "0A04120406460102" + ], + [ + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + "0A04120406430102", + "0A04120406460102" + ], + [ + ["0A040648", "0B300718", "0B7007380151", "0A06065A0171"], + ["0A040648", "0B180730", "0B3807700152", "0A05066C0152"], + "0A04120406430101", + "0A04120406460102" + ], + [["0B7007700142", "", "0B380770014A"], ["0B700770014A", "", ""], "0B7007700141", ""], + [ + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + "0A04120406430102", + "0A04120406460102" + ], + ["0B70137007700141", "0B70137007700141", "0A04120406430101", "0A04120406460101"], + ["0B70137007700142", "0B70137007700142", "0A04120406430102", "0A04120406460102"], + ["0B70137007700141", "0B70137007700141", "0A04120406430101", "0A04120406460101"], + [["0A0A06A3", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A3", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A3", "", "", ""], "0B701370077001400108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "0A0F137007700108", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "0A0F137007700108", ""], "", ""], + [ + ["0A0A06A9", "", "", ""], + ["0A040648", "0B3013300730", ["0A0F137007700148", "", ""], ["0A0F1206066C0148", "", ""]], + "", + "" + ], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], ["0B70137007700148", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0B70137007700148", "", ""], "", ""], + ["", "0B70137007700140", "", ""], + ["", "0B70137007700140", "", ""], + [["0A0A070C", "", "", ""], ["0A04070C0108", "", "0A04070C0108"], "", ""], + [ + [ + ["0A0A06A9", "", "", ""], + ["0B700770", "0B700770", ["0B7007700108", "", "0B700770"], ["0A06066C0128", "", "0A06066C0120"]], + ["0A040710", "0B700770", ["0B700770", "", "0B7007700108"], ""], + ["", "", ["0B7007700108", "", "0B700770"], ""] + ], + [ + ["0A0A06A9", "", "", ""], + ["0B700770", "0B700770", ["0B7007700108", "", "0B700770"], ["0A06066C0148", "", "0A06066C0140"]], + ["0A040710", "0B700770", ["0B700770", "", "0B7007700108"], ""], + ["", "", ["0B7007700108", "", "0B700770"], ""] + ] + ], + [ + ["0A0A06A90C00", "", "", ""], + ["0A0406480C00", "0B3007300C00", ["0B7007700C000108", "", ""], ["0A06066C0C000108", "", ""]], + "0B7007700C000108", + "0B7007700C000108" + ], + [ + "", + [ + "", + "", + [["060A0C00", "", "", ""], "137007700C000108", "", ""], + "", + [["060A0C00", "", "", ""], "137007700C000108", "", ""], + "", + [["060A0C00", "", "", ""], "137007700C000108", "", ""], + "" + ] + ], + [ + ["", ["", "", ["137007700C000148", "", "137007700C000140"], ""], "", ""], + ["", ["", "", ["137007700C000148", "", "137007700C000140"], ""], "", ""], + [ + ["060A0C00", "", "", ""], + ["06480C00", "133007300C00", ["137007700C000148", "", ""], ["1206066C0C000148", "", ""]], + "", + "" + ], + "", + [ + ["060A0C00", "", "", ""], + ["06480C00", "133007300C00", ["137007700C000148", "", "137007700C000140"], ["1206066C0C000148", "", ""]], + "", + "" + ], + "", + [ + ["060A0C00", "", "", ""], + ["06480C00", "133007300C00", ["137007700C000148", "", ""], ["1206066C0C000148", "", ""]], + "", + "" + ], + "" + ], + [ + "", + [ + "", + "", + [["137007700C00", "137007700C00", "", ""], "137007700C000140", "", ""], + ["", "137007700C000108", "", ""], + "", + "", + [["137007700C00", "137007700C00", "", ""], "137007100C000140", "", ""], + ["", "137007700C000108", "", ""] + ] + ], + [["0A0A06A9", "", "", ""], ["0A040710", "13300B300730", "0A0F137007700108", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040710", "13300B300730", "0A0F137007700108", ""], "", ""], + [ + ["0A0A06A9", "", "", ""], + ["0A040710", "13300B300730", ["0A0F137007700148", "", ""], ["0A0F1206066C0148", "", ""]], + "", + "" + ], + [["", ["", "", ""], "", ""], "", "", ""], + [ + ["07080B080180", "", ["0B7007700141", "", "0B3807700149"], ""], + ["064F0C000C00", "", ["0B7007380149", "", "0B7007700141"], ""], + ["", "", "0B0C06440109", ""], + ["0A04064F0C000C00", "", "0B0C06460109", ""] + ], + [ + ["0B0807080180", "", ["0B7007700142", "", "0B380770014A"], ""], + ["0A04064F", "", ["0B700738014A", "", "0B7007700142"], ""], + ["", "", "0B0C0644010A", ""], + ["0A04064F", "", "0B0C0646010A", ""] + ], + [ + "", + ["", "", ["0B7007380149", "", "0B7007700141"], ""], + ["", "", ["0B7007380142", "", "0B700770014A"], "0A06065A0170"], + ["", "", ["0B700770014A", "", "0B3807700142"], ""] + ], + [ + "", + ["", "", ["0B700738014A", "", "0B7007700142"], ""], + ["", "", "0A041204070C010A", ""], + ["", "", "0A041204070C010A", ""] + ], + ["", ["0A040604", "0B7013700770", "", ""], "", ["0A040604", "0B7013700770", "", ""]], + ["", ["0A040604", "0B7013700770", "", ""], "", ["0A040604", "0B7013700770", "", ""]], + [ + ["070C0A0A", "", "", ""], + ["06240A040108", "", "06360A040108"], + ["0A040646", "0A040646", ["", "", "0A0406460108"], ""], + "" + ], + [ + ["06A90A0A", "", "", ""], + ["06480A04", "07300B30", ["07700B700108", "", "07700B70"], ["066C0A060128", "", "066C0A060120"]], + ["06480A04", "07300B30", ["07700B70", "", "07700B700108"], ""], + ["", "", ["07700B700108", "", "07700B70"], ""] + ], + "1106000C", + "1106000C", + "1106000C", + "1106000C", + [["1106000C", "120F1002", "", ""], "", "", ""], + [["1106000C", "120F1002", "", ""], "", "", ""], + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + [["0600", ["0A0F06F2", "", "0A0F06F6"], "", ""], ["0600", ["0A0F06F0", "", "0A0F06F4"], "", ""], "", ""], + [["0600", ["06120A0F", "", "06360A0F"], "", ""], ["0600", ["06000A0F", "", "06240A0F"], "", ""], "", ""], + [ + ["0600", ["0A0F062F", "", ""], "", ""], + ["0600", ["0A0F062F", "", ""], "", ""], + "", + ["0600", ["0A0F062F", "", "0A0F063F"], "", ""] + ], + [ + ["0600", ["062F0A0F", "", ""], "", ""], + ["0600", ["062F0A0F", "", ""], "", ""], + "", + ["0600", ["062F0A0F", "", "063F0A0F"], "", ""] + ], + "0600", + [["0600", "0A03120F06FF", "", ""], "", "", ""], + "0600", + [["0600", "0A03120F06FF", "", ""], "", "", ""], + [["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], ["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], "", ""], + [["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], ["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], "", ""], + "0600", + "0600", + "0600", + "0600", + "0600", + "0600", + "2608", + "2608", + "", + "070E0B0E0003", + "070E0B0E0C00", + "070E0B0E1800", + "0B0E070E", + "070E0B0E", + "2808", + "2808", + "", + "070E0B0E0003", + "070E0B0E0C00", + "070E0B0E1800", + [ + [ + ["0601", "", "0601"], + ["0601", "", "0601"], + "0603", + "0603", + ["0601", "", "0601"], + ["0601", "", "0601"], + ["0601", "0601", "0601"], + ["0601", "0601", ""] + ], + [ + ["", "", ["0602", "", "", ""], ""], + ["", "", ["0602", "", "", ""], ""], + ["", "", ["0602", "", "", ""], ""], + ["", "", ["0602", "", "", ""], ""], + "", + ["", "", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""] + ] + ], + "0B0E070E", + "06000A000003", + "070E0B0E0003", + ["0B0E090E", ""], + "070E0B0E0003", + ["0B0E090E", ""], + ["0B0E090E", ""], + "0B0E0600", + "0B0E0602", + [["1002", "", "", ""], "", ["0B060706", "0A020602", "", ""], ""], + "", + ["", "", "", "", "070E0C000003", "070E0C000003", "070E0C000003", "070E0C000003"], + "0B0E070E0003", + [["0B0E070E0180", "", "", ""], "", ["0B0E070E0180", "0A020602", "", ""], ["0B0E070E0180", "0A020602", "", ""]], + [["0B0E070E0180", "", "", ""], "", ["0B0E070E0180", "0A020602", "", ""], ["0B0E070E0180", "", "", ""]], + "0B0E0600", + "0B0E0602", + "06000A000003", + "070E0B0E0003", + [ + ["0A0406480C00", "0B30133007300C00", "0A0F137007700C000151", "0A0F066C0C000151"], + ["0A0406480C00", "0B30133007300C00", "0A0F137007700C000151", "0A0F066C0C000151"], + ["0A0406440C00", "0A04120406480C00", "0A0F120406440C000151", ""], + ["0A0406490C00", "0A04120406480C00", "0A0F120406460C000151", ""] + ], + ["06030A02", ""], + [["0A0A06220C00", "", "", ""], "0A04120406220C000108", "", ""], + ["", [["06020A0A0C00", "", "", ""], "06020A040C000108", "", ""]], + ["0B70137007700C000140", "0B70137007700C000140", "", ""], + [ + [ + "", + ["06060003", "", "060B0003"], + "", + ["0601", "", "0601"], + ["0601", "", "0601"], + ["0601", "", "0601"], + ["0606", "0606", "0606", ""], + ["0606", "", "", ""] + ], + ["", ["", "", "", "", "", "", "", ""], "", "", "", "", "070E", "070E"] + ], + "030E", + "030E", + "030E", + "030E", + "030E", + "030E", + "030E", + "030E", + ["", ["0A040648", "0B3013300730", "", ""], "", ["0A040648", "0B3013300730", "", ""]], + [["0A0A06A9", "", "", ""], "0B70137006480108", "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300648", ["0B70137006480108", "", ""], ""], "", ""], + [["0A0A06A9", "", "", ""], "0B70137006480100", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700140", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["", "06490A040100", "", ""], + ["", "06490A040100", ["0A040649", "", "", ""], ["0A040649", "", "", ""]] + ], + ["", [["0B0C06A0", "", "", ""], ["0B0C0640", "0B0C0730", "", ""], "", ""]], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", "0A061206066C0140"] + ], + "", + "" + ], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", "0A061206066C0140"] + ], + "", + "" + ], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300648", "0B70137006480108", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "0B70137006480108", ""], "", ""] + ], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300648", ["0B70137006480108", "", "0B7013700648"], ""], "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + "", + ["0A040648", "0A040730", "0B3807700141", ""], + ["0A040649", "0B300738", ["0A0406480140", "0B7007380140", "0B700770014A"], "0A06065A0170"], + "0B3807700142" + ], + [[["06090A0A", "", "", ""], ["07700B700108", "", ""], "", ""], ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", "0A061206066C0140"] + ], + "", + "" + ], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", "0A061206066C0140"] + ], + "", + "" + ], + [["", "", "", ["0A040648", "0A040730", "", ""]], "0000"], + [["0A0A06A9", "", "", ""], "0B70137006480108", "", ""], + [["0A0A06A9", "", "", ""], ["0B70137006480108", "", ""], "", ""], + [["0A0A06A9", "", "", ""], "0B7013700648", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700140", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + ["", [["0A0A060A", "", "", ""], ["0B040648", "0B040648", "", ""], "", ""]], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + ["0A040648", "0B3013300730", ["0B70137007700148", "", ""], ["0A061206066C0148", "", ""]], + "", + "" + ], + [["0A0A06A9", "", "", ""], "0B70137007700140", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + ["0A040648", "0B3013300730", ["0B70137007700148", "", ""], ["0A061206066C0148", "", ""]], + "", + "" + ], + "", + /*------------------------------------------------------------------------------------------------------------------------ Three Byte operations 0F38. ------------------------------------------------------------------------------------------------------------------------*/ - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - ["",["","0B3013300730",["0B70137007700148","",""],""],"",""], - ["",["","0B3013300730","0B70137007700140",""],"",""], - ["",["","0B300730","",""],"",""], - ["",["","0B300730","",""],"",""], - ["",["0A0406482E00","0B30133007301530","0B7013700770",""],["","","07380B70",""],""], - ["",["","","0B7013700770",""],["","","071C0B70",""],""], - ["",["","","0B7013700770",""],["","","070E0B70",""],""], - ["",["","0B300718",["0B7007380109","",""],""],["","","07380B70",""],""], - ["",["0A0407102E00","0B30133007301530",["0B70137007700148","","0B70137007700140"],""],["","","071C0B70",""],""], - ["",["0A0407102E00","0B30133007301530",["0B70137007700148","","0B70137007700140"],""],["","","07380B70",""],""], - ["",["","0B3013300730",["0B70137007700148","","0B70137007700140"],""],"",""], - ["",["0A040648","0B300730","",""],"",""], - ["",["","0B300644",["0B7006440138","",""],["0A0606440138","",""]],"",""], - ["",["","0A050646",["0B6806460108","","0B700646"],["","","0A060646"]],"",""], - ["",["","0A050648",["0B6806480138","","0B680648"],["0A0606480138","",""]],"",""], - ["",["","",["0A06065A0108","","0A06065A"],["","","0A06065A"]],"",""], - [["0A0A06A9","","",""],"0B7007700108","",""], - [["0A0A06A9","","",""],"0B7007700108","",""], - [["0A0A06A9","","",""],["0B7007700148","",""],"",""], - ["",["","","0B7007700140",""],"",""], - ["","0B7007380108",["","","07380B70",""],""], - ["","0B70071C0108",["","","071C0B70",""],""], - ["","0B70070E0108",["","","070E0B70",""],""], - ["","0B7007380108",["","","07380B70",""],""], - ["","0B70071C0108",["","","071C0B70",""],""], - ["","0B7007380108",["","","07380B70",""],""], - ["",["","",["0A0F137007700108","","0A0F13700770"],""],["","",["0A0F13700770","","0A0F137007700108"],""],""], - ["",["","",["0A0F137007700148","","0A0F137007700140"],["0A0F1206066C0148","",""]],["","",["0A0F137007700140","","0A0F137007700148"],""],""], - ["","0B70137007700140",["","",["0B7006FF","","0B7006FF0108"],""],""], - ["",["0A040648","0B3013300730","0A0F137007700140",""],["","",["0A0F0770","","0A0F07700108"],""],""], - [["",["0B7007700108","",""],"",""],["","",["","",["","","0B7006FF0108"],""],""]], - ["",["0B70137007700148","",""],"",""], - ["",["","0B3013300730",["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["","0B3013300730",["0A0412040644014A","","0A04120406480142"],""],"",""], - ["",["","073013300B30","",""],"",""], - ["",["","0B3013300730","",""],"",""], - ["","0B7007380108",["","","07380B70",""],""], - ["","0B70071C0108",["","","071C0B70",""],""], - ["","0B70070E0108",["","","070E0B70",""],""], - ["","0B7007380108",["","","07380B70",""],""], - ["","0B70071C0108",["","","071C0B70",""],""], - ["","0B7007380108",["","",["06480A04","07380B70",""],""],""], - ["",["","0A051205065A",["0B70137007700148","","0B70137007700140"],["0A061206066C0108","",""]],"",""], - ["",["0A040710","0B3013300730","0A0F137007700140",""],"",""], - ["","0B70137007700108",["","",["0B7006FF","","0B7006FF0108"],""],""], - ["",["0A0412040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],["","",["0A0F0770","","0A0F07700108"],""],""], - ["","0B70137007700108",["","","0B7006FF0100",""],""], - ["",["0A0412040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["","0B70137007700108","",""], - ["",["0A0412040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["","0B70137007700108","",""], - ["",["0A0412040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["",["0A0412040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["",["0A040648",["0A040648","0A040648","",""],"",""],"",""], - ["",["","",["0B7007700159","","0B7007700151"],["0A06066C0159","","0A06066C0151"]],"",""], - ["",["","",["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["","",["0B7007700148","","0B7007700140"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["",["",["0B3013300730","",""],["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - "","","","", - ["",["","",["0B7007700148","","0B7007700140"],""],"",""], - ["",["","",["0A04120406440108","","0A0412040646"],""],"",""], - ["",["","",["0B7007700148","","0B7007700140"],""],"",""], - ["",["","",["0A04120406440108","","0A0412040646"],""],"",""], - ["",["","","",["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["","","",["0A061206066C0159","",""]],"",""], - ["",["","","",["0A061206066C0159","","0A061206066C0151"]],"",""], - ["",["","","",["0A061206066C0159","","0A061206066C0151"]],"",""], - "", - ["",["","","",["0A061206066C0149","","0A061206066C0141"]],"",""], - "","", - ["",["","0B300644",["0B7006440128","",""],["0A0606440128","",""]],"",""], - ["",["","0B300646",["0B7006460128","","0B7006460120"],["","","0A0606460120"]],"",""], - ["",["","0A050648",["0B6806480128","","0B6806480120"],["0A0606480128","",""]],"",""], - ["",["","",["0A06065A0128","","0A06065A0120"],["","","0A06065A0120"]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - "","","","", - ["",["","",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","","0A061206066C0140"]],"",""], - ["",["","",["0B70137007700158","","0B70137007700150"],["0A061206066C0158","","0A061206066C0150"]],"",""], - ["",["","",["0B70137007700108","","0B7013700770"],""],"",""], - "","","","","", - ["",["","","",["0A061206066C0148","",""]],"",""], - ["",["","","",["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - "","","","", - ["",["","","",["0A0F1206066C0148","",""]],"",""], - ["",["","",["0B70137007700108","","0B7013700770"],""],"",""], - ["",["","",["0B70137007700148","","0B70137007700140"],""],"",""], - ["",["","",["0B70137007700148","","0B70137007700140"],""],"",""], - ["",["","0B300640",["0B7006400108","",""],""],"",""], - ["",["","0B300642",["0B7006420108","",""],""],"",""], - ["",["",["","",["0B7006000108","",""],""],"",""]], - ["",["",["","",["0B7006100108","",""],""],"",""]], - ["",["","",["0B70062F0108","","0B70063F"],""],"",""], - ["",["","",["0B70137007700108","","0B7013700770"],""],"",""], - ["",["","",["0B70137007700148","","0B70137007700140"],""],"",""], - ["",["","",["0B70137007700148","","0B70137007700140"],""],"",""], - [["","0B0C060B0180","",""],""], - [["","0B0C060B0180","",""],""], - [["","0B0C060B0180","",""],""], - ["",["","","0B70137007700140",""],"",""], - ["",["","","",["0A061206066C014A","",""]],"",""], - "", - ["",["","","",["0A061206066C0148","",""]],"",""], - ["",["","","",["0A061206066C0148","",""]],"",""], - ["",["","",["0B7007700108","","0B700770"],""],"",""], - ["",["","",["0B7007700108","","0B700770"],""],"",""], - ["",["","",["07700B700108","","07700B70"],""],"",""], - ["",["","",["07700B700108","","07700B70"],""],"",""], - "", - ["",["","",["0B70137007700108","","0B7013700770"],""],"",""], - "","", - ["",["",["0B30073013300124","","0B30064813300124"],["0B700770012C","","0B7007380124"],["0A06066C012C","","0A06065A0124"]],"",""], - ["",["",["0A04073012040104","","0B30073013300104"],["0B380770010C","","0B7007700104"],""],"",""], - ["",["",["0B30073013300134","","0B30064813300134"],["0B700770013C","","0B7007380134"],["0A06066C013C","","0A06065A0104"]],"",""], - ["",["",["0A04073012040104","","0B30073013300104"],["0B380770010C","","0B7007700104"],""],"",""], - "","", - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040714","","0A0412040718"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040714","","0A0412040718"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040714","","0A0412040718"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040714","","0A0412040718"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["","",["07700B70010C","","07380B700104"],["066C0A06012C","","065A0A060124"]],"",""], - ["",["","",["07700B38010C","","07700B700104"],""],"",""], - ["",["","",["07700B70013C","","07380B700134"],["066C0A06013C","","065A0A060134"]],"",""], - ["",["","",["07700B38010C","","07700B700104"],""],"",""], - ["",["","","",["0A061206066C011A","",""]],"",""], - "", - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - "","","","", - ["",["","","0B70137007700140",["0A061206066C0118","",""]],"",""], - ["",["","","0B70137007700140",["0A061206066C0148","",""]],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - "","","","", - ["",["","",["0B7007700148","","0B7007700140"],""],"",""], - "", - [ + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + ["", ["", "0B3013300730", ["0B70137007700148", "", ""], ""], "", ""], + ["", ["", "0B3013300730", "0B70137007700140", ""], "", ""], + ["", ["", "0B300730", "", ""], "", ""], + ["", ["", "0B300730", "", ""], "", ""], + ["", ["0A0406482E00", "0B30133007301530", "0B7013700770", ""], ["", "", "07380B70", ""], ""], + ["", ["", "", "0B7013700770", ""], ["", "", "071C0B70", ""], ""], + ["", ["", "", "0B7013700770", ""], ["", "", "070E0B70", ""], ""], + ["", ["", "0B300718", ["0B7007380109", "", ""], ""], ["", "", "07380B70", ""], ""], [ - ["",["","","",["060C013C","","060A0134"]],"",""], - ["",["","",["060C013C","","060A0134"],["060C013C","",""]],"",""], - ["",["","",["060C013C","","070A0134"],["060C013C","",""]],"",""], - "", - ["",["","","",["060C013C","","060A0134"]],"",""], - ["",["","",["060C013C","","060A0134"],["060C013C","",""]],"",""], - ["",["","",["060C013C","","060A0134"],["060C013C","",""]],"",""], - "" - ],"" - ], - [ + "", + ["0A0407102E00", "0B30133007301530", ["0B70137007700148", "", "0B70137007700140"], ""], + ["", "", "071C0B70", ""], + "" + ], [ - "", - ["",["","",["060C010C","","060C0104"],""],"",""], - ["",["","",["060C010C","","060C0104"],""],"",""], - "","", - ["",["","",["060C010C","","060C0104"],""],"",""], - ["",["","",["060C010C","","060C0104"],""],"",""], - "" - ],"" - ], - [["0A040648","","",""],["","",["0A06066C0159","","0A06066C0151"],["0A06066C0109","",""]],"",""], - [["0A040648","","",""],["","","",["0A06066C0109","",""]],"",""], - [["0A040648","","",""],["","",["0A06066C0159","","0A06066C0151"],["0A06066C0109","",""]],"",""], - [["0A0406482E00","","",""],["","",["0A04120406440109","","0A04120406460101"],["0A06066C0109","",""]],"",""], - [["0A040648","","",""],["","",["0A06066C0159","","0A06066C0151"],["0A06066C015A","",""]],"",""], - [["0A040648","","",""],["","",["0A04120406440109","","0A04120406460101"],["0A06066C0148","",""]],"",""], - "","", - [[["","","",["0A06060C0120","","0A06060C0128"]],["","","",["060C0A060128","","060C0A060120"]],"",""],""], - [[["","","",["0A06060C0130","","0A06060C0138"]],["","","",["060C0A060138","","060C0A060130"]],"",""],""], - "","", - [[["","","",["0A06060C0120","","0A06060C0128"]],["","","",["060C0A060128","","060C0A060120"]],"",""],""], - [[["","","",["0A06060C0130","","0A06060C0138"]],["","","",["060C0A060138","","060C0A060130"]],"",""],""], - "","","","","", - ["",["0A040648","0A040648","",""],"",""], - ["",["0A040648","0A0412040648","",""],"",""], - ["",["0A040648","0A0412040648","",""],"",""], - ["",["0A040648","0A0412040648","",""],"",""], - ["",["0A040648","0A0412040648","",""],"",""], - "","","","","","","","","","","","","","","","", - [ - ["0B0E070E0180","","",""], - ["0B0E070E0180","","",""],"", - ["0B0C06000180","","",""] - ], - [ - ["070E0B0E0180","","",""], - ["070E0B0E0180","","",""],"", - ["0B0C070E0180","","",""] - ], - ["",["","0B0C130C070C","",""],"",""], - [ + "", + ["0A0407102E00", "0B30133007301530", ["0B70137007700148", "", "0B70137007700140"], ""], + ["", "", "07380B70", ""], + "" + ], + ["", ["", "0B3013300730", ["0B70137007700148", "", "0B70137007700140"], ""], "", ""], + ["", ["0A040648", "0B300730", "", ""], "", ""], + ["", ["", "0B300644", ["0B7006440138", "", ""], ["0A0606440138", "", ""]], "", ""], + ["", ["", "0A050646", ["0B6806460108", "", "0B700646"], ["", "", "0A060646"]], "", ""], + ["", ["", "0A050648", ["0B6806480138", "", "0B680648"], ["0A0606480138", "", ""]], "", ""], + ["", ["", "", ["0A06065A0108", "", "0A06065A"], ["", "", "0A06065A"]], "", ""], + [["0A0A06A9", "", "", ""], "0B7007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B7007700108", "", ""], + [["0A0A06A9", "", "", ""], ["0B7007700148", "", ""], "", ""], + ["", ["", "", "0B7007700140", ""], "", ""], + ["", "0B7007380108", ["", "", "07380B70", ""], ""], + ["", "0B70071C0108", ["", "", "071C0B70", ""], ""], + ["", "0B70070E0108", ["", "", "070E0B70", ""], ""], + ["", "0B7007380108", ["", "", "07380B70", ""], ""], + ["", "0B70071C0108", ["", "", "071C0B70", ""], ""], + ["", "0B7007380108", ["", "", "07380B70", ""], ""], + [ + "", + ["", "", ["0A0F137007700108", "", "0A0F13700770"], ""], + ["", "", ["0A0F13700770", "", "0A0F137007700108"], ""], + "" + ], + [ + "", + ["", "", ["0A0F137007700148", "", "0A0F137007700140"], ["0A0F1206066C0148", "", ""]], + ["", "", ["0A0F137007700140", "", "0A0F137007700148"], ""], + "" + ], + ["", "0B70137007700140", ["", "", ["0B7006FF", "", "0B7006FF0108"], ""], ""], + ["", ["0A040648", "0B3013300730", "0A0F137007700140", ""], ["", "", ["0A0F0770", "", "0A0F07700108"], ""], ""], + [ + ["", ["0B7007700108", "", ""], "", ""], + ["", "", ["", "", ["", "", "0B7006FF0108"], ""], ""] + ], + ["", ["0B70137007700148", "", ""], "", ""], + ["", ["", "0B3013300730", ["0B7013700770014A", "", "0B70137007700142"], ""], "", ""], + ["", ["", "0B3013300730", ["0A0412040644014A", "", "0A04120406480142"], ""], "", ""], + ["", ["", "073013300B30", "", ""], "", ""], + ["", ["", "0B3013300730", "", ""], "", ""], + ["", "0B7007380108", ["", "", "07380B70", ""], ""], + ["", "0B70071C0108", ["", "", "071C0B70", ""], ""], + ["", "0B70070E0108", ["", "", "070E0B70", ""], ""], + ["", "0B7007380108", ["", "", "07380B70", ""], ""], + ["", "0B70071C0108", ["", "", "071C0B70", ""], ""], + ["", "0B7007380108", ["", "", ["06480A04", "07380B70", ""], ""], ""], + ["", ["", "0A051205065A", ["0B70137007700148", "", "0B70137007700140"], ["0A061206066C0108", "", ""]], "", ""], + ["", ["0A040710", "0B3013300730", "0A0F137007700140", ""], "", ""], + ["", "0B70137007700108", ["", "", ["0B7006FF", "", "0B7006FF0108"], ""], ""], + [ + "", + ["0A0412040648", "0B3013300730", ["0B70137007700148", "", "0B70137007700140"], ["0A061206066C0148", "", ""]], + ["", "", ["0A0F0770", "", "0A0F07700108"], ""], + "" + ], + ["", "0B70137007700108", ["", "", "0B7006FF0100", ""], ""], + [ + "", + ["0A0412040648", "0B3013300730", ["0B70137007700148", "", "0B70137007700140"], ["0A061206066C0148", "", ""]], + "", + "" + ], + ["", "0B70137007700108", "", ""], + [ + "", + ["0A0412040648", "0B3013300730", ["0B70137007700148", "", "0B70137007700140"], ["0A061206066C0148", "", ""]], + "", + "" + ], + ["", "0B70137007700108", "", ""], + [ + "", + ["0A0412040648", "0B3013300730", ["0B70137007700148", "", "0B70137007700140"], ["0A061206066C0148", "", ""]], + "", + "" + ], + [ + "", + ["0A0412040648", "0B3013300730", ["0B70137007700148", "", "0B70137007700140"], ["0A061206066C0148", "", ""]], + "", + "" + ], + ["", ["0A040648", ["0A040648", "0A040648", "", ""], "", ""], "", ""], + ["", ["", "", ["0B7007700159", "", "0B7007700151"], ["0A06066C0159", "", "0A06066C0151"]], "", ""], + ["", ["", "", ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + ["", ["", "", ["0B7007700148", "", "0B7007700140"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", ""] + ], + "", + "" + ], + [ + "", + ["", ["0B3013300730", "", ""], ["0B70137007700148", "", "0B70137007700140"], ["0A061206066C0148", "", ""]], + "", + "" + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", ""] + ], + "", + "" + ], "", - ["",["","130C070C","",""],"",""], - ["",["","130C070C","",""],"",""], - ["",["","130C070C","",""],"",""], - "","","","" - ],"", - [ - ["","0B0C070C130C","",""],"", - ["","0B0C130C070C","",""], - ["","0B0C130C070C","",""] - ], - [ "", - ["0B0C070C","","",""], - ["0B0C070C","","",""], - ["","0B0C130C070C1B0C","",""] - ], - [ - ["","0B0C130C070C","",""], - ["","0B0C130C070C","",""], - ["","0B0C130C070C","",""], - ["","0B0C130C070C","",""] - ], - "","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------ + "", + "", + ["", ["", "", ["0B7007700148", "", "0B7007700140"], ""], "", ""], + ["", ["", "", ["0A04120406440108", "", "0A0412040646"], ""], "", ""], + ["", ["", "", ["0B7007700148", "", "0B7007700140"], ""], "", ""], + ["", ["", "", ["0A04120406440108", "", "0A0412040646"], ""], "", ""], + ["", ["", "", "", ["0A061206066C015A", "", "0A061206066C0152"]], "", ""], + ["", ["", "", "", ["0A061206066C0159", "", ""]], "", ""], + ["", ["", "", "", ["0A061206066C0159", "", "0A061206066C0151"]], "", ""], + ["", ["", "", "", ["0A061206066C0159", "", "0A061206066C0151"]], "", ""], + "", + ["", ["", "", "", ["0A061206066C0149", "", "0A061206066C0141"]], "", ""], + "", + "", + ["", ["", "0B300644", ["0B7006440128", "", ""], ["0A0606440128", "", ""]], "", ""], + ["", ["", "0B300646", ["0B7006460128", "", "0B7006460120"], ["", "", "0A0606460120"]], "", ""], + ["", ["", "0A050648", ["0B6806480128", "", "0B6806480120"], ["0A0606480128", "", ""]], "", ""], + ["", ["", "", ["0A06065A0128", "", "0A06065A0120"], ["", "", "0A06065A0120"]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + "", + "", + "", + "", + ["", ["", "", ["0B70137007700148", "", "0B70137007700140"], ["0A061206066C0148", "", "0A061206066C0140"]], "", ""], + ["", ["", "", ["0B70137007700158", "", "0B70137007700150"], ["0A061206066C0158", "", "0A061206066C0150"]], "", ""], + ["", ["", "", ["0B70137007700108", "", "0B7013700770"], ""], "", ""], + "", + "", + "", + "", + "", + ["", ["", "", "", ["0A061206066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A061206066C015A", "", "0A061206066C0152"]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + "", + "", + "", + "", + ["", ["", "", "", ["0A0F1206066C0148", "", ""]], "", ""], + ["", ["", "", ["0B70137007700108", "", "0B7013700770"], ""], "", ""], + ["", ["", "", ["0B70137007700148", "", "0B70137007700140"], ""], "", ""], + ["", ["", "", ["0B70137007700148", "", "0B70137007700140"], ""], "", ""], + ["", ["", "0B300640", ["0B7006400108", "", ""], ""], "", ""], + ["", ["", "0B300642", ["0B7006420108", "", ""], ""], "", ""], + ["", ["", ["", "", ["0B7006000108", "", ""], ""], "", ""]], + ["", ["", ["", "", ["0B7006100108", "", ""], ""], "", ""]], + ["", ["", "", ["0B70062F0108", "", "0B70063F"], ""], "", ""], + ["", ["", "", ["0B70137007700108", "", "0B7013700770"], ""], "", ""], + ["", ["", "", ["0B70137007700148", "", "0B70137007700140"], ""], "", ""], + ["", ["", "", ["0B70137007700148", "", "0B70137007700140"], ""], "", ""], + [["", "0B0C060B0180", "", ""], ""], + [["", "0B0C060B0180", "", ""], ""], + [["", "0B0C060B0180", "", ""], ""], + ["", ["", "", "0B70137007700140", ""], "", ""], + ["", ["", "", "", ["0A061206066C014A", "", ""]], "", ""], + "", + ["", ["", "", "", ["0A061206066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A061206066C0148", "", ""]], "", ""], + ["", ["", "", ["0B7007700108", "", "0B700770"], ""], "", ""], + ["", ["", "", ["0B7007700108", "", "0B700770"], ""], "", ""], + ["", ["", "", ["07700B700108", "", "07700B70"], ""], "", ""], + ["", ["", "", ["07700B700108", "", "07700B70"], ""], "", ""], + "", + ["", ["", "", ["0B70137007700108", "", "0B7013700770"], ""], "", ""], + "", + "", + [ + "", + [ + "", + ["0B30073013300124", "", "0B30064813300124"], + ["0B700770012C", "", "0B7007380124"], + ["0A06066C012C", "", "0A06065A0124"] + ], + "", + "" + ], + ["", ["", ["0A04073012040104", "", "0B30073013300104"], ["0B380770010C", "", "0B7007700104"], ""], "", ""], + [ + "", + [ + "", + ["0B30073013300134", "", "0B30064813300134"], + ["0B700770013C", "", "0B7007380134"], + ["0A06066C013C", "", "0A06065A0104"] + ], + "", + "" + ], + ["", ["", ["0A04073012040104", "", "0B30073013300104"], ["0B380770010C", "", "0B7007700104"], ""], "", ""], + "", + "", + ["", ["", ["0B3013300730", "", "0B3013300730"], ["0B7013700770014A", "", "0B70137007700142"], ""], "", ""], + ["", ["", ["0B3013300730", "", "0B3013300730"], ["0B7013700770014A", "", "0B70137007700142"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040714", "", "0A0412040718"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040714", "", "0A0412040718"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040714", "", "0A0412040718"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040714", "", "0A0412040718"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + ["", ["", "", ["07700B70010C", "", "07380B700104"], ["066C0A06012C", "", "065A0A060124"]], "", ""], + ["", ["", "", ["07700B38010C", "", "07700B700104"], ""], "", ""], + ["", ["", "", ["07700B70013C", "", "07380B700134"], ["066C0A06013C", "", "065A0A060134"]], "", ""], + ["", ["", "", ["07700B38010C", "", "07700B700104"], ""], "", ""], + ["", ["", "", "", ["0A061206066C011A", "", ""]], "", ""], + "", + ["", ["", ["0B3013300730", "", "0B3013300730"], ["0B7013700770014A", "", "0B70137007700142"], ""], "", ""], + ["", ["", ["0B3013300730", "", "0B3013300730"], ["0B7013700770014A", "", "0B70137007700142"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040644", "", "0A0412040646"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040644", "", "0A0412040646"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040644", "", "0A0412040646"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040644", "", "0A0412040646"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + "", + "", + "", + "", + ["", ["", "", "0B70137007700140", ["0A061206066C0118", "", ""]], "", ""], + ["", ["", "", "0B70137007700140", ["0A061206066C0148", "", ""]], "", ""], + ["", ["", ["0B3013300730", "", "0B3013300730"], ["0B7013700770014A", "", "0B70137007700142"], ""], "", ""], + ["", ["", ["0B3013300730", "", "0B3013300730"], ["0B7013700770014A", "", "0B70137007700142"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040644", "", "0A0412040646"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040644", "", "0A0412040646"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040644", "", "0A0412040646"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"] + ], + "", + "" + ], + ["", ["", ["0A0412040644", "", "0A0412040646"], ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + "", + "", + "", + "", + ["", ["", "", ["0B7007700148", "", "0B7007700140"], ""], "", ""], + "", + [ + [ + ["", ["", "", "", ["060C013C", "", "060A0134"]], "", ""], + ["", ["", "", ["060C013C", "", "060A0134"], ["060C013C", "", ""]], "", ""], + ["", ["", "", ["060C013C", "", "070A0134"], ["060C013C", "", ""]], "", ""], + "", + ["", ["", "", "", ["060C013C", "", "060A0134"]], "", ""], + ["", ["", "", ["060C013C", "", "060A0134"], ["060C013C", "", ""]], "", ""], + ["", ["", "", ["060C013C", "", "060A0134"], ["060C013C", "", ""]], "", ""], + "" + ], + "" + ], + [ + [ + "", + ["", ["", "", ["060C010C", "", "060C0104"], ""], "", ""], + ["", ["", "", ["060C010C", "", "060C0104"], ""], "", ""], + "", + "", + ["", ["", "", ["060C010C", "", "060C0104"], ""], "", ""], + ["", ["", "", ["060C010C", "", "060C0104"], ""], "", ""], + "" + ], + "" + ], + [["0A040648", "", "", ""], ["", "", ["0A06066C0159", "", "0A06066C0151"], ["0A06066C0109", "", ""]], "", ""], + [["0A040648", "", "", ""], ["", "", "", ["0A06066C0109", "", ""]], "", ""], + [["0A040648", "", "", ""], ["", "", ["0A06066C0159", "", "0A06066C0151"], ["0A06066C0109", "", ""]], "", ""], + [ + ["0A0406482E00", "", "", ""], + ["", "", ["0A04120406440109", "", "0A04120406460101"], ["0A06066C0109", "", ""]], + "", + "" + ], + [["0A040648", "", "", ""], ["", "", ["0A06066C0159", "", "0A06066C0151"], ["0A06066C015A", "", ""]], "", ""], + [ + ["0A040648", "", "", ""], + ["", "", ["0A04120406440109", "", "0A04120406460101"], ["0A06066C0148", "", ""]], + "", + "" + ], + "", + "", + [ + [ + ["", "", "", ["0A06060C0120", "", "0A06060C0128"]], + ["", "", "", ["060C0A060128", "", "060C0A060120"]], + "", + "" + ], + "" + ], + [ + [ + ["", "", "", ["0A06060C0130", "", "0A06060C0138"]], + ["", "", "", ["060C0A060138", "", "060C0A060130"]], + "", + "" + ], + "" + ], + "", + "", + [ + [ + ["", "", "", ["0A06060C0120", "", "0A06060C0128"]], + ["", "", "", ["060C0A060128", "", "060C0A060120"]], + "", + "" + ], + "" + ], + [ + [ + ["", "", "", ["0A06060C0130", "", "0A06060C0138"]], + ["", "", "", ["060C0A060138", "", "060C0A060130"]], + "", + "" + ], + "" + ], + "", + "", + "", + "", + "", + ["", ["0A040648", "0A040648", "", ""], "", ""], + ["", ["0A040648", "0A0412040648", "", ""], "", ""], + ["", ["0A040648", "0A0412040648", "", ""], "", ""], + ["", ["0A040648", "0A0412040648", "", ""], "", ""], + ["", ["0A040648", "0A0412040648", "", ""], "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + [["0B0E070E0180", "", "", ""], ["0B0E070E0180", "", "", ""], "", ["0B0C06000180", "", "", ""]], + [["070E0B0E0180", "", "", ""], ["070E0B0E0180", "", "", ""], "", ["0B0C070E0180", "", "", ""]], + ["", ["", "0B0C130C070C", "", ""], "", ""], + [ + "", + ["", ["", "130C070C", "", ""], "", ""], + ["", ["", "130C070C", "", ""], "", ""], + ["", ["", "130C070C", "", ""], "", ""], + "", + "", + "", + "" + ], + "", + [["", "0B0C070C130C", "", ""], "", ["", "0B0C130C070C", "", ""], ["", "0B0C130C070C", "", ""]], + ["", ["0B0C070C", "", "", ""], ["0B0C070C", "", "", ""], ["", "0B0C130C070C1B0C", "", ""]], + [ + ["", "0B0C130C070C", "", ""], + ["", "0B0C130C070C", "", ""], + ["", "0B0C130C070C", "", ""], + ["", "0B0C130C070C", "", ""] + ], + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------ Three Byte operations 0F3A. ------------------------------------------------------------------------------------------------------------------------*/ - ["",["","0A05065A0C00","0B7007700C000140",""],"",""], - ["",["","0A05065A0C00","0B7007700C000140",""],"",""], - ["",["",["0B30133007300C00","",""],"",""],"",""], - ["",["","",["0B70137007700C000148","","0B70137007700C000140"],["0A061206066C0C000108","",""]],"",""], - ["",["","0B3007300C00",["0B7007700C000148","",""],""],"",""], - ["",["","0B3007300C00","0B7007700C000140",""],"",""], - ["",["","0A051205065A0C00","",""],"",""], - ["",["","","",["0A06066C0C000108","",""]],"",""], - ["",["0A0406480C00","0B3007300C00",["0B7007700C000149","",""],""],"",""], - ["",["0A0406480C00","0B3007300C00","0B7007700C000141",""],"",""], - ["",["0A0406440C00","0A04120406440C00",["0A04120406440C000109","",""],""],"",""], - ["",["0A0406460C00","0A04120406460C00","0A04120406460C000101",""],"",""], - ["",["0A0406480C00","0B30133007300C00","",""],"",""], - ["",["0A0406480C00","0B30133007300C00","",""],"",""], - ["",["0A0406480C00","0B30133007300C00","",""],"",""], - [["0A0A06A90C00","","",""],"0B70137007700C000108","",""], - "","","","", - [["","06000A040C000108","",""],["","070C0A040C000108","",""]], - [["","06020A040C000108","",""],["","070C0A040C000108","",""]], - ["",["06240A040C000108","","06360A040C00"],"",""], - ["","070C0A040C000108","",""], - ["",["","0A05120506480C00",["0B70137006480C000108","","0B70137006480C00"],""],"",""], - ["",["","06480A050C00",["06480B700C000108","","06480B700C00"],""],"",""], - ["",["","",["0A061206065A0C000108","","0A061206065A0C00"],""],"",""], - ["",["","",["065A0A060C000108","","065A0A060C00"],""],"",""], - "", - ["",["","07180B300C00",["07380B700C000109","",""],""],"",""], - ["",["","",["0A0F137007700C000148","","0A0F137007700C000140"],["0A0F1206066C0C000148","",""]],"",""], - ["",["","",["0A0F137007700C000148","","0A0F137007700C000140"],["0A0F1206066C0C000148","",""]],"",""], - ["","0A04120406200C000108","",""], - ["",["0A04120406440C000108","",""],"",""], - ["",["",["0A04120406240C00","","0A04120406360C00"],["0A04120406240C000108","","0A04120406360C00"],""],"",""], - ["",["","",["0B70137007700C000148","","0B70137007700C000140"],""],"",""], - "", - ["",["","",["0B70137007700C000148","","0B70137007700C000140"],""],"",""], - ["",["","",["0B7007700C000149","","0B7007700C000141"],["0A06066C0C000159","","0A06066C0C000151"]],"",""], - ["",["","",["0A04120406440C000109","","0A04120406460C000101"],""],"",""], - "","","","","","","","", - ["",["",["0A0F06FF0C00","","0A0F06FF0C00"],"",""],"",""], - ["",["",["0A0F06FF0C00","","0A0F06FF0C00"],"",""],"",""], - ["",["",["0A0F06FF0C00","","0A0F06FF0C00"],"",""],"",""], - ["",["",["0A0F06FF0C00","","0A0F06FF0C00"],"",""],"",""], - "","","","", - ["",["","0A05120506480C00",["0B70137006480C000108","","0B70137006480C00"],""],"",""], - ["",["","06480A050C00",["06480B700C000108","","06480B700C00"],""],"",""], - ["",["","",["0A061206065A0C000108","","0A061206065A0C00"],""],"",""], - ["",["","",["065A0A060C000108","","065A0A060C00"],""],"",""], - "","", - ["",["","0A0F063F0C00",["0A0F137007700C000108","","0A0F137007700C00"],""],"",""], - ["",["","",["0A0F137007700C000108","","0A0F137007700C00"],""],"",""], - ["",["0A0406480C00","0B30133007300C00","",""],"",""], - ["",["0A0406480C00","0A04120406480C00","",""],"",""], - ["",["0A0406480C00","0B30133007300C00",["0B70137007700C000108","",""],""],"",""], - ["",["","",["0B70137007700C000148","","0B70137007700C000140"],""],"",""], - ["",["0A0406480C00","0A04120406480C00","",""],"",""], - "", - ["",["","0A051205065A0C00","",""],"",""], - "", - ["",["",["0B301330073015300E00","","0B301330153007300E00"],"",""],"",""], - ["",["",["0B301330073015300E00","","0B301330153007300E00"],"",""],"",""], - ["",["","0B30133007301530","",""],"",""], - ["",["","0B30133007301530","",""],"",""], - ["",["","0A051205065A1505","",""],"",""], - "","","", - ["",["","",["0B70137007700C000149","","0B70137007700C000141"],""],"",""], - ["",["","",["0A04120406440C000109","","0A04120406460C000101"],""],"",""], - ["",["","","",["0A06066C0C000159","","0A06066C0C000151"]],"",""], - "", - ["",["","",["0B70137007700C000149","","0B70137007700C000141"],""],"",""], - ["",["","",["0A04120406440C000109","","0A04120406460C000101"],""],"",""], - ["",["","",["0B7007700C000149","","0B7007700C000141"],""],"",""], - ["",["","",["0A04120406440C000109","","0A04120406460C000101"],""],"",""], - "","","","", - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["0A0406480C00","0A0406480C00","",""],"",""], - ["",["0A0406480C00","0A0406480C00","",""],"",""], - ["",["0A0406480C00","0A0406480C00","",""],"",""], - ["",["0A0406480C00","0A0406480C00","",""],"",""], - "","", - ["",["","",["0A0F07700C000148","","0A0F07700C000140"],""],"",""], - ["",["","",["0A0F06440C000108","","0A0F06460C00"],""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0A04120406441530","","0A04120415300644"],"",""],"",""], - ["",["",["0A04120406461530","","0A04120415300646"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0A04120406441530","","0A04120415300644"],"",""],"",""], - ["",["",["0A04120406461530","","0A04120415300646"],"",""],"",""], - "","","","","","","","", - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0A04120406441530","","0A04120415300644"],"",""],"",""], - ["",["",["0A04120406461530","","0A04120415300646"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0A04120406441530","","0A04120415300644"],"",""],"",""], - ["",["",["0A04120406461530","","0A04120415300646"],"",""],"",""], - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","", - [["","","","0A06066C0C000141"],["","","",["0A06066C0C000159","",""]],"",["","","","0A06066C0C000151"]], - [["","","","0A06066C0C000141"],["","","",["0A06066C0C000159","",""]],"",""], - "0A0406480C00","","","", - "","","","","","","","","","","","","","","", - ["",["0A0406480C00","0A0406480C00","",""],"",""], - "","","","","","", - ["","","",["","","","0A06066C0C000151"]], - "","","","","","","","","", - ["","","",["","0B0C070C0C00","",""]], - "","","","","","","","","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------ + ["", ["", "0A05065A0C00", "0B7007700C000140", ""], "", ""], + ["", ["", "0A05065A0C00", "0B7007700C000140", ""], "", ""], + ["", ["", ["0B30133007300C00", "", ""], "", ""], "", ""], + ["", ["", "", ["0B70137007700C000148", "", "0B70137007700C000140"], ["0A061206066C0C000108", "", ""]], "", ""], + ["", ["", "0B3007300C00", ["0B7007700C000148", "", ""], ""], "", ""], + ["", ["", "0B3007300C00", "0B7007700C000140", ""], "", ""], + ["", ["", "0A051205065A0C00", "", ""], "", ""], + ["", ["", "", "", ["0A06066C0C000108", "", ""]], "", ""], + ["", ["0A0406480C00", "0B3007300C00", ["0B7007700C000149", "", ""], ""], "", ""], + ["", ["0A0406480C00", "0B3007300C00", "0B7007700C000141", ""], "", ""], + ["", ["0A0406440C00", "0A04120406440C00", ["0A04120406440C000109", "", ""], ""], "", ""], + ["", ["0A0406460C00", "0A04120406460C00", "0A04120406460C000101", ""], "", ""], + ["", ["0A0406480C00", "0B30133007300C00", "", ""], "", ""], + ["", ["0A0406480C00", "0B30133007300C00", "", ""], "", ""], + ["", ["0A0406480C00", "0B30133007300C00", "", ""], "", ""], + [["0A0A06A90C00", "", "", ""], "0B70137007700C000108", "", ""], + "", + "", + "", + "", + [ + ["", "06000A040C000108", "", ""], + ["", "070C0A040C000108", "", ""] + ], + [ + ["", "06020A040C000108", "", ""], + ["", "070C0A040C000108", "", ""] + ], + ["", ["06240A040C000108", "", "06360A040C00"], "", ""], + ["", "070C0A040C000108", "", ""], + ["", ["", "0A05120506480C00", ["0B70137006480C000108", "", "0B70137006480C00"], ""], "", ""], + ["", ["", "06480A050C00", ["06480B700C000108", "", "06480B700C00"], ""], "", ""], + ["", ["", "", ["0A061206065A0C000108", "", "0A061206065A0C00"], ""], "", ""], + ["", ["", "", ["065A0A060C000108", "", "065A0A060C00"], ""], "", ""], + "", + ["", ["", "07180B300C00", ["07380B700C000109", "", ""], ""], "", ""], + ["", ["", "", ["0A0F137007700C000148", "", "0A0F137007700C000140"], ["0A0F1206066C0C000148", "", ""]], "", ""], + ["", ["", "", ["0A0F137007700C000148", "", "0A0F137007700C000140"], ["0A0F1206066C0C000148", "", ""]], "", ""], + ["", "0A04120406200C000108", "", ""], + ["", ["0A04120406440C000108", "", ""], "", ""], + [ + "", + ["", ["0A04120406240C00", "", "0A04120406360C00"], ["0A04120406240C000108", "", "0A04120406360C00"], ""], + "", + "" + ], + ["", ["", "", ["0B70137007700C000148", "", "0B70137007700C000140"], ""], "", ""], + "", + ["", ["", "", ["0B70137007700C000148", "", "0B70137007700C000140"], ""], "", ""], + ["", ["", "", ["0B7007700C000149", "", "0B7007700C000141"], ["0A06066C0C000159", "", "0A06066C0C000151"]], "", ""], + ["", ["", "", ["0A04120406440C000109", "", "0A04120406460C000101"], ""], "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + ["", ["", ["0A0F06FF0C00", "", "0A0F06FF0C00"], "", ""], "", ""], + ["", ["", ["0A0F06FF0C00", "", "0A0F06FF0C00"], "", ""], "", ""], + ["", ["", ["0A0F06FF0C00", "", "0A0F06FF0C00"], "", ""], "", ""], + ["", ["", ["0A0F06FF0C00", "", "0A0F06FF0C00"], "", ""], "", ""], + "", + "", + "", + "", + ["", ["", "0A05120506480C00", ["0B70137006480C000108", "", "0B70137006480C00"], ""], "", ""], + ["", ["", "06480A050C00", ["06480B700C000108", "", "06480B700C00"], ""], "", ""], + ["", ["", "", ["0A061206065A0C000108", "", "0A061206065A0C00"], ""], "", ""], + ["", ["", "", ["065A0A060C000108", "", "065A0A060C00"], ""], "", ""], + "", + "", + ["", ["", "0A0F063F0C00", ["0A0F137007700C000108", "", "0A0F137007700C00"], ""], "", ""], + ["", ["", "", ["0A0F137007700C000108", "", "0A0F137007700C00"], ""], "", ""], + ["", ["0A0406480C00", "0B30133007300C00", "", ""], "", ""], + ["", ["0A0406480C00", "0A04120406480C00", "", ""], "", ""], + ["", ["0A0406480C00", "0B30133007300C00", ["0B70137007700C000108", "", ""], ""], "", ""], + ["", ["", "", ["0B70137007700C000148", "", "0B70137007700C000140"], ""], "", ""], + ["", ["0A0406480C00", "0A04120406480C00", "", ""], "", ""], + "", + ["", ["", "0A051205065A0C00", "", ""], "", ""], + "", + ["", ["", ["0B301330073015300E00", "", "0B301330153007300E00"], "", ""], "", ""], + ["", ["", ["0B301330073015300E00", "", "0B301330153007300E00"], "", ""], "", ""], + ["", ["", "0B30133007301530", "", ""], "", ""], + ["", ["", "0B30133007301530", "", ""], "", ""], + ["", ["", "0A051205065A1505", "", ""], "", ""], + "", + "", + "", + ["", ["", "", ["0B70137007700C000149", "", "0B70137007700C000141"], ""], "", ""], + ["", ["", "", ["0A04120406440C000109", "", "0A04120406460C000101"], ""], "", ""], + ["", ["", "", "", ["0A06066C0C000159", "", "0A06066C0C000151"]], "", ""], + "", + ["", ["", "", ["0B70137007700C000149", "", "0B70137007700C000141"], ""], "", ""], + ["", ["", "", ["0A04120406440C000109", "", "0A04120406460C000101"], ""], "", ""], + ["", ["", "", ["0B7007700C000149", "", "0B7007700C000141"], ""], "", ""], + ["", ["", "", ["0A04120406440C000109", "", "0A04120406460C000101"], ""], "", ""], + "", + "", + "", + "", + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["0A0406480C00", "0A0406480C00", "", ""], "", ""], + ["", ["0A0406480C00", "0A0406480C00", "", ""], "", ""], + ["", ["0A0406480C00", "0A0406480C00", "", ""], "", ""], + ["", ["0A0406480C00", "0A0406480C00", "", ""], "", ""], + "", + "", + ["", ["", "", ["0A0F07700C000148", "", "0A0F07700C000140"], ""], "", ""], + ["", ["", "", ["0A0F06440C000108", "", "0A0F06460C00"], ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0A04120406441530", "", "0A04120415300644"], "", ""], "", ""], + ["", ["", ["0A04120406461530", "", "0A04120415300646"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0A04120406441530", "", "0A04120415300644"], "", ""], "", ""], + ["", ["", ["0A04120406461530", "", "0A04120415300646"], "", ""], "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0A04120406441530", "", "0A04120415300644"], "", ""], "", ""], + ["", ["", ["0A04120406461530", "", "0A04120415300646"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0A04120406441530", "", "0A04120415300644"], "", ""], "", ""], + ["", ["", ["0A04120406461530", "", "0A04120415300646"], "", ""], "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + [ + ["", "", "", "0A06066C0C000141"], + ["", "", "", ["0A06066C0C000159", "", ""]], + "", + ["", "", "", "0A06066C0C000151"] + ], + [["", "", "", "0A06066C0C000141"], ["", "", "", ["0A06066C0C000159", "", ""]], "", ""], + "0A0406480C00", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ["", ["0A0406480C00", "0A0406480C00", "", ""], "", ""], + "", + "", + "", + "", + "", + "", + ["", "", "", ["", "", "", "0A06066C0C000151"]], + "", + "", + "", + "", + "", + "", + "", + "", + "", + ["", "", "", ["", "0B0C070C0C00", "", ""]], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP 8. ------------------------------------------------------------------------------------------------------------------------*/ - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","", - "0A04120406481404","0A04120406481404","0A04120406481404","","","","","","", - "0A04120406481404","0A04120406481404","","","","","","0A04120406481404","0A04120406481404","0A04120406481404", - "","","","","","","0A04120406481404","0A04120406481404", - "","",["0B30133007301530","","0B30133015300730"],["0A04120406481404","","0A04120414040648"],"","","0A04120406481404", - "","","","","","","","","","","","","","","", - "0A04120406481404","","","","","","","","","","0A0406480C00","0A0406480C00","0A0406480C00","0A0406480C00", - "","","","","","","","", - "0A04120406480C00","0A04120406480C00","0A04120406480C00","0A04120406480C00", - "","","","","","","","","","","","","","","","","","","","","","","","","","","","", - "0A04120406480C00","0A04120406480C00","0A04120406480C00","0A04120406480C00", - "","","","","","","","","","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A04120406481404", + "0A04120406481404", + "0A04120406481404", + "", + "", + "", + "", + "", + "", + "0A04120406481404", + "0A04120406481404", + "", + "", + "", + "", + "", + "0A04120406481404", + "0A04120406481404", + "0A04120406481404", + "", + "", + "", + "", + "", + "", + "0A04120406481404", + "0A04120406481404", + "", + "", + ["0B30133007301530", "", "0B30133015300730"], + ["0A04120406481404", "", "0A04120414040648"], + "", + "", + "0A04120406481404", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A04120406481404", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A0406480C00", + "0A0406480C00", + "0A0406480C00", + "0A0406480C00", + "", + "", + "", + "", + "", + "", + "", + "", + "0A04120406480C00", + "0A04120406480C00", + "0A04120406480C00", + "0A04120406480C00", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A04120406480C00", + "0A04120406480C00", + "0A04120406480C00", + "0A04120406480C00", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP 9. ------------------------------------------------------------------------------------------------------------------------*/ - "", - ["","130C070C","130C070C","130C070C","130C070C","130C070C","130C070C","130C070C"], - ["","130C070C","","","","","130C070C",""], - "","","","","","","","","","","","","","","", - ["",["070C","070C","","","","","",""]], - "","","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "0B300730","0B300730","0B300730","0B300730", - "","","","","","","","","","","","", - ["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"], - ["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"], - ["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"], - "","","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "0A040648","0A040648","0A040648","","","0A040648","0A040648","","","","0A040648","","","","","", - "0A040648","0A040648","0A040648","","","0A040648","0A040648","","","","0A040648","","","","","", - "0A040648","0A040648","0A040648","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------ + "", + ["", "130C070C", "130C070C", "130C070C", "130C070C", "130C070C", "130C070C", "130C070C"], + ["", "130C070C", "", "", "", "", "130C070C", ""], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ["", ["070C", "070C", "", "", "", "", "", ""]], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0B300730", + "0B300730", + "0B300730", + "0B300730", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A040648", + "0A040648", + "0A040648", + "", + "", + "0A040648", + "0A040648", + "", + "", + "", + "0A040648", + "", + "", + "", + "", + "", + "0A040648", + "0A040648", + "0A040648", + "", + "", + "0A040648", + "0A040648", + "", + "", + "", + "0A040648", + "", + "", + "", + "", + "", + "0A040648", + "0A040648", + "0A040648", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP A. ------------------------------------------------------------------------------------------------------------------------*/ - "","","","","","","","","","","","","","","","", - "0B0C070C0C020180","",["130C06240C020180","130C06240C020180","","","","","",""], - "","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------- + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0B0C070C0C020180", + "", + ["130C06240C020180", "130C06240C020180", "", "", "", "", "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------- L1OM Vector. -------------------------------------------------------------------------------------------------------------------------*/ - "","","","","1206","","","","","","","","","","","", - [["0A0606610120","0A0606610120","",""],""],"", - [["0A0606610120","0A0606610120","",""],""], - [["0A0606610120","0A0606610120","",""],""], - [["0A0606610100","0A0606610100","",""],""],"", - [["0A0606610100","0A0606610100","",""],""], - [["0A0606610100","0A0606610100","",""],""], - ["0A06066C0124",""],["066C0124",""],"",["066C0124",""], - ["066C0A060104",""],["066C0104",""],"",["066C0104",""], - ["0A0F120606610150","0A0F120606610150","",""],"0A0F120606610140","0A0F120606610140","", - ["0A0F120606610150","0A0F120606610150","",""],"0A0F120606610140","0A0F120606610140","", - "","","","","","","","", - "0A0F120606610140","","","","","","","","","","","","","","","", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","","0A06120F06610140","","0A06120F06610140","0A06120606610150","0A06120606610140", - ["0A06120606610150","0A06120606610150","",""],"","","","","","","", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","","0A06120F06610140","","0A06120F06610140","","", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","","0A06120F06610140","","0A06120F06610140","","", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - "0A06120606610150","0A06120606610140", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"","","", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"","","", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","0A06120606610140","0A06120606610140","","","0A06120606610150","0A06120606610140", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","0A06120606610140","", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","0A06120606610140","", - ["","0A0606610152","",""],["0A0606610153","0A0606610152","",""],["0A0606610153","0A0606610152","",""],"", - ["","0A0606610158","",""],["0A0606610141","0A0606610148","",""],["0A0606610141","0A0606610148","",""],"", - "0A0606610153","","0A0606610150","0A0606610152","","0A0606610150","0A0606610150","", - "0A06120606610140","0A06120606610140","0A06120606610140","", - ["0A06120606610140","0A06120606610140","",""],["0A06120606610140","0A06120606610140","",""], - ["0A06120606610140","0A06120606610140","",""],["0A06120606610140","0A06120606610140","",""], - "0A06120606610140","0A06120606610140","","","","","","", - "0A0606610140","0A0606610150","0A0606610150","","0A0606610150","","","", - "0A06120606610140","","","","","","","", - "0A0606610150","","0A06120606610150","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "0A0606610C010150","0A0606610C000C00","0A06120606610C010140","0A0606610C010140","","","","", - "","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------- + "", + "", + "", + "", + "1206", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + [["0A0606610120", "0A0606610120", "", ""], ""], + "", + [["0A0606610120", "0A0606610120", "", ""], ""], + [["0A0606610120", "0A0606610120", "", ""], ""], + [["0A0606610100", "0A0606610100", "", ""], ""], + "", + [["0A0606610100", "0A0606610100", "", ""], ""], + [["0A0606610100", "0A0606610100", "", ""], ""], + ["0A06066C0124", ""], + ["066C0124", ""], + "", + ["066C0124", ""], + ["066C0A060104", ""], + ["066C0104", ""], + "", + ["066C0104", ""], + ["0A0F120606610150", "0A0F120606610150", "", ""], + "0A0F120606610140", + "0A0F120606610140", + "", + ["0A0F120606610150", "0A0F120606610150", "", ""], + "0A0F120606610140", + "0A0F120606610140", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A0F120606610140", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "", + "0A06120F06610140", + "", + "0A06120F06610140", + "0A06120606610150", + "0A06120606610140", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + "", + "", + "", + "", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "", + "0A06120F06610140", + "", + "0A06120F06610140", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "", + "0A06120F06610140", + "", + "0A06120F06610140", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + "0A06120606610150", + "0A06120606610140", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "0A06120606610140", + "0A06120606610140", + "", + "", + "0A06120606610150", + "0A06120606610140", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "0A06120606610140", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "0A06120606610140", + "", + ["", "0A0606610152", "", ""], + ["0A0606610153", "0A0606610152", "", ""], + ["0A0606610153", "0A0606610152", "", ""], + "", + ["", "0A0606610158", "", ""], + ["0A0606610141", "0A0606610148", "", ""], + ["0A0606610141", "0A0606610148", "", ""], + "", + "0A0606610153", + "", + "0A0606610150", + "0A0606610152", + "", + "0A0606610150", + "0A0606610150", + "", + "0A06120606610140", + "0A06120606610140", + "0A06120606610140", + "", + ["0A06120606610140", "0A06120606610140", "", ""], + ["0A06120606610140", "0A06120606610140", "", ""], + ["0A06120606610140", "0A06120606610140", "", ""], + ["0A06120606610140", "0A06120606610140", "", ""], + "0A06120606610140", + "0A06120606610140", + "", + "", + "", + "", + "", + "", + "0A0606610140", + "0A0606610150", + "0A0606610150", + "", + "0A0606610150", + "", + "", + "", + "0A06120606610140", + "", + "", + "", + "", + "", + "", + "", + "0A0606610150", + "", + "0A06120606610150", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A0606610C010150", + "0A0606610C000C00", + "0A06120606610C010140", + "0A0606610C010140", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------- L1OM Mask, Mem, and bit opcodes. -------------------------------------------------------------------------------------------------------------------------*/ - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"], - ["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - "","","","", - "06FF0A0F", - [["0601","0601","0604","0604","","","",""],""], - [["0601","0601","","","","","",""],""], - [["0601","0601","","","","","",""],""], - "06FF0A0F","06FF0B06","07060A0F","06FF0B06", - "06FF0A0F","06FF0A0F","06FF0A0F","06FF0A0F", - "06FF0A0F","06FF0A0F","06FF0A0F","06FF0A0F", - "","06FF0A0F", - ["",["0B07","0B07","","","","","",""]], - ["",["0B07","0B07","","","","","",""]] + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + "", + "", + "", + "", + "06FF0A0F", + [["0601", "0601", "0604", "0604", "", "", "", ""], ""], + [["0601", "0601", "", "", "", "", "", ""], ""], + [["0601", "0601", "", "", "", "", "", ""], ""], + "06FF0A0F", + "06FF0B06", + "07060A0F", + "06FF0B06", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "", + "06FF0A0F", + ["", ["0B07", "0B07", "", "", "", "", "", ""]], + ["", ["0B07", "0B07", "", "", "", "", "", ""]] ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2464,22 +5760,262 @@ compared for if the operation code is 0x10F then the next byte is read and is us -------------------------------------------------------------------------------------------------------------------------*/ const M3DNow = [ - "","","","","","","","","","","","","PI2FW","PI2FD","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","PFNACC","","","","PFPNACC","", - "PFCMPGE","","","","PFMIN","","PFRCP","PFRSQRT","","","FPSUB","","","","FPADD","", - "PFCMPGT","","","","PFMAX","","PFRCPIT1","PFRSQIT1","","","PFSUBR","","","","PFACC","", - "PFCMPEQ","","","","PFMUL","","PFRCPIT2","PMULHRW","","","","PSWAPD","","","","PAVGUSB", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","" + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "PI2FW", + "PI2FD", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "PFNACC", + "", + "", + "", + "PFPNACC", + "", + "PFCMPGE", + "", + "", + "", + "PFMIN", + "", + "PFRCP", + "PFRSQRT", + "", + "", + "FPSUB", + "", + "", + "", + "FPADD", + "", + "PFCMPGT", + "", + "", + "", + "PFMAX", + "", + "PFRCPIT1", + "PFRSQIT1", + "", + "", + "PFSUBR", + "", + "", + "", + "PFACC", + "", + "PFCMPEQ", + "", + "", + "", + "PFMUL", + "", + "PFRCPIT2", + "PMULHRW", + "", + "", + "", + "PSWAPD", + "", + "", + "", + "PAVGUSB", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2500,11 +6036,31 @@ link to the patent https://www.google.com/patents/US7552426 -------------------------------------------------------------------------------------------------------------------------*/ const MSynthetic = [ - "VMGETINFO","VMSETINFO","VMDXDSBL","VMDXENBL","", - "VMCPUID","VMHLT","VMSPLAF","","", - "VMPUSHFD","VMPOPFD","VMCLI","VMSTI","VMIRETD", - "VMSGDT","VMSIDT","VMSLDT","VMSTR","", - "VMSDTE","","","","" + "VMGETINFO", + "VMSETINFO", + "VMDXDSBL", + "VMDXENBL", + "", + "VMCPUID", + "VMHLT", + "VMSPLAF", + "", + "", + "VMPUSHFD", + "VMPOPFD", + "VMCLI", + "VMSTI", + "VMIRETD", + "VMSGDT", + "VMSIDT", + "VMSLDT", + "VMSTR", + "", + "VMSDTE", + "", + "", + "", + "" ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2513,11 +6069,46 @@ XOP condition codes map differently. -------------------------------------------------------------------------------------------------------------------------*/ const ConditionCodes = [ - "EQ","LT","LE","UNORD","NEQ","NLT","NLE","ORD", //SSE/L1OM/MVEX. - "EQ_UQ","NGE","NGT","FALSE","NEQ_OQ","GE","GT","TRUE", //VEX/EVEX. - "EQ_OS","LT_OQ","LE_OQ","UNORD_S","NEQ_US","NLT_UQ","NLE_UQ","ORD_S", //VEX/EVEX. - "EQ_US","NGE_UQ","NGT_UQ","FALSE_OS","NEQ_OS","GE_OQ","GT_OQ","TRUE_US", //VEX/EVEX. - "LT","LE","GT","GE","EQ","NEQ","FALSE","TRUE" //XOP. + "EQ", + "LT", + "LE", + "UNORD", + "NEQ", + "NLT", + "NLE", + "ORD", //SSE/L1OM/MVEX. + "EQ_UQ", + "NGE", + "NGT", + "FALSE", + "NEQ_OQ", + "GE", + "GT", + "TRUE", //VEX/EVEX. + "EQ_OS", + "LT_OQ", + "LE_OQ", + "UNORD_S", + "NEQ_US", + "NLT_UQ", + "NLE_UQ", + "ORD_S", //VEX/EVEX. + "EQ_US", + "NGE_UQ", + "NGT_UQ", + "FALSE_OS", + "NEQ_OS", + "GE_OQ", + "GT_OQ", + "TRUE_US", //VEX/EVEX. + "LT", + "LE", + "GT", + "GE", + "EQ", + "NEQ", + "FALSE", + "TRUE" //XOP. ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2543,31 +6134,30 @@ Used by function ^DecodeOperandString()^ Which sets the operands active and give The following X86 patent link might help http://www.google.com/patents/US7640417 -------------------------------------------------------------------------------------------------------------------------*/ -var Operand = function(){ - return( - { - Type:0, //The operand type some operands have different formats like DecodeImmediate() which has a type input. - BySizeAttrubute:false, //Effects how size is used depends on which operand type for which operand across the decoder array. - /*------------------------------------------------------------------------------------------------------------------------- +var Operand = function () { + return { + Type: 0, //The operand type some operands have different formats like DecodeImmediate() which has a type input. + BySizeAttrubute: false, //Effects how size is used depends on which operand type for which operand across the decoder array. + /*------------------------------------------------------------------------------------------------------------------------- How Size is used depends on the operand it is along the decoder array for which function it uses to decode Like DecodeRegValue(), or Decode_ModRM_SIB_Address(), and lastly DecodeImmediate() as they all take the BySize. -------------------------------------------------------------------------------------------------------------------------*/ - Size:0x00, //The Setting. - OperandNum:0, //The operand number basically the order each operand is read in the operand string. - Active:false, //This is set by the set function not all operand are used across the decoder array. - //set the operands attributes then set it active in the decoder array. - set:function(T, BySize, Settings, OperandNumber) - { - this.Type = T; - this.BySizeAttrubute = BySize; - this.Size = Settings; - this.OpNum = OperandNumber; //Give the operand the number it was read in the operand string. - this.Active = true; //set the operand active so it's settings are decoded by the ^DecodeOperands()^ function. - }, - //Deactivates the operand after they are decoded by the ^DecodeOperands()^ function. - Deactivate:function(){ this.Active = false; } - } - ); + Size: 0x00, //The Setting. + OperandNum: 0, //The operand number basically the order each operand is read in the operand string. + Active: false, //This is set by the set function not all operand are used across the decoder array. + //set the operands attributes then set it active in the decoder array. + set: function (T, BySize, Settings, OperandNumber) { + this.Type = T; + this.BySizeAttrubute = BySize; + this.Size = Settings; + this.OpNum = OperandNumber; //Give the operand the number it was read in the operand string. + this.Active = true; //set the operand active so it's settings are decoded by the ^DecodeOperands()^ function. + }, + //Deactivates the operand after they are decoded by the ^DecodeOperands()^ function. + Deactivate: function () { + this.Active = false; + } + }; }; /*------------------------------------------------------------------------------------------------------------------------- @@ -2583,60 +6173,60 @@ Used by functions ^DecodeOperandString()^, and ^DecodeOperands()^, after functio -------------------------------------------------------------------------------------------------------------------------*/ var X86Decoder = [ - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- First operand that is always decoded is "Reg Opcode" if used. Uses the function ^DecodeRegValue()^ the input RValue is the three first bits of the opcode. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Reg Opcode if used. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //Reg Opcode if used. + /*------------------------------------------------------------------------------------------------------------------------- The Second operand that is decoded in series is the ModR/M address if used. Reads a byte using function ^Decode_ModRM_SIB_Value()^ gives it to the function ^Decode_ModRM_SIB_Address()^ which only reads the Mode, and Base register for the address, and then decodes the SIB byte if base register is "100" binary in value. does not use the Register value in the ModR/M because the register can also be used as a group opcode used by the function ^DecodeOpcode()^, or uses a different register in single size with a different address pointer. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //ModR/M address if used. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //ModR/M address if used. + /*------------------------------------------------------------------------------------------------------------------------- The third operand that is decoded if used is for the ModR/M reg bits. Uses the already decoded byte from ^Decode_ModRM_SIB_Value()^ gives the three bit reg value to the function ^DecodeRegValue()^. The ModR/M address, and reg are usually used together, but can also change direction in the encoding string. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //ModR/M reg bits if used. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //ModR/M reg bits if used. + /*------------------------------------------------------------------------------------------------------------------------- The fourth operand that is decoded in sequence is the first Immediate input if used. The function ^DecodeImmediate()^ starts reading bytes as a number for input to instruction. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //First Immediate if used. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //First Immediate if used. + /*------------------------------------------------------------------------------------------------------------------------- The fifth operand that is decoded in sequence is the second Immediate input if used. The function ^DecodeImmediate()^ starts reading bytes as a number for input to instruction. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Second Immediate if used (Note that the instruction "Enter" uses two immediate inputs). - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //Second Immediate if used (Note that the instruction "Enter" uses two immediate inputs). + /*------------------------------------------------------------------------------------------------------------------------- The sixth operand that is decoded in sequence is the third Immediate input if used. The function ^DecodeImmediate()^ starts reading bytes as a number for input to instruction. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Third Immediate if used (Note that the Larrabee vector instructions can use three immediate inputs). - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //Third Immediate if used (Note that the Larrabee vector instructions can use three immediate inputs). + /*------------------------------------------------------------------------------------------------------------------------- Vector adjustment codes allow the selection of the vector register value that is stored into variable VectorRegister that applies to the selected SSE instruction that is read after that uses it. The adjusted vector value is given to the function ^DecodeRegValue()^. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Vector register if used. And if vector adjustments are applied to the SSE instruction. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //Vector register if used. And if vector adjustments are applied to the SSE instruction. + /*------------------------------------------------------------------------------------------------------------------------- Immediate Register encoding if used. During the decoding of the immediate operands the ^DecodeImmediate()^ function stores the read IMM into an variable called IMMValue. The upper four bits of IMMValue is given to the input RValue to the function ^DecodeRegValue()^. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Immediate Register encoding if used. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //Immediate Register encoding if used. + /*------------------------------------------------------------------------------------------------------------------------- It does not matter which order the explicit operands decode as they do not require reading another byte after the opcode. Explicit operands are selected internally in the cpu for instruction codes that only use one register, or pointer, or number input. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Explicit Operand one. - new Operand(), //Explicit Operand two. - new Operand(), //Explicit Operand three. - new Operand() //Explicit Operand four. + new Operand(), //Explicit Operand one. + new Operand(), //Explicit Operand two. + new Operand(), //Explicit Operand three. + new Operand() //Explicit Operand four. ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2867,19 +6457,47 @@ Some instructions use SAE which suppresses all errors, but if an instruction use -------------------------------------------------------------------------------------------------------------------------*/ const RoundModes = [ - "","","","","","","","", //First 8 No rounding mode. - /*------------------------------------------------------------------------------------------------------------------------- + "", + "", + "", + "", + "", + "", + "", + "", //First 8 No rounding mode. + /*------------------------------------------------------------------------------------------------------------------------- MVEX/EVEX round Modes {SAE} Note MVEX (1xx) must be set 4 or higher, while EVEX uses upper 4 in rounding mode by vector length. -------------------------------------------------------------------------------------------------------------------------*/ - ", {Error}", ", {Error}", ", {Error}", ", {Error}", ", {SAE}", ", {SAE}", ", {SAE}", ", {SAE}", - /*------------------------------------------------------------------------------------------------------------------------- + ", {Error}", + ", {Error}", + ", {Error}", + ", {Error}", + ", {SAE}", + ", {SAE}", + ", {SAE}", + ", {SAE}", + /*------------------------------------------------------------------------------------------------------------------------- L1OM/MVEX/EVEX round modes {ER}. L1OM uses the first 4, and EVEX uses the upper 4, while MVEX can use all 8. -------------------------------------------------------------------------------------------------------------------------*/ - ", {RN}", ", {RD}", ", {RU}", ", {RZ}", ", {RN-SAE}", ", {RD-SAE}", ", {RU-SAE}", ", {RZ-SAE}", - /*------------------------------------------------------------------------------------------------------------------------- + ", {RN}", + ", {RD}", + ", {RU}", + ", {RZ}", + ", {RN-SAE}", + ", {RD-SAE}", + ", {RU-SAE}", + ", {RZ-SAE}", + /*------------------------------------------------------------------------------------------------------------------------- MVEX/EVEX round modes {SAE}, {ER} Both rounding modes can not possibly be set both at the same time. -------------------------------------------------------------------------------------------------------------------------*/ - "0B", "4B", "5B", "8B", "16B", "24B", "31B", "32B" //L1OM exponent adjustments. + "0B", + "4B", + "5B", + "8B", + "16B", + "24B", + "31B", + "32B" //L1OM exponent adjustments. ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2887,7 +6505,7 @@ L1OM/MVEX register swizzle modes. When an swizzle operation is done register to Note L1OM skips swizzle type DACB thus the last swizzle type is an repeat of the DACB as the last L1OM swizzle. -------------------------------------------------------------------------------------------------------------------------*/ -const RegSwizzleModes = [ "", "CDAB", "BADC", "DACB", "AAAA", "BBBB", "CCCC", "DDDD", "DACB" ]; +const RegSwizzleModes = ["", "CDAB", "BADC", "DACB", "AAAA", "BBBB", "CCCC", "DDDD", "DACB"]; /*------------------------------------------------------------------------------------------------------------------------- EVEX does not support conversion modes. Only broadcast round of 1To16, or 1To8 controlled by the data size. @@ -2910,58 +6528,92 @@ Lastly the elements are in order to the "CCCCC" value, and "SSS" value times 2, -------------------------------------------------------------------------------------------------------------------------*/ const ConversionModes = [ - //------------------------------------------------------------------------ - "", "", //Not used. - //------------------------------------------------------------------------ - "1To16", "1To8", //Settable as L1OM.sss/MVEX.sss = 001. Settable using EVEX broadcast round. - "4To16", "4To8", //Settable as L1OM.sss/MVEX.sss = 010. Settable using EVEX broadcast round. - //------------------------------------------------------------------------ - "Float16", "Error", //Settable as "MVEX.sss = 011", and "L1OM.sss = 110 , L1OM.CCCCC = 00001". - //------------------------------------------------------------------------ - "Float16RZ", "Error", //Settable only as L1OM.CCCCC = 00010. - //------------------------------------------------------------------------ - "SRGB8", "Error", //Settable only as L1OM.CCCCC = 00011. - /*------------------------------------------------------------------------ + //------------------------------------------------------------------------ + "", + "", //Not used. + //------------------------------------------------------------------------ + "1To16", + "1To8", //Settable as L1OM.sss/MVEX.sss = 001. Settable using EVEX broadcast round. + "4To16", + "4To8", //Settable as L1OM.sss/MVEX.sss = 010. Settable using EVEX broadcast round. + //------------------------------------------------------------------------ + "Float16", + "Error", //Settable as "MVEX.sss = 011", and "L1OM.sss = 110 , L1OM.CCCCC = 00001". + //------------------------------------------------------------------------ + "Float16RZ", + "Error", //Settable only as L1OM.CCCCC = 00010. + //------------------------------------------------------------------------ + "SRGB8", + "Error", //Settable only as L1OM.CCCCC = 00011. + /*------------------------------------------------------------------------ MVEX/L1OM Up conversion, and down conversion types. ------------------------------------------------------------------------*/ - "UInt8", "Error", //Settable as L1OM.sss/MVEX.sss = 100, and L1OM.CCCCC = 00100. - "SInt8", "Error", //Settable as L1OM.sss/MVEX.sss = 101, and L1OM.CCCCC = 00101. - //------------------------------------------------------------------------ - "UNorm8", "Error", //Settable as L1OM.sss = 101, or L1OM.CCCCC = 00110. - "SNorm8", "Error", //Settable as L1OM.CCCCC = 00111. - //------------------------------------------------------------------------ - "UInt16", "Error", //Settable as L1OM.sss/MVEX.sss = 110, and L1OM.CCCCC = 01000 - "SInt16", "Error", //Settable as L1OM.sss/MVEX.sss = 111, and L1OM.CCCCC = 01001 - //------------------------------------------------------------------------ - "UNorm16", "Error", //Settable as L1OM.CCCCC = 01010. - "SNorm16", "Error", //Settable as L1OM.CCCCC = 01011. - "UInt8I", "Error", //Settable as L1OM.CCCCC = 01100. - "SInt8I", "Error", //Settable as L1OM.CCCCC = 01101. - "UInt16I", "Error", //Settable as L1OM.CCCCC = 01110. - "SInt16I", "Error", //Settable as L1OM.CCCCC = 01111. - /*------------------------------------------------------------------------ + "UInt8", + "Error", //Settable as L1OM.sss/MVEX.sss = 100, and L1OM.CCCCC = 00100. + "SInt8", + "Error", //Settable as L1OM.sss/MVEX.sss = 101, and L1OM.CCCCC = 00101. + //------------------------------------------------------------------------ + "UNorm8", + "Error", //Settable as L1OM.sss = 101, or L1OM.CCCCC = 00110. + "SNorm8", + "Error", //Settable as L1OM.CCCCC = 00111. + //------------------------------------------------------------------------ + "UInt16", + "Error", //Settable as L1OM.sss/MVEX.sss = 110, and L1OM.CCCCC = 01000 + "SInt16", + "Error", //Settable as L1OM.sss/MVEX.sss = 111, and L1OM.CCCCC = 01001 + //------------------------------------------------------------------------ + "UNorm16", + "Error", //Settable as L1OM.CCCCC = 01010. + "SNorm16", + "Error", //Settable as L1OM.CCCCC = 01011. + "UInt8I", + "Error", //Settable as L1OM.CCCCC = 01100. + "SInt8I", + "Error", //Settable as L1OM.CCCCC = 01101. + "UInt16I", + "Error", //Settable as L1OM.CCCCC = 01110. + "SInt16I", + "Error", //Settable as L1OM.CCCCC = 01111. + /*------------------------------------------------------------------------ L1OM Up conversion, and field conversion. ------------------------------------------------------------------------*/ - "UNorm10A", "Error", //Settable as L1OM.CCCCC = 10000. Also Usable as Integer Field control. - "UNorm10B", "Error", //Settable as L1OM.CCCCC = 10001. Also Usable as Integer Field control. - "UNorm10C", "Error", //Settable as L1OM.CCCCC = 10010. Also Usable as Integer Field control. - "UNorm2D", "Error", //Settable as L1OM.CCCCC = 10011. Also Usable as Integer Field control. - //------------------------------------------------------------------------ - "Float11A", "Error", //Settable as L1OM.CCCCC = 10100. Also Usable as Float Field control. - "Float11B", "Error", //Settable as L1OM.CCCCC = 10101. Also Usable as Float Field control. - "Float10C", "Error", //Settable as L1OM.CCCCC = 10110. Also Usable as Float Field control. - "Error", "Error", //Settable as L1OM.CCCCC = 10111. Also Usable as Float Field control. - /*------------------------------------------------------------------------ + "UNorm10A", + "Error", //Settable as L1OM.CCCCC = 10000. Also Usable as Integer Field control. + "UNorm10B", + "Error", //Settable as L1OM.CCCCC = 10001. Also Usable as Integer Field control. + "UNorm10C", + "Error", //Settable as L1OM.CCCCC = 10010. Also Usable as Integer Field control. + "UNorm2D", + "Error", //Settable as L1OM.CCCCC = 10011. Also Usable as Integer Field control. + //------------------------------------------------------------------------ + "Float11A", + "Error", //Settable as L1OM.CCCCC = 10100. Also Usable as Float Field control. + "Float11B", + "Error", //Settable as L1OM.CCCCC = 10101. Also Usable as Float Field control. + "Float10C", + "Error", //Settable as L1OM.CCCCC = 10110. Also Usable as Float Field control. + "Error", + "Error", //Settable as L1OM.CCCCC = 10111. Also Usable as Float Field control. + /*------------------------------------------------------------------------ Unused Conversion modes. ------------------------------------------------------------------------*/ - "Error", "Error", //Settable as L1OM.CCCCC = 11000. - "Error", "Error", //Settable as L1OM.CCCCC = 11001. - "Error", "Error", //Settable as L1OM.CCCCC = 11010. - "Error", "Error", //Settable as L1OM.CCCCC = 11011. - "Error", "Error", //Settable as L1OM.CCCCC = 11100. - "Error", "Error", //Settable as L1OM.CCCCC = 11101. - "Error", "Error", //Settable as L1OM.CCCCC = 11110. - "Error", "Error" //Settable as L1OM.CCCCC = 11111. + "Error", + "Error", //Settable as L1OM.CCCCC = 11000. + "Error", + "Error", //Settable as L1OM.CCCCC = 11001. + "Error", + "Error", //Settable as L1OM.CCCCC = 11010. + "Error", + "Error", //Settable as L1OM.CCCCC = 11011. + "Error", + "Error", //Settable as L1OM.CCCCC = 11100. + "Error", + "Error", //Settable as L1OM.CCCCC = 11101. + "Error", + "Error", //Settable as L1OM.CCCCC = 11110. + "Error", + "Error" //Settable as L1OM.CCCCC = 11111. ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -3011,7 +6663,8 @@ Prefix G1, and G2 are used with Intel HLE, and other prefix codes such as repeat applied to any instruction unless it is an SIMD instruction which uses F2, and F3 as the SIMD Mode. -------------------------------------------------------------------------------------------------------------------------*/ -var PrefixG1 = "", PrefixG2 = ""; +var PrefixG1 = "", + PrefixG2 = ""; /*------------------------------------------------------------------------------------------------------------------------- Intel HLE is used with basic arithmetic instructions like Add, and subtract, and shift operations. @@ -3020,7 +6673,8 @@ Intel HLE instructions replace the Repeat F2, and F3, also lock F0 with XACQUIRE This is used by function ^DecodeInstruction()^. -------------------------------------------------------------------------------------------------------------------------*/ -var XRelease = false, XAcquire = false; +var XRelease = false, + XAcquire = false; /*------------------------------------------------------------------------------------------------------------------------- Intel HLE flip "G1 is used as = REP (XACQUIRE), or RENP (XRELEASE)", and "G2 is used as = LOCK" if the lock prefix was @@ -3066,7 +6720,7 @@ Used by functions ^DecodeRegValue()^, ^Decode_ModRM_SIB_Address()^. -------------------------------------------------------------------------------------------------------------------------*/ const REG = [ - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 0 Is used only if the value returned from the GetOperandSize is 0 in value which is the 8 bit general use Arithmetic registers names. Note that these same registers can be made 16 bit across instead of using just the first 8 bit in size it depends on the instruction codes extension size. @@ -3080,122 +6734,322 @@ const REG = [ used then the first 8 bit's is used by all general use arithmetic registers. Because of this the array is broken into two name listings that is used with the "RValue" number given to the function ^DecodeRegValue()^. -------------------------------------------------------------------------------------------------------------------------*/ - [ - /*------------------------------------------------------------------------------------------------------------------------- + [ + /*------------------------------------------------------------------------------------------------------------------------- 8 bit registers without any rex prefix active is the normal low byte to high byte order of the first 4 general use registers "A, C, D, and B" using 8 bits. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Registers 8 bit names without any rex prefix index 0 to 7. - "AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Registers 8 bit names without any rex prefix index 0 to 7. + "AL", + "CL", + "DL", + "BL", + "AH", + "CH", + "DH", + "BH" + ], + /*------------------------------------------------------------------------------------------------------------------------- 8 bit registers with any rex prefix active uses all 15 registers in low byte order. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Registers 8 bit names with any rex prefix index 0 to 7. - "AL", "CL", "DL", "BL", "SPL", "BPL", "SIL", "DIL", - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Registers 8 bit names with any rex prefix index 0 to 7. + "AL", + "CL", + "DL", + "BL", + "SPL", + "BPL", + "SIL", + "DIL", + /*------------------------------------------------------------------------------------------------------------------------- Registers 8 bit names Extended using the REX.R extend setting in the Rex prefix, or VEX.R bit, or EVEX.R. What ever RegExtend is set based on prefix settings is added to the select Reg Index -------------------------------------------------------------------------------------------------------------------------*/ - "R8B", "R9B", "R10B", "R11B", "R12B", "R13B", "R14B", "R15B" - ] - ], - /*------------------------------------------------------------------------------------------------------------------------- + "R8B", + "R9B", + "R10B", + "R11B", + "R12B", + "R13B", + "R14B", + "R15B" + ] + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 1 Is used only if the value returned from the GetOperandSize function is 1 in value in which bellow is the general use Arithmetic register names 16 in size. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Registers 16 bit names index 0 to 15. - "AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI", "R8W", "R9W", "R10W", "R11W", "R12W", "R13W", "R14W", "R15W" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Registers 16 bit names index 0 to 15. + "AX", + "CX", + "DX", + "BX", + "SP", + "BP", + "SI", + "DI", + "R8W", + "R9W", + "R10W", + "R11W", + "R12W", + "R13W", + "R14W", + "R15W" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 2 Is used only if the value from the GetOperandSize function is 2 in value in which bellow is the general use Arithmetic register names 32 in size. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Registers 32 bit names index 0 to 15. - "EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI", "R8D", "R9D", "R10D", "R11D", "R12D", "R13D", "R14D", "R15D" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Registers 32 bit names index 0 to 15. + "EAX", + "ECX", + "EDX", + "EBX", + "ESP", + "EBP", + "ESI", + "EDI", + "R8D", + "R9D", + "R10D", + "R11D", + "R12D", + "R13D", + "R14D", + "R15D" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 3 Is used only if the value returned from the GetOperandSize function is 3 in value in which bellow is the general use Arithmetic register names 64 in size. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //general use Arithmetic registers 64 names index 0 to 15. - "RAX", "RCX", "RDX", "RBX", "RSP", "RBP", "RSI", "RDI", "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //general use Arithmetic registers 64 names index 0 to 15. + "RAX", + "RCX", + "RDX", + "RBX", + "RSP", + "RBP", + "RSI", + "RDI", + "R8", + "R9", + "R10", + "R11", + "R12", + "R13", + "R14", + "R15" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 4 SIMD registers 128 across in size names. The SIMD registers are used by the SIMD Vector math unit. Used only if the value from the GetOperandSize function is 4 in value. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Register XMM names index 0 to 15. - "XMM0", "XMM1", "XMM2", "XMM3", "XMM4", "XMM5", "XMM6", "XMM7", "XMM8", "XMM9", "XMM10", "XMM11", "XMM12", "XMM13", "XMM14", "XMM15", - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Register XMM names index 0 to 15. + "XMM0", + "XMM1", + "XMM2", + "XMM3", + "XMM4", + "XMM5", + "XMM6", + "XMM7", + "XMM8", + "XMM9", + "XMM10", + "XMM11", + "XMM12", + "XMM13", + "XMM14", + "XMM15", + /*------------------------------------------------------------------------------------------------------------------------- Register XMM names index 16 to 31. Note different bit settings in the EVEX prefixes allow higher Extension values in the Register Extend variables. -------------------------------------------------------------------------------------------------------------------------*/ - "XMM16", "XMM17", "XMM18", "XMM19", "XMM20", "XMM21", "XMM22", "XMM23", "XMM24", "XMM25", "XMM26", "XMM27", "XMM28", "XMM29", "XMM30", "XMM31" - ], - /*------------------------------------------------------------------------------------------------------------------------- + "XMM16", + "XMM17", + "XMM18", + "XMM19", + "XMM20", + "XMM21", + "XMM22", + "XMM23", + "XMM24", + "XMM25", + "XMM26", + "XMM27", + "XMM28", + "XMM29", + "XMM30", + "XMM31" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 5 SIMD registers 256 across in size names. Used only if the value from the GetOperandSize function is 5 in value. Set by vector length setting. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Register YMM names index 0 to 15. - "YMM0", "YMM1", "YMM2", "YMM3", "YMM4", "YMM5", "YMM6", "YMM7", "YMM8", "YMM9", "YMM10", "YMM11", "YMM12", "YMM13", "YMM14", "YMM15", - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Register YMM names index 0 to 15. + "YMM0", + "YMM1", + "YMM2", + "YMM3", + "YMM4", + "YMM5", + "YMM6", + "YMM7", + "YMM8", + "YMM9", + "YMM10", + "YMM11", + "YMM12", + "YMM13", + "YMM14", + "YMM15", + /*------------------------------------------------------------------------------------------------------------------------- Register YMM names index 16 to 31. Note different bit settings in the EVEX prefixes allow higher Extension values in the Register Extend variables. -------------------------------------------------------------------------------------------------------------------------*/ - "YMM16", "YMM17", "YMM18", "YMM19", "YMM20", "YMM21", "YMM22", "YMM23", "YMM24", "YMM25", "YMM26", "YMM27", "YMM28", "YMM29", "YMM30", "YMM31" - ], - /*------------------------------------------------------------------------------------------------------------------------- + "YMM16", + "YMM17", + "YMM18", + "YMM19", + "YMM20", + "YMM21", + "YMM22", + "YMM23", + "YMM24", + "YMM25", + "YMM26", + "YMM27", + "YMM28", + "YMM29", + "YMM30", + "YMM31" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 6 SIMD registers 512 across in size names. Used only if the value from the GetOperandSize function is 6 in value. Set by Vector length setting. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Register ZMM names index 0 to 15. - "ZMM0", "ZMM1", "ZMM2", "ZMM3", "ZMM4", "ZMM5", "ZMM6", "ZMM7", "ZMM8", "ZMM9", "ZMM10", "ZMM11", "ZMM12", "ZMM13", "ZMM14", "ZMM15", - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Register ZMM names index 0 to 15. + "ZMM0", + "ZMM1", + "ZMM2", + "ZMM3", + "ZMM4", + "ZMM5", + "ZMM6", + "ZMM7", + "ZMM8", + "ZMM9", + "ZMM10", + "ZMM11", + "ZMM12", + "ZMM13", + "ZMM14", + "ZMM15", + /*------------------------------------------------------------------------------------------------------------------------- Register ZMM names index 16 to 31. Note different bit settings in the EVEX prefixes allow higher Extension values in the Register Extend variables. -------------------------------------------------------------------------------------------------------------------------*/ - "ZMM16", "ZMM17", "ZMM18", "ZMM19", "ZMM20", "ZMM21", "ZMM22", "ZMM23", "ZMM24", "ZMM25", "ZMM26", "ZMM27", "ZMM28", "ZMM29", "ZMM30", "ZMM31" - ], - /*------------------------------------------------------------------------------------------------------------------------- + "ZMM16", + "ZMM17", + "ZMM18", + "ZMM19", + "ZMM20", + "ZMM21", + "ZMM22", + "ZMM23", + "ZMM24", + "ZMM25", + "ZMM26", + "ZMM27", + "ZMM28", + "ZMM29", + "ZMM30", + "ZMM31" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 7 SIMD registers 1024 bit. The SIMD registers have not been made this long yet. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Register unknowable names index 0 to 15. - "?MM0", "?MM1", "?MM2", "?MM3", "?MM4", "?MM5", "?MM6", "?MM7", "?MM8", "?MM9", "?MM10", "?MM11", "?MM12", "?MM13", "?MM14", "?MM15", - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Register unknowable names index 0 to 15. + "?MM0", + "?MM1", + "?MM2", + "?MM3", + "?MM4", + "?MM5", + "?MM6", + "?MM7", + "?MM8", + "?MM9", + "?MM10", + "?MM11", + "?MM12", + "?MM13", + "?MM14", + "?MM15", + /*------------------------------------------------------------------------------------------------------------------------- Register unknowable names index 16 to 31. Note different bit settings in the EVEX prefixes allow higher Extension values in the Register Extend variables. -------------------------------------------------------------------------------------------------------------------------*/ - "?MM16", "?MM17", "?MM18", "?MM19", "?MM20", "?MM21", "?MM22", "?MM23", "?MM24", "?MM25", "?MM26", "?MM27", "?MM28", "?MM29", "?MM30", "?MM31" - ], - /*------------------------------------------------------------------------------------------------------------------------- + "?MM16", + "?MM17", + "?MM18", + "?MM19", + "?MM20", + "?MM21", + "?MM22", + "?MM23", + "?MM24", + "?MM25", + "?MM26", + "?MM27", + "?MM28", + "?MM29", + "?MM30", + "?MM31" + ], + /*------------------------------------------------------------------------------------------------------------------------- The Registers bellow do not change size they are completely separate, thus are used for special purposes. These registers are selected by using size as a value for the index instead instead of giving size to the function ^GetOperandSize()^. --------------------------------------------------------------------------------------------------------------------------- REG array Index 8 Segment Registers. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Segment Registers names index 0 to 7 - "ES", "CS", "SS", "DS", "FS", "GS", "ST(-2)", "ST(-1)" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Segment Registers names index 0 to 7 + "ES", + "CS", + "SS", + "DS", + "FS", + "GS", + "ST(-2)", + "ST(-1)" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 9 Stack, and MM registers used by the X87 Float point unit. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //ST registers Names index 0 to 7 - //note these are used with the X87 FPU, but are aliased to MM in MMX SSE. - "ST(0)", "ST(1)", "ST(2)", "ST(3)", "ST(4)", "ST(5)", "ST(6)", "ST(7)" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //ST registers Names index 0 to 7 + //note these are used with the X87 FPU, but are aliased to MM in MMX SSE. + "ST(0)", + "ST(1)", + "ST(2)", + "ST(3)", + "ST(4)", + "ST(5)", + "ST(6)", + "ST(7)" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG index 10 Intel MM qword technology MMX vector instructions. --------------------------------------------------------------------------------------------------------------------------- These can not be used with Vector length adjustment used in vector extensions. The MM register are the ST registers aliased @@ -3206,53 +7060,164 @@ const REG = [ that can be adjusted by vector length are separate from the MM registers, but still use the same SIMD unit. Because of this some Vector instruction codes can not be used with vector extension setting codes. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Register MM names index 0 to 7 - "MM0", "MM1", "MM2", "MM3", "MM4", "MM5", "MM6", "MM7" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Register MM names index 0 to 7 + "MM0", + "MM1", + "MM2", + "MM3", + "MM4", + "MM5", + "MM6", + "MM7" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG Array Index 11 bound registers introduced with MPX instructions. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //BND0 to BND3,and CR0 to CR3 for two byte opcodes 0x0F1A,and 0x0F1B register index 0 to 7 - "BND0", "BND1", "BND2", "BND3", "CR0", "CR1", "CR2", "CR3" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //BND0 to BND3,and CR0 to CR3 for two byte opcodes 0x0F1A,and 0x0F1B register index 0 to 7 + "BND0", + "BND1", + "BND2", + "BND3", + "CR0", + "CR1", + "CR2", + "CR3" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 12 control registers depending on the values they are set changes the modes of the CPU. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //control Registers index 0 to 15 - "CR0", "CR1", "CR2", "CR3", "CR4", "CR5", "CR6", "CR7", "CR8", "CR9", "CR10", "CR11", "CR12", "CR13", "CR14", "CR15" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //control Registers index 0 to 15 + "CR0", + "CR1", + "CR2", + "CR3", + "CR4", + "CR5", + "CR6", + "CR7", + "CR8", + "CR9", + "CR10", + "CR11", + "CR12", + "CR13", + "CR14", + "CR15" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 13 Debug mode registers. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //debug registers index 0 to 15 - "DR0", "DR1", "DR2", "DR3", "DR4", "DR5", "DR6", "DR7", "DR8", "DR9", "DR10", "DR11", "DR12", "DR13", "DR14", "DR15" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //debug registers index 0 to 15 + "DR0", + "DR1", + "DR2", + "DR3", + "DR4", + "DR5", + "DR6", + "DR7", + "DR8", + "DR9", + "DR10", + "DR11", + "DR12", + "DR13", + "DR14", + "DR15" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 14 test registers. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //TR registers index 0 to 7 - "TR0", "TR1", "TR2", "TR3", "TR4", "TR5", "TR6", "TR7" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //TR registers index 0 to 7 + "TR0", + "TR1", + "TR2", + "TR3", + "TR4", + "TR5", + "TR6", + "TR7" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG Array Index 15 SIMD vector mask registers. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //K registers index 0 to 7, because of vector extensions it is repeated till last extension. - "K0", "K1", "K2", "K3", "K4", "K5", "K6", "K7","K0", "K1", "K2", "K3", "K4", "K5", "K6", "K7", - "K0", "K1", "K2", "K3", "K4", "K5", "K6", "K7","K0", "K1", "K2", "K3", "K4", "K5", "K6", "K7" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //K registers index 0 to 7, because of vector extensions it is repeated till last extension. + "K0", + "K1", + "K2", + "K3", + "K4", + "K5", + "K6", + "K7", + "K0", + "K1", + "K2", + "K3", + "K4", + "K5", + "K6", + "K7", + "K0", + "K1", + "K2", + "K3", + "K4", + "K5", + "K6", + "K7", + "K0", + "K1", + "K2", + "K3", + "K4", + "K5", + "K6", + "K7" + ], + /*------------------------------------------------------------------------------------------------------------------------- REG Array Index 16 SIMD L1OM vector registers. -------------------------------------------------------------------------------------------------------------------------*/ - [ - "V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15", - "V16", "V17", "V18", "V19", "V20", "V21", "V22", "V23", "V24", "V25", "V26", "V27", "V28", "V29", "V30", "V31" - ] + [ + "V0", + "V1", + "V2", + "V3", + "V4", + "V5", + "V6", + "V7", + "V8", + "V9", + "V10", + "V11", + "V12", + "V13", + "V14", + "V15", + "V16", + "V17", + "V18", + "V19", + "V20", + "V21", + "V22", + "V23", + "V24", + "V25", + "V26", + "V27", + "V28", + "V29", + "V30", + "V31" + ] ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -3274,49 +7239,58 @@ Used by the function ^Decode_ModRM_SIB_Address()^. -------------------------------------------------------------------------------------------------------------------------*/ const PTR = [ - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 0 when GetOperandSize returns size 0 then times 2 for 8 bit pointer. In plus 16 bit shift array index 0 is added by 1 making 0+1=1 no pointer name is used. The blank pointer is used for instructions like LEA which loads the effective address. -------------------------------------------------------------------------------------------------------------------------*/ - "BYTE PTR ","", - /*------------------------------------------------------------------------------------------------------------------------- + "BYTE PTR ", + "", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 2 when GetOperandSize returns size 1 then times 2 for 16 bit pointer alignment. In plus 16 bit shift index 2 is added by 1 making 2+1=3 The 32 bit pointer name is used (mathematically 16+16=32). -------------------------------------------------------------------------------------------------------------------------*/ - "WORD PTR ","DWORD PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "WORD PTR ", + "DWORD PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 4 when GetOperandSize returns size 2 then multiply by 2 for index 4 for the 32 bit pointer. In plus 16 bit shift index 4 is added by 1 making 4+1=5 the 48 bit Far pointer name is used (mathematically 32+16=48). -------------------------------------------------------------------------------------------------------------------------*/ - "DWORD PTR ","FWORD PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "DWORD PTR ", + "FWORD PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 6 when GetOperandSize returns size 3 then multiply by 2 gives index 6 for the 64 bit pointer. The Non shifted 64 bit pointer has two types the 64 bit vector "MM", and regular "QWORD" the same as the REG array. In plus 16 bit shift index 6 is added by 1 making 6+1=7 the 80 bit TBYTE pointer name is used (mathematically 64+16=80). -------------------------------------------------------------------------------------------------------------------------*/ - "QWORD PTR ","TBYTE PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "QWORD PTR ", + "TBYTE PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 8 when GetOperandSize returns size 4 then multiply by 2 gives index 8 for the 128 bit Vector pointer. In far pointer shift the MMX vector pointer is used. MM is designed to be used when the by size system is false using index 9 for Pointer, and index 10 for Reg. -------------------------------------------------------------------------------------------------------------------------*/ - "XMMWORD PTR ","MMWORD PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "XMMWORD PTR ", + "MMWORD PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 10 when GetOperandSize returns size 5 then multiply by 2 gives index 10 for the 256 bit SIMD pointer. In far pointer shift the OWORD pointer is used with the bounds instructions it is also designed to be used when the by size is set false same as MM. -------------------------------------------------------------------------------------------------------------------------*/ - "YMMWORD PTR ","OWORD PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "YMMWORD PTR ", + "OWORD PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 12 when GetOperandSize returns size 6 then multiply by 2 gives index 12 for the 512 bit pointer. In plus 16 bit shift index 12 is added by 1 making 12+1=13 there is no 528 bit pointer name (mathematically 5126+16=528). -------------------------------------------------------------------------------------------------------------------------*/ - "ZMMWORD PTR ","ERROR PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "ZMMWORD PTR ", + "ERROR PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 14 when GetOperandSize returns size 7 then multiply by 2 gives index 12 for the 1024 bit pointer. In plus 16 bit shift index 14 is added by 1 making 12+1=13 there is no 1 bit pointer name (mathematically 5126+16=528). -------------------------------------------------------------------------------------------------------------------------*/ - "?MMWORD PTR ","ERROR PTR "]; + "?MMWORD PTR ", + "ERROR PTR " +]; /*------------------------------------------------------------------------------------------------------------------------- SIB byte scale Note the Scale bits value is the selected index of the array bellow only used under @@ -3326,12 +7300,12 @@ used by the ^Decode_ModRM_SIB_Address function()^. -------------------------------------------------------------------------------------------------------------------------*/ const scale = [ - "", //when scale bits are 0 in value no scale multiple is used - "*2", //when scale bits are 1 in value a scale multiple of times two is used - "*4", //when scale bits are 2 in value a scale multiple of times four is used - "*8" //when scale bits are 3 in value a scale multiple of times eight is used - ]; - + "", //when scale bits are 0 in value no scale multiple is used + "*2", //when scale bits are 1 in value a scale multiple of times two is used + "*4", //when scale bits are 2 in value a scale multiple of times four is used + "*8" //when scale bits are 3 in value a scale multiple of times eight is used +]; + /*------------------------------------------------------------------------------------------------------------------------- This function changes the Mnemonics array, for older instruction codes used by specific X86 cores that are under the same instruction codes. --------------------------------------------------------------------------------------------------------------------------- @@ -3344,192 +7318,385 @@ If input "type" is set 5 it will adjust the mnemonic array to decode Centaur ins If input "type" is set 6 it will adjust the mnemonic array to decode instruction for the X86/486 CPU which conflict with the vector unit instructions with UMOV. -------------------------------------------------------------------------------------------------------------------------*/ -export function CompatibilityMode( type ) -{ - //Reset the changeable sections of the Mnemonics array, and operand encoding array. - - Mnemonics[0x062] = ["BOUND","BOUND",""]; - Mnemonics[0x110] = [["MOVUPS","MOVUPD","MOVSS","MOVSD"],["MOVUPS","MOVUPD","MOVSS","MOVSD"]]; - Mnemonics[0x111] = [["MOVUPS","MOVUPD","MOVSS","MOVSD"],["MOVUPS","MOVUPD","MOVSS","MOVSD"]]; - Mnemonics[0x112] = [["MOVLPS","MOVLPD","MOVSLDUP","MOVDDUP"],["MOVHLPS","???","MOVSLDUP","MOVDDUP"]]; - Mnemonics[0x113] = [["MOVLPS","MOVLPD","???","???"],"???"]; - Mnemonics[0x138] = ""; Mnemonics[0x139] = "???"; Mnemonics[0x13A] = ""; Mnemonics[0x13B] = "???"; Mnemonics[0x13C] = "???"; Mnemonics[0x13D] = "???"; Mnemonics[0x13F] = "???"; - Mnemonics[0x141] = [["CMOVNO",["KANDW","","KANDQ"],"",""],["CMOVNO",["KANDB","","KANDD"],"",""],"",""]; - Mnemonics[0x142] = [["CMOVB",["KANDNW","","KANDNQ"],"",""],["CMOVB",["KANDNB","","KANDND"],"",""],"",""]; - Mnemonics[0x144] = [["CMOVE",["KNOTW","","KNOTQ"],"",""],["CMOVE",["KNOTB","","KNOTD"],"",""],"",""]; - Mnemonics[0x145] = [["CMOVNE",["KORW","","KORQ"],"",""],["CMOVNE",["KORB","","KORD"],"",""],"",""]; - Mnemonics[0x146] = [["CMOVBE",["KXNORW","","KXNORQ"],"",""],["CMOVBE",["KXNORB","","KXNORD"],"",""],"",""]; - Mnemonics[0x147] = [["CMOVA",["KXORW","","KXORQ"],"",""],["CMOVA",["KXORB","","KXORD"],"",""],"",""]; - Mnemonics[0x150] = ["???",[["MOVMSKPS","MOVMSKPS","",""],["MOVMSKPD","MOVMSKPD","",""],"???","???"]]; - Mnemonics[0x151] = ["SQRTPS","SQRTPD","SQRTSS","SQRTSD"]; - Mnemonics[0x152] = [["RSQRTPS","RSQRTPS","",""],"???",["RSQRTSS","RSQRTSS","",""],"???"]; - Mnemonics[0x154] = ["ANDPS","ANDPD","???","???"]; - Mnemonics[0x155] = ["ANDNPS","ANDNPD","???","???"]; - Mnemonics[0x158] = [["ADDPS","ADDPS","ADDPS","ADDPS"],["ADDPD","ADDPD","ADDPD","ADDPD"],"ADDSS","ADDSD"]; - Mnemonics[0x159] = [["MULPS","MULPS","MULPS","MULPS"],["MULPD","MULPD","MULPD","MULPD"],"MULSS","MULSD"]; - Mnemonics[0x15A] = [["CVTPS2PD","CVTPS2PD","CVTPS2PD","CVTPS2PD"],["CVTPD2PS","CVTPD2PS","CVTPD2PS","CVTPD2PS"],"CVTSS2SD","CVTSD2SS"]; - Mnemonics[0x15B] = [[["CVTDQ2PS","","CVTQQ2PS"],"CVTPS2DQ",""],"???","CVTTPS2DQ","???"]; - Mnemonics[0x15C] = [["SUBPS","SUBPS","SUBPS","SUBPS"],["SUBPD","SUBPD","SUBPD","SUBPD"],"SUBSS","SUBSD"]; - Mnemonics[0x15D] = ["MINPS","MINPD","MINSS","MINSD"]; - Mnemonics[0x15E] = ["DIVPS","DIVPD","DIVSS","DIVSD"]; - Mnemonics[0x178] = [["VMREAD","",["CVTTPS2UDQ","","CVTTPD2UDQ"],""],["EXTRQ","",["CVTTPS2UQQ","","CVTTPD2UQQ"],""],["???","","CVTTSS2USI",""],["INSERTQ","","CVTTSD2USI",""]]; - Mnemonics[0x179] = [["VMWRITE","",["CVTPS2UDQ","","CVTPD2UDQ"],""],["EXTRQ","",["CVTPS2UQQ","","CVTPD2UQQ"],""],["???","","CVTSS2USI",""],["INSERTQ","","CVTSD2USI",""]]; - Mnemonics[0x17A] = ["???",["","",["CVTTPS2QQ","","CVTTPD2QQ"],""],["","",["CVTUDQ2PD","","CVTUQQ2PD"],"CVTUDQ2PD"],["","",["CVTUDQ2PS","","CVTUQQ2PS"],""]]; - Mnemonics[0x17B] = ["???",["","",["CVTPS2QQ","","CVTPD2QQ"],""],["","","CVTUSI2SS",""],["","","CVTUSI2SD",""]]; - Mnemonics[0x17C] = ["???",["HADDPD","HADDPD","",""],"???",["HADDPS","HADDPS","",""]]; - Mnemonics[0x17D] = ["???",["HSUBPD","HSUBPD","",""],"???",["HSUBPS","HSUBPS","",""]]; - Mnemonics[0x17E] = [["MOVD","","",""],["MOVD","","MOVQ"],["MOVQ","MOVQ",["???","","MOVQ"],""],"???"], - Mnemonics[0x190] = [["SETO",["KMOVW","","KMOVQ"],"",""],["SETO",["KMOVB","","KMOVD"],"",""],"",""]; - Mnemonics[0x192] = [["SETB",["KMOVW","","???"],"",""],["SETB",["KMOVB","","???"],"",""],"",["SETB",["KMOVD","","KMOVQ"],"",""]]; - Mnemonics[0x193] = [["SETAE",["KMOVW","","???"],"",""],["SETAE",["KMOVB","","???"],"",""],"",["SETAE",["KMOVD","","KMOVQ"],"",""]]; - Mnemonics[0x198] = [["SETS",["KORTESTW","","KORTESTQ"],"",""],["SETS",["KORTESTB","","KORTESTD"],"",""],"",""]; - Mnemonics[0x1A6] = "XBTS"; - Mnemonics[0x1A7] = "IBTS"; +export function CompatibilityMode(type) { + //Reset the changeable sections of the Mnemonics array, and operand encoding array. - Operands[0x110] = [["0B700770","0B700770","0A040603","0A040609"],["0B700770","0B700770","0A0412040604","0A0412040604"]]; - Operands[0x111] = [["07700B70","07700B70","06030A04","06090A04"],["07700B70","07700B70","060412040A04","060412040A04"]]; - Operands[0x112] = [["0A0412040606","0A0412040606","0B700770","0B700768"],["0A0412040604","","0B700770","0B700770"]]; - Operands[0x113] = [["06060A04","06060A04","",""],""]; - Operands[0x141] = [["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"",""]; - Operands[0x142] = [["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"",""]; - Operands[0x144] = [["0B0E070E0180",["0A0F06FF","","0A0F06FF"],"",""],["0B0E070E0180",["0A0F06FF","","0A0F06FF"],"",""],"",""]; - Operands[0x145] = [["0A02070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],["0A02070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"",""]; - Operands[0x146] = [["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"",""]; - Operands[0x147] = [["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],["0B0E070E0180",["0A0F120F06FF","",""],"",""],"",""]; - Operands[0x150] = ["",[["0B0C0648","0B0C0730","",""],["0B0C0648","0B0C0730","",""],"",""]]; - Operands[0x151] = ["0B7007700112","0B7007700112","0A04120406430102","0A04120406490102"]; - Operands[0x152] = [["0A040648","0A040648","",""],"",["0A040643","0A0412040643","",""],""]; - Operands[0x154] = ["0B70137007700110","0B70137007700110","",""]; - Operands[0x155] = ["0B70137007700110","0B70137007700110","",""]; - Operands[0x158] = [["0A040648","0B3013300730","0B70137007700112","0A061206066C0172"],["0A040648","0B3013300730","0B70137007700112","0A061206066C0112"],"0A04120406430102","0A04120406460102"]; - Operands[0x159] = [["0A040648","0B3013300730","0B70137007700112","0A061206066C0172"],["0A040648","0B3013300730","0B70137007700112","0A061206066C0112"],"0A04120406430102","0A04120406460102"]; - Operands[0x15A] = [["0A040648","0B300718","0B7007380111","0A06065A0111"],["0A040648","0B180730","0B3807700112","0A05066C0112"],"0A04120406430101","0A04120406460102"]; - Operands[0x15B] = [[["0B7007700112","","0B380770011A"],"0B700770011A","",""],"","0B7007700111",""]; - Operands[0x15C] = [["0A060648","0B3013300730","0B70137007700112","0A061206066C0172"],["0A060648","0B3013300730","0B70137007700112","0A061206066C0112"],"0A04120406430102","0A04120406460102"]; - Operands[0x15D] = ["0B70137007700111","0B70137007700111","0A04120406430101","0A04120406460101"]; - Operands[0x15E] = ["0B70137007700112","0B70137007700112","0A04120406430102","0A04120406460102"]; - Operands[0x178] = [["07080B080180","",["0B7007700111","","0B3807700119"],""],["064F0C000C00","",["0B7007380119","","0B7007700111"],""],["","","0B0C06440109",""],["0A04064F0C000C00","","0B0C06460109",""]]; - Operands[0x179] = [["0B0807080180","",["0B7007700112","","0B380770011A"],""],["0A04064F","",["0B700738011A","","0B7007700112"],""],["","","0B0C0644010A",""],["0A04064F","","0B0C0646010A",""]]; - Operands[0x17A] = ["",["","",["0B7007380119","","0B7007700111"],""],["","",["0B7007380112","","0B700770011A"],"0A06065A0112"],["","",["0B700770011A","","0B3807700112"],""]]; - Operands[0x17B] = ["",["","",["0B700738011A","","0B7007700112"],""],["","","0A041204070C010A",""],["","","0A041204070C010A",""]]; - Operands[0x17C] = ["",["0A040604","0B7013700770","",""],"",["0A040604","0B7013700770","",""]]; - Operands[0x17D] = ["",["0A040604","0B7013700770","",""],"",["0A040604","0B7013700770","",""]]; - Operands[0x17E] = [["070C0A0A","","",""],["06240A040108","","06360A040108"],["0A040646","0A040646",["","","0A0406460108"],""],""]; - Operands[0x190] = [["0600",["0A0F0612","","0A0F0636"],"",""],["0600",["0A0F0600","","0A0F0624"],"",""],"",""]; - Operands[0x192] = [["0600",["0A0F06F4","",""],"",""],["0600",["0A0F06F4","",""],"",""],"",["0600",["0A0F06F6","","0A0F06F6"],"",""]]; - Operands[0x193] = [["0600",["06F40A0F","",""],"",""],["0600",["06F40A0F","",""],"",""],"",["0600",["06F60A0F","","06F60A0F"],"",""]]; - Operands[0x198] = [["0600",["0A0F06FF","","0A0F06FF"],"",""],["0600",["0A0F06FF","","0A0F06FF"],"",""],"",""]; - Operands[0x1A6] = "0B0E070E"; - Operands[0x1A7] = "070E0B0E"; - - //Adjust the VEX mask instructions for K1OM (Knights corner) which conflict with the enhanced AVX512 versions. - - if( type === 1 ) - { - Mnemonics[0x141] = [["CMOVNO","KAND","",""],"","",""]; - Mnemonics[0x142] = [["CMOVB","KANDN","",""],"","",""]; - Mnemonics[0x144] = [["CMOVE","KNOT","",""],"","",""]; - Mnemonics[0x145] = [["CMOVNE","KOR","",""],"","",""]; - Mnemonics[0x146] = [["CMOVBE","KXNOR","",""],"","",""]; - Mnemonics[0x147] = [["CMOVA","KXOR","",""],"","",""]; - Mnemonics[0x190] = [["SETO","KMOV","",""],"","",""]; - Mnemonics[0x192] = [["SETB","KMOV","",""],"","",""]; - Mnemonics[0x193] = [["SETAE","KMOV","",""],"","",""]; - Mnemonics[0x198] = [["SETS","KORTEST","",""],"","",""]; - Operands[0x141] = [["0B0E070E0180","0A0F06FF","",""],"","",""]; - Operands[0x142] = [["0B0E070E0180","0A0F06FF","",""],"","",""]; - Operands[0x144] = [["0B0E070E0180","0A0F06FF","",""],"","",""]; - Operands[0x145] = [["0A02070E0180","0A0F06FF","",""],"","",""]; - Operands[0x146] = [["0B0E070E0180","0A0F06FF","",""],"","",""]; - Operands[0x147] = [["0B0E070E0180","0A0F06FF","",""],"","",""]; - Operands[0x190] = [["0600","0A0F06FF","",""],"","",""]; - Operands[0x192] = [["0600","06FF0B06","",""],"","",""]; - Operands[0x193] = [["0600","07060A0F","",""],"","",""]; - Operands[0x198] = [["0600","0A0F06FF","",""],"","",""]; - } - - //Disable Knights corner, and AVX512, for L1OM (Intel Larrabee). - - if( type === 2 ) - { - Mnemonics[0x62] = ""; - } - - //Adjust the Mnemonics, and Operand encoding, for the Cyrix processors. - - if( type === 3 ) - { - Mnemonics[0x138] = "SMINT"; Mnemonics[0x13A] = "BB0_RESET"; Mnemonics[0x13B] = "BB1_RESET"; Mnemonics[0x13C] = "CPU_WRITE"; Mnemonics[0x13D] = "CPU_READ"; - Mnemonics[0x150] = "PAVEB"; Mnemonics[0x151] = "PADDSIW"; Mnemonics[0x152] = "PMAGW"; - Mnemonics[0x154] = "PDISTIB"; Mnemonics[0x155] = "PSUBSIW"; - Mnemonics[0x158] = "PMVZB"; Mnemonics[0x159] = "PMULHRW"; Mnemonics[0x15A] = "PMVNZB"; - Mnemonics[0x15B] = "PMVLZB"; Mnemonics[0x15C] = "PMVGEZB"; Mnemonics[0x15D] = "PMULHRIW"; - Mnemonics[0x15E] = "PMACHRIW"; - Mnemonics[0x178] = "SVDC"; Mnemonics[0x179] = "RSDC"; Mnemonics[0x17A] = "SVLDT"; - Mnemonics[0x17B] = "RSLDT"; Mnemonics[0x17C] = "SVTS"; Mnemonics[0x17D] = "RSTS"; - Mnemonics[0x17E] = "SMINT"; - Operands[0x150] = "0A0A06A9"; Operands[0x151] = "0A0A06A9"; Mnemonics[0x152] = "0A0A06A9"; - Operands[0x154] = "0A0A06AF"; Operands[0x155] = "0A0A06A9"; - Operands[0x158] = "0A0A06AF"; Operands[0x159] = "0A0A06A9"; Mnemonics[0x15A] = "0A0A06AF"; - Operands[0x15B] = "0A0A06AF"; Operands[0x15C] = "0A0A06AF"; Mnemonics[0x15D] = "0A0A06A9"; - Operands[0x15E] = "0A0A06AF"; - Operands[0x178] = "30000A08"; Operands[0x179] = "0A083000"; Operands[0x17A] = "3000"; - Operands[0x17B] = "3000"; Operands[0x17C] = "3000"; Operands[0x17D] = "3000"; - Operands[0x17E] = ""; - } - - //Adjust the Mnemonics, and Operand encoding, for the Geode processor. - - if( type === 4 ) - { - Mnemonics[0x138] = "SMINT"; Mnemonics[0x139] = "DMINT"; Mnemonics[0x13A] = "RDM"; - } - - //Adjust the Mnemonics, for the Centaur processor. - - if( type === 5 ) - { - Mnemonics[0x13F] = "ALTINST"; - Mnemonics[0x1A6] = ["???",["MONTMUL","XSA1","XSA256","???","???","???","???","???"]]; - Mnemonics[0x1A7] = [ - "???", - [ - "XSTORE", - ["???","???","XCRYPT-ECB","???"], - ["???","???","XCRYPT-CBC","???"], - ["???","???","XCRYPT-CTR","???"], - ["???","???","XCRYPT-CFB","???"], - ["???","???","XCRYPT-OFB","???"], - "???", - "???" - ] + Mnemonics[0x062] = ["BOUND", "BOUND", ""]; + Mnemonics[0x110] = [ + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"] ]; - Operands[0x1A6] = ["",["","","","","","","",""]]; - Operands[0x1A7] = [ - "", - [ - "", - ["","","",""], - ["","","",""], - ["","","",""], - ["","","",""], - ["","","",""], + Mnemonics[0x111] = [ + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"] + ]; + Mnemonics[0x112] = [ + ["MOVLPS", "MOVLPD", "MOVSLDUP", "MOVDDUP"], + ["MOVHLPS", "???", "MOVSLDUP", "MOVDDUP"] + ]; + Mnemonics[0x113] = [["MOVLPS", "MOVLPD", "???", "???"], "???"]; + Mnemonics[0x138] = ""; + Mnemonics[0x139] = "???"; + Mnemonics[0x13a] = ""; + Mnemonics[0x13b] = "???"; + Mnemonics[0x13c] = "???"; + Mnemonics[0x13d] = "???"; + Mnemonics[0x13f] = "???"; + Mnemonics[0x141] = [["CMOVNO", ["KANDW", "", "KANDQ"], "", ""], ["CMOVNO", ["KANDB", "", "KANDD"], "", ""], "", ""]; + Mnemonics[0x142] = [ + ["CMOVB", ["KANDNW", "", "KANDNQ"], "", ""], + ["CMOVB", ["KANDNB", "", "KANDND"], "", ""], "", "" - ] ]; - } - - //Adjust the Mnemonics, for the X86/486 processor and older. - - if( type === 6 ) - { - Mnemonics[0x110] = "UMOV"; Mnemonics[0x111] = "UMOV"; Mnemonics[0x112] = "UMOV"; Mnemonics[0x113] = "UMOV"; - Mnemonics[0x1A6] = "CMPXCHG"; Mnemonics[0x1A7] = "CMPXCHG"; - Operands[0x110] = "06000A00"; Operands[0x111] = "070E0B0E"; Operands[0x112] = "0A000600"; Operands[0x113] = "0B0E070E"; - Operands[0x1A6] = ""; Operands[0x1A7] = ""; - } - + Mnemonics[0x144] = [["CMOVE", ["KNOTW", "", "KNOTQ"], "", ""], ["CMOVE", ["KNOTB", "", "KNOTD"], "", ""], "", ""]; + Mnemonics[0x145] = [["CMOVNE", ["KORW", "", "KORQ"], "", ""], ["CMOVNE", ["KORB", "", "KORD"], "", ""], "", ""]; + Mnemonics[0x146] = [ + ["CMOVBE", ["KXNORW", "", "KXNORQ"], "", ""], + ["CMOVBE", ["KXNORB", "", "KXNORD"], "", ""], + "", + "" + ]; + Mnemonics[0x147] = [["CMOVA", ["KXORW", "", "KXORQ"], "", ""], ["CMOVA", ["KXORB", "", "KXORD"], "", ""], "", ""]; + Mnemonics[0x150] = ["???", [["MOVMSKPS", "MOVMSKPS", "", ""], ["MOVMSKPD", "MOVMSKPD", "", ""], "???", "???"]]; + Mnemonics[0x151] = ["SQRTPS", "SQRTPD", "SQRTSS", "SQRTSD"]; + Mnemonics[0x152] = [["RSQRTPS", "RSQRTPS", "", ""], "???", ["RSQRTSS", "RSQRTSS", "", ""], "???"]; + Mnemonics[0x154] = ["ANDPS", "ANDPD", "???", "???"]; + Mnemonics[0x155] = ["ANDNPS", "ANDNPD", "???", "???"]; + Mnemonics[0x158] = [["ADDPS", "ADDPS", "ADDPS", "ADDPS"], ["ADDPD", "ADDPD", "ADDPD", "ADDPD"], "ADDSS", "ADDSD"]; + Mnemonics[0x159] = [["MULPS", "MULPS", "MULPS", "MULPS"], ["MULPD", "MULPD", "MULPD", "MULPD"], "MULSS", "MULSD"]; + Mnemonics[0x15a] = [ + ["CVTPS2PD", "CVTPS2PD", "CVTPS2PD", "CVTPS2PD"], + ["CVTPD2PS", "CVTPD2PS", "CVTPD2PS", "CVTPD2PS"], + "CVTSS2SD", + "CVTSD2SS" + ]; + Mnemonics[0x15b] = [[["CVTDQ2PS", "", "CVTQQ2PS"], "CVTPS2DQ", ""], "???", "CVTTPS2DQ", "???"]; + Mnemonics[0x15c] = [["SUBPS", "SUBPS", "SUBPS", "SUBPS"], ["SUBPD", "SUBPD", "SUBPD", "SUBPD"], "SUBSS", "SUBSD"]; + Mnemonics[0x15d] = ["MINPS", "MINPD", "MINSS", "MINSD"]; + Mnemonics[0x15e] = ["DIVPS", "DIVPD", "DIVSS", "DIVSD"]; + Mnemonics[0x178] = [ + ["VMREAD", "", ["CVTTPS2UDQ", "", "CVTTPD2UDQ"], ""], + ["EXTRQ", "", ["CVTTPS2UQQ", "", "CVTTPD2UQQ"], ""], + ["???", "", "CVTTSS2USI", ""], + ["INSERTQ", "", "CVTTSD2USI", ""] + ]; + Mnemonics[0x179] = [ + ["VMWRITE", "", ["CVTPS2UDQ", "", "CVTPD2UDQ"], ""], + ["EXTRQ", "", ["CVTPS2UQQ", "", "CVTPD2UQQ"], ""], + ["???", "", "CVTSS2USI", ""], + ["INSERTQ", "", "CVTSD2USI", ""] + ]; + Mnemonics[0x17a] = [ + "???", + ["", "", ["CVTTPS2QQ", "", "CVTTPD2QQ"], ""], + ["", "", ["CVTUDQ2PD", "", "CVTUQQ2PD"], "CVTUDQ2PD"], + ["", "", ["CVTUDQ2PS", "", "CVTUQQ2PS"], ""] + ]; + Mnemonics[0x17b] = [ + "???", + ["", "", ["CVTPS2QQ", "", "CVTPD2QQ"], ""], + ["", "", "CVTUSI2SS", ""], + ["", "", "CVTUSI2SD", ""] + ]; + Mnemonics[0x17c] = ["???", ["HADDPD", "HADDPD", "", ""], "???", ["HADDPS", "HADDPS", "", ""]]; + Mnemonics[0x17d] = ["???", ["HSUBPD", "HSUBPD", "", ""], "???", ["HSUBPS", "HSUBPS", "", ""]]; + (Mnemonics[0x17e] = [["MOVD", "", "", ""], ["MOVD", "", "MOVQ"], ["MOVQ", "MOVQ", ["???", "", "MOVQ"], ""], "???"]), + (Mnemonics[0x190] = [ + ["SETO", ["KMOVW", "", "KMOVQ"], "", ""], + ["SETO", ["KMOVB", "", "KMOVD"], "", ""], + "", + "" + ]); + Mnemonics[0x192] = [ + ["SETB", ["KMOVW", "", "???"], "", ""], + ["SETB", ["KMOVB", "", "???"], "", ""], + "", + ["SETB", ["KMOVD", "", "KMOVQ"], "", ""] + ]; + Mnemonics[0x193] = [ + ["SETAE", ["KMOVW", "", "???"], "", ""], + ["SETAE", ["KMOVB", "", "???"], "", ""], + "", + ["SETAE", ["KMOVD", "", "KMOVQ"], "", ""] + ]; + Mnemonics[0x198] = [ + ["SETS", ["KORTESTW", "", "KORTESTQ"], "", ""], + ["SETS", ["KORTESTB", "", "KORTESTD"], "", ""], + "", + "" + ]; + Mnemonics[0x1a6] = "XBTS"; + Mnemonics[0x1a7] = "IBTS"; + + Operands[0x110] = [ + ["0B700770", "0B700770", "0A040603", "0A040609"], + ["0B700770", "0B700770", "0A0412040604", "0A0412040604"] + ]; + Operands[0x111] = [ + ["07700B70", "07700B70", "06030A04", "06090A04"], + ["07700B70", "07700B70", "060412040A04", "060412040A04"] + ]; + Operands[0x112] = [ + ["0A0412040606", "0A0412040606", "0B700770", "0B700768"], + ["0A0412040604", "", "0B700770", "0B700770"] + ]; + Operands[0x113] = [["06060A04", "06060A04", "", ""], ""]; + Operands[0x141] = [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "" + ]; + Operands[0x142] = [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "" + ]; + Operands[0x144] = [ + ["0B0E070E0180", ["0A0F06FF", "", "0A0F06FF"], "", ""], + ["0B0E070E0180", ["0A0F06FF", "", "0A0F06FF"], "", ""], + "", + "" + ]; + Operands[0x145] = [ + ["0A02070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0A02070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "" + ]; + Operands[0x146] = [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "" + ]; + Operands[0x147] = [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", ""], "", ""], + "", + "" + ]; + Operands[0x150] = ["", [["0B0C0648", "0B0C0730", "", ""], ["0B0C0648", "0B0C0730", "", ""], "", ""]]; + Operands[0x151] = ["0B7007700112", "0B7007700112", "0A04120406430102", "0A04120406490102"]; + Operands[0x152] = [["0A040648", "0A040648", "", ""], "", ["0A040643", "0A0412040643", "", ""], ""]; + Operands[0x154] = ["0B70137007700110", "0B70137007700110", "", ""]; + Operands[0x155] = ["0B70137007700110", "0B70137007700110", "", ""]; + Operands[0x158] = [ + ["0A040648", "0B3013300730", "0B70137007700112", "0A061206066C0172"], + ["0A040648", "0B3013300730", "0B70137007700112", "0A061206066C0112"], + "0A04120406430102", + "0A04120406460102" + ]; + Operands[0x159] = [ + ["0A040648", "0B3013300730", "0B70137007700112", "0A061206066C0172"], + ["0A040648", "0B3013300730", "0B70137007700112", "0A061206066C0112"], + "0A04120406430102", + "0A04120406460102" + ]; + Operands[0x15a] = [ + ["0A040648", "0B300718", "0B7007380111", "0A06065A0111"], + ["0A040648", "0B180730", "0B3807700112", "0A05066C0112"], + "0A04120406430101", + "0A04120406460102" + ]; + Operands[0x15b] = [[["0B7007700112", "", "0B380770011A"], "0B700770011A", "", ""], "", "0B7007700111", ""]; + Operands[0x15c] = [ + ["0A060648", "0B3013300730", "0B70137007700112", "0A061206066C0172"], + ["0A060648", "0B3013300730", "0B70137007700112", "0A061206066C0112"], + "0A04120406430102", + "0A04120406460102" + ]; + Operands[0x15d] = ["0B70137007700111", "0B70137007700111", "0A04120406430101", "0A04120406460101"]; + Operands[0x15e] = ["0B70137007700112", "0B70137007700112", "0A04120406430102", "0A04120406460102"]; + Operands[0x178] = [ + ["07080B080180", "", ["0B7007700111", "", "0B3807700119"], ""], + ["064F0C000C00", "", ["0B7007380119", "", "0B7007700111"], ""], + ["", "", "0B0C06440109", ""], + ["0A04064F0C000C00", "", "0B0C06460109", ""] + ]; + Operands[0x179] = [ + ["0B0807080180", "", ["0B7007700112", "", "0B380770011A"], ""], + ["0A04064F", "", ["0B700738011A", "", "0B7007700112"], ""], + ["", "", "0B0C0644010A", ""], + ["0A04064F", "", "0B0C0646010A", ""] + ]; + Operands[0x17a] = [ + "", + ["", "", ["0B7007380119", "", "0B7007700111"], ""], + ["", "", ["0B7007380112", "", "0B700770011A"], "0A06065A0112"], + ["", "", ["0B700770011A", "", "0B3807700112"], ""] + ]; + Operands[0x17b] = [ + "", + ["", "", ["0B700738011A", "", "0B7007700112"], ""], + ["", "", "0A041204070C010A", ""], + ["", "", "0A041204070C010A", ""] + ]; + Operands[0x17c] = ["", ["0A040604", "0B7013700770", "", ""], "", ["0A040604", "0B7013700770", "", ""]]; + Operands[0x17d] = ["", ["0A040604", "0B7013700770", "", ""], "", ["0A040604", "0B7013700770", "", ""]]; + Operands[0x17e] = [ + ["070C0A0A", "", "", ""], + ["06240A040108", "", "06360A040108"], + ["0A040646", "0A040646", ["", "", "0A0406460108"], ""], + "" + ]; + Operands[0x190] = [ + ["0600", ["0A0F0612", "", "0A0F0636"], "", ""], + ["0600", ["0A0F0600", "", "0A0F0624"], "", ""], + "", + "" + ]; + Operands[0x192] = [ + ["0600", ["0A0F06F4", "", ""], "", ""], + ["0600", ["0A0F06F4", "", ""], "", ""], + "", + ["0600", ["0A0F06F6", "", "0A0F06F6"], "", ""] + ]; + Operands[0x193] = [ + ["0600", ["06F40A0F", "", ""], "", ""], + ["0600", ["06F40A0F", "", ""], "", ""], + "", + ["0600", ["06F60A0F", "", "06F60A0F"], "", ""] + ]; + Operands[0x198] = [ + ["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], + ["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], + "", + "" + ]; + Operands[0x1a6] = "0B0E070E"; + Operands[0x1a7] = "070E0B0E"; + + //Adjust the VEX mask instructions for K1OM (Knights corner) which conflict with the enhanced AVX512 versions. + + if (type === 1) { + Mnemonics[0x141] = [["CMOVNO", "KAND", "", ""], "", "", ""]; + Mnemonics[0x142] = [["CMOVB", "KANDN", "", ""], "", "", ""]; + Mnemonics[0x144] = [["CMOVE", "KNOT", "", ""], "", "", ""]; + Mnemonics[0x145] = [["CMOVNE", "KOR", "", ""], "", "", ""]; + Mnemonics[0x146] = [["CMOVBE", "KXNOR", "", ""], "", "", ""]; + Mnemonics[0x147] = [["CMOVA", "KXOR", "", ""], "", "", ""]; + Mnemonics[0x190] = [["SETO", "KMOV", "", ""], "", "", ""]; + Mnemonics[0x192] = [["SETB", "KMOV", "", ""], "", "", ""]; + Mnemonics[0x193] = [["SETAE", "KMOV", "", ""], "", "", ""]; + Mnemonics[0x198] = [["SETS", "KORTEST", "", ""], "", "", ""]; + Operands[0x141] = [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x142] = [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x144] = [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x145] = [["0A02070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x146] = [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x147] = [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x190] = [["0600", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x192] = [["0600", "06FF0B06", "", ""], "", "", ""]; + Operands[0x193] = [["0600", "07060A0F", "", ""], "", "", ""]; + Operands[0x198] = [["0600", "0A0F06FF", "", ""], "", "", ""]; + } + + //Disable Knights corner, and AVX512, for L1OM (Intel Larrabee). + + if (type === 2) { + Mnemonics[0x62] = ""; + } + + //Adjust the Mnemonics, and Operand encoding, for the Cyrix processors. + + if (type === 3) { + Mnemonics[0x138] = "SMINT"; + Mnemonics[0x13a] = "BB0_RESET"; + Mnemonics[0x13b] = "BB1_RESET"; + Mnemonics[0x13c] = "CPU_WRITE"; + Mnemonics[0x13d] = "CPU_READ"; + Mnemonics[0x150] = "PAVEB"; + Mnemonics[0x151] = "PADDSIW"; + Mnemonics[0x152] = "PMAGW"; + Mnemonics[0x154] = "PDISTIB"; + Mnemonics[0x155] = "PSUBSIW"; + Mnemonics[0x158] = "PMVZB"; + Mnemonics[0x159] = "PMULHRW"; + Mnemonics[0x15a] = "PMVNZB"; + Mnemonics[0x15b] = "PMVLZB"; + Mnemonics[0x15c] = "PMVGEZB"; + Mnemonics[0x15d] = "PMULHRIW"; + Mnemonics[0x15e] = "PMACHRIW"; + Mnemonics[0x178] = "SVDC"; + Mnemonics[0x179] = "RSDC"; + Mnemonics[0x17a] = "SVLDT"; + Mnemonics[0x17b] = "RSLDT"; + Mnemonics[0x17c] = "SVTS"; + Mnemonics[0x17d] = "RSTS"; + Mnemonics[0x17e] = "SMINT"; + Operands[0x150] = "0A0A06A9"; + Operands[0x151] = "0A0A06A9"; + Mnemonics[0x152] = "0A0A06A9"; + Operands[0x154] = "0A0A06AF"; + Operands[0x155] = "0A0A06A9"; + Operands[0x158] = "0A0A06AF"; + Operands[0x159] = "0A0A06A9"; + Mnemonics[0x15a] = "0A0A06AF"; + Operands[0x15b] = "0A0A06AF"; + Operands[0x15c] = "0A0A06AF"; + Mnemonics[0x15d] = "0A0A06A9"; + Operands[0x15e] = "0A0A06AF"; + Operands[0x178] = "30000A08"; + Operands[0x179] = "0A083000"; + Operands[0x17a] = "3000"; + Operands[0x17b] = "3000"; + Operands[0x17c] = "3000"; + Operands[0x17d] = "3000"; + Operands[0x17e] = ""; + } + + //Adjust the Mnemonics, and Operand encoding, for the Geode processor. + + if (type === 4) { + Mnemonics[0x138] = "SMINT"; + Mnemonics[0x139] = "DMINT"; + Mnemonics[0x13a] = "RDM"; + } + + //Adjust the Mnemonics, for the Centaur processor. + + if (type === 5) { + Mnemonics[0x13f] = "ALTINST"; + Mnemonics[0x1a6] = ["???", ["MONTMUL", "XSA1", "XSA256", "???", "???", "???", "???", "???"]]; + Mnemonics[0x1a7] = [ + "???", + [ + "XSTORE", + ["???", "???", "XCRYPT-ECB", "???"], + ["???", "???", "XCRYPT-CBC", "???"], + ["???", "???", "XCRYPT-CTR", "???"], + ["???", "???", "XCRYPT-CFB", "???"], + ["???", "???", "XCRYPT-OFB", "???"], + "???", + "???" + ] + ]; + Operands[0x1a6] = ["", ["", "", "", "", "", "", "", ""]]; + Operands[0x1a7] = [ + "", + ["", ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], "", ""] + ]; + } + + //Adjust the Mnemonics, for the X86/486 processor and older. + + if (type === 6) { + Mnemonics[0x110] = "UMOV"; + Mnemonics[0x111] = "UMOV"; + Mnemonics[0x112] = "UMOV"; + Mnemonics[0x113] = "UMOV"; + Mnemonics[0x1a6] = "CMPXCHG"; + Mnemonics[0x1a7] = "CMPXCHG"; + Operands[0x110] = "06000A00"; + Operands[0x111] = "070E0B0E"; + Operands[0x112] = "0A000600"; + Operands[0x113] = "0B0E070E"; + Operands[0x1a6] = ""; + Operands[0x1a7] = ""; + } } /*------------------------------------------------------------------------------------------------------------------------- @@ -3543,59 +7710,60 @@ The function "GetPosition()" Gives back the current base address in it's proper If the hex input is invalid returns false. -------------------------------------------------------------------------------------------------------------------------*/ -export function LoadBinCode( HexStr ) -{ - //Clear BinCode, and Reset Code Position in Bin Code array. +export function LoadBinCode(HexStr) { + //Clear BinCode, and Reset Code Position in Bin Code array. - BinCode = []; CodePos = 0; + BinCode = []; + CodePos = 0; - //Iterate though the hex string and covert to 0 to 255 byte values into the BinCode array. + //Iterate though the hex string and covert to 0 to 255 byte values into the BinCode array. - var len = HexStr.length; + var len = HexStr.length; - for( var i = 0, el = 0, Sign = 0, int32 = 0; i < len; i += 8 ) - { - //It is faster to read 8 hex digits at a time if possible. + for (var i = 0, el = 0, Sign = 0, int32 = 0; i < len; i += 8) { + //It is faster to read 8 hex digits at a time if possible. - int32 = parseInt( HexStr.slice( i, i + 8 ), 16 ); + int32 = parseInt(HexStr.slice(i, i + 8), 16); - //If input is invalid return false. + //If input is invalid return false. - if( isNaN( int32 ) ){ return ( false ); } + if (isNaN(int32)) { + return false; + } - //If the end of the Hex string is reached and is not 8 digits the number has to be lined up. + //If the end of the Hex string is reached and is not 8 digits the number has to be lined up. - ( ( len - i ) < 8 ) && ( int32 <<= ( 8 - len - i ) << 2 ); + len - i < 8 && (int32 <<= (8 - len - i) << 2); - //The variable sing corrects the unusable sing bits during the 4 byte rotation algorithm. + //The variable sing corrects the unusable sing bits during the 4 byte rotation algorithm. - Sign = int32; + Sign = int32; - //Remove the Sign bit value if active for when the number is changed to int32 during rotation. + //Remove the Sign bit value if active for when the number is changed to int32 during rotation. - int32 ^= int32 & 0x80000000; + int32 ^= int32 & 0x80000000; - //Rotate the 32 bit int so that each number is put in order in the BinCode array. Add the Sign Bit positions back though each rotation. + //Rotate the 32 bit int so that each number is put in order in the BinCode array. Add the Sign Bit positions back though each rotation. - int32 = ( int32 >> 24 ) | ( ( int32 << 8 ) & 0x7FFFFFFF ); - BinCode[el++] = ( ( ( Sign >> 24 ) & 0x80 ) | int32 ) & 0xFF; - int32 = ( int32 >> 24 ) | ( ( int32 << 8 ) & 0x7FFFFFFF ); - BinCode[el++] = ( ( ( Sign >> 16 ) & 0x80 ) | int32 ) & 0xFF; - int32 = ( int32 >> 24 ) | ( ( int32 << 8 ) & 0x7FFFFFFF ); - BinCode[el++] = ( ( ( Sign >> 8 ) & 0x80 ) | int32 ) & 0xFF; - int32 = ( int32 >> 24 ) | ( ( int32 << 8 ) & 0x7FFFFFFF ); - BinCode[el++] = ( ( Sign & 0x80 ) | int32 ) & 0xFF; - } + int32 = (int32 >> 24) | ((int32 << 8) & 0x7fffffff); + BinCode[el++] = (((Sign >> 24) & 0x80) | int32) & 0xff; + int32 = (int32 >> 24) | ((int32 << 8) & 0x7fffffff); + BinCode[el++] = (((Sign >> 16) & 0x80) | int32) & 0xff; + int32 = (int32 >> 24) | ((int32 << 8) & 0x7fffffff); + BinCode[el++] = (((Sign >> 8) & 0x80) | int32) & 0xff; + int32 = (int32 >> 24) | ((int32 << 8) & 0x7fffffff); + BinCode[el++] = ((Sign & 0x80) | int32) & 0xff; + } - //Remove elements past the Number of bytes in HexStr because int 32 is always 4 bytes it is possible to end in an uneven number. + //Remove elements past the Number of bytes in HexStr because int 32 is always 4 bytes it is possible to end in an uneven number. - len >>= 1; + len >>= 1; - for(; len < BinCode.length; BinCode.pop() ); + for (; len < BinCode.length; BinCode.pop()); - //Return true for that the binary code loaded properly. + //Return true for that the binary code loaded properly. - return ( true ); + return true; } /*------------------------------------------------------------------------------------------------------------------------- @@ -3605,25 +7773,24 @@ This function also moves the binary code array position CodePos by one basically disassembler as it is decoding a sequence of bytes. -------------------------------------------------------------------------------------------------------------------------*/ -function NextByte() -{ - //Add the current byte as hex to InstructionHex which will be displayed beside the decoded instruction. - //After an instruction decodes InstructionHex is only added beside the instruction if ShowInstructionHex is active. - var t; - if ( CodePos < BinCode.length ) //If not out of bounds. - { - //Convert current byte to String, and pad. +function NextByte() { + //Add the current byte as hex to InstructionHex which will be displayed beside the decoded instruction. + //After an instruction decodes InstructionHex is only added beside the instruction if ShowInstructionHex is active. + var t; + if (CodePos < BinCode.length) { + //If not out of bounds. + //Convert current byte to String, and pad. - ( ( t = BinCode[CodePos++].toString(16) ).length === 1) && ( t = "0" + t ); + (t = BinCode[CodePos++].toString(16)).length === 1 && (t = "0" + t); - //Add it to the current bytes used for the decode instruction. + //Add it to the current bytes used for the decode instruction. - InstructionHex += t; + InstructionHex += t; - //Continue the Base address. + //Continue the Base address. - ( ( Pos32 += 1 ) > 0xFFFFFFFF ) && ( Pos32 = 0, ( ( Pos64 += 1 ) > 0xFFFFFFFF ) && ( Pos64 = 0 ) ); - } + (Pos32 += 1) > 0xffffffff && ((Pos32 = 0), (Pos64 += 1) > 0xffffffff && (Pos64 = 0)); + } } /*------------------------------------------------------------------------------------------------------------------------- @@ -3632,27 +7799,36 @@ segment, and offset address. Note that the Code Segment is used in 16 bit code. if set 36, or higher. Effects instruction location in memory when decoding a program. -------------------------------------------------------------------------------------------------------------------------*/ -export function SetBasePosition( Address ) -{ - //Split the Segment:offset. +export function SetBasePosition(Address) { + //Split the Segment:offset. - var t = Address.split(":"); + var t = Address.split(":"); - //Set the 16 bit code segment position if there is one. + //Set the 16 bit code segment position if there is one. - if ( typeof t[1] !== "undefined" ){ CodeSeg = parseInt( t[0].slice( t[0].length - 4 ), 16 ); Address = t[1]; } + if (typeof t[1] !== "undefined") { + CodeSeg = parseInt(t[0].slice(t[0].length - 4), 16); + Address = t[1]; + } - //Adjust the Instruction pointer 16(IP)/32(EIP)/64(RIP). Also varies based on Bit Mode. + //Adjust the Instruction pointer 16(IP)/32(EIP)/64(RIP). Also varies based on Bit Mode. - var Len = Address.length; + var Len = Address.length; - if( Len >= 9 && BitMode == 2 ){ Pos64 = parseInt( Address.slice( Len - 16, Len - 8 ), 16 ); } - if( Len >= 5 && BitMode >= 1 && !( BitMode == 1 & CodeSeg >= 36 ) ){ Pos32 = parseInt( Address.slice( Len - 8 ), 16 ); } - else if( Len >= 1 && BitMode >= 0 ){ Pos32 = ( Pos32 & 0xFFFF0000 ) | ( parseInt( Address.slice( Len - 4 ), 16 ) ); } + if (Len >= 9 && BitMode == 2) { + Pos64 = parseInt(Address.slice(Len - 16, Len - 8), 16); + } + if (Len >= 5 && BitMode >= 1 && !((BitMode == 1) & (CodeSeg >= 36))) { + Pos32 = parseInt(Address.slice(Len - 8), 16); + } else if (Len >= 1 && BitMode >= 0) { + Pos32 = (Pos32 & 0xffff0000) | parseInt(Address.slice(Len - 4), 16); + } - //Convert Pos32 to undignified integer. + //Convert Pos32 to undignified integer. - if ( Pos32 < 0 ) { Pos32 += 0x100000000; } + if (Pos32 < 0) { + Pos32 += 0x100000000; + } } /*------------------------------------------------------------------------------------------------------------------------- @@ -3661,124 +7837,115 @@ In 16 bit an instruction location is Bound to the code segment location in memor In 32 bit an instruction location uses the first 32 bit's of the instruction pointer. -------------------------------------------------------------------------------------------------------------------------*/ -function GetPosition() -{ - //If 16 bit Seg:Offset, or if 32 bit and CodeSeg is 36, or higher. +function GetPosition() { + //If 16 bit Seg:Offset, or if 32 bit and CodeSeg is 36, or higher. - if( BitMode === 0 | ( BitMode === 1 & CodeSeg >= 36 ) ) - { - for ( var S16 = ( Pos32 & 0xFFFF ).toString(16); S16.length < 4; S16 = "0" + S16 ); - for ( var Seg = ( CodeSeg ).toString(16); Seg.length < 4; Seg = "0" + Seg ); - return( ( Seg + ":" + S16 ).toUpperCase() ); - } + if ((BitMode === 0) | ((BitMode === 1) & (CodeSeg >= 36))) { + for (var S16 = (Pos32 & 0xffff).toString(16); S16.length < 4; S16 = "0" + S16); + for (var Seg = CodeSeg.toString(16); Seg.length < 4; Seg = "0" + Seg); + return (Seg + ":" + S16).toUpperCase(); + } - //32 bit, and 64 bit section. + //32 bit, and 64 bit section. - var S64="", S32=""; + var S64 = "", + S32 = ""; - //If 32 bit or higher. + //If 32 bit or higher. - if( BitMode >= 1 ) - { - for ( S32 = Pos32.toString(16); S32.length < 8; S32 = "0" + S32 ); - } + if (BitMode >= 1) { + for (S32 = Pos32.toString(16); S32.length < 8; S32 = "0" + S32); + } - //If 64 bit. + //If 64 bit. - if( BitMode === 2 ) - { - for ( S64 = Pos64.toString(16); S64.length < 8; S64 = "0" + S64 ); - } + if (BitMode === 2) { + for (S64 = Pos64.toString(16); S64.length < 8; S64 = "0" + S64); + } - //Return the 32/64 address. + //Return the 32/64 address. - return ( ( S64 + S32 ).toUpperCase() ); + return (S64 + S32).toUpperCase(); } /*------------------------------------------------------------------------------------------------------------------------- Moves the dissembler 64 bit address, and CodePos to correct address. Returns false if address location is out of bounds. -------------------------------------------------------------------------------------------------------------------------*/ -function GotoPosition( Address ) -{ - //Current address location. +function GotoPosition(Address) { + //Current address location. - var LocPos32 = Pos32; - var LocPos64 = Pos64; - var LocCodeSeg = CodeSeg; + var LocPos32 = Pos32; + var LocPos64 = Pos64; + var LocCodeSeg = CodeSeg; - //Split the by Segment:offset address format. + //Split the by Segment:offset address format. - var t = Address.split(":"); + var t = Address.split(":"); - //Set the 16 bit code segment location if there is one. + //Set the 16 bit code segment location if there is one. - if ( typeof t[1] !== "undefined" ) - { - LocCodeSeg = parseInt(t[0].slice( t[0].length - 4 ), 16); - Address = t[1]; - } + if (typeof t[1] !== "undefined") { + LocCodeSeg = parseInt(t[0].slice(t[0].length - 4), 16); + Address = t[1]; + } - var len = Address.length; + var len = Address.length; - //If the address is 64 bit's long, and bit mode is 64 bit adjust the 64 bit location. + //If the address is 64 bit's long, and bit mode is 64 bit adjust the 64 bit location. - if( len >= 9 && BitMode === 2 ) - { - LocPos64 = parseInt( Address.slice( len - 16, len - 8 ), 16 ); - } + if (len >= 9 && BitMode === 2) { + LocPos64 = parseInt(Address.slice(len - 16, len - 8), 16); + } - //If the address is 32 bit's long, and bit mode is 32 bit, or higher adjust the 32 bit location. + //If the address is 32 bit's long, and bit mode is 32 bit, or higher adjust the 32 bit location. - if( len >= 5 && BitMode >= 1 & !( BitMode === 1 & CodeSeg >= 36 ) ) - { - LocPos32 = parseInt( Address.slice( len - 8 ), 16 ); - } + if (len >= 5 && (BitMode >= 1) & !((BitMode === 1) & (CodeSeg >= 36))) { + LocPos32 = parseInt(Address.slice(len - 8), 16); + } - //Else If the address is 16 bit's long, and bit mode is 16 bit, or higher adjust the first 16 bit's in location 32. + //Else If the address is 16 bit's long, and bit mode is 16 bit, or higher adjust the first 16 bit's in location 32. + else if (len >= 1 && BitMode >= 0) { + LocPos32 = LocPos32 - LocPos32 + parseInt(Address.slice(len - 4), 16); + } - else if( len >= 1 && BitMode >= 0 ) - { - LocPos32 = ( LocPos32 - LocPos32 + parseInt( Address.slice( len - 4 ), 16 ) ); - } + //Find the difference between the current base address and the selected address location. - //Find the difference between the current base address and the selected address location. + var Dif32 = Pos32 - LocPos32, + Dif64 = Pos64 - LocPos64; - var Dif32 = Pos32 - LocPos32, Dif64 = Pos64 - LocPos64; + //Only calculate the Code Segment location if The program uses 16 bit address mode otherwise the + //code segment does not affect the address location. - //Only calculate the Code Segment location if The program uses 16 bit address mode otherwise the - //code segment does not affect the address location. + if ((BitMode === 1) & (CodeSeg >= 36) || BitMode === 0) { + Dif32 += (CodeSeg - LocCodeSeg) << 4; + } - if( ( BitMode === 1 & CodeSeg >= 36 ) || BitMode === 0 ) - { - Dif32 += ( CodeSeg - LocCodeSeg ) << 4; - } + //Before adjusting the Code Position Backup the Code Position in case that the address is out of bounds. - //Before adjusting the Code Position Backup the Code Position in case that the address is out of bounds. + t = CodePos; - t = CodePos; + //Subtract the difference to the CodePos position. - //Subtract the difference to the CodePos position. + CodePos -= Dif64 * 4294967296 + Dif32; - CodePos -= Dif64 * 4294967296 + Dif32; + //If code position is out of bound for the loaded binary in the BinCode array, or + //is a negative index return false and reset CodePos. - //If code position is out of bound for the loaded binary in the BinCode array, or - //is a negative index return false and reset CodePos. + if (CodePos < 0 || CodePos > BinCode.length) { + CodePos = t; + return false; + } - if( CodePos < 0 || CodePos > BinCode.length ) - { - CodePos = t; return ( false ); - } + //Set the base address so that it matches the Selected address location that Code position is moved to in relative space in the BinCode Array. - //Set the base address so that it matches the Selected address location that Code position is moved to in relative space in the BinCode Array. + CodeSeg = LocCodeSeg; + Pos32 = LocPos32; + Pos64 = LocPos64; - CodeSeg = LocCodeSeg; - Pos32 = LocPos32 - Pos64 = LocPos64; + //Return true for that the address Position is moved in range correctly. - //Return true for that the address Position is moved in range correctly. - - return ( true ); + return true; } /*------------------------------------------------------------------------------------------------------------------------- @@ -3793,107 +7960,129 @@ from this function Lines up With the Pinter array, and Register array indexes fo The variable SizeAttrSelect is separate from this function it is adjusted by prefixes that adjust Vector size, and General purpose registers. -------------------------------------------------------------------------------------------------------------------------*/ -function GetOperandSize( SizeAttribute ) -{ - /*---------------------------------------------------------------------------------------------------------------------------------------- +function GetOperandSize(SizeAttribute) { + /*---------------------------------------------------------------------------------------------------------------------------------------- Each S value goes in order to the vector length value in EVEX, and VEX Smallest to biggest in perfect alignment. SizeAttrSelect is set 1 by default, unless it is set 0 to 3 by the vector length bit's in the EVEX prefix, or 0 to 1 in the VEX prefix. In which if it is not an Vector instruction S2 acts as the mid default size attribute in 32 bit mode, and 64 bit mode for all instructions. ----------------------------------------------------------------------------------------------------------------------------------------*/ - var S4 = 0, S3 = 0, S2 = 0, S1 = 0, S0 = -1; //Note S0 is Vector size 1024, which is unused. + var S4 = 0, + S3 = 0, + S2 = 0, + S1 = 0, + S0 = -1; //Note S0 is Vector size 1024, which is unused. - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Lookup the Highest active bit in the SizeAttribute value giving the position the bit is in the number. S1 will be the biggest size attribute. In which this size attribute is only used when the extended size is active from the Rex prefix using the W (width) bit setting. In which sets variable SizeAttrSelect to 2 in value when the Width bit prefix setting is decoded, or if it is an Vector this is the Max vector size 512 in which when the EVEX.L'L bit's are set 10 = 2 sets SizeAttrSelect 2, note 11 = 3 is reserved for vectors 1024 in size. ----------------------------------------------------------------------------------------------------------------------------------------*/ - S1 = SizeAttribute; S1 = ( ( S1 & 0xF0 ) !== 0 ? ( S1 >>= 4, 4 ) : 0 ) | ( ( S1 & 0xC ) !== 0 ? ( S1 >>= 2, 2 ) : 0 ) | ( ( S1 >>= 1 ) !== 0 ); + S1 = SizeAttribute; + S1 = ((S1 & 0xf0) !== 0 ? ((S1 >>= 4), 4) : 0) | ((S1 & 0xc) !== 0 ? ((S1 >>= 2), 2) : 0) | ((S1 >>= 1) !== 0); - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- If there is no size attributes then set S1 to -1 then the rest are set to S1 as they should have no size setting. ----------------------------------------------------------------------------------------------------------------------------------------*/ - if( SizeAttribute === 0 ) { S1 = -1; } + if (SizeAttribute === 0) { + S1 = -1; + } - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Convert the Bit Position of S1 into it's value and remove it by subtracting it into the SizeAttribute settings. ----------------------------------------------------------------------------------------------------------------------------------------*/ - SizeAttribute -= ( 1 << S1 ); + SizeAttribute -= 1 << S1; - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Lookup the Highest Second active bit in the SizeAttribute value giving the position the bit is in the number. In which S2 will be the default size attribute when SizeAttrSelect is 1 and has not been changed by prefixes, or If this is an vector SizeAttrSelect is set one by the EVEX.L'L bit's 01 = 1, or VEX.L is active 1 = 1 in which the Mid vector size is used. In which 256 is the Mid vector size some vectors are smaller some go 64/128/256 in which the mid size is 128. ----------------------------------------------------------------------------------------------------------------------------------------*/ - S2 = SizeAttribute; S2 = ( ( S2 & 0xF0 ) !== 0 ? ( S2 >>= 4, 4 ) : 0 ) | ( ( S2 & 0xC ) !== 0 ? ( S2 >>= 2, 2 ) : 0 ) | ( ( S2 >>= 1 ) !== 0 ); + S2 = SizeAttribute; + S2 = ((S2 & 0xf0) !== 0 ? ((S2 >>= 4), 4) : 0) | ((S2 & 0xc) !== 0 ? ((S2 >>= 2), 2) : 0) | ((S2 >>= 1) !== 0); - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Convert the Bit Position of S2 into it's value and remove it by subtracting it if it is not 0. ----------------------------------------------------------------------------------------------------------------------------------------*/ - if( S2 !== 0 ) { SizeAttribute -= ( 1 << S2 ); } - - /*---------------------------------------------------------------------------------------------------------------------------------------- + if (S2 !== 0) { + SizeAttribute -= 1 << S2; + } else { + /*---------------------------------------------------------------------------------------------------------------------------------------- If it is 0 The highest size attribute is set as the default operand size. So S2 is aliased to S1, if there is no other Size setting attributes. ----------------------------------------------------------------------------------------------------------------------------------------*/ + S2 = S1; + } - else { S2 = S1; } - - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Lookup the Highest third active bit in the SizeAttribute value giving the position the bit is in the number. The third Size is only used if the Operand override prefix is used setting SizeAttrSelect to 0, or if this is an vector the EVEX.L'L bit's are 00 = 0 sets SizeAttrSelect 0, or VEX.L = 0 in which SizeAttrSelect is 0 using the smallest vector size. ----------------------------------------------------------------------------------------------------------------------------------------*/ - S3 = SizeAttribute; S3 = ( ( S3 & 0xF0 ) !== 0 ? ( S3 >>= 4, 4 ) : 0 ) | ( ( S3 & 0xC ) !== 0 ? ( S3 >>= 2, 2 ) : 0 ) | ( ( S3 >>= 1 ) !== 0 ); + S3 = SizeAttribute; + S3 = ((S3 & 0xf0) !== 0 ? ((S3 >>= 4), 4) : 0) | ((S3 & 0xc) !== 0 ? ((S3 >>= 2), 2) : 0) | ((S3 >>= 1) !== 0); - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Convert the Bit Position of S3 into it's value and remove it by subtracting it if it is not 0. ----------------------------------------------------------------------------------------------------------------------------------------*/ - if( S3 !== 0 ) { SizeAttribute -= ( 1 << S3 ); } - - /*---------------------------------------------------------------------------------------------------------------------------------------- + if (S3 !== 0) { + SizeAttribute -= 1 << S3; + } else { + /*---------------------------------------------------------------------------------------------------------------------------------------- If it is 0 The second size attribute is set as the operand size. So S3 is aliased to S2, if there is no other Size setting attributes. ----------------------------------------------------------------------------------------------------------------------------------------*/ + S3 = S2; + if (S2 !== 2) { + S2 = S1; + } + } - else { S3 = S2; if( S2 !== 2 ) { S2 = S1; } }; + //In 32/16 bit mode the operand size must never exceed 32. - //In 32/16 bit mode the operand size must never exceed 32. + if (BitMode <= 1 && S2 >= 3 && !Vect) { + if ((S1 | S2 | S3) === S3) { + S1 = 2; + S3 = 2; + } //If single size all adjust 32. + S2 = 2; //Default operand size 32. + } - if ( BitMode <= 1 && S2 >= 3 && !Vect ) - { - if( ( S1 | S2 | S3 ) === S3 ){ S1 = 2; S3 = 2; } //If single size all adjust 32. - S2 = 2; //Default operand size 32. - } + //In 16 bit mode The operand override is always active until used. This makes all operands 16 bit size. + //When Operand override is used it is the default 32 size. Flip S3 with S2. - //In 16 bit mode The operand override is always active until used. This makes all operands 16 bit size. - //When Operand override is used it is the default 32 size. Flip S3 with S2. + if (BitMode === 0 && !Vect) { + var t = S3; + S3 = S2; + S2 = t; + } - if( BitMode === 0 && !Vect ) { var t = S3; S3 = S2; S2 = t; } + //If an Vect is active, then EVEX.W, VEX.W, or XOP.W bit acts as 32/64. - //If an Vect is active, then EVEX.W, VEX.W, or XOP.W bit acts as 32/64. + if ((Vect || Extension > 0) && (S1 + S2 + S3 === 7) | (S1 + S2 + S3 === 5)) { + Vect = false; + return [S2, S1][WidthBit & 1]; + } - if( ( Vect || Extension > 0 ) && ( ( S1 + S2 + S3 ) === 7 | ( S1 + S2 + S3 ) === 5 ) ) { Vect = false; return( ( [ S2, S1 ] )[ WidthBit & 1 ] ); } + //If it is an vector, and Bround is active vector goes max size. - //If it is an vector, and Bround is active vector goes max size. + if (Vect && ConversionMode === 1) { + S0 = S1; + S3 = S1; + S2 = S1; + } - if( Vect && ConversionMode === 1 ) - { - S0 = S1; S3 = S1; S2 = S1; - } - - //Note the fourth size that is -1 in the returned size attribute is Vector length 11=3 which is invalid unless Intel decides to add 1024 bit vectors. - //The only time S0 is not negative one is if vector broadcast round is active. - - return( ( [ S3, S2, S1, S0 ] )[ SizeAttrSelect ] ); + //Note the fourth size that is -1 in the returned size attribute is Vector length 11=3 which is invalid unless Intel decides to add 1024 bit vectors. + //The only time S0 is not negative one is if vector broadcast round is active. + return [S3, S2, S1, S0][SizeAttrSelect]; } /*------------------------------------------------------------------------------------------------------------------------- @@ -3905,44 +8094,42 @@ The second element is the three bits for the ModR/M byte Opcode/Reg bits, or the The third element is the last three bits for the ModR/M byte the R/M bits, or the SIB Base Register value as a number value 0 to 7. -------------------------------------------------------------------------------------------------------------------------*/ -function Decode_ModRM_SIB_Value() -{ - //Get the current position byte value +function Decode_ModRM_SIB_Value() { + //Get the current position byte value - var v = BinCode[CodePos]; + var v = BinCode[CodePos]; - //The first tow binary digits of the read byte is the Mode bits of the ModR/M byte or - //The first tow binary digits of the byte is the Scale bits of the SIB byte. + //The first tow binary digits of the read byte is the Mode bits of the ModR/M byte or + //The first tow binary digits of the byte is the Scale bits of the SIB byte. - var ModeScale = (v >> 6) & 0x03; //value 0 to 3 + var ModeScale = (v >> 6) & 0x03; //value 0 to 3 - //The three binary digits of the read byte after the first two digits is the OpcodeReg Value of the ModR/M byte or - //The three binary digits of the read byte after the first two digits is the Index Register value for the SIB byte. + //The three binary digits of the read byte after the first two digits is the OpcodeReg Value of the ModR/M byte or + //The three binary digits of the read byte after the first two digits is the Index Register value for the SIB byte. - var OpcodeRegIndex = (v >> 3) & 0x07; //value 0 to 7 + var OpcodeRegIndex = (v >> 3) & 0x07; //value 0 to 7 - //The three binary digits at the end of the read byte is the R/M (Register,or Memory) Value of the ModR/M byte or - //The three binary digits at the end of the read byte is the Base Register Value of the SIB byte. + //The three binary digits at the end of the read byte is the R/M (Register,or Memory) Value of the ModR/M byte or + //The three binary digits at the end of the read byte is the Base Register Value of the SIB byte. - var RMBase = v & 0x07; //value 0 to 7 + var RMBase = v & 0x07; //value 0 to 7 - //Put the array together containing the three indexes with the value - //Note both the ModR/M byte and SIB byte use the same bit value pattern + //Put the array together containing the three indexes with the value + //Note both the ModR/M byte and SIB byte use the same bit value pattern - var ByteValueArray = [ - ModeScale,//Index 0 is the first tow bits for the Mode, or Scale Depending on what the byte value is used for. - OpcodeRegIndex,//Index 1 is the three bits for the OpcodeReg, or Index Depending on what the byte value is used for. - RMBase //Index 2 is the three bits for the RM, or BASE bits Depending on what the byte value is used for. - ]; + var ByteValueArray = [ + ModeScale, //Index 0 is the first tow bits for the Mode, or Scale Depending on what the byte value is used for. + OpcodeRegIndex, //Index 1 is the three bits for the OpcodeReg, or Index Depending on what the byte value is used for. + RMBase //Index 2 is the three bits for the RM, or BASE bits Depending on what the byte value is used for. + ]; - //Move the Decoders Position by one. - - NextByte(); + //Move the Decoders Position by one. - //return the array containing the decoded values of the byte. + NextByte(); - return (ByteValueArray); + //return the array containing the decoded values of the byte. + return ByteValueArray; } /*------------------------------------------------------------------------------------------------------------------------- @@ -3958,250 +8145,254 @@ If BySize is false the SizeSetting is used numerically as a single size selectio 0=8,1=16,2=32,3=64 by size setting value. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeImmediate( type, BySize, SizeSetting ) -{ - - /*------------------------------------------------------------------------------------------------------------------------- +function DecodeImmediate(type, BySize, SizeSetting) { + /*------------------------------------------------------------------------------------------------------------------------- Initialize V32, and V64 which will store the Immediate value. JavaScript Float64 numbers can not accurately work with numbers 64 bit's long. So numbers are split into two numbers that should never exceed an 32 bit value though calculation. Numbers that are too big for the first 32 bit's are stored as the next 32 bit's in V64. -------------------------------------------------------------------------------------------------------------------------*/ - var V32 = 0, V64 = 0; + var V32 = 0, + V64 = 0; - //*Initialize the Pad Size for V32, and V64 depending On the Immediate type Calculation they use. + //*Initialize the Pad Size for V32, and V64 depending On the Immediate type Calculation they use. - var Pad32 = 0, Pad64 = 0; + var Pad32 = 0, + Pad64 = 0; - //*Initialize the Sign value that is only set for Negative, or Positive Relative displacements. + //*Initialize the Sign value that is only set for Negative, or Positive Relative displacements. - var Sign = 0; + var Sign = 0; - //*Initialize the Sign Extend variable size as 0 Some Immediate numbers Sign extend. + //*Initialize the Sign Extend variable size as 0 Some Immediate numbers Sign extend. - var Extend = 0; + var Extend = 0; - //*The variable S is the size of the Immediate. + //*The variable S is the size of the Immediate. - var S = SizeSetting & 0x0F; + var S = SizeSetting & 0x0f; - //*Extend size. + //*Extend size. - Extend = SizeSetting >> 4; + Extend = SizeSetting >> 4; - //*If by Size attributes is set true. + //*If by Size attributes is set true. - if ( BySize ) - { - S = GetOperandSize( S ); + if (BySize) { + S = GetOperandSize(S); - if ( Extend > 0 ) - { - Extend = GetOperandSize( Extend ); + if (Extend > 0) { + Extend = GetOperandSize(Extend); + } } - } - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- The possible values of S (Calculated Size) are S=0 is IMM8, S=1 is IMM16, S=2 is IMM32, S=3 is IMM64. Calculate how many bytes that are going to have to be read based on the value of S. S=0 is 1 byte, S=1 is 2 bytes, S=2 is 4 bytes, S=3 is 8 bytes. The Number of bytes to read is 2 to the power of S. -------------------------------------------------------------------------------------------------------------------------*/ - var n = 1 << S; + var n = 1 << S; - //Adjust Pad32, and Pad64. + //Adjust Pad32, and Pad64. - Pad32 = Math.min( n, 4 ); ( n >= 8 ) && ( Pad64 = 8 ); + Pad32 = Math.min(n, 4); + n >= 8 && (Pad64 = 8); - //Store the first byte of the immediate because IMM8 can use different encodings. + //Store the first byte of the immediate because IMM8 can use different encodings. - IMMValue = BinCode[CodePos]; + IMMValue = BinCode[CodePos]; - //*Loop and Move the Decoder to the next byte Code position to the number of bytes to read for V32, and V64. + //*Loop and Move the Decoder to the next byte Code position to the number of bytes to read for V32, and V64. - for ( var i = 0, v = 1; i < Pad32; V32 += BinCode[CodePos] * v, i++, v *= 256, NextByte() ); - for ( v = 1; i < Pad64; V64 += BinCode[CodePos] * v, i++, v *= 256, NextByte() ); + for (var i = 0, v = 1; i < Pad32; V32 += BinCode[CodePos] * v, i++, v *= 256, NextByte()); + for (v = 1; i < Pad64; V64 += BinCode[CodePos] * v, i++, v *= 256, NextByte()); - //*Adjust Pad32 so it matches the length the Immediate should be in hex for number of bytes read. + //*Adjust Pad32 so it matches the length the Immediate should be in hex for number of bytes read. - Pad32 <<= 1; Pad64 <<= 1; + Pad32 <<= 1; + Pad64 <<= 1; - /*--------------------------------------------------------------------------------------------------------------------------- + /*--------------------------------------------------------------------------------------------------------------------------- If the IMM type is used with an register operand on the upper four bit's then the IMM byte does not use the upper 4 bit's. ---------------------------------------------------------------------------------------------------------------------------*/ - if( type === 1 ) { V32 &= ( 1 << ( ( n << 3 ) - 4 ) ) - 1; } + if (type === 1) { + V32 &= (1 << ((n << 3) - 4)) - 1; + } - /*--------------------------------------------------------------------------------------------------------------------------- + /*--------------------------------------------------------------------------------------------------------------------------- If the Immediate is an relative address calculation. ---------------------------------------------------------------------------------------------------------------------------*/ - if ( type === 2 ) - { - //Calculate the Padded size for at the end of the function an Relative is padded to the size of the address based on bit mode. + if (type === 2) { + //Calculate the Padded size for at the end of the function an Relative is padded to the size of the address based on bit mode. - Pad32 = ( Math.min( BitMode, 1 ) << 2 ) + 4; Pad64 = Math.max( Math.min( BitMode, 2 ), 1 ) << 3; + Pad32 = (Math.min(BitMode, 1) << 2) + 4; + Pad64 = Math.max(Math.min(BitMode, 2), 1) << 3; - //Carry bit to 64 bit section. - - var C64 = 0; - - //Relative size. - - var n = Math.min( 0x100000000, Math.pow( 2, 4 << ( S + 1 ) ) ); - - //Sign bit adjust. - - if( V32 >= ( n >> 1 ) ) { V32 -= n; } - - //Add position. - - V32 += Pos32; - - //Remove carry bit and add it to C64. + //Carry bit to 64 bit section. - ( C64 = ( ( V32 ) >= 0x100000000 ) ) && ( V32 -= 0x100000000 ); - - //Do not carry to 64 if address is 32, and below. - - if ( S <= 2 ) { C64 = false; } + var C64 = 0; - //Add the 64 bit position plus carry. + //Relative size. - ( ( V64 += Pos64 + C64 ) > 0xFFFFFFFF ) && ( V64 -= 0x100000000 ); - } + var n = Math.min(0x100000000, Math.pow(2, 4 << (S + 1))); - /*--------------------------------------------------------------------------------------------------------------------------- + //Sign bit adjust. + + if (V32 >= n >> 1) { + V32 -= n; + } + + //Add position. + + V32 += Pos32; + + //Remove carry bit and add it to C64. + + (C64 = V32 >= 0x100000000) && (V32 -= 0x100000000); + + //Do not carry to 64 if address is 32, and below. + + if (S <= 2) { + C64 = false; + } + + //Add the 64 bit position plus carry. + + (V64 += Pos64 + C64) > 0xffffffff && (V64 -= 0x100000000); + } + + /*--------------------------------------------------------------------------------------------------------------------------- If the Immediate is an displacement calculation. ---------------------------------------------------------------------------------------------------------------------------*/ - if ( type === 3 ) - { - /*------------------------------------------------------------------------------------------------------------------------- + if (type === 3) { + /*------------------------------------------------------------------------------------------------------------------------- Calculate the displacement center point based on Immediate size. -------------------------------------------------------------------------------------------------------------------------*/ - //An displacement can not be bigger than 32 bit's, so Pad64 is set 0. + //An displacement can not be bigger than 32 bit's, so Pad64 is set 0. - Pad64 = 0; + Pad64 = 0; - //Now calculate the Center Point. + //Now calculate the Center Point. - var Center = 2 * ( 1 << ( n << 3 ) - 2 ); + var Center = 2 * (1 << ((n << 3) - 2)); - //By default the Sign is Positive. + //By default the Sign is Positive. - Sign = 1; + Sign = 1; - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- Calculate the VSIB displacement size if it is a VSIB Disp8. -------------------------------------------------------------------------------------------------------------------------*/ - if ( VSIB && S === 0 ) - { - var VScale = WidthBit | 2; - Center <<= VScale; V32 <<= VScale; + if (VSIB && S === 0) { + var VScale = WidthBit | 2; + Center <<= VScale; + V32 <<= VScale; + } + + //When the value is higher than the center it is negative. + + if (V32 >= Center) { + //Convert the number to the negative side of the center point. + + V32 = Center * 2 - V32; + + //The Sign is negative. + + Sign = 2; + } } - //When the value is higher than the center it is negative. - - if ( V32 >= Center ) - { - //Convert the number to the negative side of the center point. - - V32 = Center * 2 - V32; - - //The Sign is negative. - - Sign = 2; - } - } - - /*--------------------------------------------------------------------------------------------------------------------------- + /*--------------------------------------------------------------------------------------------------------------------------- Pad Imm based on the calculated Immediate size, because when an value is converted to an number as text that can be displayed the 0 digits to the left are removed. Think of this as like the number 000179 the actual length of the number is 6 digits, but is displayed as 179, because the unused digits are not displayed, but they still exist in the memory. ---------------------------------------------------------------------------------------------------------------------------*/ - for( var Imm = V32.toString(16), L = Pad32; Imm.length < L; Imm = "0" + Imm ); - if( Pad64 > 8 ) { for( Imm = V64.toString(16) + Imm, L = Pad64; Imm.length < L; Imm = "0" + Imm ); } + for (var Imm = V32.toString(16), L = Pad32; Imm.length < L; Imm = "0" + Imm); + if (Pad64 > 8) { + for (Imm = V64.toString(16) + Imm, L = Pad64; Imm.length < L; Imm = "0" + Imm); + } - /*--------------------------------------------------------------------------------------------------------------------------- + /*--------------------------------------------------------------------------------------------------------------------------- Extend Imm if it's extend size is bigger than the Current Imm size. ---------------------------------------------------------------------------------------------------------------------------*/ - if ( Extend !== S ) - { - //Calculate number of bytes to Extend till by size. + if (Extend !== S) { + //Calculate number of bytes to Extend till by size. - Extend = Math.pow( 2, Extend ) * 2; + Extend = Math.pow(2, Extend) * 2; - //Setup the Signified pad value. + //Setup the Signified pad value. - var spd = "00"; ( ( ( parseInt( Imm.substring(0, 1), 16) & 8 ) >> 3 ) ) && ( spd = "FF" ); + var spd = "00"; + (parseInt(Imm.substring(0, 1), 16) & 8) >> 3 && (spd = "FF"); - //Start padding. + //Start padding. - for (; Imm.length < Extend; Imm = spd + Imm); - } + for (; Imm.length < Extend; Imm = spd + Imm); + } - //*Return the Imm. - - return ( ( Sign > 0 ? ( Sign > 1 ? "-" : "+" ) : "" ) + Imm.toUpperCase() ); + //*Return the Imm. + return (Sign > 0 ? (Sign > 1 ? "-" : "+") : "") + Imm.toUpperCase(); } /*------------------------------------------------------------------------------------------------------------------------- Decode registers by Size attributes, or a select register index. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeRegValue( RValue, BySize, Setting ) -{ - //If the instruction is a Vector instruction, and no extension is active like EVEX, VEX Make sure Size attribute uses the default vector size. +function DecodeRegValue(RValue, BySize, Setting) { + //If the instruction is a Vector instruction, and no extension is active like EVEX, VEX Make sure Size attribute uses the default vector size. - if( Vect && Extension === 0 ) - { - SizeAttrSelect = 0; - } + if (Vect && Extension === 0) { + SizeAttrSelect = 0; + } - //If By size is true Use the Setting with the GetOperandSize + //If By size is true Use the Setting with the GetOperandSize - if ( BySize ) - { - Setting = GetOperandSize( Setting ); //get decoded size value. + if (BySize) { + Setting = GetOperandSize(Setting); //get decoded size value. - //Any Vector register smaller than 128 has to XMM because XMM is the smallest SIMD Vector register. + //Any Vector register smaller than 128 has to XMM because XMM is the smallest SIMD Vector register. - if( Vect && Setting < 4 ) { Setting = 4; } - } + if (Vect && Setting < 4) { + Setting = 4; + } + } - //If XOP only vector 0 to 15 are usable. - - if( Opcode >= 0x400 ) { RValue &= 15; } + //If XOP only vector 0 to 15 are usable. - //Else If 16/32 bit mode in VEX/EVEX/MVEX vctor register can only go 0 though 7. + if (Opcode >= 0x400) { + RValue &= 15; + } - else if( BitMode <= 1 && Extension >= 1 ) { RValue &= 7; } + //Else If 16/32 bit mode in VEX/EVEX/MVEX vctor register can only go 0 though 7. + else if (BitMode <= 1 && Extension >= 1) { + RValue &= 7; + } - //If L1OM ZMM to V reg. + //If L1OM ZMM to V reg. - if ( Opcode >= 0x700 && Setting === 6 ) - { - Setting = 16; - } + if (Opcode >= 0x700 && Setting === 6) { + Setting = 16; + } - //Else if 8 bit high/low Registers + //Else if 8 bit high/low Registers + else if (Setting === 0) { + return REG[0][RexActive][RValue]; + } - else if ( Setting === 0 ) - { - return (REG[0][RexActive][ RValue ]); - } + //Return the Register. - //Return the Register. - - return (REG[Setting][ RValue ]); + return REG[Setting][RValue]; } /*------------------------------------------------------------------------------------------------------------------------- @@ -4210,96 +8401,94 @@ Note if by size attributes is false the lower four bits is the selected Memory p and the higher four bits is the selected register. -------------------------------------------------------------------------------------------------------------------------*/ -function Decode_ModRM_SIB_Address( ModRM, BySize, Setting ) -{ - var out = ""; //the variable out is what stores the decoded address pointer, or Register if Register mode. - var S_C = "{"; //L1OM, and K1OM {SSS,CCCCC} setting decoding, or EVEX broadcast round. - - //------------------------------------------------------------------------------------------------------------------------- - //If the ModR/M is not in register mode decode it as an Effective address. - //------------------------------------------------------------------------------------------------------------------------- - - if( ModRM[0] !== 3 ) - { - - //If the instruction is a Vector instruction, and no extension is active like EVEX, VEX Make sure Size attribute uses the default vector size. - - if( Vect && Extension === 0 ) - { - SizeAttrSelect = 0; - } +function Decode_ModRM_SIB_Address(ModRM, BySize, Setting) { + var out = ""; //the variable out is what stores the decoded address pointer, or Register if Register mode. + var S_C = "{"; //L1OM, and K1OM {SSS,CCCCC} setting decoding, or EVEX broadcast round. //------------------------------------------------------------------------------------------------------------------------- - //The Selected Size is setting unless BySize attribute is true. + //If the ModR/M is not in register mode decode it as an Effective address. //------------------------------------------------------------------------------------------------------------------------- - if ( BySize ) - { - //------------------------------------------------------------------------------------------------------------------------- - //Check if it is not the non vectorized 128 which uses "Oword ptr". - //------------------------------------------------------------------------------------------------------------------------- + if (ModRM[0] !== 3) { + //If the instruction is a Vector instruction, and no extension is active like EVEX, VEX Make sure Size attribute uses the default vector size. - if ( Setting !== 16 || Vect ) - { - Setting = ( GetOperandSize( Setting ) << 1 ) | FarPointer; - } + if (Vect && Extension === 0) { + SizeAttrSelect = 0; + } - //------------------------------------------------------------------------------------------------------------------------- - //Non vectorized 128 uses "Oword ptr" alaises to "QWord ptr" in 32 bit mode, or lower. - //------------------------------------------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------------------------------------------- + //The Selected Size is setting unless BySize attribute is true. + //------------------------------------------------------------------------------------------------------------------------- - else if ( !Vect ) { Setting = 11 - ( ( BitMode <= 1 ) * 5 ); } - } + if (BySize) { + //------------------------------------------------------------------------------------------------------------------------- + //Check if it is not the non vectorized 128 which uses "Oword ptr". + //------------------------------------------------------------------------------------------------------------------------- - //------------------------------------------------------------------------------------------------------------------------- - //If By size attributes is false the selected Memory pointer is the first four bits of the size setting for all pointer indexes 0 to 15. - //Also if By size attribute is also true the selected by size index can not exceed 15 anyways which is the max combination the first four bits. - //------------------------------------------------------------------------------------------------------------------------- + if (Setting !== 16 || Vect) { + Setting = (GetOperandSize(Setting) << 1) | FarPointer; + } - Setting = Setting & 0x0F; + //------------------------------------------------------------------------------------------------------------------------- + //Non vectorized 128 uses "Oword ptr" alaises to "QWord ptr" in 32 bit mode, or lower. + //------------------------------------------------------------------------------------------------------------------------- + else if (!Vect) { + Setting = 11 - (BitMode <= 1) * 5; + } + } - //If Vector extended then MM is changed to QWORD. + //------------------------------------------------------------------------------------------------------------------------- + //If By size attributes is false the selected Memory pointer is the first four bits of the size setting for all pointer indexes 0 to 15. + //Also if By size attribute is also true the selected by size index can not exceed 15 anyways which is the max combination the first four bits. + //------------------------------------------------------------------------------------------------------------------------- - if( Extension !== 0 && Setting === 9 ){ Setting = 6; } + Setting = Setting & 0x0f; - //Bround control, or 32/64 VSIB. + //If Vector extended then MM is changed to QWORD. - if ( ConversionMode === 1 || ConversionMode === 2 || VSIB ) { out += PTR[WidthBit > 0 ? 6 : 4]; } + if (Extension !== 0 && Setting === 9) { + Setting = 6; + } - //------------------------------------------------------------------------------------------------------------------------- - //Get the pointer size by Size setting. - //------------------------------------------------------------------------------------------------------------------------- + //Bround control, or 32/64 VSIB. - else{ out = PTR[Setting]; } + if (ConversionMode === 1 || ConversionMode === 2 || VSIB) { + out += PTR[WidthBit > 0 ? 6 : 4]; + } - //Add the Segment override left address bracket if any segment override was used otherwise the SegOverride string should be just a normal left bracket. + //------------------------------------------------------------------------------------------------------------------------- + //Get the pointer size by Size setting. + //------------------------------------------------------------------------------------------------------------------------- + else { + out = PTR[Setting]; + } - out += SegOverride; + //Add the Segment override left address bracket if any segment override was used otherwise the SegOverride string should be just a normal left bracket. - //------------------------------------------------------------------------------------------------------------------------- - //calculate the actual address size according to the Address override and the CPU bit mode. - //------------------------------------------------------------------------------------------------------------------------- - //AddressSize 1 is 16, AddressSize 2 is 32, AddressSize 3 is 64. - //The Bit mode is the address size except AddressOverride reacts differently in different bit modes. - //In 16 bit AddressOverride switches to the 32 bit ModR/M effective address system. - //In both 32/64 the Address size goes down by one is size. - //------------------------------------------------------------------------------------------------------------------------- + out += SegOverride; - var AddressSize = BitMode + 1; + //------------------------------------------------------------------------------------------------------------------------- + //calculate the actual address size according to the Address override and the CPU bit mode. + //------------------------------------------------------------------------------------------------------------------------- + //AddressSize 1 is 16, AddressSize 2 is 32, AddressSize 3 is 64. + //The Bit mode is the address size except AddressOverride reacts differently in different bit modes. + //In 16 bit AddressOverride switches to the 32 bit ModR/M effective address system. + //In both 32/64 the Address size goes down by one is size. + //------------------------------------------------------------------------------------------------------------------------- - if (AddressOverride) - { - AddressSize = AddressSize - 1; + var AddressSize = BitMode + 1; - //the only time the address size is 0 is if the BitMode is 16 bit's and is subtracted by one resulting in 0. + if (AddressOverride) { + AddressSize = AddressSize - 1; - if(AddressSize === 0) - { - AddressSize = 2; //set the address size to 32 bit from the 16 bit address mode. - } - } + //the only time the address size is 0 is if the BitMode is 16 bit's and is subtracted by one resulting in 0. - /*------------------------------------------------------------------------------------------------------------------------- + if (AddressSize === 0) { + AddressSize = 2; //set the address size to 32 bit from the 16 bit address mode. + } + } + + /*------------------------------------------------------------------------------------------------------------------------- The displacement size calculation. --------------------------------------------------------------------------------------------------------------------------- In 16/32/64 the mode setting 1 will always add a Displacement of 8 to the address. @@ -4307,19 +8496,18 @@ function Decode_ModRM_SIB_Address( ModRM, BySize, Setting ) In 32/64 the Mode Setting 2 for the effective address adds an displacement of 32 to the effective address. -------------------------------------------------------------------------------------------------------------------------*/ - var Disp = ModRM[0] - 1; //Let disp relate size to mode value of the ModR/M. + var Disp = ModRM[0] - 1; //Let disp relate size to mode value of the ModR/M. - //if 32 bit and above, and if Mode is 2 then disp size is disp32. + //if 32 bit and above, and if Mode is 2 then disp size is disp32. - if(AddressSize >= 2 && ModRM[0] === 2) - { - Disp += 1; //Only one more higher in size is 32. - } + if (AddressSize >= 2 && ModRM[0] === 2) { + Disp += 1; //Only one more higher in size is 32. + } - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- End of calculation. -------------------------------------------------------------------------------------------------------------------------*/ - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- Normally the displacement type is an relative Immediate that is added ("+"), or subtracted ("-") from the center point to the selected base register, and the size depends on mode settings 1, and 2, and also Address bit mode (Displacement calculation). @@ -4327,255 +8515,281 @@ function Decode_ModRM_SIB_Address( ModRM, BySize, Setting ) so some modes, and registers combinations where used for different Immediate displacements. -------------------------------------------------------------------------------------------------------------------------*/ - var DispType = 3; //by default the displacement size is added to the selected base register, or Index register if SIB byte combination is used. + var DispType = 3; //by default the displacement size is added to the selected base register, or Index register if SIB byte combination is used. - //-------------------------------------------16 Bit ModR/M address decode logic------------------------------------------- + //-------------------------------------------16 Bit ModR/M address decode logic------------------------------------------- - if( AddressSize === 1 ) - { + if (AddressSize === 1) { + //if ModR/M mode bits 0, and Base Register value is 6 then disp16 with DispType mode 0. - //if ModR/M mode bits 0, and Base Register value is 6 then disp16 with DispType mode 0. + if (AddressSize === 1 && ModRM[0] === 0 && ModRM[2] === 6) { + Disp = 1; + DispType = 0; + } - if(AddressSize === 1 && ModRM[0] === 0 && ModRM[2] === 6) - { - Disp = 1; - DispType = 0; - } + //BX , BP switch based on bit 2 of the Register value - //BX , BP switch based on bit 2 of the Register value + if (ModRM[2] < 4) { + out += REG[AddressSize][3 + (ModRM[2] & 2)] + "+"; + } - if( ModRM[2] < 4 ){ out += REG[ AddressSize ][ 3 + ( ModRM[2] & 2 ) ] + "+"; } + //The first bit switches between Destination index, and source index - //The first bit switches between Destination index, and source index + if (ModRM[2] < 6) { + out += REG[AddressSize][6 + (ModRM[2] & 1)]; + } - if( ModRM[2] < 6 ){ out += REG[ AddressSize ][ 6 + ( ModRM[2] & 1 ) ]; } + //[BP], and [BX] as long as Mode is not 0, and Register is not 6 which sets DispType 0. + else if (DispType !== 0) { + out += REG[AddressSize][17 - (ModRM[2] << 1)]; + } + } //End of 16 bit ModR/M decode logic. - //[BP], and [BX] as long as Mode is not 0, and Register is not 6 which sets DispType 0. + //-------------------------------------------Else 32/64 ModR/M------------------------------------------- + else { + //if Mode is 0 and Base Register value is 5 then it uses an Relative (RIP) disp32. - else if ( DispType !== 0 ) { out += REG[ AddressSize ][ 17 - ( ModRM[2] << 1 ) ]; } - } //End of 16 bit ModR/M decode logic. + if (ModRM[0] === 0 && ModRM[2] === 5) { + Disp = 2; + DispType = 2; + } - //-------------------------------------------Else 32/64 ModR/M------------------------------------------- + //check if Base Register is 4 which goes into the SIB address system - else - { + if (ModRM[2] === 4) { + //Decode the SIB byte. - //if Mode is 0 and Base Register value is 5 then it uses an Relative (RIP) disp32. + var SIB = Decode_ModRM_SIB_Value(); - if( ModRM[0] === 0 && ModRM[2] === 5 ) - { - Disp = 2; - DispType = 2; - } + //Calculate the Index register with it's Extended value because the index register will only cancel out if 4 in value. - //check if Base Register is 4 which goes into the SIB address system + var IndexReg = IndexExtend | SIB[1]; - if( ModRM[2] === 4 ) - { - //Decode the SIB byte. + //check if the base register is 5 in value in the SIB without it's added extended value, and that the ModR/M Mode is 0 this activates Disp32 - var SIB = Decode_ModRM_SIB_Value(); + if (ModRM[0] === 0 && SIB[2] === 5 && !VSIB) { + Disp = 2; //Set Disp32 - //Calculate the Index register with it's Extended value because the index register will only cancel out if 4 in value. + //check if the Index register is canceled out as well - var IndexReg = IndexExtend | SIB[1]; + if (IndexReg === 4) { + //if the Index is canceled out then + DispType = 0; //a regular IMM32 is used as the address. - //check if the base register is 5 in value in the SIB without it's added extended value, and that the ModR/M Mode is 0 this activates Disp32 + //*if the Address size is 64 then the 32 bit Immediate must pad to the full 64 bit address. - if ( ModRM[0] === 0 && SIB[2] === 5 && !VSIB ) - { - Disp = 2; //Set Disp32 + if (AddressSize === 3) { + Disp = 50; + } + } + } - //check if the Index register is canceled out as well + //Else Base register is not 5, and the Mode is not 0 then decode the base register normally. + else { + out += REG[AddressSize][(BaseExtend & 8) | SIB[2]]; - if (IndexReg === 4) //if the Index is canceled out then - { - DispType = 0; //a regular IMM32 is used as the address. + //If the Index Register is not Canceled out (Note this is only reachable if base register was decoded and not canceled out) - //*if the Address size is 64 then the 32 bit Immediate must pad to the full 64 bit address. + if (IndexReg !== 4 || VSIB) { + out = out + "+"; //Then add the Plus in front of the Base register to add the index register + } + } - if( AddressSize === 3 ) { Disp = 50; } - } + //if Index Register is not Canceled, and that it is not an Vector register then decode the Index with the possibility of the base register. + + if (IndexReg !== 4 && !VSIB) { + out += REG[AddressSize][IndexExtend | IndexReg]; + + //add what the scale bits decode to the Index register by the value of the scale bits which select the name from the scale array. + + out = out + scale[SIB[0]]; + } + + //Else if it is an vector register. + else if (VSIB) { + Setting = Setting < 8 ? 4 : Setting >> 1; + + if (Opcode < 0x700) { + IndexReg |= VectorRegister & 0x10; + } + + out += DecodeRegValue(IndexExtend | IndexReg, false, Setting); //Decode Vector register by length setting and the V' extension. + + //add what the scale bits decode to the Index register by the value of the scale bits which select the name from the scale array. + + out = out + scale[SIB[0]]; + } + } //END OF THE SIB BYTE ADDRESS DECODE. + + //else Base register is not 4 and does not go into the SIB ADDRESS. + //Decode the Base register regularly plus it's Extended value if relative (RIP) disp32 is not used. + else if (DispType !== 2) { + out += REG[AddressSize][(BaseExtend & 8) | ModRM[2]]; + } } - //Else Base register is not 5, and the Mode is not 0 then decode the base register normally. + //Finally the Immediate displacement is put into the Address last. - else - { - out += REG[ AddressSize ][ BaseExtend & 8 | SIB[2] ]; - - //If the Index Register is not Canceled out (Note this is only reachable if base register was decoded and not canceled out) - - if ( IndexReg !== 4 || VSIB ) - { - out = out + "+"; //Then add the Plus in front of the Base register to add the index register - } + if (Disp >= 0) { + out += DecodeImmediate(DispType, false, Disp); } - //if Index Register is not Canceled, and that it is not an Vector register then decode the Index with the possibility of the base register. + //Put the right bracket on the address. - if ( IndexReg !== 4 && !VSIB ) - { - out += REG[ AddressSize ][ IndexExtend | IndexReg ]; + out += "]"; - //add what the scale bits decode to the Index register by the value of the scale bits which select the name from the scale array. + //----------------------L1OM/MVEX/EVEX memory conversion mode, or broadcast round----------------------- - out = out + scale[SIB[0]]; + if ( + ConversionMode !== 0 && //Not used if set 0. + !( + ( + (ConversionMode === 3 && (Opcode >= 0x700 || (!(Opcode >= 0x700) && !Float))) || //If bad L1OM/K1OM float conversion. + (!(Opcode >= 0x700) && + (VectS === 0 || + (ConversionMode === 5 && VectS === 5) || //If K1OM UNorm conversion L1OM only. + (ConversionMode !== 1 && VectS === 1) ^ (ConversionMode < 3 && !Swizzle))) + ) //Or K1OM broadcast Swizzle, and special case {4to16} only. + ) + ) { + //Calculate Conversion. + + if (ConversionMode >= 4) { + ConversionMode += 2; + } + if (ConversionMode >= 8) { + ConversionMode += 2; + } + + //If L1OM. + + if (Opcode >= 0x700) { + //If L1OM without Swizzle. + + if (!Swizzle && ConversionMode > 2) { + ConversionMode = 31; + } + + //L1OM Float adjust. + else if (Float) { + if (ConversionMode === 7) { + ConversionMode++; + } + if (ConversionMode === 10) { + ConversionMode = 3; + } + } + } + + //Set conversion. Note K1OM special case inverts width bit. + + out += + S_C + ConversionModes[(ConversionMode << 1) | ((WidthBit ^ (!(Opcode >= 0x700) & (VectS === 7))) & 1)]; + S_C = ","; } - - //Else if it is an vector register. - - else if ( VSIB ) - { - Setting = ( Setting < 8 ) ? 4 : Setting >> 1; - if( Opcode < 0x700 ) { IndexReg |= ( VectorRegister & 0x10 ); } - - out += DecodeRegValue( IndexExtend | IndexReg, false, Setting ); //Decode Vector register by length setting and the V' extension. - - //add what the scale bits decode to the Index register by the value of the scale bits which select the name from the scale array. - - out = out + scale[SIB[0]]; + //Else bad Conversion setting. + else if (ConversionMode !== 0) { + out += S_C + "Error"; + S_C = ","; } - } //END OF THE SIB BYTE ADDRESS DECODE. - //else Base register is not 4 and does not go into the SIB ADDRESS. - //Decode the Base register regularly plus it's Extended value if relative (RIP) disp32 is not used. + //--------------------------------END of memory Conversion control logic-------------------------------- + } //End of Memory address Modes 00, 01, 10 decode. - else if(DispType !== 2) - { - out += REG[ AddressSize ][ BaseExtend & 8 | ModRM[2] ]; - } - } + //-----------------------------else the ModR/M mode bits are 11 register Mode----------------------------- + else { + //------------------------------------------------------------------------------------------------------------------------- + //The Selected Size is setting unless BySize attribute is true. + //------------------------------------------------------------------------------------------------------------------------- + //MVEX/EVEX round mode. - //Finally the Immediate displacement is put into the Address last. - - if( Disp >= 0 ) { out += DecodeImmediate( DispType, false, Disp ); } - - //Put the right bracket on the address. - - out += "]"; - - //----------------------L1OM/MVEX/EVEX memory conversion mode, or broadcast round----------------------- - - if( - ( ConversionMode !== 0 ) && //Not used if set 0. - !( - ( ConversionMode === 3 && ( Opcode >= 0x700 || !( Opcode >= 0x700 ) && !Float ) ) || //If bad L1OM/K1OM float conversion. - ( !( Opcode >= 0x700 ) && ( VectS === 0 || ( ConversionMode === 5 && VectS === 5 ) || //If K1OM UNorm conversion L1OM only. - ( ConversionMode !== 1 && VectS === 1 ) ^ ( ConversionMode < 3 && !Swizzle ) ) ) //Or K1OM broadcast Swizzle, and special case {4to16} only. - ) - ) - { - //Calculate Conversion. - - if( ConversionMode >= 4 ){ ConversionMode += 2; } - if( ConversionMode >= 8 ){ ConversionMode += 2; } - - //If L1OM. - - if( Opcode >= 0x700 ) - { - //If L1OM without Swizzle. - - if ( !Swizzle && ConversionMode > 2 ) { ConversionMode = 31; } - - //L1OM Float adjust. - - else if( Float ) - { - if( ConversionMode === 7 ) { ConversionMode++; } - if( ConversionMode === 10 ) { ConversionMode = 3; } + if ((Extension === 3 && HInt_ZeroMerg) || (Extension === 2 && ConversionMode === 1)) { + RoundMode |= RoundingSetting; } - } - //Set conversion. Note K1OM special case inverts width bit. + //If the upper 4 bits are defined and by size is false then the upper four bits is the selected register. - out += S_C + ConversionModes[ ( ConversionMode << 1 ) | ( WidthBit ^ ( !( Opcode >= 0x700 ) & VectS === 7 ) ) & 1 ]; S_C = ","; + if ((Setting & 0xf0) > 0 && !BySize) { + Setting >>= 4; + } + + //Decode the register with Base expansion. + + out = DecodeRegValue(BaseExtend | ModRM[2], BySize, Setting); + + //L1OM/K1OM Register swizzle modes. + + if (Opcode >= 0x700 || (Extension === 3 && !HInt_ZeroMerg && Swizzle)) { + if (Opcode >= 0x700 && ConversionMode >= 3) { + ConversionMode++; + } //L1OM skips swizzle type DACB. + if (ConversionMode !== 0) { + out += S_C + RegSwizzleModes[ConversionMode]; + S_C = ","; + } + } + if (Extension !== 2) { + HInt_ZeroMerg = false; + } //Cache memory control is not possible in Register mode. } - //Else bad Conversion setting. + //--------------------------------------------------L1OM.CCCCC conversions------------------------------------------------- - else if( ConversionMode !== 0 ) { out += S_C + "Error"; S_C = ","; } - - //--------------------------------END of memory Conversion control logic-------------------------------- + if (Opcode >= 0x700) { + //Swizzle Field control Int/Float, or Exponent adjustment. - } //End of Memory address Modes 00, 01, 10 decode. + if (Swizzle) { + if (Opcode === 0x79a) { + out += S_C + ConversionModes[(18 | (VectorRegister & 3)) << 1]; + S_C = "}"; + } else if (Opcode === 0x79b) { + out += S_C + ConversionModes[(22 + (VectorRegister & 3)) << 1]; + S_C = "}"; + } else if ((RoundingSetting & 8) === 8) { + out += S_C + RoundModes[24 | (VectorRegister & 7)]; + S_C = "}"; + } + } - //-----------------------------else the ModR/M mode bits are 11 register Mode----------------------------- - - else - { - //------------------------------------------------------------------------------------------------------------------------- - //The Selected Size is setting unless BySize attribute is true. - //------------------------------------------------------------------------------------------------------------------------- - - //MVEX/EVEX round mode. - - if ( ( Extension === 3 && HInt_ZeroMerg ) || ( Extension === 2 && ConversionMode === 1 ) ) - { - RoundMode |= RoundingSetting; + //Up/Down Conversion. + else if (VectorRegister !== 0) { + if ( + (Up && VectorRegister !== 2) || //Up conversion "float16rz" is bad. + (!Up && VectorRegister !== 3 && VectorRegister <= 15) //Down conversion "srgb8", and field control is bad. + ) { + out += S_C + ConversionModes[((VectorRegister + 2) << 1) | WidthBit]; + S_C = "}"; + } else { + out += S_C + "Error"; + S_C = "}"; + } //Else Invalid setting. + } + } + if (S_C === ",") { + S_C = "}"; } - //If the upper 4 bits are defined and by size is false then the upper four bits is the selected register. + //Right bracket if any SSS,CCCCC conversion mode setting. - if( ( ( Setting & 0xF0 ) > 0 ) && !BySize ) { Setting >>= 4; } - - //Decode the register with Base expansion. - - out = DecodeRegValue( BaseExtend | ModRM[2], BySize, Setting ); - - //L1OM/K1OM Register swizzle modes. - - if( Opcode >= 0x700 || ( Extension === 3 && !HInt_ZeroMerg && Swizzle ) ) - { - if( Opcode >= 0x700 && ConversionMode >= 3 ){ ConversionMode++; } //L1OM skips swizzle type DACB. - if( ConversionMode !== 0 ){ out += S_C + RegSwizzleModes[ ConversionMode ]; S_C = ","; } - } - if( Extension !== 2 ){ HInt_ZeroMerg = false; } //Cache memory control is not possible in Register mode. - } - - //--------------------------------------------------L1OM.CCCCC conversions------------------------------------------------- - - if( Opcode >= 0x700 ) - { - //Swizzle Field control Int/Float, or Exponent adjustment. - - if(Swizzle) - { - if( Opcode === 0x79A ) { out += S_C + ConversionModes[ ( 18 | ( VectorRegister & 3 ) ) << 1 ]; S_C = "}"; } - else if( Opcode === 0x79B ) { out += S_C + ConversionModes[ ( 22 + ( VectorRegister & 3 ) ) << 1 ]; S_C = "}"; } - else if( ( RoundingSetting & 8 ) === 8 ) { out += S_C + RoundModes [ 24 | ( VectorRegister & 7 ) ]; S_C = "}"; } + if (S_C === "}") { + out += S_C; } - //Up/Down Conversion. + //------------------------------------------L1OM/K1OM Hint cache memory control-------------------------------------------- - else if( VectorRegister !== 0 ) - { - if( ( ( Up && VectorRegister !== 2 ) || //Up conversion "float16rz" is bad. - ( !Up && VectorRegister !== 3 && VectorRegister <= 15 ) ) //Down conversion "srgb8", and field control is bad. - ) { out += S_C + ConversionModes[ ( ( VectorRegister + 2 ) << 1 ) | WidthBit ]; S_C = "}"; } - else { out += S_C + "Error"; S_C = "}"; } //Else Invalid setting. + if (HInt_ZeroMerg) { + if (Extension === 3) { + out += "{EH}"; + } else if (Opcode >= 0x700) { + out += "{NT}"; + } } - } - if ( S_C === "," ) { S_C = "}"; } - //Right bracket if any SSS,CCCCC conversion mode setting. + //-------------------------------------------Return the Register/Memory address-------------------------------------------- - if( S_C === "}" ) { out += S_C; } - - //------------------------------------------L1OM/K1OM Hint cache memory control-------------------------------------------- - - if( HInt_ZeroMerg ) - { - if ( Extension === 3 ) { out += "{EH}"; } - else if ( Opcode >= 0x700 ) { out += "{NT}"; } - } - - //-------------------------------------------Return the Register/Memory address-------------------------------------------- - - return (out); + return out; } /*------------------------------------------------------------------------------------------------------------------------- @@ -4585,351 +8799,330 @@ controls in the CPU to be applied to an select instruction code that is not an P At the end of this function "Opcode" should not hold any prefix code, so then Opcode contains an operation code. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodePrefixAdjustments() -{ - //------------------------------------------------------------------------------------------------------------------------- - Opcode = ( Opcode & 0x300 ) | BinCode[CodePos]; //Add 8 bit opcode while bits 9, and 10 are used for opcode map. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - //if 0F hex start at 256 for Opcode. - - if(Opcode === 0x0F) - { - Opcode = 0x100; //By starting at 0x100 with binary bit 9 set one then adding the 8 bit opcode then Opcode goes 256 to 511. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } - - //if 38 hex while using two byte opcode. - - else if(Opcode === 0x138 && Mnemonics[0x138] === "") - { - Opcode = 0x200; //By starting at 0x200 with binary bit 10 set one then adding the 8 bit opcode then Opcode goes 512 to 767. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } - - //if 3A hex while using two byte opcode go three byte opcodes. - - else if(Opcode === 0x13A && Mnemonics[0x13A] === "") - { - Opcode = 0x300; //By starting at 0x300 hex and adding the 8 bit opcode then Opcode goes 768 to 1023. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } - - //Rex prefix decodes only in 64 bit mode. - - if( Opcode >= 0x40 & Opcode <= 0x4F && BitMode === 2 ) - { - RexActive = 1; //Set Rex active uses 8 bit registers in lower order as 0 to 15. - BaseExtend = ( Opcode & 0x01 ) << 3; //Base Register extend setting. - IndexExtend = ( Opcode & 0x02 ) << 2; //Index Register extend setting. - RegExtend = ( Opcode & 0x04 ) << 1; //Register Extend Setting. - WidthBit = ( Opcode & 0x08 ) >> 3; //Set The Width Bit setting if active. - SizeAttrSelect = WidthBit ? 2 : 1; //The width Bit open all 64 bits. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } - - //The VEX2 Operation code Extension to SSE settings decoding. - - if( Opcode === 0xC5 && ( BinCode[CodePos] >= 0xC0 || BitMode === 2 ) ) - { - Extension = 1; +function DecodePrefixAdjustments() { //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read VEX2 byte settings. + Opcode = (Opcode & 0x300) | BinCode[CodePos]; //Add 8 bit opcode while bits 9, and 10 are used for opcode map. NextByte(); //Move to the next byte. //------------------------------------------------------------------------------------------------------------------------- - //some bits are inverted, so uninvert them arithmetically. + //if 0F hex start at 256 for Opcode. - Opcode ^= 0xF8; - - //Decode bit settings. - - if( BitMode === 2 ) - { - RegExtend = ( Opcode & 0x80 ) >> 4; //Register Extend. - VectorRegister = ( Opcode & 0x78 ) >> 3; //The added in Vector register to SSE. + if (Opcode === 0x0f) { + Opcode = 0x100; //By starting at 0x100 with binary bit 9 set one then adding the 8 bit opcode then Opcode goes 256 to 511. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. } - SizeAttrSelect = ( Opcode & 0x04 ) >> 2; //The L bit for 256 vector size. - SIMD = Opcode & 0x03; //The SIMD mode. - - //Automatically uses the two byte opcode map starts at 256 goes to 511. - - Opcode = 0x100; - - //------------------------------------------------------------------------------------------------------------------------- - Opcode = ( Opcode & 0x300 ) | BinCode[CodePos]; //read the opcode. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - //Stop decoding prefixes. - - return(null); - } - - //The VEX3 prefix settings decoding. - - if( Opcode === 0xC4 && ( BinCode[CodePos] >= 0xC0 || BitMode === 2 ) ) - { - Extension = 1; - //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read VEX3 byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - Opcode |= ( BinCode[CodePos] << 8 ); //Read next VEX3 byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - //Some bits are inverted, so uninvert them arithmetically. - - Opcode ^= 0x78E0; - - //Decode bit settings. - - if( BitMode === 2 ) - { - RegExtend = ( Opcode & 0x0080 ) >> 4; //Extend Register Setting. - IndexExtend = ( Opcode & 0x0040 ) >> 3; //Extend Index register setting. - BaseExtend = ( Opcode & 0x0020 ) >> 2; //Extend base Register setting. + //if 38 hex while using two byte opcode. + else if (Opcode === 0x138 && Mnemonics[0x138] === "") { + Opcode = 0x200; //By starting at 0x200 with binary bit 10 set one then adding the 8 bit opcode then Opcode goes 512 to 767. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. } - WidthBit = ( Opcode & 0x8000 ) >> 15; //The width bit works as a separator. - VectorRegister = ( Opcode & 0x7800 ) >> 11; //The added in Vector register to SSE. - SizeAttrSelect = ( Opcode & 0x0400 ) >> 10; //Vector length for 256 setting. - SIMD = ( Opcode & 0x0300 ) >> 8; //The SIMD mode. - Opcode = ( Opcode & 0x001F ) << 8; //Change Operation code map. - - //------------------------------------------------------------------------------------------------------------------------- - Opcode = ( Opcode & 0x300 ) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map bit's. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - return(null); - } - - //The AMD XOP prefix. - - if( Opcode === 0x8F ) - { - //If XOP - - var Code = BinCode[ CodePos ] & 0x0F; - - if( Code >= 8 && Code <= 10 ) - { - Extension = 1; - //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read XOP byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - Opcode |= ( BinCode[CodePos] << 8 ); //Read next XOP byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - //Some bits are inverted, so uninvert them arithmetically. - - Opcode ^= 0x78E0; - - //Decode bit settings. - - RegExtend = ( Opcode & 0x0080 ) >> 4; //Extend Register Setting. - IndexExtend = ( Opcode & 0x0040 ) >> 3; //Extend Index register setting. - BaseExtend = ( Opcode & 0x0020 ) >> 2; //Extend base Register setting. - WidthBit = ( Opcode & 0x8000 ) >> 15; //The width bit works as a separator. - VectorRegister = ( Opcode & 0x7800 ) >> 11; //The added in Vector register to SSE. - SizeAttrSelect = ( Opcode & 0x0400 ) >> 10; //Vector length for 256 setting. - SIMD = ( Opcode & 0x0300 ) >> 8; //The SIMD mode. - if( SIMD > 0 ) { InvalidOp = true; } //If SIMD MODE is set anything other than 0 the instruction is invalid. - Opcode = 0x400 | ( ( Opcode & 0x0003 ) << 8 ); //Change Operation code map. - - //------------------------------------------------------------------------------------------------------------------------- - Opcode = ( Opcode & 0x700 ) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map bit's. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - return(null); - } - } - - //The L1OM vector prefix settings decoding. - - if( Opcode === 0xD6 ) - { - //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read L1OM byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - Opcode |= ( BinCode[CodePos] << 8 ); //Read next L1OM byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - WidthBit = SIMD & 1; - VectorRegister = ( Opcode & 0xF800 ) >> 11; - RoundMode = VectorRegister >> 3; - MaskRegister = ( Opcode & 0x0700 ) >> 8; - HInt_ZeroMerg = ( Opcode & 0x0080 ) >> 7; - ConversionMode = ( Opcode & 0x0070 ) >> 4; - RegExtend = ( Opcode & 0x000C ) << 1; - BaseExtend = ( Opcode & 0x0003 ) << 3; - IndexExtend = ( Opcode & 0x0002 ) << 2; - - //------------------------------------------------------------------------------------------------------------------------- - Opcode = 0x700 | BinCode[CodePos]; //read the 8 bit opcode. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - return(null); - } - - //Only decode L1OM instead of MVEX/EVEX if L1OM compatibility mode is set. - - if( Mnemonics[0x62] === "" && Opcode === 0x62 ) - { - //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read L1OM byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - Opcode ^= 0xF0; - - IndexExtend = ( Opcode & 0x80 ) >> 4; - BaseExtend = ( Opcode & 0x40 ) >> 3; - RegExtend = ( Opcode & 0x20 ) >> 2; - - if ( SIMD !== 1 ) { SizeAttrSelect = ( ( Opcode & 0x10 ) === 0x10 ) ? 2 : 1; } else { SIMD = 0; } - - Opcode = 0x800 | ( ( Opcode & 0x30 ) >> 4 ) | ( ( Opcode & 0x0F ) << 2 ); - - return(null); - } - - //The MVEX/EVEX prefix settings decoding. - - if ( Opcode === 0x62 && ( BinCode[CodePos] >= 0xC0 || BitMode === 2 ) ) - { - Extension = 2; - //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read MVEX/EVEX byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - Opcode |= ( BinCode[CodePos] << 8 ); //read next MVEX/EVEX byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - Opcode |= ( BinCode[CodePos] << 16 ); //read next MVEX/EVEX byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - //Some bits are inverted, so uninvert them arithmetically. - - Opcode ^= 0x0878F0; - - //Check if Reserved bits are 0 if they are not 0 the MVEX/EVEX instruction is invalid. - - InvalidOp = ( Opcode & 0x00000C ) > 0; - - //Decode bit settings. - - if( BitMode === 2 ) - { - RegExtend = ( ( Opcode & 0x80 ) >> 4 ) | ( Opcode & 0x10 ); //The Double R'R bit decode for Register Extension 0 to 32. - BaseExtend = ( Opcode & 0x60 ) >> 2; //The X bit, and B Bit base register extend combination 0 to 32. - IndexExtend = ( Opcode & 0x40 ) >> 3; //The X extends the SIB Index by 8. - } - - VectorRegister = ( ( Opcode & 0x7800 ) >> 11 ) | ( ( Opcode & 0x080000 ) >> 15 ); //The Added in Vector Register for SSE under MVEX/EVEX. - - WidthBit = ( Opcode & 0x8000 ) >> 15; //The width bit separator for MVEX/EVEX. - SIMD = ( Opcode & 0x0300 ) >> 8; //decode the SIMD mode setting. - HInt_ZeroMerg = ( Opcode & 0x800000 ) >> 23; //Zero Merge to destination control, or MVEX EH control. - - //EVEX option bits take the place of Vector length control. - - if ( ( Opcode & 0x0400 ) > 0 ) - { - SizeAttrSelect = ( Opcode & 0x600000 ) >> 21; //The EVEX.L'L Size combination. - RoundMode = SizeAttrSelect | 4; //Rounding mode is Vector length if used. - ConversionMode = (Opcode & 0x100000 ) >> 20; //Broadcast Round Memory address system. - } - - //MVEX Vector Length, and Broadcast round. - - else - { - SizeAttrSelect = 2; //Max Size by default. - ConversionMode = ( Opcode & 0x700000 ) >> 20; //"MVEX.sss" Option bits. - RoundMode = ConversionMode; //Rounding mode selection is ConversionMode if used. - Extension = 3; + //if 3A hex while using two byte opcode go three byte opcodes. + else if (Opcode === 0x13a && Mnemonics[0x13a] === "") { + Opcode = 0x300; //By starting at 0x300 hex and adding the 8 bit opcode then Opcode goes 768 to 1023. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. } - MaskRegister = ( Opcode & 0x070000 ) >> 16; //Mask to destination. - Opcode = ( Opcode & 0x03 ) << 8; //Change Operation code map. + //Rex prefix decodes only in 64 bit mode. - //------------------------------------------------------------------------------------------------------------------------- - Opcode = ( Opcode & 0x300 ) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map extend bit's. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- + if ((Opcode >= 0x40) & (Opcode <= 0x4f) && BitMode === 2) { + RexActive = 1; //Set Rex active uses 8 bit registers in lower order as 0 to 15. + BaseExtend = (Opcode & 0x01) << 3; //Base Register extend setting. + IndexExtend = (Opcode & 0x02) << 2; //Index Register extend setting. + RegExtend = (Opcode & 0x04) << 1; //Register Extend Setting. + WidthBit = (Opcode & 0x08) >> 3; //Set The Width Bit setting if active. + SizeAttrSelect = WidthBit ? 2 : 1; //The width Bit open all 64 bits. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } - //Stop decoding prefixes. + //The VEX2 Operation code Extension to SSE settings decoding. - return(null); - } + if (Opcode === 0xc5 && (BinCode[CodePos] >= 0xc0 || BitMode === 2)) { + Extension = 1; + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read VEX2 byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- - //Segment overrides + //some bits are inverted, so uninvert them arithmetically. - if ( ( Opcode & 0x7E7 ) === 0x26 || ( Opcode & 0x7FE ) === 0x64 ) - { - SegOverride = Mnemonics[ Opcode ]; //Set the Left Bracket for the ModR/M memory address. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } + Opcode ^= 0xf8; - //Operand override Prefix + //Decode bit settings. - if(Opcode === 0x66) - { - SIMD = 1; //sets SIMD mode 1 in case of SSE instruction opcode. - SizeAttrSelect = 0; //Adjust the size attribute setting for the size adjustment to the next instruction. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } + if (BitMode === 2) { + RegExtend = (Opcode & 0x80) >> 4; //Register Extend. + VectorRegister = (Opcode & 0x78) >> 3; //The added in Vector register to SSE. + } - //Ram address size override. + SizeAttrSelect = (Opcode & 0x04) >> 2; //The L bit for 256 vector size. + SIMD = Opcode & 0x03; //The SIMD mode. - if(Opcode === 0x67) - { - AddressOverride = true; //Set the setting active for the ModR/M address size. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } + //Automatically uses the two byte opcode map starts at 256 goes to 511. - //if repeat Prefixes F2 hex REP,or F3 hex RENP + Opcode = 0x100; - if (Opcode === 0xF2 || Opcode === 0xF3) - { - SIMD = (Opcode & 0x02 ) | ( 1 - Opcode & 0x01 ); //F2, and F3 change the SIMD mode during SSE instructions. - PrefixG1 = Mnemonics[ Opcode ]; //set the Prefix string. - HLEFlipG1G2 = true; //set Filp HLE in case this is the last prefix read, and LOCK was set in string G2 first for HLE. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } + //------------------------------------------------------------------------------------------------------------------------- + Opcode = (Opcode & 0x300) | BinCode[CodePos]; //read the opcode. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- - //if the lock prefix note the lock prefix is separate + //Stop decoding prefixes. - if (Opcode === 0xF0) - { - PrefixG2 = Mnemonics[ Opcode ]; //set the Prefix string - HLEFlipG1G2 = false; //set Flip HLE false in case this is the last prefix read, and REP, or REPNE was set in string G2 first for HLE. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } + return null; + } - //Before ending the function "DecodePrefixAdjustments()" some opcode combinations are invalid in 64 bit mode. + //The VEX3 prefix settings decoding. - if ( BitMode === 2 ) - { - InvalidOp |= ( ( ( Opcode & 0x07 ) >= 0x06 ) & ( Opcode <= 0x40 ) ); - InvalidOp |= ( Opcode === 0x60 | Opcode === 0x61 ); - InvalidOp |= ( Opcode === 0xD4 | Opcode === 0xD5 ); - InvalidOp |= ( Opcode === 0x9A | Opcode === 0xEA ); - InvalidOp |= ( Opcode === 0x82 ); - } + if (Opcode === 0xc4 && (BinCode[CodePos] >= 0xc0 || BitMode === 2)) { + Extension = 1; + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read VEX3 byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + Opcode |= BinCode[CodePos] << 8; //Read next VEX3 byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + //Some bits are inverted, so uninvert them arithmetically. + + Opcode ^= 0x78e0; + + //Decode bit settings. + + if (BitMode === 2) { + RegExtend = (Opcode & 0x0080) >> 4; //Extend Register Setting. + IndexExtend = (Opcode & 0x0040) >> 3; //Extend Index register setting. + BaseExtend = (Opcode & 0x0020) >> 2; //Extend base Register setting. + } + + WidthBit = (Opcode & 0x8000) >> 15; //The width bit works as a separator. + VectorRegister = (Opcode & 0x7800) >> 11; //The added in Vector register to SSE. + SizeAttrSelect = (Opcode & 0x0400) >> 10; //Vector length for 256 setting. + SIMD = (Opcode & 0x0300) >> 8; //The SIMD mode. + Opcode = (Opcode & 0x001f) << 8; //Change Operation code map. + + //------------------------------------------------------------------------------------------------------------------------- + Opcode = (Opcode & 0x300) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map bit's. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + return null; + } + + //The AMD XOP prefix. + + if (Opcode === 0x8f) { + //If XOP + + var Code = BinCode[CodePos] & 0x0f; + + if (Code >= 8 && Code <= 10) { + Extension = 1; + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read XOP byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + Opcode |= BinCode[CodePos] << 8; //Read next XOP byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + //Some bits are inverted, so uninvert them arithmetically. + + Opcode ^= 0x78e0; + + //Decode bit settings. + + RegExtend = (Opcode & 0x0080) >> 4; //Extend Register Setting. + IndexExtend = (Opcode & 0x0040) >> 3; //Extend Index register setting. + BaseExtend = (Opcode & 0x0020) >> 2; //Extend base Register setting. + WidthBit = (Opcode & 0x8000) >> 15; //The width bit works as a separator. + VectorRegister = (Opcode & 0x7800) >> 11; //The added in Vector register to SSE. + SizeAttrSelect = (Opcode & 0x0400) >> 10; //Vector length for 256 setting. + SIMD = (Opcode & 0x0300) >> 8; //The SIMD mode. + if (SIMD > 0) { + InvalidOp = true; + } //If SIMD MODE is set anything other than 0 the instruction is invalid. + Opcode = 0x400 | ((Opcode & 0x0003) << 8); //Change Operation code map. + + //------------------------------------------------------------------------------------------------------------------------- + Opcode = (Opcode & 0x700) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map bit's. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + return null; + } + } + + //The L1OM vector prefix settings decoding. + + if (Opcode === 0xd6) { + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read L1OM byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + Opcode |= BinCode[CodePos] << 8; //Read next L1OM byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + WidthBit = SIMD & 1; + VectorRegister = (Opcode & 0xf800) >> 11; + RoundMode = VectorRegister >> 3; + MaskRegister = (Opcode & 0x0700) >> 8; + HInt_ZeroMerg = (Opcode & 0x0080) >> 7; + ConversionMode = (Opcode & 0x0070) >> 4; + RegExtend = (Opcode & 0x000c) << 1; + BaseExtend = (Opcode & 0x0003) << 3; + IndexExtend = (Opcode & 0x0002) << 2; + + //------------------------------------------------------------------------------------------------------------------------- + Opcode = 0x700 | BinCode[CodePos]; //read the 8 bit opcode. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + return null; + } + + //Only decode L1OM instead of MVEX/EVEX if L1OM compatibility mode is set. + + if (Mnemonics[0x62] === "" && Opcode === 0x62) { + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read L1OM byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + Opcode ^= 0xf0; + + IndexExtend = (Opcode & 0x80) >> 4; + BaseExtend = (Opcode & 0x40) >> 3; + RegExtend = (Opcode & 0x20) >> 2; + + if (SIMD !== 1) { + SizeAttrSelect = (Opcode & 0x10) === 0x10 ? 2 : 1; + } else { + SIMD = 0; + } + + Opcode = 0x800 | ((Opcode & 0x30) >> 4) | ((Opcode & 0x0f) << 2); + + return null; + } + + //The MVEX/EVEX prefix settings decoding. + + if (Opcode === 0x62 && (BinCode[CodePos] >= 0xc0 || BitMode === 2)) { + Extension = 2; + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read MVEX/EVEX byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + Opcode |= BinCode[CodePos] << 8; //read next MVEX/EVEX byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + Opcode |= BinCode[CodePos] << 16; //read next MVEX/EVEX byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + //Some bits are inverted, so uninvert them arithmetically. + + Opcode ^= 0x0878f0; + + //Check if Reserved bits are 0 if they are not 0 the MVEX/EVEX instruction is invalid. + + InvalidOp = (Opcode & 0x00000c) > 0; + + //Decode bit settings. + + if (BitMode === 2) { + RegExtend = ((Opcode & 0x80) >> 4) | (Opcode & 0x10); //The Double R'R bit decode for Register Extension 0 to 32. + BaseExtend = (Opcode & 0x60) >> 2; //The X bit, and B Bit base register extend combination 0 to 32. + IndexExtend = (Opcode & 0x40) >> 3; //The X extends the SIB Index by 8. + } + + VectorRegister = ((Opcode & 0x7800) >> 11) | ((Opcode & 0x080000) >> 15); //The Added in Vector Register for SSE under MVEX/EVEX. + + WidthBit = (Opcode & 0x8000) >> 15; //The width bit separator for MVEX/EVEX. + SIMD = (Opcode & 0x0300) >> 8; //decode the SIMD mode setting. + HInt_ZeroMerg = (Opcode & 0x800000) >> 23; //Zero Merge to destination control, or MVEX EH control. + + //EVEX option bits take the place of Vector length control. + + if ((Opcode & 0x0400) > 0) { + SizeAttrSelect = (Opcode & 0x600000) >> 21; //The EVEX.L'L Size combination. + RoundMode = SizeAttrSelect | 4; //Rounding mode is Vector length if used. + ConversionMode = (Opcode & 0x100000) >> 20; //Broadcast Round Memory address system. + } + + //MVEX Vector Length, and Broadcast round. + else { + SizeAttrSelect = 2; //Max Size by default. + ConversionMode = (Opcode & 0x700000) >> 20; //"MVEX.sss" Option bits. + RoundMode = ConversionMode; //Rounding mode selection is ConversionMode if used. + Extension = 3; + } + + MaskRegister = (Opcode & 0x070000) >> 16; //Mask to destination. + Opcode = (Opcode & 0x03) << 8; //Change Operation code map. + + //------------------------------------------------------------------------------------------------------------------------- + Opcode = (Opcode & 0x300) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map extend bit's. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + //Stop decoding prefixes. + + return null; + } + + //Segment overrides + + if ((Opcode & 0x7e7) === 0x26 || (Opcode & 0x7fe) === 0x64) { + SegOverride = Mnemonics[Opcode]; //Set the Left Bracket for the ModR/M memory address. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } + + //Operand override Prefix + + if (Opcode === 0x66) { + SIMD = 1; //sets SIMD mode 1 in case of SSE instruction opcode. + SizeAttrSelect = 0; //Adjust the size attribute setting for the size adjustment to the next instruction. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } + + //Ram address size override. + + if (Opcode === 0x67) { + AddressOverride = true; //Set the setting active for the ModR/M address size. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } + + //if repeat Prefixes F2 hex REP,or F3 hex RENP + + if (Opcode === 0xf2 || Opcode === 0xf3) { + SIMD = (Opcode & 0x02) | ((1 - Opcode) & 0x01); //F2, and F3 change the SIMD mode during SSE instructions. + PrefixG1 = Mnemonics[Opcode]; //set the Prefix string. + HLEFlipG1G2 = true; //set Filp HLE in case this is the last prefix read, and LOCK was set in string G2 first for HLE. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } + + //if the lock prefix note the lock prefix is separate + + if (Opcode === 0xf0) { + PrefixG2 = Mnemonics[Opcode]; //set the Prefix string + HLEFlipG1G2 = false; //set Flip HLE false in case this is the last prefix read, and REP, or REPNE was set in string G2 first for HLE. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } + + //Before ending the function "DecodePrefixAdjustments()" some opcode combinations are invalid in 64 bit mode. + + if (BitMode === 2) { + InvalidOp |= ((Opcode & 0x07) >= 0x06) & (Opcode <= 0x40); + InvalidOp |= (Opcode === 0x60) | (Opcode === 0x61); + InvalidOp |= (Opcode === 0xd4) | (Opcode === 0xd5); + InvalidOp |= (Opcode === 0x9a) | (Opcode === 0xea); + InvalidOp |= Opcode === 0x82; + } } /*------------------------------------------------------------------------------------------------------------------------- @@ -4943,89 +9136,122 @@ However DecodePrefixAdjustments can also prevent this function from being called used for the bit mode the CPU is in as it will set InvalidOp true. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeOpcode() -{ - //get the Operation name by the operations opcode. +function DecodeOpcode() { + //get the Operation name by the operations opcode. - Instruction = Mnemonics[Opcode]; + Instruction = Mnemonics[Opcode]; - //get the Operands for this opcode it follows the same array structure as Mnemonics array + //get the Operands for this opcode it follows the same array structure as Mnemonics array - InsOperands = Operands[Opcode]; + InsOperands = Operands[Opcode]; - //Some Opcodes use the next byte automatically for extended opcode selection. Or current SIMD mode. + //Some Opcodes use the next byte automatically for extended opcode selection. Or current SIMD mode. - var ModRMByte = BinCode[CodePos]; //Read the byte but do not move to the next byte. + var ModRMByte = BinCode[CodePos]; //Read the byte but do not move to the next byte. - //If the current Mnemonic is an array two in size then Register Mode, and memory mode are separate from each other. - //Used in combination with Grouped opcodes, and Static opcodes. + //If the current Mnemonic is an array two in size then Register Mode, and memory mode are separate from each other. + //Used in combination with Grouped opcodes, and Static opcodes. - if(Instruction instanceof Array && Instruction.length == 2) { var bits = ( ModRMByte >> 6 ) & ( ModRMByte >> 7 ); Instruction = Instruction[bits]; InsOperands = InsOperands[bits]; } - - //Arithmetic unit 8x8 combinational logic array combinations. - //If the current Mnemonic is an array 8 in length It is a group opcode instruction may repeat previous instructions in different forums. - - if(Instruction instanceof Array && Instruction.length == 8) { var bits = ( ModRMByte & 0x38 ) >> 3; Instruction = Instruction[bits]; InsOperands = InsOperands[bits]; - - //if The select Group opcode is another array 8 in size it is a static opcode selection which makes the last three bits of the ModR/M byte combination. - - if(Instruction instanceof Array && Instruction.length == 8) { var bits = ( ModRMByte & 0x07 ); Instruction = Instruction[bits]; InsOperands = InsOperands[bits]; NextByte(); } } - - //Vector unit 4x4 combinational array logic. - //if the current Mnemonic is an array 4 in size it is an SIMD instruction with four possible modes N/A, 66, F3, F2. - //The mode is set to SIMD, it could have been set by the EVEX.pp, VEX.pp bit combination, or by prefixes N/A, 66, F3, F2. - - if(Instruction instanceof Array && Instruction.length == 4) - { - Vect = true; //Set Vector Encoding true. - - //Reset the prefix string G1 because prefix codes F2, and F3 are used with SSE which forum the repeat prefix. - //Some SSE instructions can use the REP, RENP prefixes. - //The Vectors that do support the repeat prefix uses Packed Single format. - - if(Instruction[2] !== "" && Instruction[3] !== "") { PrefixG1 = ""; } else { SIMD = ( SIMD === 1 ) & 1; } - Instruction = Instruction[SIMD]; InsOperands = InsOperands[SIMD]; - - //If the SIMD instruction uses another array 4 in length in the Selected SIMD vector Instruction. - //Then each vector Extension is separate. The first extension is used if no extension is active for Regular instructions, and vector instruction septation. - //0=None. 1=VEX only. 2=EVEX only. 3=??? unused. - - if(Instruction instanceof Array && Instruction.length == 4) - { - //Get the correct Instruction for the Active Extension type. - - if(Instruction[Extension] !== "") { Instruction = Instruction[Extension]; InsOperands = InsOperands[Extension]; } - else{ Instruction = "???"; InsOperands = ""; } + if (Instruction instanceof Array && Instruction.length == 2) { + var bits = (ModRMByte >> 6) & (ModRMByte >> 7); + Instruction = Instruction[bits]; + InsOperands = InsOperands[bits]; } - else if( Extension === 3 ){ Instruction = "???"; InsOperands = ""; } - } - else if( Opcode >= 0x700 && SIMD > 0 ){ Instruction = "???"; InsOperands = ""; } - //if Any Mnemonic is an array 3 in size the instruction name goes by size. + //Arithmetic unit 8x8 combinational logic array combinations. + //If the current Mnemonic is an array 8 in length It is a group opcode instruction may repeat previous instructions in different forums. - if(Instruction instanceof Array && Instruction.length == 3) - { - var bits = ( Extension === 0 & BitMode !== 0 ) ^ ( SizeAttrSelect >= 1 ); //The first bit in SizeAttrSelect for size 32/16 Flips if 16 bit mode. - ( WidthBit ) && ( bits = 2 ); //Goes 64 using the Width bit. - ( Extension === 3 && HInt_ZeroMerg && Instruction[1] !== "" ) && ( HInt_ZeroMerg = false, bits = 1 ); //MVEX uses element 1 if MVEX.E is set for instruction that change name. + if (Instruction instanceof Array && Instruction.length == 8) { + var bits = (ModRMByte & 0x38) >> 3; + Instruction = Instruction[bits]; + InsOperands = InsOperands[bits]; - if (Instruction[bits] !== "") { Instruction = Instruction[bits]; InsOperands = InsOperands[bits]; } + //if The select Group opcode is another array 8 in size it is a static opcode selection which makes the last three bits of the ModR/M byte combination. - //else no size prefix name then use the default size Mnemonic name. + if (Instruction instanceof Array && Instruction.length == 8) { + var bits = ModRMByte & 0x07; + Instruction = Instruction[bits]; + InsOperands = InsOperands[bits]; + NextByte(); + } + } - else { Instruction = Instruction[0]; InsOperands = InsOperands[0]; } - } + //Vector unit 4x4 combinational array logic. + //if the current Mnemonic is an array 4 in size it is an SIMD instruction with four possible modes N/A, 66, F3, F2. + //The mode is set to SIMD, it could have been set by the EVEX.pp, VEX.pp bit combination, or by prefixes N/A, 66, F3, F2. - //If Extension is not 0 then add the vector extend "V" to the instruction. - //During the decoding of the operands the instruction can be returned as invalid if it is an Arithmetic, or MM, ST instruction. - //Vector mask instructions start with K instead of V any instruction that starts with K and is an - //vector mask Instruction which starts with K instead of V. + if (Instruction instanceof Array && Instruction.length == 4) { + Vect = true; //Set Vector Encoding true. - if( Opcode <= 0x400 && Extension > 0 && Instruction.charAt(0) !== "K" && Instruction !== "???" ) { Instruction = "V" + Instruction; } + //Reset the prefix string G1 because prefix codes F2, and F3 are used with SSE which forum the repeat prefix. + //Some SSE instructions can use the REP, RENP prefixes. + //The Vectors that do support the repeat prefix uses Packed Single format. - //In 32 bit mode, or bellow only one instruction MOVSXD is replaced with ARPL. + if (Instruction[2] !== "" && Instruction[3] !== "") { + PrefixG1 = ""; + } else { + SIMD = (SIMD === 1) & 1; + } + Instruction = Instruction[SIMD]; + InsOperands = InsOperands[SIMD]; - if( BitMode <= 1 && Instruction === "MOVSXD" ) { Instruction = "ARPL"; InsOperands = "06020A01"; } + //If the SIMD instruction uses another array 4 in length in the Selected SIMD vector Instruction. + //Then each vector Extension is separate. The first extension is used if no extension is active for Regular instructions, and vector instruction septation. + //0=None. 1=VEX only. 2=EVEX only. 3=??? unused. + + if (Instruction instanceof Array && Instruction.length == 4) { + //Get the correct Instruction for the Active Extension type. + + if (Instruction[Extension] !== "") { + Instruction = Instruction[Extension]; + InsOperands = InsOperands[Extension]; + } else { + Instruction = "???"; + InsOperands = ""; + } + } else if (Extension === 3) { + Instruction = "???"; + InsOperands = ""; + } + } else if (Opcode >= 0x700 && SIMD > 0) { + Instruction = "???"; + InsOperands = ""; + } + + //if Any Mnemonic is an array 3 in size the instruction name goes by size. + + if (Instruction instanceof Array && Instruction.length == 3) { + var bits = ((Extension === 0) & (BitMode !== 0)) ^ (SizeAttrSelect >= 1); //The first bit in SizeAttrSelect for size 32/16 Flips if 16 bit mode. + WidthBit && (bits = 2); //Goes 64 using the Width bit. + Extension === 3 && HInt_ZeroMerg && Instruction[1] !== "" && ((HInt_ZeroMerg = false), (bits = 1)); //MVEX uses element 1 if MVEX.E is set for instruction that change name. + + if (Instruction[bits] !== "") { + Instruction = Instruction[bits]; + InsOperands = InsOperands[bits]; + } + + //else no size prefix name then use the default size Mnemonic name. + else { + Instruction = Instruction[0]; + InsOperands = InsOperands[0]; + } + } + + //If Extension is not 0 then add the vector extend "V" to the instruction. + //During the decoding of the operands the instruction can be returned as invalid if it is an Arithmetic, or MM, ST instruction. + //Vector mask instructions start with K instead of V any instruction that starts with K and is an + //vector mask Instruction which starts with K instead of V. + + if (Opcode <= 0x400 && Extension > 0 && Instruction.charAt(0) !== "K" && Instruction !== "???") { + Instruction = "V" + Instruction; + } + + //In 32 bit mode, or bellow only one instruction MOVSXD is replaced with ARPL. + + if (BitMode <= 1 && Instruction === "MOVSXD") { + Instruction = "ARPL"; + InsOperands = "06020A01"; + } } /*------------------------------------------------------------------------------------------------------------------------- @@ -5038,110 +9264,106 @@ This function is used after the function ^DecodeOpcode()^ because the function ^ operand string for what the instruction takes as input. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeOperandString() -{ - //Variables that are used for decoding one operands across the operand string. +function DecodeOperandString() { + //Variables that are used for decoding one operands across the operand string. - var OperandValue = 0, Code = 0, BySize = 0, Setting = 0; + var OperandValue = 0, + Code = 0, + BySize = 0, + Setting = 0; - //It does not matter which order the explicit operands decode as they do not require reading another byte. - //They start at 7 and are set in order, but the order they are displayed is the order they are read in the operand string because of OpNum. + //It does not matter which order the explicit operands decode as they do not require reading another byte. + //They start at 7 and are set in order, but the order they are displayed is the order they are read in the operand string because of OpNum. - var ExplicitOp = 8, ImmOp = 3; + var ExplicitOp = 8, + ImmOp = 3; - //Each operand is 4 hex digits, and OpNum is added by one for each operand that is read per Iteration. + //Each operand is 4 hex digits, and OpNum is added by one for each operand that is read per Iteration. - for( var i = 0, OpNum = 0; i < InsOperands.length; i+=4 ) //Iterate though operand string. - { - OperandValue = parseInt( InsOperands.substring(i, (i + 4) ), 16 ); //Convert the four hex digits to a 16 bit number value. - Code = ( OperandValue & 0xFE00 ) >> 9; //Get the operand Code. - BySize = ( OperandValue & 0x0100 ) >> 8; //Get it's by size attributes setting for if Setting is used as size attributes. - Setting = ( OperandValue & 0x00FF ); //Get the 8 bit Size setting. + for ( + var i = 0, OpNum = 0; + i < InsOperands.length; + i += 4 //Iterate though operand string. + ) { + OperandValue = parseInt(InsOperands.substring(i, i + 4), 16); //Convert the four hex digits to a 16 bit number value. + Code = (OperandValue & 0xfe00) >> 9; //Get the operand Code. + BySize = (OperandValue & 0x0100) >> 8; //Get it's by size attributes setting for if Setting is used as size attributes. + Setting = OperandValue & 0x00ff; //Get the 8 bit Size setting. - //If code is 0 the next 8 bit value specifies which type of of prefix settings are active. + //If code is 0 the next 8 bit value specifies which type of of prefix settings are active. - if( Code === 0 ) - { - if(BySize) //Vector adjustment settings. - { - RoundingSetting = ( Setting & 0x03 ) << 3; - if( Opcode >= 0x700 && RoundingSetting >= 0x10 ){ RoundMode |= 0x10; } - VSIB = ( Setting >> 2 ) & 1; - IgnoresWidthbit = ( Setting >> 3 ) & 1; - VectS = ( Setting >> 4 ) & 7; - Swizzle = ( VectS >> 2 ) & 1; - Up = ( VectS >> 1 ) & 1; - Float = VectS & 1; - if( ( Setting & 0x80 ) == 0x80 ) { Vect = false; } //If Non vector instruction set Vect false. - } - else //Instruction Prefix types. - { - XRelease = Setting & 0x01; - XAcquire = ( Setting & 0x02 ) >> 1; - HT = ( Setting & 0x04 ) >> 2; - BND = ( Setting & 0x08 ) >> 3; - } + if (Code === 0) { + if (BySize) { + //Vector adjustment settings. + RoundingSetting = (Setting & 0x03) << 3; + if (Opcode >= 0x700 && RoundingSetting >= 0x10) { + RoundMode |= 0x10; + } + VSIB = (Setting >> 2) & 1; + IgnoresWidthbit = (Setting >> 3) & 1; + VectS = (Setting >> 4) & 7; + Swizzle = (VectS >> 2) & 1; + Up = (VectS >> 1) & 1; + Float = VectS & 1; + if ((Setting & 0x80) == 0x80) { + Vect = false; + } //If Non vector instruction set Vect false. + } //Instruction Prefix types. + else { + XRelease = Setting & 0x01; + XAcquire = (Setting & 0x02) >> 1; + HT = (Setting & 0x04) >> 2; + BND = (Setting & 0x08) >> 3; + } + } + + //if it is a opcode Reg Encoding then first element along the decoder is set as this has to be decode first, before moving to the + //byte for modR/M. + else if (Code === 1) { + X86Decoder[0].set(0, BySize, Setting, OpNum++); + } + + //if it is a ModR/M, or Far pointer ModR/M, or Moffs address then second decoder element is set. + else if (Code >= 2 && Code <= 4) { + X86Decoder[1].set(Code - 2, BySize, Setting, OpNum++); + if (Code == 4) { + FarPointer = 1; + } //If code is 4 it is a far pointer. + } + + //The ModR/M Reg bit's are separated from the address system above. The ModR/M register can be used as a different register with a + //different address pointer. The Reg bits of the ModR/M decode next as it would be inefficient to read the register value if the + //decoder moves to the immediate. + else if (Code === 5) { + X86Decoder[2].set(0, BySize, Setting, OpNum++); + } + + //Immediate input one. The immediate input is just a number input it is decoded last unless the instruction does not use a + //ModR/M encoding, or Reg Opcode. + else if (Code >= 6 && Code <= 8 && ImmOp <= 5) { + X86Decoder[ImmOp++].set(Code - 6, BySize, Setting, OpNum++); + } + + //Vector register. If the instruction uses this register it will not be decoded or displayed unless one of the vector extension codes are + //decoded by the function ^DecodePrefixAdjustments()^. The Vector extension codes also have a Vector register value that is stored into + //the variable VectorRegister. The variable VectorRegister is given to the function ^DecodeRegValue()^. + else if (Code === 9 && (Extension > 0 || Opcode >= 0x700)) { + X86Decoder[6].set(0, BySize, Setting, OpNum++); + } + + //The upper four bits of the Immediate is used as an register. The variable IMM stores the last immediate byte that is read by ^DecodeImmediate()^. + //The upper four bits of the IMM is given to the function ^DecodeRegValue()^. + else if (Code === 10) { + X86Decoder[7].set(0, BySize, Setting, OpNum++); + } + + //Else any other encoding type higher than 13 is an explicit operand selection. + //And also there can only be an max of four explicit operands. + else if (Code >= 11 && ExplicitOp <= 11) { + X86Decoder[ExplicitOp].set(Code - 11, BySize, Setting, OpNum++); + ExplicitOp++; //move to the next Explicit operand. + } } - - //if it is a opcode Reg Encoding then first element along the decoder is set as this has to be decode first, before moving to the - //byte for modR/M. - - else if( Code === 1 ) - { - X86Decoder[0].set( 0, BySize, Setting, OpNum++ ); - } - - //if it is a ModR/M, or Far pointer ModR/M, or Moffs address then second decoder element is set. - - else if( Code >= 2 && Code <= 4 ) - { - X86Decoder[1].set( ( Code - 2 ), BySize, Setting, OpNum++ ); - if( Code == 4 ){ FarPointer = 1; } //If code is 4 it is a far pointer. - } - - //The ModR/M Reg bit's are separated from the address system above. The ModR/M register can be used as a different register with a - //different address pointer. The Reg bits of the ModR/M decode next as it would be inefficient to read the register value if the - //decoder moves to the immediate. - - else if( Code === 5 ) - { - X86Decoder[2].set( 0, BySize, Setting, OpNum++ ); - } - - //Immediate input one. The immediate input is just a number input it is decoded last unless the instruction does not use a - //ModR/M encoding, or Reg Opcode. - - else if( Code >= 6 && Code <= 8 && ImmOp <= 5 ) - { - X86Decoder[ImmOp++].set( ( Code - 6 ), BySize, Setting, OpNum++ ); - } - - //Vector register. If the instruction uses this register it will not be decoded or displayed unless one of the vector extension codes are - //decoded by the function ^DecodePrefixAdjustments()^. The Vector extension codes also have a Vector register value that is stored into - //the variable VectorRegister. The variable VectorRegister is given to the function ^DecodeRegValue()^. - - else if( Code === 9 && ( Extension > 0 || Opcode >= 0x700 ) ) - { - X86Decoder[6].set( 0, BySize, Setting, OpNum++ ); - } - - //The upper four bits of the Immediate is used as an register. The variable IMM stores the last immediate byte that is read by ^DecodeImmediate()^. - //The upper four bits of the IMM is given to the function ^DecodeRegValue()^. - - else if( Code === 10 ) - { - X86Decoder[7].set( 0, BySize, Setting, OpNum++ ); - } - - //Else any other encoding type higher than 13 is an explicit operand selection. - //And also there can only be an max of four explicit operands. - - else if( Code >= 11 && ExplicitOp <= 11) - { - X86Decoder[ExplicitOp].set( ( Code - 11 ), BySize, Setting, OpNum++ ); - ExplicitOp++; //move to the next Explicit operand. - } - } } /*------------------------------------------------------------------------------------------------------------------------- @@ -5149,597 +9371,595 @@ Decode each of the operands along the X86Decoder and deactivate them. This function is used after ^DecodeOperandString()^ which sets up the X86 Decoder for the instructions operands. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeOperands() -{ - //The Operands array is a string array in which the operand number is the element the decoded operand is positioned. +function DecodeOperands() { + //The Operands array is a string array in which the operand number is the element the decoded operand is positioned. - var out = []; + var out = []; - //This holds the decoded ModR/M byte from the "Decode_ModRM_SIB_Value()" function because the Register, and Address can decode differently. + //This holds the decoded ModR/M byte from the "Decode_ModRM_SIB_Value()" function because the Register, and Address can decode differently. - var ModRMByte = [ -1, //Mode is set negative one used to check if the ModR/M has been decoded. - 0, //The register value is decoded separately if used. - 0 //the base register for the address location. - ]; + var ModRMByte = [ + -1, //Mode is set negative one used to check if the ModR/M has been decoded. + 0, //The register value is decoded separately if used. + 0 //the base register for the address location. + ]; - //If no Immediate operand is used then the Immediate register encoding forces an IMM8 for the register even if the immediate is not used. + //If no Immediate operand is used then the Immediate register encoding forces an IMM8 for the register even if the immediate is not used. - var IMM_Used = false; //This is set true for if any Immediate is read because the last Immediate byte is used as the register on the upper four bits. + var IMM_Used = false; //This is set true for if any Immediate is read because the last Immediate byte is used as the register on the upper four bits. - //If reg opcode is active. + //If reg opcode is active. - if( X86Decoder[0].Active ) - { - out[ X86Decoder[0].OpNum ] = DecodeRegValue( - ( RegExtend | ( Opcode & 0x07 ) ), //Register value. - X86Decoder[0].BySizeAttrubute, //By size attribute or not. - X86Decoder[0].Size //Size settings. - ); - } - - //If ModR/M Address is active. - - if( X86Decoder[1].Active ) - { - //Decode the ModR/M byte Address which can end up reading another byte for SIB address, and including displacements. - - if(X86Decoder[1].Type !== 0) - { - ModRMByte = Decode_ModRM_SIB_Value(); //Decode the ModR/M byte. - out[ X86Decoder[1].OpNum ] = Decode_ModRM_SIB_Address( - ModRMByte, //The ModR/M byte. - X86Decoder[1].BySizeAttrubute, //By size attribute or not. - X86Decoder[1].Size //Size settings. - ); - } - - //Else If the ModR/M type is 0 then it is a moffs address. - - else - { - var s=0, AddrsSize = 0; - if( X86Decoder[1].BySizeAttrubute ) - { - AddrsSize = ( Math.pow( 2, BitMode ) << 1 ); - s = GetOperandSize( X86Decoder[1].Size, true ) << 1; - } - else - { - AddrsSize = BitMode + 1; - s = X86Decoder[1].Size; - } - out[ X86Decoder[1].OpNum ] = PTR[ s ]; - out[ X86Decoder[1].OpNum ] += SegOverride + DecodeImmediate( 0, X86Decoder[1].BySizeAttrubute, AddrsSize ) + "]"; - } - } - - //Decode the Register value of the ModR/M byte. - - if( X86Decoder[2].Active ) - { - //If the ModR/M address is not used, and ModR/M byte was not previously decoded then decode it. - - if( ModRMByte[0] === -1 ){ ModRMByte = Decode_ModRM_SIB_Value(); } - - //Decode only the Register Section of the ModR/M byte values. - - out[ X86Decoder[2].OpNum ] = DecodeRegValue( - ( RegExtend | ( ModRMByte[1] & 0x07 ) ), //Register value. - X86Decoder[2].BySizeAttrubute, //By size attribute or not. - X86Decoder[2].Size //Size settings. - ); - } - - //First Immediate if used. - - if( X86Decoder[3].Active ) - { - var t = DecodeImmediate( - X86Decoder[3].Type, //Immediate input type. - X86Decoder[3].BySizeAttrubute, //By size attribute or not. - X86Decoder[3].Size //Size settings. - ); - - //Check if Instruction uses condition codes. - - if( Instruction.slice(-1) === "," ) - { - Instruction = Instruction.split(","); - - if( ( Extension >= 1 && Extension <= 2 && Opcode <= 0x400 && IMMValue < 0x20 ) || IMMValue < 0x08 ) - { - IMMValue |= ( ( ( Opcode > 0x400 ) & 1 ) << 5 ); //XOP adjust. - Instruction = Instruction[0] + ConditionCodes[ IMMValue ] + Instruction[1]; - } - else { Instruction = Instruction[0] + Instruction[1]; out[ X86Decoder[3].OpNum ] = t; } - } - - //else add the Immediate byte encoding to the decoded instruction operands. - - else { out[ X86Decoder[3].OpNum ] = t; } - - IMM_Used = true; //Immediate byte is read. - } - - //Second Immediate if used. - - if( X86Decoder[4].Active ) - { - out[ X86Decoder[4].OpNum ] = DecodeImmediate( - X86Decoder[4].Type, //Immediate input type. - X86Decoder[4].BySizeAttrubute, //By size attribute or not. - X86Decoder[4].Size //Size settings. - ); - } - - //Third Immediate if used. - - if( X86Decoder[5].Active ) - { - out[ X86Decoder[5].OpNum ] = DecodeImmediate( - X86Decoder[5].Type, //Immediate input type. - X86Decoder[5].BySizeAttrubute, //By size attribute or not. - X86Decoder[5].Size //Size settings. - ); - } - - //Vector register if used from an SIMD vector extended instruction. - - if( X86Decoder[6].Active ) - { - out[ X86Decoder[6].OpNum ] = DecodeRegValue( - VectorRegister, //Register value. - X86Decoder[6].BySizeAttrubute, //By size attribute or not. - X86Decoder[6].Size //Size settings. - ); - } - - //Immediate register encoding. - - if( X86Decoder[7].Active ) - { - if( !IMM_Used ) { DecodeImmediate(0, false, 0); } //forces IMM8 if no Immediate has been used. - out[ X86Decoder[7].OpNum ] = DecodeRegValue( - ( ( ( IMMValue & 0xF0 ) >> 4 ) | ( ( IMMValue & 0x08 ) << 1 ) ), //Register value. - X86Decoder[7].BySizeAttrubute, //By size attribute or not. - X86Decoder[7].Size //Size settings. - ); - } - - //------------------------------------------------------------------------------------------------------------------------- - //Iterate though the 4 possible Explicit operands The first operands that is not active ends the Iteration. - //------------------------------------------------------------------------------------------------------------------------- - - for( var i = 8; i < 11; i++ ) - { - //------------------------------------------------------------------------------------------------------------------------- - //if Active Type is used as which Explicit operand. - //------------------------------------------------------------------------------------------------------------------------- - - if( X86Decoder[i].Active ) - { - //General use registers value 0 though 4 there size can change by size setting but can not be extended or changed. - - if( X86Decoder[i].Type <= 3 ) - { - out[ X86Decoder[i].OpNum ] = DecodeRegValue( - X86Decoder[i].Type, //register by value for Explicit Registers A, C, D, B. - X86Decoder[i].BySizeAttrubute, //By size attribute or not. - X86Decoder[i].Size //Size attribute. + if (X86Decoder[0].Active) { + out[X86Decoder[0].OpNum] = DecodeRegValue( + RegExtend | (Opcode & 0x07), //Register value. + X86Decoder[0].BySizeAttrubute, //By size attribute or not. + X86Decoder[0].Size //Size settings. ); - } + } - //RBX address Explicit Operands prefixes can extend the registers and change pointer size RegMode 0. + //If ModR/M Address is active. - else if( X86Decoder[i].Type === 4 ) - { - s = 3; //If 32, or 64 bit ModR/M. - if( ( BitMode === 0 && !AddressOverride ) || ( BitMode === 1 && AddressOverride ) ){ s = 7; } //If 16 bit ModR/M. - out[ X86Decoder[i].OpNum ] = Decode_ModRM_SIB_Address( - [ 0, 0, s ], //the RBX register only for the pointer. - X86Decoder[i].BySizeAttrubute, //By size attribute or not. - X86Decoder[i].Size //size attributes. + if (X86Decoder[1].Active) { + //Decode the ModR/M byte Address which can end up reading another byte for SIB address, and including displacements. + + if (X86Decoder[1].Type !== 0) { + ModRMByte = Decode_ModRM_SIB_Value(); //Decode the ModR/M byte. + out[X86Decoder[1].OpNum] = Decode_ModRM_SIB_Address( + ModRMByte, //The ModR/M byte. + X86Decoder[1].BySizeAttrubute, //By size attribute or not. + X86Decoder[1].Size //Size settings. + ); + } + + //Else If the ModR/M type is 0 then it is a moffs address. + else { + var s = 0, + AddrsSize = 0; + if (X86Decoder[1].BySizeAttrubute) { + AddrsSize = Math.pow(2, BitMode) << 1; + s = GetOperandSize(X86Decoder[1].Size, true) << 1; + } else { + AddrsSize = BitMode + 1; + s = X86Decoder[1].Size; + } + out[X86Decoder[1].OpNum] = PTR[s]; + out[X86Decoder[1].OpNum] += + SegOverride + DecodeImmediate(0, X86Decoder[1].BySizeAttrubute, AddrsSize) + "]"; + } + } + + //Decode the Register value of the ModR/M byte. + + if (X86Decoder[2].Active) { + //If the ModR/M address is not used, and ModR/M byte was not previously decoded then decode it. + + if (ModRMByte[0] === -1) { + ModRMByte = Decode_ModRM_SIB_Value(); + } + + //Decode only the Register Section of the ModR/M byte values. + + out[X86Decoder[2].OpNum] = DecodeRegValue( + RegExtend | (ModRMByte[1] & 0x07), //Register value. + X86Decoder[2].BySizeAttrubute, //By size attribute or not. + X86Decoder[2].Size //Size settings. ); - } + } - //source and destination address Explicit Operands prefixes can extend the registers and change pointer size. + //First Immediate if used. - else if( X86Decoder[i].Type === 5 | X86Decoder[i].Type === 6 ) - { - s = 1; //If 32, or 64 bit ModR/M. - if( ( BitMode === 0 && !AddressOverride ) || ( BitMode === 1 & AddressOverride ) ) { s = -1; } //If 16 bit ModR/M. - out[ X86Decoder[i].OpNum ] = Decode_ModRM_SIB_Address( - [ 0, 0, ( X86Decoder[i].Type + s ) ], //source and destination pointer register by type value. - X86Decoder[i].BySizeAttrubute, //By size attribute or not. - X86Decoder[i].Size //size attributes. + if (X86Decoder[3].Active) { + var t = DecodeImmediate( + X86Decoder[3].Type, //Immediate input type. + X86Decoder[3].BySizeAttrubute, //By size attribute or not. + X86Decoder[3].Size //Size settings. ); - } - //The ST only Operand, and FS, GS. + //Check if Instruction uses condition codes. - else if( X86Decoder[i].Type >= 7 ) - { - out[ X86Decoder[i].OpNum ] = ["ST", "FS", "GS", "1", "3", "XMM0", "M10"][ ( X86Decoder[i].Type - 7 ) ]; - } + if (Instruction.slice(-1) === ",") { + Instruction = Instruction.split(","); + + if ((Extension >= 1 && Extension <= 2 && Opcode <= 0x400 && IMMValue < 0x20) || IMMValue < 0x08) { + IMMValue |= ((Opcode > 0x400) & 1) << 5; //XOP adjust. + Instruction = Instruction[0] + ConditionCodes[IMMValue] + Instruction[1]; + } else { + Instruction = Instruction[0] + Instruction[1]; + out[X86Decoder[3].OpNum] = t; + } + } + + //else add the Immediate byte encoding to the decoded instruction operands. + else { + out[X86Decoder[3].OpNum] = t; + } + + IMM_Used = true; //Immediate byte is read. + } + + //Second Immediate if used. + + if (X86Decoder[4].Active) { + out[X86Decoder[4].OpNum] = DecodeImmediate( + X86Decoder[4].Type, //Immediate input type. + X86Decoder[4].BySizeAttrubute, //By size attribute or not. + X86Decoder[4].Size //Size settings. + ); + } + + //Third Immediate if used. + + if (X86Decoder[5].Active) { + out[X86Decoder[5].OpNum] = DecodeImmediate( + X86Decoder[5].Type, //Immediate input type. + X86Decoder[5].BySizeAttrubute, //By size attribute or not. + X86Decoder[5].Size //Size settings. + ); + } + + //Vector register if used from an SIMD vector extended instruction. + + if (X86Decoder[6].Active) { + out[X86Decoder[6].OpNum] = DecodeRegValue( + VectorRegister, //Register value. + X86Decoder[6].BySizeAttrubute, //By size attribute or not. + X86Decoder[6].Size //Size settings. + ); + } + + //Immediate register encoding. + + if (X86Decoder[7].Active) { + if (!IMM_Used) { + DecodeImmediate(0, false, 0); + } //forces IMM8 if no Immediate has been used. + out[X86Decoder[7].OpNum] = DecodeRegValue( + ((IMMValue & 0xf0) >> 4) | ((IMMValue & 0x08) << 1), //Register value. + X86Decoder[7].BySizeAttrubute, //By size attribute or not. + X86Decoder[7].Size //Size settings. + ); } //------------------------------------------------------------------------------------------------------------------------- - //else inactive end iteration. + //Iterate though the 4 possible Explicit operands The first operands that is not active ends the Iteration. //------------------------------------------------------------------------------------------------------------------------- - else { break; } + for (var i = 8; i < 11; i++) { + //------------------------------------------------------------------------------------------------------------------------- + //if Active Type is used as which Explicit operand. + //------------------------------------------------------------------------------------------------------------------------- - } + if (X86Decoder[i].Active) { + //General use registers value 0 though 4 there size can change by size setting but can not be extended or changed. - /*------------------------------------------------------------------------------------------------------------------------- + if (X86Decoder[i].Type <= 3) { + out[X86Decoder[i].OpNum] = DecodeRegValue( + X86Decoder[i].Type, //register by value for Explicit Registers A, C, D, B. + X86Decoder[i].BySizeAttrubute, //By size attribute or not. + X86Decoder[i].Size //Size attribute. + ); + } + + //RBX address Explicit Operands prefixes can extend the registers and change pointer size RegMode 0. + else if (X86Decoder[i].Type === 4) { + s = 3; //If 32, or 64 bit ModR/M. + if ((BitMode === 0 && !AddressOverride) || (BitMode === 1 && AddressOverride)) { + s = 7; + } //If 16 bit ModR/M. + out[X86Decoder[i].OpNum] = Decode_ModRM_SIB_Address( + [0, 0, s], //the RBX register only for the pointer. + X86Decoder[i].BySizeAttrubute, //By size attribute or not. + X86Decoder[i].Size //size attributes. + ); + } + + //source and destination address Explicit Operands prefixes can extend the registers and change pointer size. + else if ((X86Decoder[i].Type === 5) | (X86Decoder[i].Type === 6)) { + s = 1; //If 32, or 64 bit ModR/M. + if ((BitMode === 0 && !AddressOverride) || (BitMode === 1) & AddressOverride) { + s = -1; + } //If 16 bit ModR/M. + out[X86Decoder[i].OpNum] = Decode_ModRM_SIB_Address( + [0, 0, X86Decoder[i].Type + s], //source and destination pointer register by type value. + X86Decoder[i].BySizeAttrubute, //By size attribute or not. + X86Decoder[i].Size //size attributes. + ); + } + + //The ST only Operand, and FS, GS. + else if (X86Decoder[i].Type >= 7) { + out[X86Decoder[i].OpNum] = ["ST", "FS", "GS", "1", "3", "XMM0", "M10"][X86Decoder[i].Type - 7]; + } + } + + //------------------------------------------------------------------------------------------------------------------------- + //else inactive end iteration. + //------------------------------------------------------------------------------------------------------------------------- + else { + break; + } + } + + /*------------------------------------------------------------------------------------------------------------------------- If the EVEX vector extension is active the Mask, and Zero merge control are inserted into operand 0 (Destination operand). -------------------------------------------------------------------------------------------------------------------------*/ - //Mask Register is used if it is not 0 in value. + //Mask Register is used if it is not 0 in value. - if( MaskRegister !== 0 ){ out[0] += "{K" + MaskRegister + "}"; } - - //EVEX Zero Merge control. + if (MaskRegister !== 0) { + out[0] += "{K" + MaskRegister + "}"; + } - if( Extension === 2 && HInt_ZeroMerg ) { out[0] += "{Z}"; } + //EVEX Zero Merge control. - //convert the operand array to a string and return it. + if (Extension === 2 && HInt_ZeroMerg) { + out[0] += "{Z}"; + } - InsOperands = out.toString(); + //convert the operand array to a string and return it. + + InsOperands = out.toString(); } /*------------------------------------------------------------------------------------------------------------------------- The main Instruction decode function plugs everything in together for the steps required to decode a full X86 instruction. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeInstruction() -{ - //Reset Prefix adjustments, and vector setting adjustments. +function DecodeInstruction() { + //Reset Prefix adjustments, and vector setting adjustments. - Reset(); + Reset(); - var out = ""; //The instruction code that will be returned back from this function. + var out = ""; //The instruction code that will be returned back from this function. - //Record the starting position. + //Record the starting position. - InstructionPos = GetPosition(); + InstructionPos = GetPosition(); - //First read any opcodes (prefix) that act as adjustments to the main three operand decode functions ^DecodeRegValue()^, - //^Decode_ModRM_SIB_Address()^, and ^DecodeImmediate()^. + //First read any opcodes (prefix) that act as adjustments to the main three operand decode functions ^DecodeRegValue()^, + //^Decode_ModRM_SIB_Address()^, and ^DecodeImmediate()^. - DecodePrefixAdjustments(); + DecodePrefixAdjustments(); - //Only continue if an invalid opcode is not read by DecodePrefixAdjustments() for cpu bit mode setting. + //Only continue if an invalid opcode is not read by DecodePrefixAdjustments() for cpu bit mode setting. - if( !InvalidOp ) - { - //Decode the instruction. + if (!InvalidOp) { + //Decode the instruction. - DecodeOpcode(); + DecodeOpcode(); - //------------------------------------------------------------------------------------------------------------------------- - //Intel Larrabee CCCCC condition codes. - //------------------------------------------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------------------------------------------- + //Intel Larrabee CCCCC condition codes. + //------------------------------------------------------------------------------------------------------------------------- - if( Opcode >= 0x700 && Instruction.slice(-1) === "," ) - { - Instruction = Instruction.split(","); + if (Opcode >= 0x700 && Instruction.slice(-1) === ",") { + Instruction = Instruction.split(","); - //CMP conditions. + //CMP conditions. - if( Opcode >= 0x720 && Opcode <= 0x72F ) - { - IMMValue = VectorRegister >> 2; + if (Opcode >= 0x720 && Opcode <= 0x72f) { + IMMValue = VectorRegister >> 2; - if( Float || ( IMMValue !== 3 && IMMValue !== 7 ) ) - { - Instruction = Instruction[0] + ConditionCodes[IMMValue] + Instruction[1]; + if (Float || (IMMValue !== 3 && IMMValue !== 7)) { + Instruction = Instruction[0] + ConditionCodes[IMMValue] + Instruction[1]; + } else { + Instruction = Instruction[0] + Instruction[1]; + } + + IMMValue = 0; + VectorRegister &= 0x03; + } + + //Else High/Low. + else { + Instruction = Instruction[0] + ((VectorRegister & 1) === 1 ? "H" : "L") + Instruction[1]; + } } - else { Instruction = Instruction[0] + Instruction[1]; } - IMMValue = 0; VectorRegister &= 0x03; - } + //Setup the X86 Decoder for which operands the instruction uses. - //Else High/Low. + DecodeOperandString(); - else - { - Instruction = Instruction[0] + ( ( ( VectorRegister & 1 ) === 1 ) ? "H" : "L" ) + Instruction[1]; - } + //Now only some instructions can vector extend, and that is only if the instruction is an SIMD Vector format instruction. + + if (!Vect && Extension > 0 && Opcode <= 0x400) { + InvalidOp = true; + } + + //The Width Bit setting must match the vector numbers size otherwise this create an invalid operation code in MVEX/EVEX unless the Width bit is ignored. + + if (Vect && !IgnoresWidthbit && Extension >= 2) { + InvalidOp = (SIMD & 1) !== (WidthBit & 1); //Note use, and ignore width bit pastern EVEX. + } + if (Opcode >= 0x700) { + WidthBit ^= IgnoresWidthbit; + } //L1OM Width bit invert. } - //Setup the X86 Decoder for which operands the instruction uses. + //If the instruction is invalid then set the instruction to "???" - DecodeOperandString(); - - //Now only some instructions can vector extend, and that is only if the instruction is an SIMD Vector format instruction. - - if( !Vect && Extension > 0 && Opcode <= 0x400 ) { InvalidOp = true; } - - //The Width Bit setting must match the vector numbers size otherwise this create an invalid operation code in MVEX/EVEX unless the Width bit is ignored. - - if( Vect && !IgnoresWidthbit && Extension >= 2 ) - { - InvalidOp = ( ( SIMD & 1 ) !== ( WidthBit & 1 ) ); //Note use, and ignore width bit pastern EVEX. + if (InvalidOp) { + out = "???"; //set the returned instruction to invalid } - if( Opcode >= 0x700 ) { WidthBit ^= IgnoresWidthbit; } //L1OM Width bit invert. - } - //If the instruction is invalid then set the instruction to "???" + //Else finish decoding the valid instruction. + else { + //Decode each operand along the Decoder array in order, and deactivate them. - if( InvalidOp ) - { - out = "???" //set the returned instruction to invalid - } + DecodeOperands(); - //Else finish decoding the valid instruction. - - else - { - //Decode each operand along the Decoder array in order, and deactivate them. - - DecodeOperands(); - - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- 3DNow Instruction name is encoded by the next byte after the ModR/M, and Reg operands. -------------------------------------------------------------------------------------------------------------------------*/ - if( Opcode === 0x10F ) - { - //Lookup operation code. + if (Opcode === 0x10f) { + //Lookup operation code. - Instruction = M3DNow[ BinCode[CodePos] ]; NextByte(); + Instruction = M3DNow[BinCode[CodePos]]; + NextByte(); - //If Invalid instruction. + //If Invalid instruction. - if( Instruction === "" || Instruction == null ) - { - Instruction = "???"; InsOperands = ""; - } - } - - /*------------------------------------------------------------------------------------------------------------------------- + if (Instruction === "" || Instruction == null) { + Instruction = "???"; + InsOperands = ""; + } + } else if (Instruction === "SSS") { + /*------------------------------------------------------------------------------------------------------------------------- Synthetic virtual machine operation codes. -------------------------------------------------------------------------------------------------------------------------*/ + //The Next two bytes after the static opcode is the select synthetic virtual machine operation code. - else if( Instruction === "SSS" ) - { - //The Next two bytes after the static opcode is the select synthetic virtual machine operation code. + var Code1 = BinCode[CodePos]; + NextByte(); + var Code2 = BinCode[CodePos]; + NextByte(); - var Code1 = BinCode[CodePos]; NextByte(); - var Code2 = BinCode[CodePos]; NextByte(); + //No operations exist past 4 in value for both bytes that combine to the operation code. - //No operations exist past 4 in value for both bytes that combine to the operation code. + if (Code1 >= 5 || Code2 >= 5) { + Instruction = "???"; + } - if( Code1 >= 5 || Code2 >= 5 ) { Instruction = "???"; } + //Else calculate the operation code in the 5x5 map. + else { + Instruction = MSynthetic[Code1 * 5 + Code2]; - //Else calculate the operation code in the 5x5 map. + //If Invalid instruction. - else - { - Instruction = MSynthetic[ ( Code1 * 5 ) + Code2 ]; - - //If Invalid instruction. - - if( Instruction === "" || Instruction == null ) - { - Instruction = "???"; + if (Instruction === "" || Instruction == null) { + Instruction = "???"; + } + } } - } + + //32/16 bit instructions 9A, and EA use Segment, and offset with Immediate format. + + if (Opcode === 0x9a || Opcode === 0xea) { + var t = InsOperands.split(","); + InsOperands = t[1] + ":" + t[0]; + } + + //**Depending on the operation different prefixes replace others for HLE, or MPX, and branch prediction. + //if REP prefix, and LOCK prefix are used together, and the current decoded operation allows HLE XRELEASE. + + if (PrefixG1 === Mnemonics[0xf3] && PrefixG2 === Mnemonics[0xf0] && XRelease) { + PrefixG1 = "XRELEASE"; //Then change REP to XRELEASE. + } + + //if REPNE prefix, and LOCK prefix are used together, and the current decoded operation allows HLE XACQUIRE. + + if (PrefixG1 === Mnemonics[0xf2] && PrefixG2 === Mnemonics[0xf0] && XAcquire) { + PrefixG1 = "XACQUIRE"; //Then change REP to XACQUIRE + } + + //Depending on the order that the Repeat prefix, and Lock prefix is used flip Prefix G1, and G2 if HLEFlipG1G2 it is true. + + if ((PrefixG1 === "XRELEASE" || PrefixG1 === "XACQUIRE") && HLEFlipG1G2) { + t = PrefixG1; + PrefixG1 = PrefixG2; + PrefixG2 = t; + } + + //if HT is active then it is a jump instruction check and adjust for the HT,and HNT prefix. + + if (HT) { + if (SegOverride === Mnemonics[0x2e]) { + PrefixG1 = "HNT"; + } else if (SegOverride === Mnemonics[0x3e]) { + PrefixG1 = "HT"; + } + } + + //else if Prefix is REPNE switch it to BND if operation is a MPX instruction. + + if (PrefixG1 === Mnemonics[0xf2] && BND) { + PrefixG1 = "BND"; + } + + //Before the Instruction is put together check the length of the instruction if it is longer than 15 bytes the instruction is undefined. + + if (InstructionHex.length > 30) { + //Calculate how many bytes over. + + var Dif32 = (InstructionHex.length - 30) >> 1; + + //Limit the instruction hex output to 15 bytes. + + InstructionHex = InstructionHex.substring(0, 30); + + //Calculate the Difference between the Disassembler current position. + + Dif32 = Pos32 - Dif32; + + //Convert Dif to unsignified numbers. + + if (Dif32 < 0) { + Dif32 += 0x100000000; + } + + //Convert to strings. + + for (var S32 = Dif32.toString(16); S32.length < 8; S32 = "0" + S32); + for (var S64 = Pos64.toString(16); S64.length < 8; S64 = "0" + S64); + + //Go to the Calculated address right after the Instruction UD. + + GotoPosition(S64 + S32); + + //Set prefixes, and operands to empty strings, and set Instruction to UD. + + PrefixG1 = ""; + PrefixG2 = ""; + Instruction = "???"; + InsOperands = ""; + } + + //Put the Instruction sequence together. + + out = PrefixG1 + " " + PrefixG2 + " " + Instruction + " " + InsOperands; + + //Remove any trailing spaces because of unused prefixes. + + out = out.replace(/^[ ]+|[ ]+$/g, ""); + + //Add error suppression if used. + + if (Opcode >= 0x700 || RoundMode !== 0) { + out += RoundModes[RoundMode]; + } + + //Return the instruction. } - //32/16 bit instructions 9A, and EA use Segment, and offset with Immediate format. - - if( Opcode === 0x9A || Opcode === 0xEA ) - { - var t = InsOperands.split(","); - InsOperands = t[1] + ":" +t[0]; - } - - //**Depending on the operation different prefixes replace others for HLE, or MPX, and branch prediction. - //if REP prefix, and LOCK prefix are used together, and the current decoded operation allows HLE XRELEASE. - - if(PrefixG1 === Mnemonics[0xF3] && PrefixG2 === Mnemonics[0xF0] && XRelease) - { - PrefixG1 = "XRELEASE"; //Then change REP to XRELEASE. - } - - //if REPNE prefix, and LOCK prefix are used together, and the current decoded operation allows HLE XACQUIRE. - - if(PrefixG1 === Mnemonics[0xF2] && PrefixG2 === Mnemonics[0xF0] && XAcquire) - { - PrefixG1 = "XACQUIRE"; //Then change REP to XACQUIRE - } - - //Depending on the order that the Repeat prefix, and Lock prefix is used flip Prefix G1, and G2 if HLEFlipG1G2 it is true. - - if((PrefixG1 === "XRELEASE" || PrefixG1 === "XACQUIRE") && HLEFlipG1G2) - { - t = PrefixG1; PrefixG1 = PrefixG2; PrefixG2 = t; - } - - //if HT is active then it is a jump instruction check and adjust for the HT,and HNT prefix. - - if(HT) - { - if (SegOverride === Mnemonics[0x2E]) - { - PrefixG1 = "HNT"; - } - else if (SegOverride === Mnemonics[0x3E]) - { - PrefixG1 = "HT"; - } - } - - //else if Prefix is REPNE switch it to BND if operation is a MPX instruction. - - if(PrefixG1 === Mnemonics[0xF2] && BND) - { - PrefixG1 = "BND"; - } - - //Before the Instruction is put together check the length of the instruction if it is longer than 15 bytes the instruction is undefined. - - if ( InstructionHex.length > 30 ) - { - //Calculate how many bytes over. - - var Dif32 = ( ( InstructionHex.length - 30 ) >> 1 ); - - //Limit the instruction hex output to 15 bytes. - - InstructionHex = InstructionHex.substring( 0, 30 ); - - //Calculate the Difference between the Disassembler current position. - - Dif32 = Pos32 - Dif32; - - //Convert Dif to unsignified numbers. - - if( Dif32 < 0 ) { Dif32 += 0x100000000; } - - //Convert to strings. - - for (var S32 = Dif32.toString(16) ; S32.length < 8; S32 = "0" + S32); - for (var S64 = Pos64.toString(16) ; S64.length < 8; S64 = "0" + S64); - - //Go to the Calculated address right after the Instruction UD. - - GotoPosition( S64 + S32 ); - - //Set prefixes, and operands to empty strings, and set Instruction to UD. - - PrefixG1 = "";PrefixG2 = ""; Instruction = "???"; InsOperands = ""; - } - - //Put the Instruction sequence together. - - out = PrefixG1 + " " + PrefixG2 + " " + Instruction + " " + InsOperands; - - //Remove any trailing spaces because of unused prefixes. - - out = out.replace(/^[ ]+|[ ]+$/g,''); - - //Add error suppression if used. - - if( Opcode >= 0x700 || RoundMode !== 0 ) - { - out += RoundModes[ RoundMode ]; - } - - //Return the instruction. - } - - return( out ); + return out; } /*------------------------------------------------------------------------------------------------------------------------- This function Resets the Decoder in case of error, or an full instruction has been decoded. -------------------------------------------------------------------------------------------------------------------------*/ -function Reset() -{ - //Reset Opcode, and Size attribute selector. +function Reset() { + //Reset Opcode, and Size attribute selector. - Opcode = 0; SizeAttrSelect = 1; - - //Reset Operands and instruction. - - Instruction = ""; InsOperands = ""; + Opcode = 0; + SizeAttrSelect = 1; - //Reset ModR/M. + //Reset Operands and instruction. - RexActive = 0; RegExtend = 0; BaseExtend = 0; IndexExtend = 0; - SegOverride = "["; AddressOverride = false; FarPointer = 0; + Instruction = ""; + InsOperands = ""; - //Reset Vector extensions controls. + //Reset ModR/M. - Extension = 0; SIMD = 0; Vect = false; ConversionMode = 0; WidthBit = false; - VectorRegister = 0; MaskRegister = 0; HInt_ZeroMerg = false; RoundMode = 0x00; + RexActive = 0; + RegExtend = 0; + BaseExtend = 0; + IndexExtend = 0; + SegOverride = "["; + AddressOverride = false; + FarPointer = 0; - //Reset vector format settings. + //Reset Vector extensions controls. - IgnoresWidthbit = false; VSIB = false; RoundingSetting = 0; - Swizzle = false; Up = false; Float = false; VectS = 0x00; + Extension = 0; + SIMD = 0; + Vect = false; + ConversionMode = 0; + WidthBit = false; + VectorRegister = 0; + MaskRegister = 0; + HInt_ZeroMerg = false; + RoundMode = 0x00; - //Reset IMMValue used for Imm register encoding, and Condition codes. + //Reset vector format settings. - IMMValue = 0; + IgnoresWidthbit = false; + VSIB = false; + RoundingSetting = 0; + Swizzle = false; + Up = false; + Float = false; + VectS = 0x00; - //Reset instruction Prefixes. + //Reset IMMValue used for Imm register encoding, and Condition codes. - PrefixG1 = "", PrefixG2 = ""; - XRelease = false; XAcquire = false; HLEFlipG1G2 = false; - HT = false; - BND = false; + IMMValue = 0; - //Reset Invalid operation code. + //Reset instruction Prefixes. - InvalidOp = false; + (PrefixG1 = ""), (PrefixG2 = ""); + XRelease = false; + XAcquire = false; + HLEFlipG1G2 = false; + HT = false; + BND = false; - //Reset instruction hex because it is used to check if the instruction is longer than 15 bytes which is impossible for the X86 Decoder Circuit. + //Reset Invalid operation code. - InstructionHex = ""; + InvalidOp = false; - //Deactivate all operands along the X86Decoder. + //Reset instruction hex because it is used to check if the instruction is longer than 15 bytes which is impossible for the X86 Decoder Circuit. - for( var i = 0; i < X86Decoder.length; X86Decoder[i++].Deactivate() ); + InstructionHex = ""; + + //Deactivate all operands along the X86Decoder. + + for (var i = 0; i < X86Decoder.length; X86Decoder[i++].Deactivate()); } /*------------------------------------------------------------------------------------------------------------------------- do an linear disassemble. -------------------------------------------------------------------------------------------------------------------------*/ -export function LDisassemble() -{ - var Instruction = ""; //Stores the Decoded instruction. - var Out = ""; //The Disassemble output +export function LDisassemble() { + var Instruction = ""; //Stores the Decoded instruction. + var Out = ""; //The Disassemble output - //Disassemble binary code using an linear pass. + //Disassemble binary code using an linear pass. - var len = BinCode.length; + var len = BinCode.length; - //Backup the base address. + //Backup the base address. - var BPos64 = Pos64, BPos32 = Pos32; + var BPos64 = Pos64, + BPos32 = Pos32; - while( CodePos < len ) - { - Instruction = DecodeInstruction(); + while (CodePos < len) { + Instruction = DecodeInstruction(); - //Add the 64 bit address of the output if ShowInstructionPos decoding is active. + //Add the 64 bit address of the output if ShowInstructionPos decoding is active. - if( ShowInstructionPos ) - { - Out += InstructionPos + " "; + if (ShowInstructionPos) { + Out += InstructionPos + " "; + } + + //Show Each byte that was read to decode the instruction if ShowInstructionHex decoding is active. + + if (ShowInstructionHex) { + InstructionHex = InstructionHex.toUpperCase(); + for (; InstructionHex.length < 32; InstructionHex = InstructionHex + " "); + Out += InstructionHex + ""; + } + + //Put the decoded instruction into the output and make a new line. + + Out += Instruction + "\r\n"; + + //Reset instruction Pos and Hex. + + InstructionPos = ""; + InstructionHex = ""; } - //Show Each byte that was read to decode the instruction if ShowInstructionHex decoding is active. + CodePos = 0; //Reset the Code position + Pos32 = BPos32; + Pos64 = BPos64; //Reset Base address. - if(ShowInstructionHex) - { - InstructionHex = InstructionHex.toUpperCase(); - for(; InstructionHex.length < 32; InstructionHex = InstructionHex + " " ); - Out += InstructionHex + ""; - } - - //Put the decoded instruction into the output and make a new line. - - Out += Instruction + "\r\n"; - - //Reset instruction Pos and Hex. - - InstructionPos = ""; InstructionHex = ""; - } - - CodePos = 0; //Reset the Code position - Pos32 = BPos32; Pos64 = BPos64; //Reset Base address. - - //return the decoded binary code - - return(Out); + //return the decoded binary code + return Out; } //////////////////////////////////////////////////////////////////////////////////////////////// @@ -5748,13 +9968,12 @@ export function LDisassemble() * The following code has been added to expose public methods for use in CyberChef */ -export function setBitMode (val) { - BitMode = val; -}; -export function setShowInstructionHex (val) { - ShowInstructionHex = val; -}; -export function setShowInstructionPos (val) { - ShowInstructionPos = val; -}; - +export function setBitMode(val) { + BitMode = val; +} +export function setShowInstructionHex(val) { + ShowInstructionHex = val; +} +export function setShowInstructionPos(val) { + ShowInstructionPos = val; +} diff --git a/src/core/vendor/gost/gostCipher.mjs b/src/core/vendor/gost/gostCipher.mjs index 8505fd34..ea3926aa 100644 --- a/src/core/vendor/gost/gostCipher.mjs +++ b/src/core/vendor/gost/gostCipher.mjs @@ -32,27 +32,27 @@ * */ -import GostRandom from './gostRandom.mjs'; +import GostRandom from "./gostRandom.mjs"; -import crypto from 'crypto' +import crypto from "crypto"; /* -* Initial parameters and common algortithms of GOST 28147-89 -* -* http://tools.ietf.org/html/rfc5830 -* -*/ // + * Initial parameters and common algortithms of GOST 28147-89 + * + * http://tools.ietf.org/html/rfc5830 + * + */ // var root = {}; var rootCrypto = crypto; var CryptoOperationData = ArrayBuffer; var SyntaxError = Error, - DataError = Error, - NotSupportedError = Error; + DataError = Error, + NotSupportedError = Error; /* -* Check supported -* This implementation support only Little Endian arhitecture -*/ + * Check supported + * This implementation support only Little Endian arhitecture + */ var littleEndian = (function () { var buffer = new CryptoOperationData(2); @@ -65,114 +65,93 @@ var defaultIV = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0]); // Predefined sBox collection var sBoxes = { - 'E-TEST': [ - 0x4, 0x2, 0xF, 0x5, 0x9, 0x1, 0x0, 0x8, 0xE, 0x3, 0xB, 0xC, 0xD, 0x7, 0xA, 0x6, - 0xC, 0x9, 0xF, 0xE, 0x8, 0x1, 0x3, 0xA, 0x2, 0x7, 0x4, 0xD, 0x6, 0x0, 0xB, 0x5, - 0xD, 0x8, 0xE, 0xC, 0x7, 0x3, 0x9, 0xA, 0x1, 0x5, 0x2, 0x4, 0x6, 0xF, 0x0, 0xB, - 0xE, 0x9, 0xB, 0x2, 0x5, 0xF, 0x7, 0x1, 0x0, 0xD, 0xC, 0x6, 0xA, 0x4, 0x3, 0x8, - 0x3, 0xE, 0x5, 0x9, 0x6, 0x8, 0x0, 0xD, 0xA, 0xB, 0x7, 0xC, 0x2, 0x1, 0xF, 0x4, - 0x8, 0xF, 0x6, 0xB, 0x1, 0x9, 0xC, 0x5, 0xD, 0x3, 0x7, 0xA, 0x0, 0xE, 0x2, 0x4, - 0x9, 0xB, 0xC, 0x0, 0x3, 0x6, 0x7, 0x5, 0x4, 0x8, 0xE, 0xF, 0x1, 0xA, 0x2, 0xD, - 0xC, 0x6, 0x5, 0x2, 0xB, 0x0, 0x9, 0xD, 0x3, 0xE, 0x7, 0xA, 0xF, 0x4, 0x1, 0x8 + "E-TEST": [ + 0x4, 0x2, 0xf, 0x5, 0x9, 0x1, 0x0, 0x8, 0xe, 0x3, 0xb, 0xc, 0xd, 0x7, 0xa, 0x6, 0xc, 0x9, 0xf, 0xe, 0x8, 0x1, + 0x3, 0xa, 0x2, 0x7, 0x4, 0xd, 0x6, 0x0, 0xb, 0x5, 0xd, 0x8, 0xe, 0xc, 0x7, 0x3, 0x9, 0xa, 0x1, 0x5, 0x2, 0x4, + 0x6, 0xf, 0x0, 0xb, 0xe, 0x9, 0xb, 0x2, 0x5, 0xf, 0x7, 0x1, 0x0, 0xd, 0xc, 0x6, 0xa, 0x4, 0x3, 0x8, 0x3, 0xe, + 0x5, 0x9, 0x6, 0x8, 0x0, 0xd, 0xa, 0xb, 0x7, 0xc, 0x2, 0x1, 0xf, 0x4, 0x8, 0xf, 0x6, 0xb, 0x1, 0x9, 0xc, 0x5, + 0xd, 0x3, 0x7, 0xa, 0x0, 0xe, 0x2, 0x4, 0x9, 0xb, 0xc, 0x0, 0x3, 0x6, 0x7, 0x5, 0x4, 0x8, 0xe, 0xf, 0x1, 0xa, + 0x2, 0xd, 0xc, 0x6, 0x5, 0x2, 0xb, 0x0, 0x9, 0xd, 0x3, 0xe, 0x7, 0xa, 0xf, 0x4, 0x1, 0x8 ], - 'E-A': [ - 0x9, 0x6, 0x3, 0x2, 0x8, 0xB, 0x1, 0x7, 0xA, 0x4, 0xE, 0xF, 0xC, 0x0, 0xD, 0x5, - 0x3, 0x7, 0xE, 0x9, 0x8, 0xA, 0xF, 0x0, 0x5, 0x2, 0x6, 0xC, 0xB, 0x4, 0xD, 0x1, - 0xE, 0x4, 0x6, 0x2, 0xB, 0x3, 0xD, 0x8, 0xC, 0xF, 0x5, 0xA, 0x0, 0x7, 0x1, 0x9, - 0xE, 0x7, 0xA, 0xC, 0xD, 0x1, 0x3, 0x9, 0x0, 0x2, 0xB, 0x4, 0xF, 0x8, 0x5, 0x6, - 0xB, 0x5, 0x1, 0x9, 0x8, 0xD, 0xF, 0x0, 0xE, 0x4, 0x2, 0x3, 0xC, 0x7, 0xA, 0x6, - 0x3, 0xA, 0xD, 0xC, 0x1, 0x2, 0x0, 0xB, 0x7, 0x5, 0x9, 0x4, 0x8, 0xF, 0xE, 0x6, - 0x1, 0xD, 0x2, 0x9, 0x7, 0xA, 0x6, 0x0, 0x8, 0xC, 0x4, 0x5, 0xF, 0x3, 0xB, 0xE, - 0xB, 0xA, 0xF, 0x5, 0x0, 0xC, 0xE, 0x8, 0x6, 0x2, 0x3, 0x9, 0x1, 0x7, 0xD, 0x4 + "E-A": [ + 0x9, 0x6, 0x3, 0x2, 0x8, 0xb, 0x1, 0x7, 0xa, 0x4, 0xe, 0xf, 0xc, 0x0, 0xd, 0x5, 0x3, 0x7, 0xe, 0x9, 0x8, 0xa, + 0xf, 0x0, 0x5, 0x2, 0x6, 0xc, 0xb, 0x4, 0xd, 0x1, 0xe, 0x4, 0x6, 0x2, 0xb, 0x3, 0xd, 0x8, 0xc, 0xf, 0x5, 0xa, + 0x0, 0x7, 0x1, 0x9, 0xe, 0x7, 0xa, 0xc, 0xd, 0x1, 0x3, 0x9, 0x0, 0x2, 0xb, 0x4, 0xf, 0x8, 0x5, 0x6, 0xb, 0x5, + 0x1, 0x9, 0x8, 0xd, 0xf, 0x0, 0xe, 0x4, 0x2, 0x3, 0xc, 0x7, 0xa, 0x6, 0x3, 0xa, 0xd, 0xc, 0x1, 0x2, 0x0, 0xb, + 0x7, 0x5, 0x9, 0x4, 0x8, 0xf, 0xe, 0x6, 0x1, 0xd, 0x2, 0x9, 0x7, 0xa, 0x6, 0x0, 0x8, 0xc, 0x4, 0x5, 0xf, 0x3, + 0xb, 0xe, 0xb, 0xa, 0xf, 0x5, 0x0, 0xc, 0xe, 0x8, 0x6, 0x2, 0x3, 0x9, 0x1, 0x7, 0xd, 0x4 ], - 'E-B': [ - 0x8, 0x4, 0xB, 0x1, 0x3, 0x5, 0x0, 0x9, 0x2, 0xE, 0xA, 0xC, 0xD, 0x6, 0x7, 0xF, - 0x0, 0x1, 0x2, 0xA, 0x4, 0xD, 0x5, 0xC, 0x9, 0x7, 0x3, 0xF, 0xB, 0x8, 0x6, 0xE, - 0xE, 0xC, 0x0, 0xA, 0x9, 0x2, 0xD, 0xB, 0x7, 0x5, 0x8, 0xF, 0x3, 0x6, 0x1, 0x4, - 0x7, 0x5, 0x0, 0xD, 0xB, 0x6, 0x1, 0x2, 0x3, 0xA, 0xC, 0xF, 0x4, 0xE, 0x9, 0x8, - 0x2, 0x7, 0xC, 0xF, 0x9, 0x5, 0xA, 0xB, 0x1, 0x4, 0x0, 0xD, 0x6, 0x8, 0xE, 0x3, - 0x8, 0x3, 0x2, 0x6, 0x4, 0xD, 0xE, 0xB, 0xC, 0x1, 0x7, 0xF, 0xA, 0x0, 0x9, 0x5, - 0x5, 0x2, 0xA, 0xB, 0x9, 0x1, 0xC, 0x3, 0x7, 0x4, 0xD, 0x0, 0x6, 0xF, 0x8, 0xE, - 0x0, 0x4, 0xB, 0xE, 0x8, 0x3, 0x7, 0x1, 0xA, 0x2, 0x9, 0x6, 0xF, 0xD, 0x5, 0xC + "E-B": [ + 0x8, 0x4, 0xb, 0x1, 0x3, 0x5, 0x0, 0x9, 0x2, 0xe, 0xa, 0xc, 0xd, 0x6, 0x7, 0xf, 0x0, 0x1, 0x2, 0xa, 0x4, 0xd, + 0x5, 0xc, 0x9, 0x7, 0x3, 0xf, 0xb, 0x8, 0x6, 0xe, 0xe, 0xc, 0x0, 0xa, 0x9, 0x2, 0xd, 0xb, 0x7, 0x5, 0x8, 0xf, + 0x3, 0x6, 0x1, 0x4, 0x7, 0x5, 0x0, 0xd, 0xb, 0x6, 0x1, 0x2, 0x3, 0xa, 0xc, 0xf, 0x4, 0xe, 0x9, 0x8, 0x2, 0x7, + 0xc, 0xf, 0x9, 0x5, 0xa, 0xb, 0x1, 0x4, 0x0, 0xd, 0x6, 0x8, 0xe, 0x3, 0x8, 0x3, 0x2, 0x6, 0x4, 0xd, 0xe, 0xb, + 0xc, 0x1, 0x7, 0xf, 0xa, 0x0, 0x9, 0x5, 0x5, 0x2, 0xa, 0xb, 0x9, 0x1, 0xc, 0x3, 0x7, 0x4, 0xd, 0x0, 0x6, 0xf, + 0x8, 0xe, 0x0, 0x4, 0xb, 0xe, 0x8, 0x3, 0x7, 0x1, 0xa, 0x2, 0x9, 0x6, 0xf, 0xd, 0x5, 0xc ], - 'E-C': [ - 0x1, 0xB, 0xC, 0x2, 0x9, 0xD, 0x0, 0xF, 0x4, 0x5, 0x8, 0xE, 0xA, 0x7, 0x6, 0x3, - 0x0, 0x1, 0x7, 0xD, 0xB, 0x4, 0x5, 0x2, 0x8, 0xE, 0xF, 0xC, 0x9, 0xA, 0x6, 0x3, - 0x8, 0x2, 0x5, 0x0, 0x4, 0x9, 0xF, 0xA, 0x3, 0x7, 0xC, 0xD, 0x6, 0xE, 0x1, 0xB, - 0x3, 0x6, 0x0, 0x1, 0x5, 0xD, 0xA, 0x8, 0xB, 0x2, 0x9, 0x7, 0xE, 0xF, 0xC, 0x4, - 0x8, 0xD, 0xB, 0x0, 0x4, 0x5, 0x1, 0x2, 0x9, 0x3, 0xC, 0xE, 0x6, 0xF, 0xA, 0x7, - 0xC, 0x9, 0xB, 0x1, 0x8, 0xE, 0x2, 0x4, 0x7, 0x3, 0x6, 0x5, 0xA, 0x0, 0xF, 0xD, - 0xA, 0x9, 0x6, 0x8, 0xD, 0xE, 0x2, 0x0, 0xF, 0x3, 0x5, 0xB, 0x4, 0x1, 0xC, 0x7, - 0x7, 0x4, 0x0, 0x5, 0xA, 0x2, 0xF, 0xE, 0xC, 0x6, 0x1, 0xB, 0xD, 0x9, 0x3, 0x8 + "E-C": [ + 0x1, 0xb, 0xc, 0x2, 0x9, 0xd, 0x0, 0xf, 0x4, 0x5, 0x8, 0xe, 0xa, 0x7, 0x6, 0x3, 0x0, 0x1, 0x7, 0xd, 0xb, 0x4, + 0x5, 0x2, 0x8, 0xe, 0xf, 0xc, 0x9, 0xa, 0x6, 0x3, 0x8, 0x2, 0x5, 0x0, 0x4, 0x9, 0xf, 0xa, 0x3, 0x7, 0xc, 0xd, + 0x6, 0xe, 0x1, 0xb, 0x3, 0x6, 0x0, 0x1, 0x5, 0xd, 0xa, 0x8, 0xb, 0x2, 0x9, 0x7, 0xe, 0xf, 0xc, 0x4, 0x8, 0xd, + 0xb, 0x0, 0x4, 0x5, 0x1, 0x2, 0x9, 0x3, 0xc, 0xe, 0x6, 0xf, 0xa, 0x7, 0xc, 0x9, 0xb, 0x1, 0x8, 0xe, 0x2, 0x4, + 0x7, 0x3, 0x6, 0x5, 0xa, 0x0, 0xf, 0xd, 0xa, 0x9, 0x6, 0x8, 0xd, 0xe, 0x2, 0x0, 0xf, 0x3, 0x5, 0xb, 0x4, 0x1, + 0xc, 0x7, 0x7, 0x4, 0x0, 0x5, 0xa, 0x2, 0xf, 0xe, 0xc, 0x6, 0x1, 0xb, 0xd, 0x9, 0x3, 0x8 ], - 'E-D': [ - 0xF, 0xC, 0x2, 0xA, 0x6, 0x4, 0x5, 0x0, 0x7, 0x9, 0xE, 0xD, 0x1, 0xB, 0x8, 0x3, - 0xB, 0x6, 0x3, 0x4, 0xC, 0xF, 0xE, 0x2, 0x7, 0xD, 0x8, 0x0, 0x5, 0xA, 0x9, 0x1, - 0x1, 0xC, 0xB, 0x0, 0xF, 0xE, 0x6, 0x5, 0xA, 0xD, 0x4, 0x8, 0x9, 0x3, 0x7, 0x2, - 0x1, 0x5, 0xE, 0xC, 0xA, 0x7, 0x0, 0xD, 0x6, 0x2, 0xB, 0x4, 0x9, 0x3, 0xF, 0x8, - 0x0, 0xC, 0x8, 0x9, 0xD, 0x2, 0xA, 0xB, 0x7, 0x3, 0x6, 0x5, 0x4, 0xE, 0xF, 0x1, - 0x8, 0x0, 0xF, 0x3, 0x2, 0x5, 0xE, 0xB, 0x1, 0xA, 0x4, 0x7, 0xC, 0x9, 0xD, 0x6, - 0x3, 0x0, 0x6, 0xF, 0x1, 0xE, 0x9, 0x2, 0xD, 0x8, 0xC, 0x4, 0xB, 0xA, 0x5, 0x7, - 0x1, 0xA, 0x6, 0x8, 0xF, 0xB, 0x0, 0x4, 0xC, 0x3, 0x5, 0x9, 0x7, 0xD, 0x2, 0xE + "E-D": [ + 0xf, 0xc, 0x2, 0xa, 0x6, 0x4, 0x5, 0x0, 0x7, 0x9, 0xe, 0xd, 0x1, 0xb, 0x8, 0x3, 0xb, 0x6, 0x3, 0x4, 0xc, 0xf, + 0xe, 0x2, 0x7, 0xd, 0x8, 0x0, 0x5, 0xa, 0x9, 0x1, 0x1, 0xc, 0xb, 0x0, 0xf, 0xe, 0x6, 0x5, 0xa, 0xd, 0x4, 0x8, + 0x9, 0x3, 0x7, 0x2, 0x1, 0x5, 0xe, 0xc, 0xa, 0x7, 0x0, 0xd, 0x6, 0x2, 0xb, 0x4, 0x9, 0x3, 0xf, 0x8, 0x0, 0xc, + 0x8, 0x9, 0xd, 0x2, 0xa, 0xb, 0x7, 0x3, 0x6, 0x5, 0x4, 0xe, 0xf, 0x1, 0x8, 0x0, 0xf, 0x3, 0x2, 0x5, 0xe, 0xb, + 0x1, 0xa, 0x4, 0x7, 0xc, 0x9, 0xd, 0x6, 0x3, 0x0, 0x6, 0xf, 0x1, 0xe, 0x9, 0x2, 0xd, 0x8, 0xc, 0x4, 0xb, 0xa, + 0x5, 0x7, 0x1, 0xa, 0x6, 0x8, 0xf, 0xb, 0x0, 0x4, 0xc, 0x3, 0x5, 0x9, 0x7, 0xd, 0x2, 0xe ], - 'E-SC': [ - 0x3, 0x6, 0x1, 0x0, 0x5, 0x7, 0xd, 0x9, 0x4, 0xb, 0x8, 0xc, 0xe, 0xf, 0x2, 0xa, - 0x7, 0x1, 0x5, 0x2, 0x8, 0xb, 0x9, 0xc, 0xd, 0x0, 0x3, 0xa, 0xf, 0xe, 0x4, 0x6, - 0xf, 0x1, 0x4, 0x6, 0xc, 0x8, 0x9, 0x2, 0xe, 0x3, 0x7, 0xa, 0xb, 0xd, 0x5, 0x0, - 0x3, 0x4, 0xf, 0xc, 0x5, 0x9, 0xe, 0x0, 0x6, 0x8, 0x7, 0xa, 0x1, 0xb, 0xd, 0x2, - 0x6, 0x9, 0x0, 0x7, 0xb, 0x8, 0x4, 0xc, 0x2, 0xe, 0xa, 0xf, 0x1, 0xd, 0x5, 0x3, - 0x6, 0x1, 0x2, 0xf, 0x0, 0xb, 0x9, 0xc, 0x7, 0xd, 0xa, 0x5, 0x8, 0x4, 0xe, 0x3, - 0x0, 0x2, 0xe, 0xc, 0x9, 0x1, 0x4, 0x7, 0x3, 0xf, 0x6, 0x8, 0xa, 0xd, 0xb, 0x5, - 0x5, 0x2, 0xb, 0x8, 0x4, 0xc, 0x7, 0x1, 0xa, 0x6, 0xe, 0x0, 0x9, 0x3, 0xd, 0xf + "E-SC": [ + 0x3, 0x6, 0x1, 0x0, 0x5, 0x7, 0xd, 0x9, 0x4, 0xb, 0x8, 0xc, 0xe, 0xf, 0x2, 0xa, 0x7, 0x1, 0x5, 0x2, 0x8, 0xb, + 0x9, 0xc, 0xd, 0x0, 0x3, 0xa, 0xf, 0xe, 0x4, 0x6, 0xf, 0x1, 0x4, 0x6, 0xc, 0x8, 0x9, 0x2, 0xe, 0x3, 0x7, 0xa, + 0xb, 0xd, 0x5, 0x0, 0x3, 0x4, 0xf, 0xc, 0x5, 0x9, 0xe, 0x0, 0x6, 0x8, 0x7, 0xa, 0x1, 0xb, 0xd, 0x2, 0x6, 0x9, + 0x0, 0x7, 0xb, 0x8, 0x4, 0xc, 0x2, 0xe, 0xa, 0xf, 0x1, 0xd, 0x5, 0x3, 0x6, 0x1, 0x2, 0xf, 0x0, 0xb, 0x9, 0xc, + 0x7, 0xd, 0xa, 0x5, 0x8, 0x4, 0xe, 0x3, 0x0, 0x2, 0xe, 0xc, 0x9, 0x1, 0x4, 0x7, 0x3, 0xf, 0x6, 0x8, 0xa, 0xd, + 0xb, 0x5, 0x5, 0x2, 0xb, 0x8, 0x4, 0xc, 0x7, 0x1, 0xa, 0x6, 0xe, 0x0, 0x9, 0x3, 0xd, 0xf ], - 'E-Z': [// This is default S-box in according to draft of new standard - 0xc, 0x4, 0x6, 0x2, 0xa, 0x5, 0xb, 0x9, 0xe, 0x8, 0xd, 0x7, 0x0, 0x3, 0xf, 0x1, - 0x6, 0x8, 0x2, 0x3, 0x9, 0xa, 0x5, 0xc, 0x1, 0xe, 0x4, 0x7, 0xb, 0xd, 0x0, 0xf, - 0xb, 0x3, 0x5, 0x8, 0x2, 0xf, 0xa, 0xd, 0xe, 0x1, 0x7, 0x4, 0xc, 0x9, 0x6, 0x0, - 0xc, 0x8, 0x2, 0x1, 0xd, 0x4, 0xf, 0x6, 0x7, 0x0, 0xa, 0x5, 0x3, 0xe, 0x9, 0xb, - 0x7, 0xf, 0x5, 0xa, 0x8, 0x1, 0x6, 0xd, 0x0, 0x9, 0x3, 0xe, 0xb, 0x4, 0x2, 0xc, - 0x5, 0xd, 0xf, 0x6, 0x9, 0x2, 0xc, 0xa, 0xb, 0x7, 0x8, 0x1, 0x4, 0x3, 0xe, 0x0, - 0x8, 0xe, 0x2, 0x5, 0x6, 0x9, 0x1, 0xc, 0xf, 0x4, 0xb, 0x0, 0xd, 0xa, 0x3, 0x7, - 0x1, 0x7, 0xe, 0xd, 0x0, 0x5, 0x8, 0x3, 0x4, 0xf, 0xa, 0x6, 0x9, 0xc, 0xb, 0x2 + "E-Z": [ + // This is default S-box in according to draft of new standard + 0xc, 0x4, 0x6, 0x2, 0xa, 0x5, 0xb, 0x9, 0xe, 0x8, 0xd, 0x7, 0x0, 0x3, 0xf, 0x1, 0x6, 0x8, 0x2, 0x3, 0x9, 0xa, + 0x5, 0xc, 0x1, 0xe, 0x4, 0x7, 0xb, 0xd, 0x0, 0xf, 0xb, 0x3, 0x5, 0x8, 0x2, 0xf, 0xa, 0xd, 0xe, 0x1, 0x7, 0x4, + 0xc, 0x9, 0x6, 0x0, 0xc, 0x8, 0x2, 0x1, 0xd, 0x4, 0xf, 0x6, 0x7, 0x0, 0xa, 0x5, 0x3, 0xe, 0x9, 0xb, 0x7, 0xf, + 0x5, 0xa, 0x8, 0x1, 0x6, 0xd, 0x0, 0x9, 0x3, 0xe, 0xb, 0x4, 0x2, 0xc, 0x5, 0xd, 0xf, 0x6, 0x9, 0x2, 0xc, 0xa, + 0xb, 0x7, 0x8, 0x1, 0x4, 0x3, 0xe, 0x0, 0x8, 0xe, 0x2, 0x5, 0x6, 0x9, 0x1, 0xc, 0xf, 0x4, 0xb, 0x0, 0xd, 0xa, + 0x3, 0x7, 0x1, 0x7, 0xe, 0xd, 0x0, 0x5, 0x8, 0x3, 0x4, 0xf, 0xa, 0x6, 0x9, 0xc, 0xb, 0x2 ], //S-box for digest - 'D-TEST': [ - 0x4, 0xA, 0x9, 0x2, 0xD, 0x8, 0x0, 0xE, 0x6, 0xB, 0x1, 0xC, 0x7, 0xF, 0x5, 0x3, - 0xE, 0xB, 0x4, 0xC, 0x6, 0xD, 0xF, 0xA, 0x2, 0x3, 0x8, 0x1, 0x0, 0x7, 0x5, 0x9, - 0x5, 0x8, 0x1, 0xD, 0xA, 0x3, 0x4, 0x2, 0xE, 0xF, 0xC, 0x7, 0x6, 0x0, 0x9, 0xB, - 0x7, 0xD, 0xA, 0x1, 0x0, 0x8, 0x9, 0xF, 0xE, 0x4, 0x6, 0xC, 0xB, 0x2, 0x5, 0x3, - 0x6, 0xC, 0x7, 0x1, 0x5, 0xF, 0xD, 0x8, 0x4, 0xA, 0x9, 0xE, 0x0, 0x3, 0xB, 0x2, - 0x4, 0xB, 0xA, 0x0, 0x7, 0x2, 0x1, 0xD, 0x3, 0x6, 0x8, 0x5, 0x9, 0xC, 0xF, 0xE, - 0xD, 0xB, 0x4, 0x1, 0x3, 0xF, 0x5, 0x9, 0x0, 0xA, 0xE, 0x7, 0x6, 0x8, 0x2, 0xC, - 0x1, 0xF, 0xD, 0x0, 0x5, 0x7, 0xA, 0x4, 0x9, 0x2, 0x3, 0xE, 0x6, 0xB, 0x8, 0xC + "D-TEST": [ + 0x4, 0xa, 0x9, 0x2, 0xd, 0x8, 0x0, 0xe, 0x6, 0xb, 0x1, 0xc, 0x7, 0xf, 0x5, 0x3, 0xe, 0xb, 0x4, 0xc, 0x6, 0xd, + 0xf, 0xa, 0x2, 0x3, 0x8, 0x1, 0x0, 0x7, 0x5, 0x9, 0x5, 0x8, 0x1, 0xd, 0xa, 0x3, 0x4, 0x2, 0xe, 0xf, 0xc, 0x7, + 0x6, 0x0, 0x9, 0xb, 0x7, 0xd, 0xa, 0x1, 0x0, 0x8, 0x9, 0xf, 0xe, 0x4, 0x6, 0xc, 0xb, 0x2, 0x5, 0x3, 0x6, 0xc, + 0x7, 0x1, 0x5, 0xf, 0xd, 0x8, 0x4, 0xa, 0x9, 0xe, 0x0, 0x3, 0xb, 0x2, 0x4, 0xb, 0xa, 0x0, 0x7, 0x2, 0x1, 0xd, + 0x3, 0x6, 0x8, 0x5, 0x9, 0xc, 0xf, 0xe, 0xd, 0xb, 0x4, 0x1, 0x3, 0xf, 0x5, 0x9, 0x0, 0xa, 0xe, 0x7, 0x6, 0x8, + 0x2, 0xc, 0x1, 0xf, 0xd, 0x0, 0x5, 0x7, 0xa, 0x4, 0x9, 0x2, 0x3, 0xe, 0x6, 0xb, 0x8, 0xc ], - 'D-A': [ - 0xA, 0x4, 0x5, 0x6, 0x8, 0x1, 0x3, 0x7, 0xD, 0xC, 0xE, 0x0, 0x9, 0x2, 0xB, 0xF, - 0x5, 0xF, 0x4, 0x0, 0x2, 0xD, 0xB, 0x9, 0x1, 0x7, 0x6, 0x3, 0xC, 0xE, 0xA, 0x8, - 0x7, 0xF, 0xC, 0xE, 0x9, 0x4, 0x1, 0x0, 0x3, 0xB, 0x5, 0x2, 0x6, 0xA, 0x8, 0xD, - 0x4, 0xA, 0x7, 0xC, 0x0, 0xF, 0x2, 0x8, 0xE, 0x1, 0x6, 0x5, 0xD, 0xB, 0x9, 0x3, - 0x7, 0x6, 0x4, 0xB, 0x9, 0xC, 0x2, 0xA, 0x1, 0x8, 0x0, 0xE, 0xF, 0xD, 0x3, 0x5, - 0x7, 0x6, 0x2, 0x4, 0xD, 0x9, 0xF, 0x0, 0xA, 0x1, 0x5, 0xB, 0x8, 0xE, 0xC, 0x3, - 0xD, 0xE, 0x4, 0x1, 0x7, 0x0, 0x5, 0xA, 0x3, 0xC, 0x8, 0xF, 0x6, 0x2, 0x9, 0xB, - 0x1, 0x3, 0xA, 0x9, 0x5, 0xB, 0x4, 0xF, 0x8, 0x6, 0x7, 0xE, 0xD, 0x0, 0x2, 0xC + "D-A": [ + 0xa, 0x4, 0x5, 0x6, 0x8, 0x1, 0x3, 0x7, 0xd, 0xc, 0xe, 0x0, 0x9, 0x2, 0xb, 0xf, 0x5, 0xf, 0x4, 0x0, 0x2, 0xd, + 0xb, 0x9, 0x1, 0x7, 0x6, 0x3, 0xc, 0xe, 0xa, 0x8, 0x7, 0xf, 0xc, 0xe, 0x9, 0x4, 0x1, 0x0, 0x3, 0xb, 0x5, 0x2, + 0x6, 0xa, 0x8, 0xd, 0x4, 0xa, 0x7, 0xc, 0x0, 0xf, 0x2, 0x8, 0xe, 0x1, 0x6, 0x5, 0xd, 0xb, 0x9, 0x3, 0x7, 0x6, + 0x4, 0xb, 0x9, 0xc, 0x2, 0xa, 0x1, 0x8, 0x0, 0xe, 0xf, 0xd, 0x3, 0x5, 0x7, 0x6, 0x2, 0x4, 0xd, 0x9, 0xf, 0x0, + 0xa, 0x1, 0x5, 0xb, 0x8, 0xe, 0xc, 0x3, 0xd, 0xe, 0x4, 0x1, 0x7, 0x0, 0x5, 0xa, 0x3, 0xc, 0x8, 0xf, 0x6, 0x2, + 0x9, 0xb, 0x1, 0x3, 0xa, 0x9, 0x5, 0xb, 0x4, 0xf, 0x8, 0x6, 0x7, 0xe, 0xd, 0x0, 0x2, 0xc ], - 'D-SC': [ - 0xb, 0xd, 0x7, 0x0, 0x5, 0x4, 0x1, 0xf, 0x9, 0xe, 0x6, 0xa, 0x3, 0xc, 0x8, 0x2, - 0x1, 0x2, 0x7, 0x9, 0xd, 0xb, 0xf, 0x8, 0xe, 0xc, 0x4, 0x0, 0x5, 0x6, 0xa, 0x3, - 0x5, 0x1, 0xd, 0x3, 0xf, 0x6, 0xc, 0x7, 0x9, 0x8, 0xb, 0x2, 0x4, 0xe, 0x0, 0xa, - 0xd, 0x1, 0xb, 0x4, 0x9, 0xc, 0xe, 0x0, 0x7, 0x5, 0x8, 0xf, 0x6, 0x2, 0xa, 0x3, - 0x2, 0xd, 0xa, 0xf, 0x9, 0xb, 0x3, 0x7, 0x8, 0xc, 0x5, 0xe, 0x6, 0x0, 0x1, 0x4, - 0x0, 0x4, 0x6, 0xc, 0x5, 0x3, 0x8, 0xd, 0xa, 0xb, 0xf, 0x2, 0x1, 0x9, 0x7, 0xe, - 0x1, 0x3, 0xc, 0x8, 0xa, 0x6, 0xb, 0x0, 0x2, 0xe, 0x7, 0x9, 0xf, 0x4, 0x5, 0xd, - 0xa, 0xb, 0x6, 0x0, 0x1, 0x3, 0x4, 0x7, 0xe, 0xd, 0x5, 0xf, 0x8, 0x2, 0x9, 0xc + "D-SC": [ + 0xb, 0xd, 0x7, 0x0, 0x5, 0x4, 0x1, 0xf, 0x9, 0xe, 0x6, 0xa, 0x3, 0xc, 0x8, 0x2, 0x1, 0x2, 0x7, 0x9, 0xd, 0xb, + 0xf, 0x8, 0xe, 0xc, 0x4, 0x0, 0x5, 0x6, 0xa, 0x3, 0x5, 0x1, 0xd, 0x3, 0xf, 0x6, 0xc, 0x7, 0x9, 0x8, 0xb, 0x2, + 0x4, 0xe, 0x0, 0xa, 0xd, 0x1, 0xb, 0x4, 0x9, 0xc, 0xe, 0x0, 0x7, 0x5, 0x8, 0xf, 0x6, 0x2, 0xa, 0x3, 0x2, 0xd, + 0xa, 0xf, 0x9, 0xb, 0x3, 0x7, 0x8, 0xc, 0x5, 0xe, 0x6, 0x0, 0x1, 0x4, 0x0, 0x4, 0x6, 0xc, 0x5, 0x3, 0x8, 0xd, + 0xa, 0xb, 0xf, 0x2, 0x1, 0x9, 0x7, 0xe, 0x1, 0x3, 0xc, 0x8, 0xa, 0x6, 0xb, 0x0, 0x2, 0xe, 0x7, 0x9, 0xf, 0x4, + 0x5, 0xd, 0xa, 0xb, 0x6, 0x0, 0x1, 0x3, 0x4, 0x7, 0xe, 0xd, 0x5, 0xf, 0x8, 0x2, 0x9, 0xc ] }; var C = new Uint8Array([ - 0x69, 0x00, 0x72, 0x22, 0x64, 0xC9, 0x04, 0x23, - 0x8D, 0x3A, 0xDB, 0x96, 0x46, 0xE9, 0x2A, 0xC4, - 0x18, 0xFE, 0xAC, 0x94, 0x00, 0xED, 0x07, 0x12, - 0xC0, 0x86, 0xDC, 0xC2, 0xEF, 0x4C, 0xA9, 0x2B + 0x69, 0x00, 0x72, 0x22, 0x64, 0xc9, 0x04, 0x23, 0x8d, 0x3a, 0xdb, 0x96, 0x46, 0xe9, 0x2a, 0xc4, 0x18, 0xfe, 0xac, + 0x94, 0x00, 0xed, 0x07, 0x12, 0xc0, 0x86, 0xdc, 0xc2, 0xef, 0x4c, 0xa9, 0x2b ]); function signed(x) { @@ -187,22 +166,19 @@ function unsigned(x) { // Random generator function randomSeed(e) { GostRandom = GostRandom || root.GostRandom; - var randomSource = GostRandom ? new (GostRandom || root.GostRandom) : rootCrypto; - if (randomSource.getRandomValues) - randomSource.getRandomValues(e); - else - throw new NotSupportedError('Random generator not found'); + var randomSource = GostRandom ? new (GostRandom || root.GostRandom)() : rootCrypto; + if (randomSource.getRandomValues) randomSource.getRandomValues(e); + else throw new NotSupportedError("Random generator not found"); } // Get buffer function buffer(d) { - if (d instanceof CryptoOperationData) - return d; + if (d instanceof CryptoOperationData) return d; else if (d && d?.buffer instanceof CryptoOperationData) - return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength ? - d.buffer : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; - else - throw new DataError('CryptoOperationData required'); + return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength + ? d.buffer + : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; + else throw new DataError("CryptoOperationData required"); } // Get byte array @@ -215,7 +191,6 @@ function cloneArray(d) { return new Uint8Array(byteArray(d)); } - // Get int32 array function intArray(d) { return new Int32Array(buffer(d)); @@ -223,37 +198,33 @@ function intArray(d) { // Swap bytes for version 2015 function swap32(b) { - return ((b & 0xff) << 24) - | ((b & 0xff00) << 8) - | ((b >> 8) & 0xff00) - | ((b >> 24) & 0xff); + return ((b & 0xff) << 24) | ((b & 0xff00) << 8) | ((b >> 8) & 0xff00) | ((b >> 24) & 0xff); } // /* - * Initial parameters and common algortithms of GOST R 34.12-15 - * Algorithm "Kuznechik" 128bit - * - */ // + * Initial parameters and common algortithms of GOST R 34.12-15 + * Algorithm "Kuznechik" 128bit + * + */ // // Default initial vector var defaultIV128 = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); // Mult table for R function var multTable = (function () { - // Multiply two numbers in the GF(2^8) finite field defined // by the polynomial x^8 + x^7 + x^6 + x + 1 = 0 */ function gmul(a, b) { - var p = 0, counter, carry; + var p = 0, + counter, + carry; for (counter = 0; counter < 8; counter++) { - if (b & 1) - p ^= a; + if (b & 1) p ^= a; carry = a & 0x80; // detect if x^8 term is about to be generated a = (a << 1) & 0xff; - if (carry) - a ^= 0xc3; // replace x^8 with x^7 + x^6 + x + 1 + if (carry) a ^= 0xc3; // replace x^8 with x^7 + x^6 + x + 1 b >>= 1; } return p & 0xff; @@ -265,8 +236,7 @@ var multTable = (function () { var m = []; for (var i = 0; i < 8; i++) { m[i] = []; - for (var j = 0; j < 256; j++) - m[i][j] = gmul(x[i], j); + for (var j = 0; j < 256; j++) m[i][j] = gmul(x[i], j); } return m; })(); @@ -277,76 +247,61 @@ var kB = [4, 2, 3, 1, 6, 5, 0, 7, 0, 5, 6, 1, 3, 2, 4, 0]; // R - function function funcR(d) { var sum = 0; - for (var i = 0; i < 16; i++) - sum ^= multTable[kB[i]][d[i]]; + for (var i = 0; i < 16; i++) sum ^= multTable[kB[i]][d[i]]; - for (var i = 16; i > 0; --i) - d[i] = d[i - 1]; + for (var i = 16; i > 0; --i) d[i] = d[i - 1]; d[0] = sum; } function funcReverseR(d) { var tmp = d[0]; - for (var i = 0; i < 15; i++) - d[i] = d[i + 1]; + for (var i = 0; i < 15; i++) d[i] = d[i + 1]; d[15] = tmp; var sum = 0; - for (i = 0; i < 16; i++) - sum ^= multTable[kB[i]][d[i]]; + for (i = 0; i < 16; i++) sum ^= multTable[kB[i]][d[i]]; d[15] = sum; } // Nonlinear transformation var kPi = [ - 252, 238, 221, 17, 207, 110, 49, 22, 251, 196, 250, 218, 35, 197, 4, 77, - 233, 119, 240, 219, 147, 46, 153, 186, 23, 54, 241, 187, 20, 205, 95, 193, - 249, 24, 101, 90, 226, 92, 239, 33, 129, 28, 60, 66, 139, 1, 142, 79, - 5, 132, 2, 174, 227, 106, 143, 160, 6, 11, 237, 152, 127, 212, 211, 31, - 235, 52, 44, 81, 234, 200, 72, 171, 242, 42, 104, 162, 253, 58, 206, 204, - 181, 112, 14, 86, 8, 12, 118, 18, 191, 114, 19, 71, 156, 183, 93, 135, - 21, 161, 150, 41, 16, 123, 154, 199, 243, 145, 120, 111, 157, 158, 178, 177, - 50, 117, 25, 61, 255, 53, 138, 126, 109, 84, 198, 128, 195, 189, 13, 87, - 223, 245, 36, 169, 62, 168, 67, 201, 215, 121, 214, 246, 124, 34, 185, 3, - 224, 15, 236, 222, 122, 148, 176, 188, 220, 232, 40, 80, 78, 51, 10, 74, - 167, 151, 96, 115, 30, 0, 98, 68, 26, 184, 56, 130, 100, 159, 38, 65, - 173, 69, 70, 146, 39, 94, 85, 47, 140, 163, 165, 125, 105, 213, 149, 59, - 7, 88, 179, 64, 134, 172, 29, 247, 48, 55, 107, 228, 136, 217, 231, 137, - 225, 27, 131, 73, 76, 63, 248, 254, 141, 83, 170, 144, 202, 216, 133, 97, - 32, 113, 103, 164, 45, 43, 9, 91, 203, 155, 37, 208, 190, 229, 108, 82, - 89, 166, 116, 210, 230, 244, 180, 192, 209, 102, 175, 194, 57, 75, 99, 182 + 252, 238, 221, 17, 207, 110, 49, 22, 251, 196, 250, 218, 35, 197, 4, 77, 233, 119, 240, 219, 147, 46, 153, 186, 23, + 54, 241, 187, 20, 205, 95, 193, 249, 24, 101, 90, 226, 92, 239, 33, 129, 28, 60, 66, 139, 1, 142, 79, 5, 132, 2, + 174, 227, 106, 143, 160, 6, 11, 237, 152, 127, 212, 211, 31, 235, 52, 44, 81, 234, 200, 72, 171, 242, 42, 104, 162, + 253, 58, 206, 204, 181, 112, 14, 86, 8, 12, 118, 18, 191, 114, 19, 71, 156, 183, 93, 135, 21, 161, 150, 41, 16, 123, + 154, 199, 243, 145, 120, 111, 157, 158, 178, 177, 50, 117, 25, 61, 255, 53, 138, 126, 109, 84, 198, 128, 195, 189, + 13, 87, 223, 245, 36, 169, 62, 168, 67, 201, 215, 121, 214, 246, 124, 34, 185, 3, 224, 15, 236, 222, 122, 148, 176, + 188, 220, 232, 40, 80, 78, 51, 10, 74, 167, 151, 96, 115, 30, 0, 98, 68, 26, 184, 56, 130, 100, 159, 38, 65, 173, + 69, 70, 146, 39, 94, 85, 47, 140, 163, 165, 125, 105, 213, 149, 59, 7, 88, 179, 64, 134, 172, 29, 247, 48, 55, 107, + 228, 136, 217, 231, 137, 225, 27, 131, 73, 76, 63, 248, 254, 141, 83, 170, 144, 202, 216, 133, 97, 32, 113, 103, + 164, 45, 43, 9, 91, 203, 155, 37, 208, 190, 229, 108, 82, 89, 166, 116, 210, 230, 244, 180, 192, 209, 102, 175, 194, + 57, 75, 99, 182 ]; var kReversePi = (function () { var m = []; - for (var i = 0, n = kPi.length; i < n; i++) - m[kPi[i]] = i; + for (var i = 0, n = kPi.length; i < n; i++) m[kPi[i]] = i; return m; })(); function funcS(d) { - for (var i = 0; i < 16; ++i) - d[i] = kPi[d[i]]; + for (var i = 0; i < 16; ++i) d[i] = kPi[d[i]]; } function funcReverseS(d) { - for (var i = 0; i < 16; ++i) - d[i] = kReversePi[d[i]]; + for (var i = 0; i < 16; ++i) d[i] = kReversePi[d[i]]; } function funcX(a, b) { - for (var i = 0; i < 16; ++i) - a[i] ^= b[i]; + for (var i = 0; i < 16; ++i) a[i] ^= b[i]; } function funcL(d) { - for (var i = 0; i < 16; ++i) - funcR(d); + for (var i = 0; i < 16; ++i) funcR(d); } function funcReverseL(d) { - for (var i = 0; i < 16; ++i) - funcReverseR(d); + for (var i = 0; i < 16; ++i) funcReverseR(d); } function funcLSX(a, b) { @@ -369,8 +324,7 @@ function funcF(inputKey, inputKeySecond, iterationConst) { } function funcC(number, d) { - for (var i = 0; i < 15; i++) - d[i] = 0; + for (var i = 0; i < 15; i++) d[i] = 0; d[15] = number; funcL(d); } @@ -387,17 +341,18 @@ function funcC(number, d) { * @param {type} k * @returns {Uint8Array} */ -function keySchedule128(k) // -{ - var keys = new Uint8Array(160), c = new Uint8Array(16); +function keySchedule128(k) { + // + var keys = new Uint8Array(160), + c = new Uint8Array(16); keys.set(byteArray(k)); for (var j = 0; j < 4; j++) { - var j0 = 32 * j, j1 = 32 * (j + 1); + var j0 = 32 * j, + j1 = 32 * (j + 1); keys.set(new Uint8Array(keys.buffer, j0, 32), j1); for (var i = 1; i < 9; i++) { funcC(j * 8 + i, c); - funcF(new Uint8Array(keys.buffer, j1, 16), - new Uint8Array(keys.buffer, j1 + 16, 16), c); + funcF(new Uint8Array(keys.buffer, j1, 16), new Uint8Array(keys.buffer, j1 + 16, 16), c); } } return keys; @@ -415,18 +370,16 @@ function keySchedule128(k) // * @param {number} ofs Offsec * @param {number} e true - decrypt */ -function process128(k, d, ofs, e) // -{ +function process128(k, d, ofs, e) { + // ofs = ofs || d.byteOffset; var r = new Uint8Array(d.buffer, ofs, 16); if (e) { - for (var i = 0; i < 9; i++) - funcReverseLSX(r, new Uint8Array(k.buffer, (9 - i) * 16, 16)); + for (var i = 0; i < 9; i++) funcReverseLSX(r, new Uint8Array(k.buffer, (9 - i) * 16, 16)); funcX(r, new Uint8Array(k.buffer, 0, 16)); } else { - for (var i = 0; i < 9; i++) - funcLSX(r, new Uint8Array(k.buffer, 16 * i, 16)); + for (var i = 0; i < 9; i++) funcLSX(r, new Uint8Array(k.buffer, 16 * i, 16)); funcX(r, new Uint8Array(k.buffer, 16 * 9, 16)); } @@ -443,24 +396,23 @@ function process128(k, d, ofs, e) // * @param {Int32Array} m 2x32 bits cipher block * @param {Int32Array} k 32 bits key[i] */ -function round(S, m, k) // -{ +function round(S, m, k) { + // var cm = (m[0] + k) & 0xffffffff; - var om = S[ 0 + ((cm >> (0 * 4)) & 0xF)] << (0 * 4); - om |= S[ 16 + ((cm >> (1 * 4)) & 0xF)] << (1 * 4); - om |= S[ 32 + ((cm >> (2 * 4)) & 0xF)] << (2 * 4); - om |= S[ 48 + ((cm >> (3 * 4)) & 0xF)] << (3 * 4); - om |= S[ 64 + ((cm >> (4 * 4)) & 0xF)] << (4 * 4); - om |= S[ 80 + ((cm >> (5 * 4)) & 0xF)] << (5 * 4); - om |= S[ 96 + ((cm >> (6 * 4)) & 0xF)] << (6 * 4); - om |= S[112 + ((cm >> (7 * 4)) & 0xF)] << (7 * 4); - cm = om << 11 | om >>> (32 - 11); + var om = S[0 + ((cm >> (0 * 4)) & 0xf)] << (0 * 4); + om |= S[16 + ((cm >> (1 * 4)) & 0xf)] << (1 * 4); + om |= S[32 + ((cm >> (2 * 4)) & 0xf)] << (2 * 4); + om |= S[48 + ((cm >> (3 * 4)) & 0xf)] << (3 * 4); + om |= S[64 + ((cm >> (4 * 4)) & 0xf)] << (4 * 4); + om |= S[80 + ((cm >> (5 * 4)) & 0xf)] << (5 * 4); + om |= S[96 + ((cm >> (6 * 4)) & 0xf)] << (6 * 4); + om |= S[112 + ((cm >> (7 * 4)) & 0xf)] << (7 * 4); + cm = (om << 11) | (om >>> (32 - 11)); cm ^= m[1]; m[1] = m[0]; m[0] = cm; - } // /** @@ -474,14 +426,13 @@ function round(S, m, k) // * @param d {Int32Array} 8x8 bits cipher block * @param ofs {number} offset */ -function process89(k, d, ofs) // -{ +function process89(k, d, ofs) { + // ofs = ofs || d.byteOffset; var s = this.sBox, - m = new Int32Array(d.buffer, ofs, 2); + m = new Int32Array(d.buffer, ofs, 2); - for (var i = 0; i < 32; i++) - round(s, m, k[i]); + for (var i = 0; i < 32; i++) round(s, m, k[i]); var r = m[0]; m[0] = m[1]; @@ -499,17 +450,16 @@ function process89(k, d, ofs) // * @param d {Int32Array} 8x8 bits cipher block * @param ofs {number} offset */ -function process15(k, d, ofs) // -{ +function process15(k, d, ofs) { + // ofs = ofs || d.byteOffset; var s = this.sBox, - m = new Int32Array(d.buffer, ofs, 2), - r = swap32(m[0]); + m = new Int32Array(d.buffer, ofs, 2), + r = swap32(m[0]); m[0] = swap32(m[1]); m[1] = r; - for (var i = 0; i < 32; i++) - round(s, m, k[i]); + for (var i = 0; i < 32; i++) round(s, m, k[i]); m[0] = swap32(m[0]); m[1] = swap32(m[1]); @@ -526,30 +476,24 @@ function process15(k, d, ofs) // * @param e {boolean} true - decrypt * @returns {Int32Array} keyScheduled 32-bit key */ -function keySchedule89(k, e) // -{ +function keySchedule89(k, e) { + // var sch = new Int32Array(32), - key = new Int32Array(buffer(k)); + key = new Int32Array(buffer(k)); - for (var i = 0; i < 8; i++) - sch[i] = key[i]; + for (var i = 0; i < 8; i++) sch[i] = key[i]; if (e) { - for (var i = 0; i < 8; i++) - sch[i + 8] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 8] = sch[7 - i]; - for (var i = 0; i < 8; i++) - sch[i + 16] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 16] = sch[7 - i]; } else { - for (var i = 0; i < 8; i++) - sch[i + 8] = sch[i]; + for (var i = 0; i < 8; i++) sch[i + 8] = sch[i]; - for (var i = 0; i < 8; i++) - sch[i + 16] = sch[i]; + for (var i = 0; i < 8; i++) sch[i + 16] = sch[i]; } - for (var i = 0; i < 8; i++) - sch[i + 24] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 24] = sch[7 - i]; return sch; } // @@ -565,30 +509,24 @@ function keySchedule89(k, e) // * @param e {boolean} true - decrypt * @returns {Int32Array} keyScheduled 32-bit key */ -function keySchedule15(k, e) // -{ +function keySchedule15(k, e) { + // var sch = new Int32Array(32), - key = new Int32Array(buffer(k)); + key = new Int32Array(buffer(k)); - for (var i = 0; i < 8; i++) - sch[i] = swap32(key[i]); + for (var i = 0; i < 8; i++) sch[i] = swap32(key[i]); if (e) { - for (var i = 0; i < 8; i++) - sch[i + 8] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 8] = sch[7 - i]; - for (var i = 0; i < 8; i++) - sch[i + 16] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 16] = sch[7 - i]; } else { - for (var i = 0; i < 8; i++) - sch[i + 8] = sch[i]; + for (var i = 0; i < 8; i++) sch[i + 8] = sch[i]; - for (var i = 0; i < 8; i++) - sch[i + 16] = sch[i]; + for (var i = 0; i < 8; i++) sch[i + 16] = sch[i]; } - for (var i = 0; i < 8; i++) - sch[i + 24] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 24] = sch[7 - i]; return sch; } // @@ -605,48 +543,43 @@ function keySchedule15(k, e) // * @param {Uint8Array} k * @returns {Uint16Array} */ -var keyScheduleRC2 = (function () // -{ +var keyScheduleRC2 = (function () { + // // an array of "random" bytes based on the digits of PI = 3.14159... var PITABLE = new Uint8Array([ - 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, - 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, - 0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32, - 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0x0b, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82, - 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, - 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, - 0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57, 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x03, - 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7, - 0x08, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, - 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x04, 0x18, 0xa4, 0xec, - 0xc2, 0xe0, 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, - 0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, - 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x05, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9, - 0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, 0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9, - 0x0d, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, - 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0x0a, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad + 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, 0xc6, 0x7e, + 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, 0x17, 0x9a, 0x59, 0xf5, + 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32, 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, + 0x7b, 0x0b, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82, 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, + 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, + 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, 0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57, 0x27, 0xf2, 0x1d, 0x9b, + 0xbc, 0x94, 0x43, 0x03, 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, + 0x1e, 0xd7, 0x08, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, + 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x04, 0x18, 0xa4, 0xec, 0xc2, 0xe0, + 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, 0x99, 0x7c, 0x3a, 0x85, + 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, + 0x92, 0xae, 0x05, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9, 0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, + 0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9, 0x0d, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, + 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0x0a, 0xa6, 0x20, 0x68, + 0xfe, 0x7f, 0xc1, 0xad ]); - return function (k) - { + return function (k) { var key = new Uint8Array(buffer(k)), - T = Math.min(key.length, 128), - T1 = this.effectiveLength, - T8 = Math.floor((T1 + 7) / 8), - TM = 0xff % Math.pow(2, 8 + T1 - 8 * T8); + T = Math.min(key.length, 128), + T1 = this.effectiveLength, + T8 = Math.floor((T1 + 7) / 8), + TM = 0xff % Math.pow(2, 8 + T1 - 8 * T8); - var L = new Uint8Array(128), K = new Uint16Array(L.buffer); - for (var i = 0; i < T; i++) - L[i] = key[i]; - for (var i = T; i < 128; i++) - L[i] = PITABLE[(L[i - 1] + L[i - T]) % 256]; + var L = new Uint8Array(128), + K = new Uint16Array(L.buffer); + for (var i = 0; i < T; i++) L[i] = key[i]; + for (var i = T; i < 128; i++) L[i] = PITABLE[(L[i - 1] + L[i - T]) % 256]; L[128 - T8] = PITABLE[L[128 - T8] & TM]; - for (var i = 127 - T8; i >= 0; --i) - L[i] = PITABLE[L[i + 1] ^ L[i + T8]]; + for (var i = 127 - T8; i >= 0; --i) L[i] = PITABLE[L[i + 1] ^ L[i + T8]]; return K; }; -} // -)(); +})(); // /** * RC2 encrypt/decrypt process @@ -662,26 +595,29 @@ var keyScheduleRC2 = (function () // * @param {number} ofs Offsec * @param {number} e true - decrypt */ -var processRC2 = (function () // -{ - var K, j, R = new Uint16Array(4), - s = new Uint16Array([1, 2, 3, 5]), reverse; +var processRC2 = (function () { + // + var K, + j, + R = new Uint16Array(4), + s = new Uint16Array([1, 2, 3, 5]), + reverse; function rol(R, s) { - return (R << s | R >>> (16 - s)) & 0xffff; + return ((R << s) | (R >>> (16 - s))) & 0xffff; } function ror(R, s) { - return (R >>> s | R << (16 - s)) & 0xffff; + return ((R >>> s) | (R << (16 - s))) & 0xffff; } function mix(i) { if (reverse) { R[i] = ror(R[i], s[i]); - R[i] = R[i] - K[j] - (R[(i + 3) % 4] & R[(i + 2) % 4]) - ((~R[(i + 3) % 4]) & R[(i + 1) % 4]); + R[i] = R[i] - K[j] - (R[(i + 3) % 4] & R[(i + 2) % 4]) - (~R[(i + 3) % 4] & R[(i + 1) % 4]); j = j - 1; } else { - R[i] = R[i] + K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) + ((~R[(i + 3) % 4]) & R[(i + 1) % 4]); + R[i] = R[i] + K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) + (~R[(i + 3) % 4] & R[(i + 1) % 4]); j = j + 1; R[i] = rol(R[i], s[i]); } @@ -699,11 +635,9 @@ var processRC2 = (function () // count = count || 1; for (var j = 0; j < count; j++) { if (reverse) { - for (var i = 3; i >= 0; --i) - method(i); + for (var i = 3; i >= 0; --i) method(i); } else { - for (var i = 0; i < 4; i++) - method(i); + for (var i = 0; i < 4; i++) method(i); } } } @@ -729,8 +663,7 @@ var processRC2 = (function () // // 8. Perform five mixing rounds. perform(mix, 5); }; -} // -)(); +})(); // /** * Algorithm name GOST 28147-ECB

    @@ -744,15 +677,14 @@ var processRC2 = (function () // * @param d {CryptoOperationData} 8 bits message * @return {CryptoOperationData} result */ -function encryptECB(k, d) // -{ +function encryptECB(k, d) { + // var p = this.pad(byteArray(d)), - n = this.blockSize, - b = p.byteLength / n, - key = this.keySchedule(k); + n = this.blockSize, + b = p.byteLength / n, + key = this.keySchedule(k); - for (var i = 0; i < b; i++) - this.process(key, p, n * i); + for (var i = 0; i < b; i++) this.process(key, p, n * i); return p.buffer; } // @@ -770,15 +702,14 @@ function encryptECB(k, d) // * @param d {CryptoOperationData} 8 bits message * @return {CryptoOperationData} result */ -function decryptECB(k, d) // -{ +function decryptECB(k, d) { + // var p = cloneArray(d), - n = this.blockSize, - b = p.byteLength / n, - key = this.keySchedule(k, 1); + n = this.blockSize, + b = p.byteLength / n, + key = this.keySchedule(k, 1); - for (var i = 0; i < b; i++) - this.process(key, p, n * i, 1); + for (var i = 0; i < b; i++) this.process(key, p, n * i, 1); return this.unpad(p).buffer; } // @@ -798,31 +729,28 @@ function decryptECB(k, d) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function encryptCFB(k, d, iv) // -{ +function encryptCFB(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - c = cloneArray(d), - m = s.length, - t = new Uint8Array(m), - b = this.shiftBits >> 3, - cb = c.length, r = cb % b, q = (cb - r) / b, - key = this.keySchedule(k); + c = cloneArray(d), + m = s.length, + t = new Uint8Array(m), + b = this.shiftBits >> 3, + cb = c.length, + r = cb % b, + q = (cb - r) / b, + key = this.keySchedule(k); for (var i = 0; i < q; i++) { - - for (var j = 0; j < m; j++) - t[j] = s[j]; + for (var j = 0; j < m; j++) t[j] = s[j]; this.process(key, s); - for (var j = 0; j < b; j++) - c[i * b + j] ^= s[j]; + for (var j = 0; j < b; j++) c[i * b + j] ^= s[j]; - for (var j = 0; j < m - b; j++) - s[j] = t[b + j]; + for (var j = 0; j < m - b; j++) s[j] = t[b + j]; - for (var j = 0; j < b; j++) - s[m - b + j] = c[i * b + j]; + for (var j = 0; j < b; j++) s[m - b + j] = c[i * b + j]; k = this.keyMeshing(k, s, i, key); } @@ -830,8 +758,7 @@ function encryptCFB(k, d, iv) // if (r > 0) { this.process(key, s); - for (var i = 0; i < r; i++) - c[q * b + i] ^= s[i]; + for (var i = 0; i < r; i++) c[q * b + i] ^= s[i]; } return c.buffer; } // @@ -851,20 +778,20 @@ function encryptCFB(k, d, iv) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function decryptCFB(k, d, iv) // -{ +function decryptCFB(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - c = cloneArray(d), - m = s.length, - t = new Uint8Array(m), - b = this.shiftBits >> 3, - cb = c.length, r = cb % b, q = (cb - r) / b, - key = this.keySchedule(k); + c = cloneArray(d), + m = s.length, + t = new Uint8Array(m), + b = this.shiftBits >> 3, + cb = c.length, + r = cb % b, + q = (cb - r) / b, + key = this.keySchedule(k); for (var i = 0; i < q; i++) { - - for (var j = 0; j < m; j++) - t[j] = s[j]; + for (var j = 0; j < m; j++) t[j] = s[j]; this.process(key, s); @@ -873,11 +800,9 @@ function decryptCFB(k, d, iv) // c[i * b + j] ^= s[j]; } - for (var j = 0; j < m - b; j++) - s[j] = t[b + j]; + for (var j = 0; j < m - b; j++) s[j] = t[b + j]; - for (var j = 0; j < b; j++) - s[m - b + j] = t[j]; + for (var j = 0; j < b; j++) s[m - b + j] = t[j]; k = this.keyMeshing(k, s, i, key); } @@ -885,8 +810,7 @@ function decryptCFB(k, d, iv) // if (r > 0) { this.process(key, s); - for (var i = 0; i < r; i++) - c[q * b + i] ^= s[i]; + for (var i = 0; i < r; i++) c[q * b + i] ^= s[i]; } return c.buffer; } // @@ -921,35 +845,31 @@ function decryptCFB(k, d, iv) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function processOFB(k, d, iv) // -{ +function processOFB(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - c = cloneArray(d), - m = s.length, - t = new Uint8Array(m), - b = this.shiftBits >> 3, - p = new Uint8Array(b), - cb = c.length, r = cb % b, q = (cb - r) / b, - key = this.keySchedule(k); + c = cloneArray(d), + m = s.length, + t = new Uint8Array(m), + b = this.shiftBits >> 3, + p = new Uint8Array(b), + cb = c.length, + r = cb % b, + q = (cb - r) / b, + key = this.keySchedule(k); for (var i = 0; i < q; i++) { - - for (var j = 0; j < m; j++) - t[j] = s[j]; + for (var j = 0; j < m; j++) t[j] = s[j]; this.process(key, s); - for (var j = 0; j < b; j++) - p[j] = s[j]; + for (var j = 0; j < b; j++) p[j] = s[j]; - for (var j = 0; j < b; j++) - c[i * b + j] ^= s[j]; + for (var j = 0; j < b; j++) c[i * b + j] ^= s[j]; - for (var j = 0; j < m - b; j++) - s[j] = t[b + j]; + for (var j = 0; j < m - b; j++) s[j] = t[b + j]; - for (var j = 0; j < b; j++) - s[m - b + j] = p[j]; + for (var j = 0; j < b; j++) s[m - b + j] = p[j]; k = this.keyMeshing(k, s, i, key); } @@ -957,8 +877,7 @@ function processOFB(k, d, iv) // if (r > 0) { this.process(key, s); - for (var i = 0; i < r; i++) - c[q * b + i] ^= s[i]; + for (var i = 0; i < r; i++) c[q * b + i] ^= s[i]; } return c.buffer; } // @@ -991,15 +910,17 @@ function processOFB(k, d, iv) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function processCTR89(k, d, iv) // -{ +function processCTR89(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - c = cloneArray(d), - b = this.blockSize, - t = new Int8Array(b), - cb = c.length, r = cb % b, q = (cb - r) / b, - key = this.keySchedule(k), - syn = new Int32Array(s.buffer); + c = cloneArray(d), + b = this.blockSize, + t = new Int8Array(b), + cb = c.length, + r = cb % b, + q = (cb - r) / b, + key = this.keySchedule(k), + syn = new Int32Array(s.buffer); this.process(key, s); @@ -1009,16 +930,13 @@ function processCTR89(k, d, iv) // var tmp = unsigned(syn[1]) + 0x1010104; // Special thanks to Ilya Matveychikov syn[1] = signed(tmp < 0x100000000 ? tmp : tmp - 0xffffffff); - for (var j = 0; j < b; j++) - t[j] = s[j]; + for (var j = 0; j < b; j++) t[j] = s[j]; this.process(key, syn); - for (var j = 0; j < b; j++) - c[i * b + j] ^= s[j]; + for (var j = 0; j < b; j++) c[i * b + j] ^= s[j]; - for (var j = 0; j < b; j++) - s[j] = t[j]; + for (var j = 0; j < b; j++) s[j] = t[j]; k = this.keyMeshing(k, s, i, key); } @@ -1030,35 +948,32 @@ function processCTR89(k, d, iv) // this.process(key, syn); - for (var i = 0; i < r; i++) - c[q * b + i] ^= s[i]; + for (var i = 0; i < r; i++) c[q * b + i] ^= s[i]; } return c.buffer; } // -function processCTR15(k, d, iv) // -{ +function processCTR15(k, d, iv) { + // var c = cloneArray(d), - n = this.blockSize, - b = this.shiftBits >> 3, - cb = c.length, r = cb % b, q = (cb - r) / b, - s = new Uint8Array(n), - t = new Int32Array(n), - key = this.keySchedule(k); + n = this.blockSize, + b = this.shiftBits >> 3, + cb = c.length, + r = cb % b, + q = (cb - r) / b, + s = new Uint8Array(n), + t = new Int32Array(n), + key = this.keySchedule(k); s.set(iv || this.iv); for (var i = 0; i < q; i++) { - - for (var j = 0; j < n; j++) - t[j] = s[j]; + for (var j = 0; j < n; j++) t[j] = s[j]; this.process(key, s); - for (var j = 0; j < b; j++) - c[b * i + j] ^= s[j]; + for (var j = 0; j < b; j++) c[b * i + j] ^= s[j]; - for (var j = 0; j < n; j++) - s[j] = t[j]; + for (var j = 0; j < n; j++) s[j] = t[j]; for (var j = n - 1; i >= 0; --i) { if (s[j] > 0xfe) { @@ -1072,8 +987,7 @@ function processCTR15(k, d, iv) // if (r > 0) { this.process(key, s); - for (var j = 0; j < r; j++) - c[b * q + j] ^= s[j]; + for (var j = 0; j < r; j++) c[b * q + j] ^= s[j]; } return c.buffer; @@ -1094,30 +1008,25 @@ function processCTR15(k, d, iv) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function encryptCBC(k, d, iv) // -{ +function encryptCBC(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - n = this.blockSize, - m = s.length, - c = this.pad(byteArray(d)), - key = this.keySchedule(k); + n = this.blockSize, + m = s.length, + c = this.pad(byteArray(d)), + key = this.keySchedule(k); for (var i = 0, b = c.length / n; i < b; i++) { - - for (var j = 0; j < n; j++) - s[j] ^= c[i * n + j]; + for (var j = 0; j < n; j++) s[j] ^= c[i * n + j]; this.process(key, s); - for (var j = 0; j < n; j++) - c[i * n + j] = s[j]; + for (var j = 0; j < n; j++) c[i * n + j] = s[j]; if (m !== n) { - for (var j = 0; j < m - n; j++) - s[j] = s[n + j]; + for (var j = 0; j < m - n; j++) s[j] = s[n + j]; - for (var j = 0; j < n; j++) - s[j + m - n] = c[i * n + j]; + for (var j = 0; j < n; j++) s[j + m - n] = c[i * n + j]; } k = this.keyMeshing(k, s, i, key); @@ -1141,32 +1050,27 @@ function encryptCBC(k, d, iv) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function decryptCBC(k, d, iv) // -{ +function decryptCBC(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - n = this.blockSize, - m = s.length, - c = cloneArray(d), - next = new Uint8Array(n), - key = this.keySchedule(k, 1); + n = this.blockSize, + m = s.length, + c = cloneArray(d), + next = new Uint8Array(n), + key = this.keySchedule(k, 1); for (var i = 0, b = c.length / n; i < b; i++) { - - for (var j = 0; j < n; j++) - next[j] = c[i * n + j]; + for (var j = 0; j < n; j++) next[j] = c[i * n + j]; this.process(key, c, i * n, 1); - for (var j = 0; j < n; j++) - c[i * n + j] ^= s[j]; + for (var j = 0; j < n; j++) c[i * n + j] ^= s[j]; if (m !== n) { - for (var j = 0; j < m - n; j++) - s[j] = s[n + j]; + for (var j = 0; j < m - n; j++) s[j] = s[n + j]; } - for (var j = 0; j < n; j++) - s[j + m - n] = next[j]; + for (var j = 0; j < n; j++) s[j + m - n] = next[j]; k = this.keyMeshing(k, s, i, key, 1); } @@ -1183,15 +1087,14 @@ function decryptCBC(k, d, iv) // * @return {CryptoOperationData} result */ -function generateKey() // -{ +function generateKey() { + // // Simple generate 256 bit random seed var k = new Uint8Array(this.keySize); randomSeed(k); return k.buffer; } // - /** * makeIMIT (K, D) is the 32-bit result of the GOST 28147/GOST R 34.13 in * "imitovstavka" (MAC) mode, used with D as plaintext, K as key and IV @@ -1207,45 +1110,47 @@ function generateKey() // * @param {Uint8Array} d 8 bits array with data * @return {Uint8Array} result */ -function processMAC89(key, s, d) // -{ +function processMAC89(key, s, d) { + // var c = zeroPad.call(this, byteArray(d)), - n = this.blockSize, - q = c.length / n, - sBox = this.sBox, - sum = new Int32Array(s.buffer); + n = this.blockSize, + q = c.length / n, + sBox = this.sBox, + sum = new Int32Array(s.buffer); for (var i = 0; i < q; i++) { + for (var j = 0; j < n; j++) s[j] ^= c[i * n + j]; - for (var j = 0; j < n; j++) - s[j] ^= c[i * n + j]; - - for (var j = 0; j < 16; j++) // 1-16 steps + for ( + var j = 0; + j < 16; + j++ // 1-16 steps + ) round(sBox, sum, key[j]); } } // -function processKeyMAC15(s) // -{ - var t = 0, n = s.length; +function processKeyMAC15(s) { + // + var t = 0, + n = s.length; for (var i = n - 1; i >= 0; --i) { var t1 = s[i] >>> 7; - s[i] = (s[i] << 1) & 0xff | t; + s[i] = ((s[i] << 1) & 0xff) | t; t = t1; } if (t !== 0) { - if (n === 16) - s[15] ^= 0x87; - else - s[7] ^= 0x1b; + if (n === 16) s[15] ^= 0x87; + else s[7] ^= 0x1b; } } // -function processMAC15(key, s, d) // -{ +function processMAC15(key, s, d) { + // var n = this.blockSize, - sBox = this.sBox, c = byteArray(d), - r = new Uint8Array(n); + sBox = this.sBox, + c = byteArray(d), + r = new Uint8Array(n); // R this.process(key, r); // K1 @@ -1257,13 +1162,11 @@ function processMAC15(key, s, d) // } for (var i = 0, q = c.length / n; i < q; i++) { + for (var j = 0; j < n; j++) s[j] ^= c[i * n + j]; - for (var j = 0; j < n; j++) - s[j] ^= c[i * n + j]; - - if (i === q - 1) {// Last block - for (var j = 0; j < n; j++) - s[j] ^= r[j]; + if (i === q - 1) { + // Last block + for (var j = 0; j < n; j++) s[j] ^= r[j]; } this.process(key, s); @@ -1284,11 +1187,11 @@ function processMAC15(key, s, d) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function signMAC(k, d, iv) // -{ +function signMAC(k, d, iv) { + // var key = this.keySchedule(k), - s = new Uint8Array(iv || this.iv), - m = Math.ceil(this.macLength >> 3) || this.blockSize >> 1; + s = new Uint8Array(iv || this.iv), + m = Math.ceil(this.macLength >> 3) || this.blockSize >> 1; this.processMAC(key, s, d); @@ -1312,15 +1215,12 @@ function signMAC(k, d, iv) // * @param {CryptoOperationData} iv 8x8 optional bits initial vector * @return {boolen} MAC verified = true */ -function verifyMAC(k, m, d, iv) // -{ +function verifyMAC(k, m, d, iv) { + // var mac = new Uint8Array(signMAC.call(this, k, d, iv)), - test = byteArray(m); - if (mac.length !== test.length) - return false; - for (var i = 0, n = mac.length; i < n; i++) - if (mac[i] !== test[i]) - return false; + test = byteArray(m); + if (mac.length !== test.length) return false; + for (var i = 0, n = mac.length; i < n; i++) if (mac[i] !== test[i]) return false; return true; } // @@ -1341,14 +1241,15 @@ function verifyMAC(k, m, d, iv) // * @param {CryptoOperationData} cek Content encryption key * @returns {CryptoOperationData} Encrypted cek */ -function wrapKeyGOST(kek, cek) // -{ - var n = this.blockSize, k = this.keySize, len = k + (n >> 1); +function wrapKeyGOST(kek, cek) { + // + var n = this.blockSize, + k = this.keySize, + len = k + (n >> 1); // 1) For a unique symmetric KEK, generate 8 octets at random and call // the result UKM. For a KEK, produced by VKO GOST R 34.10-2001, use // the UKM that was used for key derivation. - if (!this.ukm) - throw new DataError('UKM must be defined'); + if (!this.ukm) throw new DataError("UKM must be defined"); var ukm = new Uint8Array(this.ukm); // 2) Compute a 4-byte checksum value, GOST 28147IMIT (UKM, KEK, CEK). // Call the result CEK_MAC. @@ -1375,28 +1276,27 @@ function wrapKeyGOST(kek, cek) // * @param {type} data Content encryption key * @return {CryptoOperationData} result */ -function unwrapKeyGOST(kek, data) // -{ - var n = this.blockSize, k = this.keySize, len = k + (n >> 1); +function unwrapKeyGOST(kek, data) { + // + var n = this.blockSize, + k = this.keySize, + len = k + (n >> 1); // 1) If the wrapped content-encryption key is not 44 octets, then error. var d = buffer(data); - if (d.byteLength !== len) - throw new DataError('Wrapping key size must be ' + len + ' bytes'); + if (d.byteLength !== len) throw new DataError("Wrapping key size must be " + len + " bytes"); // 2) Decompose the wrapped content-encryption key into UKM, CEK_ENC, and CEK_MAC. // UKM is the most significant (first) 8 octets. CEK_ENC is next 32 octets, // and CEK_MAC is the least significant (last) 4 octets. - if (!this.ukm) - throw new DataError('UKM must be defined'); + if (!this.ukm) throw new DataError("UKM must be defined"); var ukm = new Uint8Array(this.ukm), - enc = new Uint8Array(d, 0, k), - mac = new Uint8Array(d, k, n >> 1); + enc = new Uint8Array(d, 0, k), + mac = new Uint8Array(d, k, n >> 1); // 3) Decrypt CEK_ENC in ECB mode using the KEK. Call the output CEK. var cek = decryptECB.call(this, kek, enc); // 4) Compute a 4-byte checksum value, GOST 28147IMIT (UKM, KEK, CEK), // compare the result with CEK_MAC. If they are not equal, then error. var check = verifyMAC.call(this, kek, mac, cek, ukm); - if (!check) - throw new DataError('Error verify MAC of wrapping key'); + if (!check) throw new DataError("Error verify MAC of wrapping key"); return cek; } // @@ -1415,8 +1315,8 @@ function unwrapKeyGOST(kek, data) // * @param {CryptoOperationData} ukm Random generated value * @returns {CryptoOperationData} Diversified kek */ -function diversifyKEK(kek, ukm) // -{ +function diversifyKEK(kek, ukm) { + // var n = this.blockSize; // 1) Let K[0] = K; @@ -1441,10 +1341,8 @@ function diversifyKEK(kek, ukm) // // (((~a[i,0])*k[i,0] + ... + (~a[i,7])*k[i,7]) mod 2^32); var s = new Int32Array(2); for (var j = 0; j < 8; j++) { - if (a[i][j]) - s[0] = (s[0] + k[j]) & 0xffffffff; - else - s[1] = (s[1] + k[j]) & 0xffffffff; + if (a[i][j]) s[0] = (s[0] + k[j]) & 0xffffffff; + else s[1] = (s[1] + k[j]) & 0xffffffff; } // C) K[i+1] = encryptCFB (S[i], K[i], K[i]) var iv = new Uint8Array(s.buffer); @@ -1470,15 +1368,16 @@ function diversifyKEK(kek, ukm) // * @param {CryptoOperationData} cek Content encryption key * @returns {CryptoOperationData} Encrypted cek */ -function wrapKeyCP(kek, cek) // -{ - var n = this.blockSize, k = this.keySize, len = k + (n >> 1); +function wrapKeyCP(kek, cek) { + // + var n = this.blockSize, + k = this.keySize, + len = k + (n >> 1); // 1) For a unique symmetric KEK or a KEK produced by VKO GOST R // 34.10-94, generate 8 octets at random. Call the result UKM. For // a KEK, produced by VKO GOST R 34.10-2001, use the UKM that was // used for key derivation. - if (!this.ukm) - throw new DataError('UKM must be defined'); + if (!this.ukm) throw new DataError("UKM must be defined"); var ukm = new Uint8Array(this.ukm); // 2) Diversify KEK, using the CryptoPro KEK Diversification Algorithm, // described in Section 6.5. Call the result KEK(UKM). @@ -1509,22 +1408,22 @@ function wrapKeyCP(kek, cek) // * @param {CryptoOperationData} data Encrypted content encryption keu * @return {CryptoOperationData} result Decrypted content encryption keu */ -function unwrapKeyCP(kek, data) // -{ - var n = this.blockSize, k = this.keySize, len = k + (n >> 1); +function unwrapKeyCP(kek, data) { + // + var n = this.blockSize, + k = this.keySize, + len = k + (n >> 1); // 1) If the wrapped content-encryption key is not 44 octets, then error. var d = buffer(data); - if (d.byteLength !== len) - throw new DataError('Wrapping key size must be ' + len + ' bytes'); + if (d.byteLength !== len) throw new DataError("Wrapping key size must be " + len + " bytes"); // 2) Decompose the wrapped content-encryption key into UKM, CEK_ENC, // and CEK_MAC. UKM is the most significant (first) 8 octets. // CEK_ENC is next 32 octets, and CEK_MAC is the least significant // (last) 4 octets. - if (!this.ukm) - throw new DataError('UKM must be defined'); + if (!this.ukm) throw new DataError("UKM must be defined"); var ukm = new Uint8Array(this.ukm), - enc = new Uint8Array(d, 0, k), - mac = new Uint8Array(d, k, n >> 1); + enc = new Uint8Array(d, 0, k), + mac = new Uint8Array(d, k, n >> 1); // 3) Diversify KEK using the CryptoPro KEK Diversification Algorithm, // described in section 6.5. Call the result KEK(UKM). var dek = diversifyKEK.call(this, kek, ukm); @@ -1534,8 +1433,7 @@ function unwrapKeyCP(kek, data) // // CEK), compare the result with CEK_MAC. If they are not equal, // then it is an error. var check = verifyMAC.call(this, dek, mac, cek, ukm); - if (!check) - throw new DataError('Error verify MAC of wrapping key'); + if (!check) throw new DataError("Error verify MAC of wrapping key"); return cek; } // @@ -1566,25 +1464,23 @@ function unwrapKeyCP(kek, data) // * @param {CryptoOperationData} ukm - random vector for packing - 32 bytes * (count of masks - 1) * @returns {CryptoOperationData} packed master key - concatination of mk.db3 + masks.db3 */ -function packKeySC(unpacked, ukm) // -{ - var m = this.blockSize >> 1, k = this.keySize; +function packKeySC(unpacked, ukm) { + // + var m = this.blockSize >> 1, + k = this.keySize; var mcount = 8; var key = new Uint8Array(buffer(unpacked)); - if (key.byteLength !== k) - throw new DataError('Wrong cleartext size ' + key.byteLength + ' bytes'); + if (key.byteLength !== k) throw new DataError("Wrong cleartext size " + key.byteLength + " bytes"); // Check or generate UKM ukm = ukm || this.ukm; if (ukm) { ukm = new Uint8Array(buffer(ukm)); - if (ukm.byteLength > 0 && ukm.byteLength % k === 0) - mcount = ukm.byteLength / k + 1; - else - throw new DataError('Wrong rand size ' + ukm.byteLength + ' bytes'); - } else - randomSeed(ukm = new Uint8Array((mcount - 1) * k)); + if (ukm.byteLength > 0 && ukm.byteLength % k === 0) mcount = ukm.byteLength / k + 1; + else throw new DataError("Wrong rand size " + ukm.byteLength + " bytes"); + } else randomSeed((ukm = new Uint8Array((mcount - 1) * k))); // Output array - var d = new Uint8Array(mcount * k + m + 2), b = d.buffer; + var d = new Uint8Array(mcount * k + m + 2), + b = d.buffer; // Calculate MAC var zero32 = new Uint8Array(k); var mac = signMAC.call(this, key, zero32); @@ -1594,8 +1490,7 @@ function packKeySC(unpacked, ukm) // d.set(ukm, k + m + 2); for (var i = 1; i < mcount; i++) { var mask = new Uint8Array(b, 2 + m + k * i); - for (var j = 0; j < k; j++) - key[j] ^= mask[j]; + for (var j = 0; j < k; j++) key[j] ^= mask[j]; } d.set(key, m + 2); return d.buffer; @@ -1613,38 +1508,35 @@ function packKeySC(unpacked, ukm) // * @param {CryptoOperationData} packed - concatination of mk.db3 + masks.db3 * @returns {CryptoOperationData} unpacked master key */ -function unpackKeySC(packed) // -{ - var m = this.blockSize >> 1, k = this.keySize; +function unpackKeySC(packed) { + // + var m = this.blockSize >> 1, + k = this.keySize; var b = buffer(packed); // Unpack master key var magic = new Uint8Array(b, 0, 1)[0]; - if (magic !== 0x22) - throw new DataError('Invalid magic number'); + if (magic !== 0x22) throw new DataError("Invalid magic number"); var mcount = new Uint8Array(b, 1, 1)[0]; var mac = new Uint8Array(b, 2, m); // MAC for summarized mask // Compute packKey xor summing for all masks var key = new Uint8Array(k); for (var i = 0; i < mcount; i++) { var mask = new Uint8Array(b, 2 + m + k * i, k); - for (var j = 0; j < k; j++) - key[j] ^= mask[j]; + for (var j = 0; j < k; j++) key[j] ^= mask[j]; } // Test MAC for packKey with default sBox on zero 32 bytes array var zero32 = new Uint8Array(k); var test = verifyMAC.call(this, key, mac, zero32); if (!test) { // Try to use different sBoxes - var names = ['E-A', 'E-B', 'E-C', 'E-D', 'E-SC']; + var names = ["E-A", "E-B", "E-C", "E-D", "E-SC"]; for (var i = 0, n = names.length; i < n; i++) { this.sBox = sBoxes[names[i]]; test = verifyMAC.call(this, key, mac, zero32); - if (test) - break; + if (test) break; } } - if (!test) - throw new DataError('Invalid main key MAC'); + if (!test) throw new DataError("Invalid main key MAC"); return key.buffer; } // @@ -1660,13 +1552,13 @@ function unpackKeySC(packed) // * @param {CryptoOperationData} cek - key for wrapping * @returns {CryptoOperationData} wrapped key - file kek.opq */ -function wrapKeySC(kek, cek) // -{ - var m = this.blockSize >> 1, n = this.keySize; +function wrapKeySC(kek, cek) { + // + var m = this.blockSize >> 1, + n = this.keySize; var k = buffer(kek); var c = buffer(cek); - if (k.byteLength !== n) - k = unpackKeySC.call(this, k); + if (k.byteLength !== n) k = unpackKeySC.call(this, k); var enc = encryptECB.call(this, k, c); var mac = signMAC.call(this, k, c); var d = new Uint8Array(m + n); @@ -1687,18 +1579,17 @@ function wrapKeySC(kek, cek) // * @param {CryptoOperationData} cek - wrapping key - file kek.opq * @return {CryptoOperationData} result */ -function unwrapKeySC(kek, cek) // -{ - var m = this.blockSize >> 1, n = this.keySize; +function unwrapKeySC(kek, cek) { + // + var m = this.blockSize >> 1, + n = this.keySize; var k = buffer(kek); var c = buffer(cek); - if (k.byteLength !== n) - k = unpackKeySC.call(this, k); + if (k.byteLength !== n) k = unpackKeySC.call(this, k); var enc = new Uint8Array(c, 0, n); // Encrypted kek var mac = new Uint8Array(c, n, m); // MAC for clear kek var d = decryptECB.call(this, k, enc); - if (!verifyMAC.call(this, k, mac, d)) - throw new DataError('Invalid key MAC'); + if (!verifyMAC.call(this, k, mac, d)) throw new DataError("Invalid key MAC"); return d; } // @@ -1712,23 +1603,19 @@ function unwrapKeySC(kek, cek) // * @instance * @return {CryptoOperationData} result */ -function generateWrappingKeySC() // -{ +function generateWrappingKeySC() { + // return packKeySC.call(this, generateKey.call(this)); } // -function maskKey(mask, key, inverse, keySize) // -{ +function maskKey(mask, key, inverse, keySize) { + // var k = keySize / 4, - m32 = new Int32Array(buffer(mask)), - k32 = new Int32Array(buffer(key)), - r32 = new Int32Array(k); - if (inverse) - for (var i = 0; i < k; i++) - r32[i] = (k32[i] + m32[i]) & 0xffffffff; - else - for (var i = 0; i < k; i++) - r32[i] = (k32[i] - m32[i]) & 0xffffffff; + m32 = new Int32Array(buffer(mask)), + k32 = new Int32Array(buffer(key)), + r32 = new Int32Array(k); + if (inverse) for (var i = 0; i < k; i++) r32[i] = (k32[i] + m32[i]) & 0xffffffff; + else for (var i = 0; i < k; i++) r32[i] = (k32[i] - m32[i]) & 0xffffffff; return r32.buffer; } // @@ -1744,9 +1631,9 @@ function maskKey(mask, key, inverse, keySize) // -{ - return maskKey(mask, key, this.procreator === 'VN', this.keySize); +function wrapKeyMask(mask, key) { + // + return maskKey(mask, key, this.procreator === "VN", this.keySize); } // /** @@ -1761,9 +1648,9 @@ function wrapKeyMask(mask, key) // * @param {CryptoOperationData} key The masked key * @return {CryptoOperationData} result The key */ -function unwrapKeyMask(mask, key) // -{ - return maskKey(mask, key, this.procreator !== 'VN', this.keySize); +function unwrapKeyMask(mask, key) { + // + return maskKey(mask, key, this.procreator !== "VN", this.keySize); } // /** @@ -1782,9 +1669,10 @@ function unwrapKeyMask(mask, key) // * @param {boolean} e true - decrypt * @returns CryptoOperationData next 8x8 bit key */ -function keyMeshingCP(k, s, i, key, e) // -{ - if ((i + 1) * this.blockSize % 1024 === 0) { // every 1024 octets +function keyMeshingCP(k, s, i, key, e) { + // + if (((i + 1) * this.blockSize) % 1024 === 0) { + // every 1024 octets // K[i+1] = decryptECB (K[i], C); k = decryptECB.call(this, k, C); // IV0[i+1] = encryptECB (K[i+1],IVn[i]) @@ -1804,8 +1692,8 @@ function keyMeshingCP(k, s, i, key, e) // * @private * @param {(Uint8Array|CryptoOperationData)} k 8x8 bit key */ -function noKeyMeshing(k) // -{ +function noKeyMeshing(k) { + // return k; } // @@ -1821,8 +1709,8 @@ function noKeyMeshing(k) // * @param {Uint8Array} d array with source data * @returns {Uint8Array} result */ -function noPad(d) // -{ +function noPad(d) { + // return new Uint8Array(d); } // @@ -1840,34 +1728,30 @@ function noPad(d) // * @param {Uint8Array} d array with source data * @returns {Uint8Array} result */ -function pkcs5Pad(d) // -{ +function pkcs5Pad(d) { + // var n = d.byteLength, - nb = this.blockSize, - q = nb - n % nb, - m = Math.ceil((n + 1) / nb) * nb, - r = new Uint8Array(m); + nb = this.blockSize, + q = nb - (n % nb), + m = Math.ceil((n + 1) / nb) * nb, + r = new Uint8Array(m); r.set(d); - for (var i = n; i < m; i++) - r[i] = q; + for (var i = n; i < m; i++) r[i] = q; return r; } // -function pkcs5Unpad(d) // -{ +function pkcs5Unpad(d) { + // var m = d.byteLength, - nb = this.blockSize, - q = d[m - 1], - n = m - q; - if (q > nb) - throw DataError('Invalid padding'); + nb = this.blockSize, + q = d[m - 1], + n = m - q; + if (q > nb) throw DataError("Invalid padding"); var r = new Uint8Array(n); - if (n > 0) - r.set(new Uint8Array(d.buffer, 0, n)); + if (n > 0) r.set(new Uint8Array(d.buffer, 0, n)); return r; } // - /** * Algorithm name GOST 28147-ZeroPadding

    * @@ -1880,19 +1764,17 @@ function pkcs5Unpad(d) // * @param {Uint8Array} d array with source data * @returns {Uint8Array} result */ -function zeroPad(d) // -{ +function zeroPad(d) { + // var n = d.byteLength, - nb = this.blockSize, - m = Math.ceil(n / nb) * nb, - r = new Uint8Array(m); + nb = this.blockSize, + m = Math.ceil(n / nb) * nb, + r = new Uint8Array(m); r.set(d); - for (var i = n; i < m; i++) - r[i] = 0; + for (var i = n; i < m; i++) r[i] = 0; return r; } // - /** * Algorithm name GOST 28147-BitPadding

    * @@ -1906,31 +1788,27 @@ function zeroPad(d) // * @param {Uint8Array} d array with source data * @returns {Uint8Array} result */ -function bitPad(d) // -{ +function bitPad(d) { + // var n = d.byteLength, - nb = this.blockSize, - m = Math.ceil((n + 1) / nb) * nb, - r = new Uint8Array(m); + nb = this.blockSize, + m = Math.ceil((n + 1) / nb) * nb, + r = new Uint8Array(m); r.set(d); r[n] = 1; - for (var i = n + 1; i < m; i++) - r[i] = 0; + for (var i = n + 1; i < m; i++) r[i] = 0; return r; } // -function bitUnpad(d) // -{ +function bitUnpad(d) { + // var m = d.byteLength, - n = m; - while (n > 1 && d[n - 1] === 0) - n--; - if (d[n - 1] !== 1) - throw DataError('Invalid padding'); + n = m; + while (n > 1 && d[n - 1] === 0) n--; + if (d[n - 1] !== 1) throw DataError("Invalid padding"); n--; var r = new Uint8Array(n); - if (n > 0) - r.set(new Uint8Array(d.buffer, 0, n)); + if (n > 0) r.set(new Uint8Array(d.buffer, 0, n)); return r; } // @@ -1947,13 +1825,14 @@ function bitUnpad(d) // * @param {Uint8Array} d array with source data * @returns {Uint8Array} result */ -function randomPad(d) // -{ +function randomPad(d) { + // var n = d.byteLength, - nb = this.blockSize, - q = nb - n % nb, - m = Math.ceil(n / nb) * nb, - r = new Uint8Array(m), e = new Uint8Array(r.buffer, n, q); + nb = this.blockSize, + q = nb - (n % nb), + m = Math.ceil(n / nb) * nb, + r = new Uint8Array(m), + e = new Uint8Array(r.buffer, n, q); r.set(d); randomSeed(e); return r; @@ -2057,31 +1936,43 @@ function randomPad(d) // * @class GostCipher * @param {AlgorithmIndentifier} algorithm WebCryptoAPI algorithm identifier */ -function GostCipher(algorithm) // -{ +function GostCipher(algorithm) { + // // Check little endian support - if (!littleEndian) - throw new NotSupportedError('Big endian platform not supported'); + if (!littleEndian) throw new NotSupportedError("Big endian platform not supported"); algorithm = algorithm || {}; this.keySize = 32; this.blockLength = algorithm.length || 64; this.blockSize = this.blockLength >> 3; - this.name = (algorithm.name || (algorithm.version === 1 ? 'RC2' : - algorithm.version === 1989 ? 'GOST 28147' : 'GOST R 34.12')) + - (algorithm.version > 4 ? '-' + ((algorithm.version || 1989) % 100) : '') + '-' + - (this.blockLength === 64 ? '' : this.blockLength + '-') + - ((algorithm.mode === 'MAC') ? 'MAC-' + (algorithm.macLength || this.blockLength >> 1) : - (algorithm.mode === 'KW' || algorithm.keyWrapping) ? - ((algorithm.keyWrapping || 'NO') !== 'NO' ? algorithm.keyWrapping : '') + 'KW' : - (algorithm.block || 'ECB') + ((algorithm.block === 'CFB' || algorithm.block === 'OFB' || - (algorithm.block === 'CTR' && algorithm.version === 2015)) && - algorithm?.shiftBits !== this.blockLength ? '-' + algorithm.shiftBits : '') + - (algorithm.padding ? '-' + (algorithm.padding || (algorithm.block === 'CTR' || - algorithm.block === 'CFB' || algorithm.block === 'OFB' ? 'NO' : 'ZERO')) + 'PADDING' : '') + - ((algorithm.keyMeshing || 'NO') !== 'NO' ? '-CPKEYMESHING' : '')) + - (algorithm.procreator ? '/' + algorithm.procreator : '') + - (typeof algorithm.sBox === 'string' ? '/' + algorithm.sBox : ''); + this.name = + (algorithm.name || + (algorithm.version === 1 ? "RC2" : algorithm.version === 1989 ? "GOST 28147" : "GOST R 34.12")) + + (algorithm.version > 4 ? "-" + ((algorithm.version || 1989) % 100) : "") + + "-" + + (this.blockLength === 64 ? "" : this.blockLength + "-") + + (algorithm.mode === "MAC" + ? "MAC-" + (algorithm.macLength || this.blockLength >> 1) + : algorithm.mode === "KW" || algorithm.keyWrapping + ? ((algorithm.keyWrapping || "NO") !== "NO" ? algorithm.keyWrapping : "") + "KW" + : (algorithm.block || "ECB") + + ((algorithm.block === "CFB" || + algorithm.block === "OFB" || + (algorithm.block === "CTR" && algorithm.version === 2015)) && + algorithm?.shiftBits !== this.blockLength + ? "-" + algorithm.shiftBits + : "") + + (algorithm.padding + ? "-" + + (algorithm.padding || + (algorithm.block === "CTR" || algorithm.block === "CFB" || algorithm.block === "OFB" + ? "NO" + : "ZERO")) + + "PADDING" + : "") + + ((algorithm.keyMeshing || "NO") !== "NO" ? "-CPKEYMESHING" : "")) + + (algorithm.procreator ? "/" + algorithm.procreator : "") + + (typeof algorithm.sBox === "string" ? "/" + algorithm.sBox : ""); // Algorithm procreator this.procreator = algorithm.procreator; @@ -2103,8 +1994,7 @@ function GostCipher(algorithm) // } else if (this.blockLength === 128) { this.process = process128; this.keySchedule = keySchedule128; - } else - throw new DataError('Invalid block length'); + } else throw new DataError("Invalid block length"); this.processMAC = processMAC15; break; case 1989: @@ -2112,22 +2002,20 @@ function GostCipher(algorithm) // this.process = process89; this.processMAC = processMAC89; this.keySchedule = keySchedule89; - if (this.blockLength !== 64) - throw new DataError('Invalid block length'); + if (this.blockLength !== 64) throw new DataError("Invalid block length"); break; default: - throw new NotSupportedError('Algorithm version ' + algorithm.version + ' not supported'); + throw new NotSupportedError("Algorithm version " + algorithm.version + " not supported"); } - switch (algorithm.mode || (algorithm.keyWrapping && 'KW') || 'ES') { - - case 'ES': - switch (algorithm.block || 'ECB') { - case 'ECB': + switch (algorithm.mode || (algorithm.keyWrapping && "KW") || "ES") { + case "ES": + switch (algorithm.block || "ECB") { + case "ECB": this.encrypt = encryptECB; this.decrypt = decryptECB; break; - case 'CTR': + case "CTR": if (this.version === 1989) { this.encrypt = processCTR89; this.decrypt = processCTR89; @@ -2136,26 +2024,26 @@ function GostCipher(algorithm) // this.decrypt = processCTR15; this.shiftBits = algorithm.shiftBits || this.blockLength; } - break - case 'CBC': + break; + case "CBC": this.encrypt = encryptCBC; this.decrypt = decryptCBC; - break - case 'CFB': + break; + case "CFB": this.encrypt = encryptCFB; this.decrypt = decryptCFB; this.shiftBits = algorithm.shiftBits || this.blockLength; break; - case 'OFB': + case "OFB": this.encrypt = processOFB; this.decrypt = processOFB; this.shiftBits = algorithm.shiftBits || this.blockLength; break; default: - throw new NotSupportedError('Block mode ' + algorithm.block + ' not supported'); + throw new NotSupportedError("Block mode " + algorithm.block + " not supported"); } switch (algorithm.keyMeshing) { - case 'CP': + case "CP": this.keyMeshing = keyMeshingCP; break; default: @@ -2163,15 +2051,15 @@ function GostCipher(algorithm) // } if (this.encrypt === encryptECB || this.encrypt === encryptCBC) { switch (algorithm.padding) { - case 'PKCS5P': + case "PKCS5P": this.pad = pkcs5Pad; this.unpad = pkcs5Unpad; break; - case 'RANDOM': + case "RANDOM": this.pad = randomPad; this.unpad = noPad; break; - case 'BIT': + case "BIT": this.pad = bitPad; this.unpad = bitUnpad; break; @@ -2185,27 +2073,27 @@ function GostCipher(algorithm) // } this.generateKey = generateKey; break; - case 'MAC': + case "MAC": this.sign = signMAC; this.verify = verifyMAC; this.generateKey = generateKey; - this.macLength = algorithm.macLength || (this.blockLength >> 1); + this.macLength = algorithm.macLength || this.blockLength >> 1; this.pad = noPad; this.unpad = noPad; this.keyMeshing = noKeyMeshing; break; - case 'KW': + case "KW": this.pad = noPad; this.unpad = noPad; this.keyMeshing = noKeyMeshing; switch (algorithm.keyWrapping) { - case 'CP': + case "CP": this.wrapKey = wrapKeyCP; this.unwrapKey = unwrapKeyCP; this.generateKey = generateKey; this.shiftBits = algorithm.shiftBits || this.blockLength; break; - case 'SC': + case "SC": this.wrapKey = wrapKeySC; this.unwrapKey = unwrapKeySC; this.generateKey = generateWrappingKeySC; @@ -2216,43 +2104,41 @@ function GostCipher(algorithm) // this.generateKey = generateKey; } break; - case 'MASK': + case "MASK": this.wrapKey = wrapKeyMask; this.unwrapKey = unwrapKeyMask; this.generateKey = generateKey; break; default: - throw new NotSupportedError('Mode ' + algorithm.mode + ' not supported'); + throw new NotSupportedError("Mode " + algorithm.mode + " not supported"); } // Define sBox parameter - var sBox = algorithm.sBox, sBoxName; - if (!sBox) - sBox = this.version === 2015 ? sBoxes['E-Z'] : this.procreator === 'SC' ? sBoxes['E-SC'] : sBoxes['E-A']; - else if (typeof sBox === 'string') { + var sBox = algorithm.sBox, + sBoxName; + if (!sBox) sBox = this.version === 2015 ? sBoxes["E-Z"] : this.procreator === "SC" ? sBoxes["E-SC"] : sBoxes["E-A"]; + else if (typeof sBox === "string") { sBoxName = sBox.toUpperCase(); sBox = sBoxes[sBoxName]; - if (!sBox) - throw new SyntaxError('Unknown sBox name: ' + algorithm.sBox); - } else if (!sBox.length || sBox.length !== sBoxes['E-Z'].length) - throw new SyntaxError('Length of sBox must be ' + sBoxes['E-Z'].length); + if (!sBox) throw new SyntaxError("Unknown sBox name: " + algorithm.sBox); + } else if (!sBox.length || sBox.length !== sBoxes["E-Z"].length) + throw new SyntaxError("Length of sBox must be " + sBoxes["E-Z"].length); this.sBox = sBox; // Initial vector if (algorithm.iv) { this.iv = new Uint8Array(algorithm.iv); if (this.iv.byteLength !== this.blockSize && this.version === 1989) - throw new SyntaxError('Length of iv must be ' + this.blockLength + ' bits'); + throw new SyntaxError("Length of iv must be " + this.blockLength + " bits"); else if (this.iv.byteLength !== this.blockSize >> 1 && this.encrypt === processCTR15) - throw new SyntaxError('Length of iv must be ' + this.blockLength >> 1 + ' bits'); + throw new SyntaxError(("Length of iv must be " + this.blockLength) >> (1 + " bits")); else if (this.iv.byteLength % this.blockSize !== 0 && this.encrypt !== processCTR15) - throw new SyntaxError('Length of iv must be a multiple of ' + this.blockLength + ' bits'); - } else - this.iv = this.blockLength === 128 ? defaultIV128 : defaultIV; + throw new SyntaxError("Length of iv must be a multiple of " + this.blockLength + " bits"); + } else this.iv = this.blockLength === 128 ? defaultIV128 : defaultIV; // User key material if (algorithm.ukm) { this.ukm = new Uint8Array(algorithm.ukm); if (this.ukm.byteLength * 8 !== this.blockLength) - throw new SyntaxError('Length of ukm must be ' + this.blockLength + ' bits'); + throw new SyntaxError("Length of ukm must be " + this.blockLength + " bits"); } } // diff --git a/src/core/vendor/gost/gostCoding.mjs b/src/core/vendor/gost/gostCoding.mjs index ed42b3cc..a1ae87fa 100644 --- a/src/core/vendor/gost/gostCoding.mjs +++ b/src/core/vendor/gost/gostCoding.mjs @@ -32,7 +32,7 @@ * */ -import gostCrypto from './gostCrypto.mjs'; +import gostCrypto from "./gostCrypto.mjs"; /** * The Coding interface provides string converting methods: Base64, Hex, @@ -46,24 +46,23 @@ var CryptoOperationData = ArrayBuffer; var Date = Date; function buffer(d) { - if (d instanceof CryptoOperationData) - return d; + if (d instanceof CryptoOperationData) return d; else if (d && d?.buffer instanceof CryptoOperationData) - return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength ? - d.buffer : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; - else - throw new DataError('CryptoOperationData required'); + return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength + ? d.buffer + : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; + else throw new DataError("CryptoOperationData required"); } // -function GostCoding() { -} +function GostCoding() {} /** * BASE64 conversion * * @class GostCoding.Base64 */ -var Base64 = {// +var Base64 = { + // /** * Base64.decode convert BASE64 string s to CryptoOperationData * @@ -72,28 +71,34 @@ var Base64 = {// * @returns {CryptoOperationData} Binary decoded data */ decode: function (s) { - s = s.replace(/[^A-Za-z0-9\+\/]/g, ''); + s = s.replace(/[^A-Za-z0-9\+\/]/g, ""); var n = s.length, - k = n * 3 + 1 >> 2, r = new Uint8Array(k); + k = (n * 3 + 1) >> 2, + r = new Uint8Array(k); for (var m3, m4, u24 = 0, j = 0, i = 0; i < n; i++) { m4 = i & 3; var c = s.charCodeAt(i); - c = c > 64 && c < 91 ? - c - 65 : c > 96 && c < 123 ? - c - 71 : c > 47 && c < 58 ? - c + 4 : c === 43 ? - 62 : c === 47 ? - 63 : 0; + c = + c > 64 && c < 91 + ? c - 65 + : c > 96 && c < 123 + ? c - 71 + : c > 47 && c < 58 + ? c + 4 + : c === 43 + ? 62 + : c === 47 + ? 63 + : 0; - u24 |= c << 18 - 6 * m4; + u24 |= c << (18 - 6 * m4); if (m4 === 3 || n - i === 1) { for (m3 = 0; m3 < 3 && j < k; m3++, j++) { - r[j] = u24 >>> (16 >>> m3 & 24) & 255; + r[j] = (u24 >>> ((16 >>> m3) & 24)) & 255; } u24 = 0; - } } return r.buffer; @@ -106,24 +111,24 @@ var Base64 = {// * @returns {String} BASE64 encoded data */ encode: function (data) { - var slen = 8, d = new Uint8Array(buffer(data)); - var m3 = 2, s = ''; + var slen = 8, + d = new Uint8Array(buffer(data)); + var m3 = 2, + s = ""; for (var n = d.length, u24 = 0, i = 0; i < n; i++) { m3 = i % 3; - if (i > 0 && (i * 4 / 3) % (12 * slen) === 0) - s += '\r\n'; - u24 |= d[i] << (16 >>> m3 & 24); + if (i > 0 && ((i * 4) / 3) % (12 * slen) === 0) s += "\r\n"; + u24 |= d[i] << ((16 >>> m3) & 24); if (m3 === 2 || n - i === 1) { for (var j = 18; j >= 0; j -= 6) { - var c = u24 >>> j & 63; - c = c < 26 ? c + 65 : c < 52 ? c + 71 : c < 62 ? c - 4 : - c === 62 ? 43 : c === 63 ? 47 : 65; + var c = (u24 >>> j) & 63; + c = c < 26 ? c + 65 : c < 52 ? c + 71 : c < 62 ? c - 4 : c === 62 ? 43 : c === 63 ? 47 : 65; s += String.fromCharCode(c); } u24 = 0; } } - return s.substr(0, s.length - 2 + m3) + (m3 === 2 ? '' : m3 === 1 ? '=' : '=='); + return s.substr(0, s.length - 2 + m3) + (m3 === 2 ? "" : m3 === 1 ? "=" : "=="); } // }; @@ -142,17 +147,73 @@ GostCoding.prototype.Base64 = Base64; * * @class GostCoding.Chars */ -var Chars = (function () { // +var Chars = (function () { + // var _win1251_ = { - 0x402: 0x80, 0x403: 0x81, 0x201A: 0x82, 0x453: 0x83, 0x201E: 0x84, 0x2026: 0x85, 0x2020: 0x86, 0x2021: 0x87, - 0x20AC: 0x88, 0x2030: 0x89, 0x409: 0x8A, 0x2039: 0x8B, 0x40A: 0x8C, 0x40C: 0x8D, 0x40B: 0x8E, 0x40f: 0x8f, - 0x452: 0x90, 0x2018: 0x91, 0x2019: 0x92, 0x201C: 0x93, 0x201D: 0x94, 0x2022: 0x95, 0x2013: 0x96, 0x2014: 0x97, - 0x2122: 0x99, 0x459: 0x9A, 0x203A: 0x9B, 0x45A: 0x9C, 0x45C: 0x9D, 0x45B: 0x9E, 0x45f: 0x9f, - 0xA0: 0xA0, 0x40E: 0xA1, 0x45E: 0xA2, 0x408: 0xA3, 0xA4: 0xA4, 0x490: 0xA5, 0xA6: 0xA6, 0xA7: 0xA7, - 0x401: 0xA8, 0xA9: 0xA9, 0x404: 0xAA, 0xAB: 0xAB, 0xAC: 0xAC, 0xAD: 0xAD, 0xAE: 0xAE, 0x407: 0xAf, - 0xB0: 0xB0, 0xB1: 0xB1, 0x406: 0xB2, 0x456: 0xB3, 0x491: 0xB4, 0xB5: 0xB5, 0xB6: 0xB6, 0xB7: 0xB7, - 0x451: 0xB8, 0x2116: 0xB9, 0x454: 0xBA, 0xBB: 0xBB, 0x458: 0xBC, 0x405: 0xBD, 0x455: 0xBE, 0x457: 0xBf + 0x402: 0x80, + 0x403: 0x81, + 0x201a: 0x82, + 0x453: 0x83, + 0x201e: 0x84, + 0x2026: 0x85, + 0x2020: 0x86, + 0x2021: 0x87, + 0x20ac: 0x88, + 0x2030: 0x89, + 0x409: 0x8a, + 0x2039: 0x8b, + 0x40a: 0x8c, + 0x40c: 0x8d, + 0x40b: 0x8e, + 0x40f: 0x8f, + 0x452: 0x90, + 0x2018: 0x91, + 0x2019: 0x92, + 0x201c: 0x93, + 0x201d: 0x94, + 0x2022: 0x95, + 0x2013: 0x96, + 0x2014: 0x97, + 0x2122: 0x99, + 0x459: 0x9a, + 0x203a: 0x9b, + 0x45a: 0x9c, + 0x45c: 0x9d, + 0x45b: 0x9e, + 0x45f: 0x9f, + 0xa0: 0xa0, + 0x40e: 0xa1, + 0x45e: 0xa2, + 0x408: 0xa3, + 0xa4: 0xa4, + 0x490: 0xa5, + 0xa6: 0xa6, + 0xa7: 0xa7, + 0x401: 0xa8, + 0xa9: 0xa9, + 0x404: 0xaa, + 0xab: 0xab, + 0xac: 0xac, + 0xad: 0xad, + 0xae: 0xae, + 0x407: 0xaf, + 0xb0: 0xb0, + 0xb1: 0xb1, + 0x406: 0xb2, + 0x456: 0xb3, + 0x491: 0xb4, + 0xb5: 0xb5, + 0xb6: 0xb6, + 0xb7: 0xb7, + 0x451: 0xb8, + 0x2116: 0xb9, + 0x454: 0xba, + 0xbb: 0xbb, + 0x458: 0xbc, + 0x405: 0xbd, + 0x455: 0xbe, + 0x457: 0xbf }; var _win1251back_ = {}; for (var from in _win1251_) { @@ -170,11 +231,11 @@ var Chars = (function () { // * @returns {CryptoOperationData} Decoded binary data */ decode: function (s, charset) { - charset = (charset || 'win1251').toLowerCase().replace('-', ''); + charset = (charset || "win1251").toLowerCase().replace("-", ""); var r = []; for (var i = 0, j = s.length; i < j; i++) { var c = s.charCodeAt(i); - if (charset === 'utf8') { + if (charset === "utf8") { if (c < 0x80) { r.push(c); } else if (c < 0x800) { @@ -182,55 +243,54 @@ var Chars = (function () { // r.push(0x80 + (c & 63)); } else if (c < 0x10000) { r.push(0xe0 + (c >>> 12)); - r.push(0x80 + (c >>> 6 & 63)); + r.push(0x80 + ((c >>> 6) & 63)); r.push(0x80 + (c & 63)); } else if (c < 0x200000) { r.push(0xf0 + (c >>> 18)); - r.push(0x80 + (c >>> 12 & 63)); - r.push(0x80 + (c >>> 6 & 63)); + r.push(0x80 + ((c >>> 12) & 63)); + r.push(0x80 + ((c >>> 6) & 63)); r.push(0x80 + (c & 63)); } else if (c < 0x4000000) { r.push(0xf8 + (c >>> 24)); - r.push(0x80 + (c >>> 18 & 63)); - r.push(0x80 + (c >>> 12 & 63)); - r.push(0x80 + (c >>> 6 & 63)); + r.push(0x80 + ((c >>> 18) & 63)); + r.push(0x80 + ((c >>> 12) & 63)); + r.push(0x80 + ((c >>> 6) & 63)); r.push(0x80 + (c & 63)); } else { r.push(0xfc + (c >>> 30)); - r.push(0x80 + (c >>> 24 & 63)); - r.push(0x80 + (c >>> 18 & 63)); - r.push(0x80 + (c >>> 12 & 63)); - r.push(0x80 + (c >>> 6 & 63)); + r.push(0x80 + ((c >>> 24) & 63)); + r.push(0x80 + ((c >>> 18) & 63)); + r.push(0x80 + ((c >>> 12) & 63)); + r.push(0x80 + ((c >>> 6) & 63)); r.push(0x80 + (c & 63)); } - } else if (charset === 'unicode' || charset === 'ucs2' || charset === 'utf16') { - if (c < 0xD800 || (c >= 0xE000 && c <= 0x10000)) { + } else if (charset === "unicode" || charset === "ucs2" || charset === "utf16") { + if (c < 0xd800 || (c >= 0xe000 && c <= 0x10000)) { r.push(c >>> 8); r.push(c & 0xff); } else if (c >= 0x10000 && c < 0x110000) { c -= 0x10000; - var first = ((0xffc00 & c) >> 10) + 0xD800; - var second = (0x3ff & c) + 0xDC00; + var first = ((0xffc00 & c) >> 10) + 0xd800; + var second = (0x3ff & c) + 0xdc00; r.push(first >>> 8); r.push(first & 0xff); r.push(second >>> 8); r.push(second & 0xff); } - } else if (charset === 'utf32' || charset === 'ucs4') { - r.push(c >>> 24 & 0xff); - r.push(c >>> 16 & 0xff); - r.push(c >>> 8 & 0xff); + } else if (charset === "utf32" || charset === "ucs4") { + r.push((c >>> 24) & 0xff); + r.push((c >>> 16) & 0xff); + r.push((c >>> 8) & 0xff); r.push(c & 0xff); - } else if (charset === 'win1251') { + } else if (charset === "win1251") { if (c >= 0x80) { - if (c >= 0x410 && c < 0x450) // А..Яа..я + if (c >= 0x410 && c < 0x450) + // А..Яа..я c -= 0x350; - else - c = _win1251_[c] || 0; + else c = _win1251_[c] || 0; } r.push(c); - } else - r.push(c & 0xff); + } else r.push(c & 0xff); } return new Uint8Array(r).buffer; }, @@ -243,46 +303,58 @@ var Chars = (function () { // * @returns {string} Encoded javascript string */ encode: function (data, charset) { - charset = (charset || 'win1251').toLowerCase().replace('-', ''); - var r = [], d = new Uint8Array(buffer(data)); + charset = (charset || "win1251").toLowerCase().replace("-", ""); + var r = [], + d = new Uint8Array(buffer(data)); for (var i = 0, n = d.length; i < n; i++) { var c = d[i]; - if (charset === 'utf8') { - c = c >= 0xfc && c < 0xfe && i + 5 < n ? // six bytes - (c - 0xfc) * 1073741824 + (d[++i] - 0x80 << 24) + (d[++i] - 0x80 << 18) + (d[++i] - 0x80 << 12) + (d[++i] - 0x80 << 6) + d[++i] - 0x80 - : c >> 0xf8 && c < 0xfc && i + 4 < n ? // five bytes - (c - 0xf8 << 24) + (d[++i] - 0x80 << 18) + (d[++i] - 0x80 << 12) + (d[++i] - 0x80 << 6) + d[++i] - 0x80 - : c >> 0xf0 && c < 0xf8 && i + 3 < n ? // four bytes - (c - 0xf0 << 18) + (d[++i] - 0x80 << 12) + (d[++i] - 0x80 << 6) + d[++i] - 0x80 - : c >= 0xe0 && c < 0xf0 && i + 2 < n ? // three bytes - (c - 0xe0 << 12) + (d[++i] - 0x80 << 6) + d[++i] - 0x80 - : c >= 0xc0 && c < 0xe0 && i + 1 < n ? // two bytes - (c - 0xc0 << 6) + d[++i] - 0x80 - : c; // one byte - } else if (charset === 'unicode' || charset === 'ucs2' || charset === 'utf16') { + if (charset === "utf8") { + c = + c >= 0xfc && c < 0xfe && i + 5 < n // six bytes + ? (c - 0xfc) * 1073741824 + + ((d[++i] - 0x80) << 24) + + ((d[++i] - 0x80) << 18) + + ((d[++i] - 0x80) << 12) + + ((d[++i] - 0x80) << 6) + + d[++i] - + 0x80 + : c >> 0xf8 && c < 0xfc && i + 4 < n // five bytes + ? ((c - 0xf8) << 24) + + ((d[++i] - 0x80) << 18) + + ((d[++i] - 0x80) << 12) + + ((d[++i] - 0x80) << 6) + + d[++i] - + 0x80 + : c >> 0xf0 && c < 0xf8 && i + 3 < n // four bytes + ? ((c - 0xf0) << 18) + ((d[++i] - 0x80) << 12) + ((d[++i] - 0x80) << 6) + d[++i] - 0x80 + : c >= 0xe0 && c < 0xf0 && i + 2 < n // three bytes + ? ((c - 0xe0) << 12) + ((d[++i] - 0x80) << 6) + d[++i] - 0x80 + : c >= 0xc0 && c < 0xe0 && i + 1 < n // two bytes + ? ((c - 0xc0) << 6) + d[++i] - 0x80 + : c; // one byte + } else if (charset === "unicode" || charset === "ucs2" || charset === "utf16") { c = (c << 8) + d[++i]; - if (c >= 0xD800 && c < 0xE000) { - var first = (c - 0xD800) << 10; + if (c >= 0xd800 && c < 0xe000) { + var first = (c - 0xd800) << 10; c = d[++i]; c = (c << 8) + d[++i]; - var second = c - 0xDC00; + var second = c - 0xdc00; c = first + second + 0x10000; } - } else if (charset === 'utf32' || charset === 'ucs4') { + } else if (charset === "utf32" || charset === "ucs4") { c = (c << 8) + d[++i]; c = (c << 8) + d[++i]; c = (c << 8) + d[++i]; - } else if (charset === 'win1251') { + } else if (charset === "win1251") { if (c >= 0x80) { - if (c >= 0xC0 && c < 0x100) + if (c >= 0xc0 && c < 0x100) c += 0x350; // А..Яа..я - else - c = _win1251back_[c] || 0; + else c = _win1251back_[c] || 0; } } r.push(String.fromCharCode(c)); } - return r.join(''); + return r.join(""); } }; // })(); @@ -301,7 +373,8 @@ GostCoding.prototype.Chars = Chars; * * @class GostCoding.Hex */ -var Hex = {// +var Hex = { + // /** * Hex.decode(s, endean) convert HEX string s to CryptoOperationData in endean mode * @@ -311,16 +384,13 @@ var Hex = {// * @returns {CryptoOperationData} Decoded binary data */ decode: function (s, endean) { - s = s.replace(/[^A-Fa-f0-9]/g, ''); - var n = Math.ceil(s.length / 2), r = new Uint8Array(n); - s = (s.length % 2 > 0 ? '0' : '') + s; - if (endean && ((typeof endean !== 'string') || - (endean.toLowerCase().indexOf('little') < 0))) - for (var i = 0; i < n; i++) - r[i] = parseInt(s.substr((n - i - 1) * 2, 2), 16); - else - for (var i = 0; i < n; i++) - r[i] = parseInt(s.substr(i * 2, 2), 16); + s = s.replace(/[^A-Fa-f0-9]/g, ""); + var n = Math.ceil(s.length / 2), + r = new Uint8Array(n); + s = (s.length % 2 > 0 ? "0" : "") + s; + if (endean && (typeof endean !== "string" || endean.toLowerCase().indexOf("little") < 0)) + for (var i = 0; i < n; i++) r[i] = parseInt(s.substr((n - i - 1) * 2, 2), 16); + else for (var i = 0; i < n; i++) r[i] = parseInt(s.substr(i * 2, 2), 16); return r.buffer; }, /** @@ -332,19 +402,18 @@ var Hex = {// * @returns {string} Hex decoded string */ encode: function (data, endean) { - var s = [], d = new Uint8Array(buffer(data)), n = d.length; - if (endean && ((typeof endean !== 'string') || - (endean.toLowerCase().indexOf('little') < 0))) + var s = [], + d = new Uint8Array(buffer(data)), + n = d.length; + if (endean && (typeof endean !== "string" || endean.toLowerCase().indexOf("little") < 0)) for (var i = 0; i < n; i++) { var j = n - i - 1; - s[j] = (j > 0 && j % 32 === 0 ? '\r\n' : '') + - ('00' + d[i].toString(16)).slice(-2); + s[j] = (j > 0 && j % 32 === 0 ? "\r\n" : "") + ("00" + d[i].toString(16)).slice(-2); } else for (var i = 0; i < n; i++) - s[i] = (i > 0 && i % 32 === 0 ? '\r\n' : '') + - ('00' + d[i].toString(16)).slice(-2); - return s.join(''); + s[i] = (i > 0 && i % 32 === 0 ? "\r\n" : "") + ("00" + d[i].toString(16)).slice(-2); + return s.join(""); } // }; @@ -361,7 +430,8 @@ GostCoding.prototype.Hex = Hex; * * @class GostCoding.Int16 */ -var Int16 = {// +var Int16 = { + // /** * Int16.decode(s) convert hex big insteger s to CryptoOperationData * @@ -370,30 +440,28 @@ var Int16 = {// * @returns {CryptoOperationData} Decoded binary data */ decode: function (s) { - s = (s || '').replace(/[^\-A-Fa-f0-9]/g, ''); - if (s.length === 0) - s = '0'; + s = (s || "").replace(/[^\-A-Fa-f0-9]/g, ""); + if (s.length === 0) s = "0"; // Signature var neg = false; - if (s.charAt(0) === '-') { + if (s.charAt(0) === "-") { neg = true; s = s.substring(1); } // Align 2 chars - while (s.charAt(0) === '0' && s.length > 1) - s = s.substring(1); - s = (s.length % 2 > 0 ? '0' : '') + s; + while (s.charAt(0) === "0" && s.length > 1) s = s.substring(1); + s = (s.length % 2 > 0 ? "0" : "") + s; // Padding for singanuture // '800000' - 'ffffff' - for positive // '800001' - 'ffffff' - for negative - if ((!neg && !/^[0-7]/.test(s)) || - (neg && !/^[0-7]|8[0]+$/.test(s))) - s = '00' + s; + if ((!neg && !/^[0-7]/.test(s)) || (neg && !/^[0-7]|8[0]+$/.test(s))) s = "00" + s; // Convert hex - var n = s.length / 2, r = new Uint8Array(n), t = 0; + var n = s.length / 2, + r = new Uint8Array(n), + t = 0; for (var i = n - 1; i >= 0; --i) { var c = parseInt(s.substr(i * 2, 2), 16); - if (neg && (c + t > 0)) { + if (neg && c + t > 0) { c = 256 - c - t; t = 1; } @@ -409,22 +477,23 @@ var Int16 = {// * @returns {string} Int16 encoded string */ encode: function (data) { - var d = new Uint8Array(buffer(data)), n = d.length; - if (d.length === 0) - return '0x00'; - var s = [], neg = d[0] > 0x7f, t = 0; + var d = new Uint8Array(buffer(data)), + n = d.length; + if (d.length === 0) return "0x00"; + var s = [], + neg = d[0] > 0x7f, + t = 0; for (var i = n - 1; i >= 0; --i) { var v = d[i]; - if (neg && (v + t > 0)) { + if (neg && v + t > 0) { v = 256 - v - t; t = 1; } - s[i] = ('00' + v.toString(16)).slice(-2); + s[i] = ("00" + v.toString(16)).slice(-2); } - s = s.join(''); - while (s.charAt(0) === '0') - s = s.substring(1); - return (neg ? '-' : '') + '0x' + s; + s = s.join(""); + while (s.charAt(0) === "0") s = s.substring(1); + return (neg ? "-" : "") + "0x" + s; } // }; @@ -441,85 +510,101 @@ GostCoding.prototype.Int16 = Int16; * * @class GostCoding.BER */ -var BER = (function () { // +var BER = (function () { + // // Predefenition block function encodeBER(source, format, onlyContent) { // Correct primitive type var object = source.object; - if (object === undefined) - object = source; + if (object === undefined) object = source; // Determinate tagClass - var tagClass = source.tagClass = source.tagClass || 0; // Universial default + var tagClass = (source.tagClass = source.tagClass || 0); // Universial default // Determinate tagNumber. Use only for Universal class if (tagClass === 0) { var tagNumber = source.tagNumber; - if (typeof tagNumber === 'undefined') { - if (typeof object === 'string') { - if (object === '') // NULL + if (typeof tagNumber === "undefined") { + if (typeof object === "string") { + if (object === "") + // NULL tagNumber = 0x05; - else if (/^\-?0x[0-9a-fA-F]+$/.test(object)) // INTEGER + else if (/^\-?0x[0-9a-fA-F]+$/.test(object)) + // INTEGER tagNumber = 0x02; - else if (/^(\d+\.)+\d+$/.test(object)) // OID + else if (/^(\d+\.)+\d+$/.test(object)) + // OID tagNumber = 0x06; - else if (/^[01]+$/.test(object)) // BIT STRING + else if (/^[01]+$/.test(object)) + // BIT STRING tagNumber = 0x03; - else if (/^(true|false)$/.test(object)) // BOOLEAN + else if (/^(true|false)$/.test(object)) + // BOOLEAN tagNumber = 0x01; - else if (/^[0-9a-fA-F]+$/.test(object)) // OCTET STRING + else if (/^[0-9a-fA-F]+$/.test(object)) + // OCTET STRING tagNumber = 0x04; - else - tagNumber = 0x13; // Printable string (later can be changed to UTF8String) - } else if (typeof object === 'number') { // INTEGER + else tagNumber = 0x13; // Printable string (later can be changed to UTF8String) + } else if (typeof object === "number") { + // INTEGER tagNumber = 0x02; - } else if (typeof object === 'boolean') { // BOOLEAN + } else if (typeof object === "boolean") { + // BOOLEAN tagNumber = 0x01; - } else if (object instanceof Array) { // SEQUENCE + } else if (object instanceof Array) { + // SEQUENCE tagNumber = 0x10; - } else if (object instanceof Date) { // GeneralizedTime + } else if (object instanceof Date) { + // GeneralizedTime tagNumber = 0x18; - } else if (object instanceof CryptoOperationData || (object && object.buffer instanceof CryptoOperationData)) { + } else if ( + object instanceof CryptoOperationData || + (object && object.buffer instanceof CryptoOperationData) + ) { tagNumber = 0x04; - } else - throw new DataError('Unrecognized type for ' + object); + } else throw new DataError("Unrecognized type for " + object); } } // Determinate constructed var tagConstructed = source.tagConstructed; - if (typeof tagConstructed === 'undefined') - tagConstructed = source.tagConstructed = object instanceof Array; + if (typeof tagConstructed === "undefined") tagConstructed = source.tagConstructed = object instanceof Array; // Create content var content; - if (object instanceof CryptoOperationData || (object && object.buffer instanceof CryptoOperationData)) { // Direct + if (object instanceof CryptoOperationData || (object && object.buffer instanceof CryptoOperationData)) { + // Direct content = new Uint8Array(buffer(object)); - if (tagNumber === 0x03) { // BITSTRING + if (tagNumber === 0x03) { + // BITSTRING // Set unused bits var a = new Uint8Array(buffer(content)); content = new Uint8Array(a.length + 1); content[0] = 0; // No unused bits content.set(a, 1); } - } else if (tagConstructed) { // Sub items coding + } else if (tagConstructed) { + // Sub items coding if (object instanceof Array) { - var bytelen = 0, ba = [], offset = 0; + var bytelen = 0, + ba = [], + offset = 0; for (var i = 0, n = object.length; i < n; i++) { ba[i] = encodeBER(object[i], format); bytelen += ba[i].length; } if (tagNumber === 0x11) - ba.sort(function (a, b) { // Sort order for SET components + ba.sort(function (a, b) { + // Sort order for SET components for (var i = 0, n = Math.min(a.length, b.length); i < n; i++) { var r = a[i] - b[i]; - if (r !== 0) - return r; + if (r !== 0) return r; } return a.length - b.length; }); - if (format === 'CER') { // final for CER 00 00 + if (format === "CER") { + // final for CER 00 00 ba[n] = new Uint8Array(2); bytelen += 2; } @@ -528,8 +613,7 @@ var BER = (function () { // content.set(ba[i], offset); offset = offset + ba[i].length; } - } else - throw new DataError('Constracted block can\'t be primitive'); + } else throw new DataError("Constracted block can't be primitive"); } else { switch (tagNumber) { // 0x00: // EOC @@ -539,12 +623,11 @@ var BER = (function () { // break; case 0x02: // INTEGER case 0x0a: // ENUMIRATED - content = Int16.decode( - typeof object === 'number' ? object.toString(16) : object); + content = Int16.decode(typeof object === "number" ? object.toString(16) : object); break; case 0x03: // BIT STRING - if (typeof object === 'string') { - var unusedBits = 7 - (object.length + 7) % 8; + if (typeof object === "string") { + var unusedBits = 7 - ((object.length + 7) % 8); var n = Math.ceil(object.length / 8); content = new Uint8Array(n + 1); content[0] = unusedBits; @@ -552,59 +635,54 @@ var BER = (function () { // var c = 0; for (var j = 0; j < 8; j++) { var k = i * 8 + j; - c = (c << 1) + (k < object.length ? (object.charAt(k) === '1' ? 1 : 0) : 0); + c = (c << 1) + (k < object.length ? (object.charAt(k) === "1" ? 1 : 0) : 0); } content[i + 1] = c; } } break; case 0x04: - content = Hex.decode( - typeof object === 'number' ? object.toString(16) : object); + content = Hex.decode(typeof object === "number" ? object.toString(16) : object); break; - // case 0x05: // NULL + // case 0x05: // NULL case 0x06: // OBJECT IDENTIFIER - var a = object.match(/\d+/g), r = []; + var a = object.match(/\d+/g), + r = []; for (var i = 1; i < a.length; i++) { - var n = +a[i], r1 = []; - if (i === 1) - n = n + a[0] * 40; + var n = +a[i], + r1 = []; + if (i === 1) n = n + a[0] * 40; do { - r1.push(n & 0x7F); + r1.push(n & 0x7f); n = n >>> 7; } while (n); // reverse order - for (j = r1.length - 1; j >= 0; --j) - r.push(r1[j] + (j === 0 ? 0x00 : 0x80)); + for (j = r1.length - 1; j >= 0; --j) r.push(r1[j] + (j === 0 ? 0x00 : 0x80)); } content = new Uint8Array(r); break; - // case 0x07: // ObjectDescriptor - // case 0x08: // EXTERNAL - // case 0x09: // REAL - // case 0x0A: // ENUMERATED - // case 0x0B: // EMBEDDED PDV - case 0x0C: // UTF8String - content = Chars.decode(object, 'utf8'); + // case 0x07: // ObjectDescriptor + // case 0x08: // EXTERNAL + // case 0x09: // REAL + // case 0x0A: // ENUMERATED + // case 0x0B: // EMBEDDED PDV + case 0x0c: // UTF8String + content = Chars.decode(object, "utf8"); break; - // case 0x10: // SEQUENCE - // case 0x11: // SET + // case 0x10: // SEQUENCE + // case 0x11: // SET case 0x12: // NumericString case 0x16: // IA5String // ASCII case 0x13: // PrintableString // ASCII subset case 0x14: // TeletexString // aka T61String case 0x15: // VideotexString case 0x19: // GraphicString - case 0x1A: // VisibleString // ASCII subset - case 0x1B: // GeneralString + case 0x1a: // VisibleString // ASCII subset + case 0x1b: // GeneralString // Reflect on character encoding - for (var i = 0, n = object.length; i < n; i++) - if (object.charCodeAt(i) > 255) - tagNumber = 0x0C; - if (tagNumber === 0x0C) - content = Chars.decode(object, 'utf8'); - else - content = Chars.decode(object, 'ascii'); + for (var i = 0, n = object.length; i < n; i++) if (object.charCodeAt(i) > 255) tagNumber = 0x0c; + if (tagNumber === 0x0c) content = Chars.decode(object, "utf8"); + else content = Chars.decode(object, "ascii"); break; case 0x17: // UTCTime case 0x18: // GeneralizedTime @@ -612,63 +690,67 @@ var BER = (function () { // if (!result) { var date = new Date(object); date.setMinutes(date.getMinutes() + date.getTimezoneOffset()); // to UTC - var ms = tagNumber === 0x18 ? date.getMilliseconds().toString() : ''; // Milliseconds, remove trailing zeros - while (ms.length > 0 && ms.charAt(ms.length - 1) === '0') - ms = ms.substring(0, ms.length - 1); - if (ms.length > 0) - ms = '.' + ms; - result = (tagNumber === 0x17 ? date.getYear().toString().slice(-2) : date.getFullYear().toString()) + - ('00' + (date.getMonth() + 1)).slice(-2) + - ('00' + date.getDate()).slice(-2) + - ('00' + date.getHours()).slice(-2) + - ('00' + date.getMinutes()).slice(-2) + - ('00' + date.getSeconds()).slice(-2) + ms + 'Z'; + var ms = tagNumber === 0x18 ? date.getMilliseconds().toString() : ""; // Milliseconds, remove trailing zeros + while (ms.length > 0 && ms.charAt(ms.length - 1) === "0") ms = ms.substring(0, ms.length - 1); + if (ms.length > 0) ms = "." + ms; + result = + (tagNumber === 0x17 ? date.getYear().toString().slice(-2) : date.getFullYear().toString()) + + ("00" + (date.getMonth() + 1)).slice(-2) + + ("00" + date.getDate()).slice(-2) + + ("00" + date.getHours()).slice(-2) + + ("00" + date.getMinutes()).slice(-2) + + ("00" + date.getSeconds()).slice(-2) + + ms + + "Z"; } - content = Chars.decode(result, 'ascii'); + content = Chars.decode(result, "ascii"); break; - case 0x1C: // UniversalString - content = Chars.decode(object, 'utf32'); + case 0x1c: // UniversalString + content = Chars.decode(object, "utf32"); break; - case 0x1E: // BMPString - content = Chars.decode(object, 'utf16'); + case 0x1e: // BMPString + content = Chars.decode(object, "utf16"); break; } } - if (!content) - content = new Uint8Array(0); - if (content instanceof CryptoOperationData) - content = new Uint8Array(content); + if (!content) content = new Uint8Array(0); + if (content instanceof CryptoOperationData) content = new Uint8Array(content); - if (!tagConstructed && format === 'CER') { + if (!tagConstructed && format === "CER") { // Encoding CER-form for string types var k; switch (tagNumber) { case 0x03: // BIT_STRING k = 1; // ingnore unused bit for bit string case 0x04: // OCTET_STRING - case 0x0C: // UTF8String + case 0x0c: // UTF8String case 0x12: // NumericString case 0x13: // PrintableString case 0x14: // TeletexString case 0x15: // VideotexString case 0x16: // IA5String case 0x19: // GraphicString - case 0x1A: // VisibleString - case 0x1B: // GeneralString - case 0x1C: // UniversalString - case 0x1E: // BMPString + case 0x1a: // VisibleString + case 0x1b: // GeneralString + case 0x1c: // UniversalString + case 0x1e: // BMPString k = k || 0; // Split content on 1000 octet len parts var size = 1000; - var bytelen = 0, ba = [], offset = 0; + var bytelen = 0, + ba = [], + offset = 0; for (var i = k, n = content.length; i < n; i += size - k) { - ba[i] = encodeBER({ - object: new Unit8Array(content.buffer, i, Math.min(size - k, n - i)), - tagNumber: tagNumber, - tagClass: 0, - tagConstructed: false - }, format); + ba[i] = encodeBER( + { + object: new Unit8Array(content.buffer, i, Math.min(size - k, n - i)), + tagNumber: tagNumber, + tagClass: 0, + tagConstructed: false + }, + format + ); bytelen += ba[i].length; } ba[n] = new Uint8Array(2); // final for CER 00 00 @@ -682,56 +764,52 @@ var BER = (function () { // } // Restore tagNumber for all classes - if (tagClass === 0) - source.tagNumber = tagNumber; - else - source.tagNumber = tagNumber = source.tagNumber || 0; + if (tagClass === 0) source.tagNumber = tagNumber; + else source.tagNumber = tagNumber = source.tagNumber || 0; source.content = content; - if (onlyContent) - return content; + if (onlyContent) return content; // Create header // tagNumber - var ha = [], first = tagClass === 3 ? 0xC0 : tagClass === 2 ? 0x80 : - tagClass === 1 ? 0x40 : 0x00; - if (tagConstructed) - first |= 0x20; - if (tagNumber < 0x1F) { - first |= tagNumber & 0x1F; + var ha = [], + first = tagClass === 3 ? 0xc0 : tagClass === 2 ? 0x80 : tagClass === 1 ? 0x40 : 0x00; + if (tagConstructed) first |= 0x20; + if (tagNumber < 0x1f) { + first |= tagNumber & 0x1f; ha.push(first); } else { - first |= 0x1F; + first |= 0x1f; ha.push(first); - var n = tagNumber, ha1 = []; + var n = tagNumber, + ha1 = []; do { - ha1.push(n & 0x7F); + ha1.push(n & 0x7f); n = n >>> 7; - } while (n) + } while (n); // reverse order - for (var j = ha1.length - 1; j >= 0; --j) - ha.push(ha1[j] + (j === 0 ? 0x00 : 0x80)); + for (var j = ha1.length - 1; j >= 0; --j) ha.push(ha1[j] + (j === 0 ? 0x00 : 0x80)); } // Length - if (tagConstructed && format === 'CER') { + if (tagConstructed && format === "CER") { ha.push(0x80); } else { var len = content.length; - if (len > 0x7F) { - var l2 = len, ha2 = []; + if (len > 0x7f) { + var l2 = len, + ha2 = []; do { ha2.push(l2 & 0xff); l2 = l2 >>> 8; } while (l2); ha.push(ha2.length + 0x80); // reverse order - for (var j = ha2.length - 1; j >= 0; --j) - ha.push(ha2[j]); + for (var j = ha2.length - 1; j >= 0; --j) ha.push(ha2[j]); } else { // simple len ha.push(len); } } - var header = source.header = new Uint8Array(ha); + var header = (source.header = new Uint8Array(ha)); // Result - complete buffer var block = new Uint8Array(header.length + content.length); @@ -741,11 +819,10 @@ var BER = (function () { // } function decodeBER(source, offset) { - // start pos - var pos = offset || 0, start = pos; - var tagNumber, tagClass, tagConstructed, - content, header, buffer, sub, len; + var pos = offset || 0, + start = pos; + var tagNumber, tagClass, tagConstructed, content, header, buffer, sub, len; if (source.object) { // Ready from source @@ -754,10 +831,9 @@ var BER = (function () { // tagConstructed = source.tagConstructed; content = source.content; header = source.header; - buffer = source.object instanceof CryptoOperationData ? - new Uint8Array(source.object) : null; + buffer = source.object instanceof CryptoOperationData ? new Uint8Array(source.object) : null; sub = source.object instanceof Array ? source.object : null; - len = buffer && buffer.length || null; + len = (buffer && buffer.length) || null; } else { // Decode header var d = source; @@ -767,11 +843,14 @@ var BER = (function () { // tagNumber = buf & 0x1f; tagClass = buf >> 6; tagConstructed = (buf & 0x20) !== 0; - if (tagNumber === 0x1f) { // long tag + if (tagNumber === 0x1f) { + // long tag tagNumber = 0; do { if (tagNumber > 0x1fffffffffff80) - throw new DataError('Convertor not supported tag number more then (2^53 - 1) at position ' + offset); + throw new DataError( + "Convertor not supported tag number more then (2^53 - 1) at position " + offset + ); buf = d[pos++]; tagNumber = (tagNumber << 7) + (buf & 0x7f); } while (buf & 0x80); @@ -781,14 +860,14 @@ var BER = (function () { // buf = d[pos++]; len = buf & 0x7f; if (len !== buf) { - if (len > 6) // no reason to use Int10, as it would be a huge buffer anyways - throw new DataError('Length over 48 bits not supported at position ' + offset); + if (len > 6) + // no reason to use Int10, as it would be a huge buffer anyways + throw new DataError("Length over 48 bits not supported at position " + offset); if (len === 0) len = null; // undefined else { buf = 0; - for (var i = 0; i < len; ++i) - buf = (buf << 8) + d[pos++]; + for (var i = 0; i < len; ++i) buf = (buf << 8) + d[pos++]; len = buf; } } @@ -808,20 +887,21 @@ var BER = (function () { // pos += s.header.length + s.content.length; } if (pos !== end) - throw new DataError('Content size is not correct for container starting at offset ' + start); + throw new DataError("Content size is not correct for container starting at offset " + start); } else { // undefined length try { - for (; ; ) { + for (;;) { var s = decodeBER(d, pos); pos += s.header.length + s.content.length; - if (s.tagClass === 0x00 && s.tagNumber === 0x00) - break; + if (s.tagClass === 0x00 && s.tagNumber === 0x00) break; sub.push(s); } len = pos - start; } catch (e) { - throw new DataError('Exception ' + e + ' while decoding undefined length content at offset ' + start); + throw new DataError( + "Exception " + e + " while decoding undefined length content at offset " + start + ); } } } @@ -839,35 +919,33 @@ var BER = (function () { // case 0x03: // BIT_STRING k = 1; // ingnore unused bit for bit string case 0x04: // OCTET_STRING - case 0x0C: // UTF8String + case 0x0c: // UTF8String case 0x12: // NumericString case 0x13: // PrintableString case 0x14: // TeletexString case 0x15: // VideotexString case 0x16: // IA5String case 0x19: // GraphicString - case 0x1A: // VisibleString - case 0x1B: // GeneralString - case 0x1C: // UniversalString - case 0x1E: // BMPString + case 0x1a: // VisibleString + case 0x1b: // GeneralString + case 0x1c: // UniversalString + case 0x1e: // BMPString k = k || 0; // Concatination if (sub.length === 0) - throw new DataError('No constructed encoding content of string type at offset ' + start); + throw new DataError("No constructed encoding content of string type at offset " + start); len = k; for (var i = 0, n = sub.length; i < n; i++) { var s = sub[i]; if (s.tagClass !== tagClass || s.tagNumber !== tagNumber || s.tagConstructed) - throw new DataError('Invalid constructed encoding of string type at offset ' + start); + throw new DataError("Invalid constructed encoding of string type at offset " + start); len += s.content.length - k; } buffer = new Uint8Array(len); for (var i = 0, n = sub.length, j = k; i < n; i++) { var s = sub[i]; - if (k > 0) - buffer.set(s.content.subarray(1), j); - else - buffer.set(s.content, j); + if (k > 0) buffer.set(s.content.subarray(1), j); + else buffer.set(s.content, j); j += s.content.length - k; } tagConstructed = false; // follow not required @@ -876,10 +954,9 @@ var BER = (function () { // } } // Primitive types - var object = ''; + var object = ""; if (sub === null) { - if (len === null) - throw new DataError('Invalid tag with undefined length at offset ' + start); + if (len === null) throw new DataError("Invalid tag with undefined length at offset " + start); if (tagClass === 0) { switch (tagNumber) { @@ -892,65 +969,64 @@ var BER = (function () { // object = Int16.encode(buffer); } else { var v = buffer[0]; - if (buffer[0] > 0x7f) - v = v - 256; - for (var i = 1; i < len; i++) - v = v * 256 + buffer[i]; + if (buffer[0] > 0x7f) v = v - 256; + for (var i = 1; i < len; i++) v = v * 256 + buffer[i]; object = v; } break; case 0x03: // BIT_STRING - if (len > 5) { // Content buffer + if (len > 5) { + // Content buffer object = new Uint8Array(buffer.subarray(1)).buffer; - } else { // Max bit mask only for 32 bit + } else { + // Max bit mask only for 32 bit var unusedBit = buffer[0], - skip = unusedBit, s = []; + skip = unusedBit, + s = []; for (var i = len - 1; i >= 1; --i) { var b = buffer[i]; - for (var j = skip; j < 8; ++j) - s.push((b >> j) & 1 ? '1' : '0'); + for (var j = skip; j < 8; ++j) s.push((b >> j) & 1 ? "1" : "0"); skip = 0; } - object = s.reverse().join(''); + object = s.reverse().join(""); } break; case 0x04: // OCTET_STRING object = new Uint8Array(buffer).buffer; break; - // case 0x05: // NULL + // case 0x05: // NULL case 0x06: // OBJECT_IDENTIFIER - var s = '', - n = 0, - bits = 0; + var s = "", + n = 0, + bits = 0; for (var i = 0; i < len; ++i) { var v = buffer[i]; - n = (n << 7) + (v & 0x7F); + n = (n << 7) + (v & 0x7f); bits += 7; - if (!(v & 0x80)) { // finished - if (s === '') { - var m = n < 80 ? n < 40 ? 0 : 1 : 2; + if (!(v & 0x80)) { + // finished + if (s === "") { + var m = n < 80 ? (n < 40 ? 0 : 1) : 2; s = m + "." + (n - m * 40); - } else - s += "." + n.toString(); + } else s += "." + n.toString(); n = 0; bits = 0; } } - if (bits > 0) - throw new DataError('Incompleted OID at offset ' + start); + if (bits > 0) throw new DataError("Incompleted OID at offset " + start); object = s; break; - //case 0x07: // ObjectDescriptor - //case 0x08: // EXTERNAL - //case 0x09: // REAL - //case 0x0A: // ENUMERATED - //case 0x0B: // EMBEDDED_PDV + //case 0x07: // ObjectDescriptor + //case 0x08: // EXTERNAL + //case 0x09: // REAL + //case 0x0A: // ENUMERATED + //case 0x0B: // EMBEDDED_PDV case 0x10: // SEQUENCE case 0x11: // SET object = []; break; - case 0x0C: // UTF8String - object = Chars.encode(buffer, 'utf8'); + case 0x0c: // UTF8String + object = Chars.encode(buffer, "utf8"); break; case 0x12: // NumericString case 0x13: // PrintableString @@ -958,35 +1034,44 @@ var BER = (function () { // case 0x15: // VideotexString case 0x16: // IA5String case 0x19: // GraphicString - case 0x1A: // VisibleString - case 0x1B: // GeneralString - object = Chars.encode(buffer, 'ascii'); + case 0x1a: // VisibleString + case 0x1b: // GeneralString + object = Chars.encode(buffer, "ascii"); break; - case 0x1C: // UniversalString - object = Chars.encode(buffer, 'utf32'); + case 0x1c: // UniversalString + object = Chars.encode(buffer, "utf32"); break; - case 0x1E: // BMPString - object = Chars.encode(buffer, 'utf16'); + case 0x1e: // BMPString + object = Chars.encode(buffer, "utf16"); break; case 0x17: // UTCTime case 0x18: // GeneralizedTime var shortYear = tagNumber === 0x17; - var s = Chars.encode(buffer, 'ascii'), - m = (shortYear ? - /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/ : - /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/).exec(s); - if (!m) - throw new DataError('Unrecognized time format "' + s + '" at offset ' + start); + var s = Chars.encode(buffer, "ascii"), + m = ( + shortYear + ? /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/ + : /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/ + ).exec(s); + if (!m) throw new DataError('Unrecognized time format "' + s + '" at offset ' + start); if (shortYear) { // Where YY is greater than or equal to 50, the year SHALL be interpreted as 19YY; and // Where YY is less than 50, the year SHALL be interpreted as 20YY m[1] = +m[1]; - m[1] += (m[1] < 50) ? 2000 : 1900; + m[1] += m[1] < 50 ? 2000 : 1900; } - var dt = new Date(m[1], +m[2] - 1, +m[3], +(m[4] || '0'), +(m[5] || '0'), +(m[6] || '0'), +(m[7] || '0')), - tz = dt.getTimezoneOffset(); + var dt = new Date( + m[1], + +m[2] - 1, + +m[3], + +(m[4] || "0"), + +(m[5] || "0"), + +(m[6] || "0"), + +(m[7] || "0") + ), + tz = dt.getTimezoneOffset(); if (m[8] || tagNumber === 0x17) { - if (m[8].toUpperCase() !== 'Z' && m[9]) { + if (m[8].toUpperCase() !== "Z" && m[9]) { tz = tz + parseInt(m[9]); } dt.setMinutes(dt.getMinutes() - tz); @@ -995,10 +1080,9 @@ var BER = (function () { // object = dt; break; } - } else // OCTET_STRING - object = new Uint8Array(buffer).buffer; - } else - object = sub; + } // OCTET_STRING + else object = new Uint8Array(buffer).buffer; + } else object = sub; // result return { @@ -1084,7 +1168,8 @@ GostCoding.prototype.BER = BER; * PEM conversion * @class GostCoding.PEM */ -var PEM = {// +var PEM = { + // /** * PEM.encode(data, name) encode CryptoOperationData to PEM format with name label * @@ -1094,9 +1179,11 @@ var PEM = {// * @returns {string} Encoded object */ encode: function (data, name) { - return (name ? '-----BEGIN ' + name.toUpperCase() + '-----\r\n' : '') + - Base64.encode(data instanceof CryptoOperationData ? data : BER.encode(data)) + - (name ? '\r\n-----END ' + name.toUpperCase() + '-----' : ''); + return ( + (name ? "-----BEGIN " + name.toUpperCase() + "-----\r\n" : "") + + Base64.encode(data instanceof CryptoOperationData ? data : BER.encode(data)) + + (name ? "\r\n-----END " + name.toUpperCase() + "-----" : "") + ); }, /** * PEM.decode(s, name, deep) decode PEM format s labeled name to CryptoOperationData or javascript object in according to deep parameter @@ -1111,31 +1198,32 @@ var PEM = {// decode: function (s, name, deep, index) { // Try clear base64 var re1 = /([A-Za-z0-9\+\/\s\=]+)/g, - valid = re1.exec(s); - if (valid[1].length !== s.length) - valid = false; + valid = re1.exec(s); + if (valid[1].length !== s.length) valid = false; if (!valid && name) { // Try with the name var re2 = new RegExp( - '-----\\s?BEGIN ' + name.toUpperCase() + - '-----([A-Za-z0-9\\+\\/\\s\\=]+)-----\\s?END ' + - name.toUpperCase() + '-----', 'g'); + "-----\\s?BEGIN " + + name.toUpperCase() + + "-----([A-Za-z0-9\\+\\/\\s\\=]+)-----\\s?END " + + name.toUpperCase() + + "-----", + "g" + ); valid = re2.exec(s); } if (!valid) { // Try with some name var re3 = new RegExp( - '-----\\s?BEGIN [A-Z0-9\\s]+' + - '-----([A-Za-z0-9\\+\\/\\s\\=]+)-----\\s?END ' + - '[A-Z0-9\\s]+-----', 'g'); + "-----\\s?BEGIN [A-Z0-9\\s]+" + "-----([A-Za-z0-9\\+\\/\\s\\=]+)-----\\s?END " + "[A-Z0-9\\s]+-----", + "g" + ); valid = re3.exec(s); } var r = valid && valid[1 + (index || 0)]; - if (!r) - throw new DataError('Not valid PEM format'); + if (!r) throw new DataError("Not valid PEM format"); var out = Base64.decode(r); - if (deep) - out = BER.decode(out); + if (deep) out = BER.decode(out); return out; } // }; diff --git a/src/core/vendor/gost/gostCrypto.mjs b/src/core/vendor/gost/gostCrypto.mjs index 77132f6c..de70bdb1 100644 --- a/src/core/vendor/gost/gostCrypto.mjs +++ b/src/core/vendor/gost/gostCrypto.mjs @@ -32,326 +32,375 @@ * */ -import GostRandom from './gostRandom.mjs'; -import gostEngine from './gostEngine.mjs'; +import GostRandom from "./gostRandom.mjs"; +import gostEngine from "./gostEngine.mjs"; -import crypto from 'crypto' +import crypto from "crypto"; /* -* Algorithm normalization -* -*/ // + * Algorithm normalization + * + */ // var root = {}; root.gostEngine = gostEngine; -var rootCrypto = crypto +var rootCrypto = crypto; var SyntaxError = Error, - DataError = Error, - NotSupportedError = Error, - OperationError = Error, - InvalidStateError = Error, - InvalidAccessError = Error; + DataError = Error, + NotSupportedError = Error, + OperationError = Error, + InvalidStateError = Error, + InvalidAccessError = Error; // Normalize algorithm function normalize(algorithm, method) { - if (typeof algorithm === 'string' || algorithm instanceof String) - algorithm = {name: algorithm}; + if (typeof algorithm === "string" || algorithm instanceof String) algorithm = { name: algorithm }; var name = algorithm.name; - if (!name) - throw new SyntaxError('Algorithm name not defined'); + if (!name) throw new SyntaxError("Algorithm name not defined"); // Extract algorithm modes from name - var modes = name.split('/'), modes = modes[0].split('-').concat(modes.slice(1)); + var modes = name.split("/"), + modes = modes[0].split("-").concat(modes.slice(1)); // Normalize the name with default modes var na = {}; - name = modes[0].replace(/[\.\s]/g, ''); + name = modes[0].replace(/[\.\s]/g, ""); modes = modes.slice(1); - if (name.indexOf('28147') >= 0) { + if (name.indexOf("28147") >= 0) { na = { - name: 'GOST 28147', + name: "GOST 28147", version: 1989, - mode: (algorithm.mode || (// ES, MAC, KW - (method === 'sign' || method === 'verify') ? 'MAC' : - (method === 'wrapKey' || method === 'unwrapKey') ? 'KW' : 'ES')).toUpperCase(), + mode: ( + algorithm.mode || // ES, MAC, KW + (method === "sign" || method === "verify" + ? "MAC" + : method === "wrapKey" || method === "unwrapKey" + ? "KW" + : "ES") + ).toUpperCase(), length: algorithm.length || 64 }; - } else if (name.indexOf('3412') >= 0) { + } else if (name.indexOf("3412") >= 0) { na = { - name: 'GOST R 34.12', + name: "GOST R 34.12", version: 2015, - mode: (algorithm.mode || (// ES, MAC, KW - (method === 'sign' || method === 'verify') ? 'MAC' : - (method === 'wrapKey' || method === 'unwrapKey') ? 'KW' : 'ES')).toUpperCase(), + mode: ( + algorithm.mode || // ES, MAC, KW + (method === "sign" || method === "verify" + ? "MAC" + : method === "wrapKey" || method === "unwrapKey" + ? "KW" + : "ES") + ).toUpperCase(), length: algorithm.length || 64 // 128 }; - } else if (name.indexOf('3411') >= 0) { + } else if (name.indexOf("3411") >= 0) { na = { - name: 'GOST R 34.11', + name: "GOST R 34.11", version: 2012, // 1994 - mode: (algorithm.mode || (// HASH, KDF, HMAC, PBKDF2, PFXKDF, CPKDF - (method === 'deriveKey' || method === 'deriveBits') ? 'KDF' : - (method === 'sign' || method === 'verify') ? 'HMAC' : 'HASH')).toUpperCase(), + mode: ( + algorithm.mode || // HASH, KDF, HMAC, PBKDF2, PFXKDF, CPKDF + (method === "deriveKey" || method === "deriveBits" + ? "KDF" + : method === "sign" || method === "verify" + ? "HMAC" + : "HASH") + ).toUpperCase(), length: algorithm.length || 256 // 512 }; - } else if (name.indexOf('3410') >= 0) { + } else if (name.indexOf("3410") >= 0) { na = { - name: 'GOST R 34.10', + name: "GOST R 34.10", version: 2012, // 1994, 2001 - mode: (algorithm.mode || (// SIGN, DH, MASK - (method === 'deriveKey' || method === 'deriveBits') ? 'DH' : 'SIGN')).toUpperCase(), + mode: ( + algorithm.mode || // SIGN, DH, MASK + (method === "deriveKey" || method === "deriveBits" ? "DH" : "SIGN") + ).toUpperCase(), length: algorithm.length || 256 // 512 }; - } else if (name.indexOf('SHA') >= 0) { + } else if (name.indexOf("SHA") >= 0) { na = { - name: 'SHA', + name: "SHA", version: (algorithm.length || 160) === 160 ? 1 : 2, // 1, 2 - mode: (algorithm.mode || (// HASH, KDF, HMAC, PBKDF2, PFXKDF - (method === 'deriveKey' || method === 'deriveBits') ? 'KDF' : - (method === 'sign' || method === 'verify') ? 'HMAC' : 'HASH')).toUpperCase(), + mode: ( + algorithm.mode || // HASH, KDF, HMAC, PBKDF2, PFXKDF + (method === "deriveKey" || method === "deriveBits" + ? "KDF" + : method === "sign" || method === "verify" + ? "HMAC" + : "HASH") + ).toUpperCase(), length: algorithm.length || 160 }; - } else if (name.indexOf('RC2') >= 0) { + } else if (name.indexOf("RC2") >= 0) { na = { - name: 'RC2', + name: "RC2", version: 1, - mode: (algorithm.mode || (// ES, MAC, KW - (method === 'sign' || method === 'verify') ? 'MAC' : - (method === 'wrapKey' || method === 'unwrapKey') ? 'KW' : 'ES')).toUpperCase(), + mode: ( + algorithm.mode || // ES, MAC, KW + (method === "sign" || method === "verify" + ? "MAC" + : method === "wrapKey" || method === "unwrapKey" + ? "KW" + : "ES") + ).toUpperCase(), length: algorithm.length || 32 // 1 - 1024 }; - } else if (name.indexOf('PBKDF2') >= 0) { - na = normalize(algorithm.hash, 'digest'); - na.mode = 'PBKDF2'; - } else if (name.indexOf('PFXKDF') >= 0) { - na = normalize(algorithm.hash, 'digest'); - na.mode = 'PFXKDF'; - } else if (name.indexOf('CPKDF') >= 0) { - na = normalize(algorithm.hash, 'digest'); - na.mode = 'CPKDF'; - } else if (name.indexOf('HMAC') >= 0) { - na = normalize(algorithm.hash, 'digest'); - na.mode = 'HMAC'; - } else - throw new NotSupportedError('Algorithm not supported'); + } else if (name.indexOf("PBKDF2") >= 0) { + na = normalize(algorithm.hash, "digest"); + na.mode = "PBKDF2"; + } else if (name.indexOf("PFXKDF") >= 0) { + na = normalize(algorithm.hash, "digest"); + na.mode = "PFXKDF"; + } else if (name.indexOf("CPKDF") >= 0) { + na = normalize(algorithm.hash, "digest"); + na.mode = "CPKDF"; + } else if (name.indexOf("HMAC") >= 0) { + na = normalize(algorithm.hash, "digest"); + na.mode = "HMAC"; + } else throw new NotSupportedError("Algorithm not supported"); // Compile modes modes.forEach(function (mode) { mode = mode.toUpperCase(); if (/^[0-9]+$/.test(mode)) { - if ((['8', '16', '32'].indexOf(mode) >= 0) || (na.length === '128' && mode === '64')) { // Shift bits - if (na.mode === 'ES') - na.shiftBits = parseInt(mode); - else if (na.mode === 'MAC') - na.macLength = parseInt(mode); - else - throw new NotSupportedError('Algorithm ' + na.name + ' mode ' + mode + ' not supported'); - } else if (['89', '94', '01', '12', '15', '1989', '1994', '2001', '2012', '2015'].indexOf(mode) >= 0) { // GOST Year + if (["8", "16", "32"].indexOf(mode) >= 0 || (na.length === "128" && mode === "64")) { + // Shift bits + if (na.mode === "ES") na.shiftBits = parseInt(mode); + else if (na.mode === "MAC") na.macLength = parseInt(mode); + else throw new NotSupportedError("Algorithm " + na.name + " mode " + mode + " not supported"); + } else if (["89", "94", "01", "12", "15", "1989", "1994", "2001", "2012", "2015"].indexOf(mode) >= 0) { + // GOST Year var version = parseInt(mode); version = version < 1900 ? (version < 80 ? 2000 + version : 1900 + version) : version; na.version = version; - } else if (['1'].indexOf(mode) >= 0 && na.name === 'SHA') { // SHA-1 + } else if (["1"].indexOf(mode) >= 0 && na.name === "SHA") { + // SHA-1 na.version = 1; na.length = 160; - } else if (['256', '384', '512'].indexOf(mode) >= 0 && na.name === 'SHA') { // SHA-2 + } else if (["256", "384", "512"].indexOf(mode) >= 0 && na.name === "SHA") { + // SHA-2 na.version = 2; na.length = parseInt(mode); - } else if (['40', '128'].indexOf(mode) >= 0 && na.name === 'RC2') { // RC2 + } else if (["40", "128"].indexOf(mode) >= 0 && na.name === "RC2") { + // RC2 na.version = 1; na.length = parseInt(mode); // key size - } else if (['64', '128', '256', '512'].indexOf(mode) >= 0) // block size + } else if (["64", "128", "256", "512"].indexOf(mode) >= 0) + // block size na.length = parseInt(mode); - else if (['1000', '2000'].indexOf(mode) >= 0) // Iterations + else if (["1000", "2000"].indexOf(mode) >= 0) + // Iterations na.iterations = parseInt(mode); // Named Paramsets - } else if (['E-TEST', 'E-A', 'E-B', 'E-C', 'E-D', 'E-SC', 'E-Z', 'D-TEST', 'D-A', 'D-SC'].indexOf(mode) >= 0) { + } else if (["E-TEST", "E-A", "E-B", "E-C", "E-D", "E-SC", "E-Z", "D-TEST", "D-A", "D-SC"].indexOf(mode) >= 0) { na.sBox = mode; - } else if (['S-TEST', 'S-A', 'S-B', 'S-C', 'S-D', 'X-A', 'X-B', 'X-C'].indexOf(mode) >= 0) { + } else if (["S-TEST", "S-A", "S-B", "S-C", "S-D", "X-A", "X-B", "X-C"].indexOf(mode) >= 0) { na.namedParam = mode; - } else if (['S-256-TEST', 'S-256-A', 'S-256-B', 'S-256-C', 'P-256', 'T-512-TEST', 'T-512-A', - 'T-512-B', 'X-256-A', 'X-256-B', 'T-256-TEST', 'T-256-A', 'T-256-B', 'S-256-B', 'T-256-C', 'S-256-C'].indexOf(mode) >= 0) { + } else if ( + [ + "S-256-TEST", + "S-256-A", + "S-256-B", + "S-256-C", + "P-256", + "T-512-TEST", + "T-512-A", + "T-512-B", + "X-256-A", + "X-256-B", + "T-256-TEST", + "T-256-A", + "T-256-B", + "S-256-B", + "T-256-C", + "S-256-C" + ].indexOf(mode) >= 0 + ) { na.namedCurve = mode; - } else if (['SC', 'CP', 'VN'].indexOf(mode) >= 0) { + } else if (["SC", "CP", "VN"].indexOf(mode) >= 0) { na.procreator = mode; // Encription GOST 28147 or GOST R 34.12 - } else if (na.name === 'GOST 28147' || na.name === 'GOST R 34.12' || na.name === 'RC2') { - if (['ES', 'MAC', 'KW', 'MASK'].indexOf(mode) >= 0) { + } else if (na.name === "GOST 28147" || na.name === "GOST R 34.12" || na.name === "RC2") { + if (["ES", "MAC", "KW", "MASK"].indexOf(mode) >= 0) { na.mode = mode; - } else if (['ECB', 'CFB', 'OFB', 'CTR', 'CBC'].indexOf(mode) >= 0) { - na.mode = 'ES'; + } else if (["ECB", "CFB", "OFB", "CTR", "CBC"].indexOf(mode) >= 0) { + na.mode = "ES"; na.block = mode; - } else if (['CPKW', 'NOKW', 'SCKW'].indexOf(mode) >= 0) { - na.mode = 'KW'; - na.keyWrapping = mode.replace('KW', ''); - } else if (['ZEROPADDING', 'PKCS5PADDING', 'NOPADDING', 'RANDOMPADDING', 'BITPADDING'].indexOf(mode) >= 0) { - na.padding = mode.replace('PADDING', ''); - } else if (['NOKM', 'CPKM'].indexOf(mode) >= 0) { - na.keyMeshing = mode.replace('KM', ''); - } else - throw new NotSupportedError('Algorithm ' + na.name + ' mode ' + mode + ' not supported'); + } else if (["CPKW", "NOKW", "SCKW"].indexOf(mode) >= 0) { + na.mode = "KW"; + na.keyWrapping = mode.replace("KW", ""); + } else if (["ZEROPADDING", "PKCS5PADDING", "NOPADDING", "RANDOMPADDING", "BITPADDING"].indexOf(mode) >= 0) { + na.padding = mode.replace("PADDING", ""); + } else if (["NOKM", "CPKM"].indexOf(mode) >= 0) { + na.keyMeshing = mode.replace("KM", ""); + } else throw new NotSupportedError("Algorithm " + na.name + " mode " + mode + " not supported"); // Digesting GOST 34.11 - } else if (na.name === 'GOST R 34.11' || na.name === 'SHA') { - if (['HASH', 'KDF', 'HMAC', 'PBKDF2', 'PFXKDF', 'CPKDF'].indexOf(mode) >= 0) - na.mode = mode; - else - throw new NotSupportedError('Algorithm ' + na.name + ' mode ' + mode + ' not supported'); + } else if (na.name === "GOST R 34.11" || na.name === "SHA") { + if (["HASH", "KDF", "HMAC", "PBKDF2", "PFXKDF", "CPKDF"].indexOf(mode) >= 0) na.mode = mode; + else throw new NotSupportedError("Algorithm " + na.name + " mode " + mode + " not supported"); // Signing GOST 34.10 - } else if (na.name === 'GOST R 34.10') { - var hash = mode.replace(/[\.\s]/g, ''); - if (hash.indexOf('GOST') >= 0 && hash.indexOf('3411') >= 0) - na.hash = mode; - else if (['SIGN', 'DH', 'MASK'].indexOf(mode)) - na.mode = mode; - else - throw new NotSupportedError('Algorithm ' + na.name + ' mode ' + mode + ' not supported'); + } else if (na.name === "GOST R 34.10") { + var hash = mode.replace(/[\.\s]/g, ""); + if (hash.indexOf("GOST") >= 0 && hash.indexOf("3411") >= 0) na.hash = mode; + else if (["SIGN", "DH", "MASK"].indexOf(mode)) na.mode = mode; + else throw new NotSupportedError("Algorithm " + na.name + " mode " + mode + " not supported"); } }); // Procreator - na.procreator = algorithm.procreator || na.procreator || 'CP'; + na.procreator = algorithm.procreator || na.procreator || "CP"; // Key size switch (na.name) { - case 'GOST R 34.10': + case "GOST R 34.10": na.keySize = na.length / (na.version === 1994 ? 4 : 8); break; - case 'GOST R 34.11': + case "GOST R 34.11": na.keySize = 32; break; - case 'GOST 28147': - case 'GOST R 34.12': + case "GOST 28147": + case "GOST R 34.12": na.keySize = 32; break; - case 'RC2': + case "RC2": na.keySize = Math.ceil(na.length / 8); break; - case 'SHA': + case "SHA": na.keySize = na.length / 8; break; } // Encrypt additional modes - if (na.mode === 'ES') { - if (algorithm.block) - na.block = algorithm.block; // ECB, CFB, OFB, CTR, CBC - if (na.block) - na.block = na.block.toUpperCase(); - if (algorithm.padding) - na.padding = algorithm.padding; // NO, ZERO, PKCS5, RANDOM, BIT - if (na.padding) - na.padding = na.padding.toUpperCase(); - if (algorithm.shiftBits) - na.shiftBits = algorithm.shiftBits; // 8, 16, 32, 64 - if (algorithm.keyMeshing) - na.keyMeshing = algorithm.keyMeshing; // NO, CP - if (na.keyMeshing) - na.keyMeshing = na.keyMeshing.toUpperCase(); + if (na.mode === "ES") { + if (algorithm.block) na.block = algorithm.block; // ECB, CFB, OFB, CTR, CBC + if (na.block) na.block = na.block.toUpperCase(); + if (algorithm.padding) na.padding = algorithm.padding; // NO, ZERO, PKCS5, RANDOM, BIT + if (na.padding) na.padding = na.padding.toUpperCase(); + if (algorithm.shiftBits) na.shiftBits = algorithm.shiftBits; // 8, 16, 32, 64 + if (algorithm.keyMeshing) na.keyMeshing = algorithm.keyMeshing; // NO, CP + if (na.keyMeshing) na.keyMeshing = na.keyMeshing.toUpperCase(); // Default values - if (method !== 'importKey' && method !== 'generateKey') { - na.block = na.block || 'ECB'; - na.padding = na.padding || (na.block === 'CBC' || na.block === 'ECB' ? 'ZERO' : 'NO'); - if (na.block === 'CFB' || na.block === 'OFB') - na.shiftBits = na.shiftBits || na.length; - na.keyMeshing = na.keyMeshing || 'NO'; + if (method !== "importKey" && method !== "generateKey") { + na.block = na.block || "ECB"; + na.padding = na.padding || (na.block === "CBC" || na.block === "ECB" ? "ZERO" : "NO"); + if (na.block === "CFB" || na.block === "OFB") na.shiftBits = na.shiftBits || na.length; + na.keyMeshing = na.keyMeshing || "NO"; } } - if (na.mode === 'KW') { - if (algorithm.keyWrapping) - na.keyWrapping = algorithm.keyWrapping; // NO, CP, SC - if (na.keyWrapping) - na.keyWrapping = na.keyWrapping.toUpperCase(); - if (method !== 'importKey' && method !== 'generateKey') - na.keyWrapping = na.keyWrapping || 'NO'; + if (na.mode === "KW") { + if (algorithm.keyWrapping) na.keyWrapping = algorithm.keyWrapping; // NO, CP, SC + if (na.keyWrapping) na.keyWrapping = na.keyWrapping.toUpperCase(); + if (method !== "importKey" && method !== "generateKey") na.keyWrapping = na.keyWrapping || "NO"; } // Paramsets - ['sBox', 'namedParam', 'namedCurve', 'curve', 'param', 'modulusLength'].forEach(function (name) { + ["sBox", "namedParam", "namedCurve", "curve", "param", "modulusLength"].forEach(function (name) { algorithm[name] && (na[name] = algorithm[name]); }); // Default values - if (method !== 'importKey' && method !== 'generateKey') { - if (na.name === 'GOST 28147') { - na.sBox = na.sBox || (na.procreator === 'SC' ? 'E-SC' : 'E-A'); // 'E-A', 'E-B', 'E-C', 'E-D', 'E-SC' - } else if (na.name === 'GOST R 34.12' && na.length === 64) { - na.sBox = 'E-Z'; - } else if (na.name === 'GOST R 34.11' && na.version === 1994) { - na.sBox = na.sBox || (na.procreator === 'SC' ? 'D-SC' : 'D-A'); // 'D-SC' - } else if (na.name === 'GOST R 34.10' && na.version === 1994) { - na.namedParam = na.namedParam || (na.mode === 'DH' ? 'X-A' : 'S-A'); // 'S-B', 'S-C', 'S-D', 'X-B', 'X-C' - } else if (na.name === 'GOST R 34.10' && na.version === 2001) { - na.namedCurve = na.namedCurve || (na.length === 256 ? - na.procreator === 'SC' ? 'P-256' : (na.mode === 'DH' ? 'X-256-A' : 'S-256-A') : // 'S-256-B', 'S-256-C', 'X-256-B', 'T-256-A', 'T-256-B', 'T-256-C', 'P-256' - na.mode === 'T-512-A'); // 'T-512-B', 'T-512-C' - } else if (na.name === 'GOST R 34.10' && na.version === 2012) { - na.namedCurve = na.namedCurve || (na.length === 256 ? - na.procreator === 'SC' ? 'P-256' : (na.mode === 'DH' ? 'X-256-A' : 'S-256-A') : // 'S-256-B', 'S-256-C', 'X-256-B', 'T-256-A', 'T-256-B', 'T-256-C', 'P-256' - na.mode === 'T-512-A'); // 'T-512-B', 'T-512-C' + if (method !== "importKey" && method !== "generateKey") { + if (na.name === "GOST 28147") { + na.sBox = na.sBox || (na.procreator === "SC" ? "E-SC" : "E-A"); // 'E-A', 'E-B', 'E-C', 'E-D', 'E-SC' + } else if (na.name === "GOST R 34.12" && na.length === 64) { + na.sBox = "E-Z"; + } else if (na.name === "GOST R 34.11" && na.version === 1994) { + na.sBox = na.sBox || (na.procreator === "SC" ? "D-SC" : "D-A"); // 'D-SC' + } else if (na.name === "GOST R 34.10" && na.version === 1994) { + na.namedParam = na.namedParam || (na.mode === "DH" ? "X-A" : "S-A"); // 'S-B', 'S-C', 'S-D', 'X-B', 'X-C' + } else if (na.name === "GOST R 34.10" && na.version === 2001) { + na.namedCurve = + na.namedCurve || + (na.length === 256 + ? na.procreator === "SC" + ? "P-256" + : na.mode === "DH" + ? "X-256-A" + : "S-256-A" // 'S-256-B', 'S-256-C', 'X-256-B', 'T-256-A', 'T-256-B', 'T-256-C', 'P-256' + : na.mode === "T-512-A"); // 'T-512-B', 'T-512-C' + } else if (na.name === "GOST R 34.10" && na.version === 2012) { + na.namedCurve = + na.namedCurve || + (na.length === 256 + ? na.procreator === "SC" + ? "P-256" + : na.mode === "DH" + ? "X-256-A" + : "S-256-A" // 'S-256-B', 'S-256-C', 'X-256-B', 'T-256-A', 'T-256-B', 'T-256-C', 'P-256' + : na.mode === "T-512-A"); // 'T-512-B', 'T-512-C' } } // Vectors switch (na.mode) { - case 'DH': + case "DH": algorithm.ukm && (na.ukm = algorithm.ukm); - algorithm['public'] && (na['public'] = algorithm['public']); + algorithm["public"] && (na["public"] = algorithm["public"]); break; - case 'SIGN': - case 'KW': + case "SIGN": + case "KW": algorithm.ukm && (na.ukm = algorithm.ukm); break; - case 'ES': - case 'MAC': + case "ES": + case "MAC": algorithm.iv && (na.iv = algorithm.iv); break; - case 'KDF': + case "KDF": algorithm.label && (na.label = algorithm.label); algorithm.contex && (na.context = algorithm.contex); break; - case 'PBKDF2': + case "PBKDF2": algorithm.salt && (na.salt = algorithm.salt); algorithm.iterations && (na.iterations = algorithm.iterations); algorithm.diversifier && (na.diversifier = algorithm.diversifier); break; - case 'PFXKDF': + case "PFXKDF": algorithm.salt && (na.salt = algorithm.salt); algorithm.iterations && (na.iterations = algorithm.iterations); algorithm.diversifier && (na.diversifier = algorithm.diversifier); break; - case 'CPKDF': + case "CPKDF": algorithm.salt && (na.salt = algorithm.salt); algorithm.iterations && (na.iterations = algorithm.iterations); break; } // Verification method and modes - if (method && ( - ((na.mode !== 'ES' && na.mode !== 'SIGN' && na.mode !== 'MAC' && - na.mode !== 'HMAC' && na.mode !== 'KW' && na.mode !== 'DH' - && na.mode !== 'MASK') && - (method === 'generateKey')) || - ((na.mode !== 'ES') && - (method === 'encrypt' || method === 'decrypt')) || - ((na.mode !== 'SIGN' && na.mode !== 'MAC' && na.mode !== 'HMAC') && - (method === 'sign' || method === 'verify')) || - ((na.mode !== 'HASH') && - (method === 'digest')) || - ((na.mode !== 'KW' && na.mode !== 'MASK') && - (method === 'wrapKey' || method === 'unwrapKey')) || - ((na.mode !== 'DH' && na.mode !== 'PBKDF2' && na.mode !== 'PFXKDF' && - na.mode !== 'CPKDF' && na.mode !== 'KDF') && - (method === 'deriveKey' || method === 'deriveBits')))) - throw new NotSupportedError('Algorithm mode ' + na.mode + ' not valid for method ' + method); + if ( + method && + ((na.mode !== "ES" && + na.mode !== "SIGN" && + na.mode !== "MAC" && + na.mode !== "HMAC" && + na.mode !== "KW" && + na.mode !== "DH" && + na.mode !== "MASK" && + method === "generateKey") || + (na.mode !== "ES" && (method === "encrypt" || method === "decrypt")) || + (na.mode !== "SIGN" && + na.mode !== "MAC" && + na.mode !== "HMAC" && + (method === "sign" || method === "verify")) || + (na.mode !== "HASH" && method === "digest") || + (na.mode !== "KW" && na.mode !== "MASK" && (method === "wrapKey" || method === "unwrapKey")) || + (na.mode !== "DH" && + na.mode !== "PBKDF2" && + na.mode !== "PFXKDF" && + na.mode !== "CPKDF" && + na.mode !== "KDF" && + (method === "deriveKey" || method === "deriveBits"))) + ) + throw new NotSupportedError("Algorithm mode " + na.mode + " not valid for method " + method); // Normalize hash algorithm algorithm.hash && (na.hash = algorithm.hash); if (na.hash) { - if ((typeof na.hash === 'string' || na.hash instanceof String) - && na.procreator) - na.hash = na.hash + '/' + na.procreator; - na.hash = normalize(na.hash, 'digest'); + if ((typeof na.hash === "string" || na.hash instanceof String) && na.procreator) + na.hash = na.hash + "/" + na.procreator; + na.hash = normalize(na.hash, "digest"); } // Algorithm object identirifer @@ -362,77 +411,78 @@ function normalize(algorithm, method) { // Check for possibility use native crypto.subtle function checkNative(algorithm) { - if (!rootCrypto || !rootCrypto.subtle || !algorithm) - return false; + if (!rootCrypto || !rootCrypto.subtle || !algorithm) return false; // Prepare name - var name = (typeof algorithm === 'string' || algorithm instanceof String) ? - name = algorithm : algorithm.name; - if (!name) - return false; + var name = typeof algorithm === "string" || algorithm instanceof String ? (name = algorithm) : algorithm.name; + if (!name) return false; name = name.toUpperCase(); // Digest algorithm for key derivation - if ((name.indexOf('KDF') >= 0 || name.indexOf('HMAC') >= 0) && algorithm.hash) - return checkNative(algorithm.hash); + if ((name.indexOf("KDF") >= 0 || name.indexOf("HMAC") >= 0) && algorithm.hash) return checkNative(algorithm.hash); // True if no supported names - return name.indexOf('GOST') === -1 && - name.indexOf('SHA-1') === -1 && - name.indexOf('RC2') === -1 && - name.indexOf('?DES') === -1; + return ( + name.indexOf("GOST") === -1 && + name.indexOf("SHA-1") === -1 && + name.indexOf("RC2") === -1 && + name.indexOf("?DES") === -1 + ); } // /* - * Key conversion methods - * - */ // + * Key conversion methods + * + */ // // Check key parameter function checkKey(key, method) { - if (!key.algorithm) - throw new SyntaxError('Key algorithm not defined'); + if (!key.algorithm) throw new SyntaxError("Key algorithm not defined"); - if (!key.algorithm.name) - throw new SyntaxError('Key algorithm name not defined'); + if (!key.algorithm.name) throw new SyntaxError("Key algorithm name not defined"); var name = key.algorithm.name, - gostCipher = name === 'GOST 28147' || name === 'GOST R 34.12' || name === 'RC2', - gostDigest = name === 'GOST R 34.11' || name === 'SHA', - gostSign = name === 'GOST R 34.10'; + gostCipher = name === "GOST 28147" || name === "GOST R 34.12" || name === "RC2", + gostDigest = name === "GOST R 34.11" || name === "SHA", + gostSign = name === "GOST R 34.10"; if (!gostCipher && !gostSign && !gostDigest) - throw new NotSupportedError('Key algorithm ' + name + ' is unsupproted'); + throw new NotSupportedError("Key algorithm " + name + " is unsupproted"); - if (!key.type) - throw new SyntaxError('Key type not defined'); + if (!key.type) throw new SyntaxError("Key type not defined"); - if (((gostCipher || gostDigest) && key.type !== 'secret') || - (gostSign && !(key.type === 'public' || key.type === 'private'))) - throw new DataError('Key type ' + key.type + ' is not valid for algorithm ' + name); + if ( + ((gostCipher || gostDigest) && key.type !== "secret") || + (gostSign && !(key.type === "public" || key.type === "private")) + ) + throw new DataError("Key type " + key.type + " is not valid for algorithm " + name); - if (!key.usages || !key.usages.indexOf) - throw new SyntaxError('Key usages not defined'); + if (!key.usages || !key.usages.indexOf) throw new SyntaxError("Key usages not defined"); for (var i = 0, n = key.usages.length; i < n; i++) { var md = key.usages[i]; - if (((md === 'encrypt' || md === 'decrypt') && key.type !== 'secret') || - (md === 'sign' && key.type === 'public') || - (md === 'verify' && key.type === 'private')) - throw new InvalidStateError('Key type ' + key.type + ' is not valid for ' + md); + if ( + ((md === "encrypt" || md === "decrypt") && key.type !== "secret") || + (md === "sign" && key.type === "public") || + (md === "verify" && key.type === "private") + ) + throw new InvalidStateError("Key type " + key.type + " is not valid for " + md); } if (method) if (key.usages.indexOf(method) === -1) - throw new InvalidAccessError('Key usages is not contain method ' + method); + throw new InvalidAccessError("Key usages is not contain method " + method); - if (!key.buffer) - throw new SyntaxError('Key buffer is not defined'); + if (!key.buffer) throw new SyntaxError("Key buffer is not defined"); - var size = key.buffer.byteLength * 8, keySize = 8 * key.algorithm.keySize; - if ((key.type === 'secret' && size !== (keySize || 256) && - (key.usages.indexOf('encrypt') >= 0 || key.usages.indexOf('decrypt') >= 0)) || - (key.type === 'private' && !(size === 256 || size === 512)) || - (key.type === 'public' && !(size === 512 || size === 1024))) - throw new SyntaxError('Key buffer has wrong size ' + size + ' bit'); + var size = key.buffer.byteLength * 8, + keySize = 8 * key.algorithm.keySize; + if ( + (key.type === "secret" && + size !== (keySize || 256) && + (key.usages.indexOf("encrypt") >= 0 || key.usages.indexOf("decrypt") >= 0)) || + (key.type === "private" && !(size === 256 || size === 512)) || + (key.type === "public" && !(size === 512 || size === 1024)) + ) + throw new SyntaxError("Key buffer has wrong size " + size + " bit"); } // Extract key and enrich cipher algorithm @@ -441,32 +491,32 @@ function extractKey(method, algorithm, key) { if (algorithm) { var params; switch (algorithm.mode) { - case 'ES': - params = ['sBox', 'keyMeshing', 'padding', 'block']; + case "ES": + params = ["sBox", "keyMeshing", "padding", "block"]; break; - case 'SIGN': - params = ['namedCurve', 'namedParam', 'sBox', 'curve', 'param', 'modulusLength']; + case "SIGN": + params = ["namedCurve", "namedParam", "sBox", "curve", "param", "modulusLength"]; break; - case 'MAC': - params = ['sBox']; + case "MAC": + params = ["sBox"]; break; - case 'KW': - params = ['keyWrapping', 'ukm']; + case "KW": + params = ["keyWrapping", "ukm"]; break; - case 'DH': - params = ['namedCurve', 'namedParam', 'sBox', 'ukm', 'curve', 'param', 'modulusLength']; + case "DH": + params = ["namedCurve", "namedParam", "sBox", "ukm", "curve", "param", "modulusLength"]; break; - case 'KDF': - params = ['context', 'label']; + case "KDF": + params = ["context", "label"]; break; - case 'PBKDF2': - params = ['sBox', 'iterations', 'salt']; + case "PBKDF2": + params = ["sBox", "iterations", "salt"]; break; - case 'PFXKDF': - params = ['sBox', 'iterations', 'salt', 'diversifier']; + case "PFXKDF": + params = ["sBox", "iterations", "salt", "diversifier"]; break; - case 'CPKDF': - params = ['sBox', 'salt']; + case "CPKDF": + params = ["sBox", "salt"]; break; } if (params) @@ -480,8 +530,8 @@ function extractKey(method, algorithm, key) { // Make key definition function convertKey(algorithm, extractable, keyUsages, keyData, keyType) { var key = { - type: keyType || (algorithm.name === 'GOST R 34.10' ? 'private' : 'secret'), - extractable: extractable || 'false', + type: keyType || (algorithm.name === "GOST R 34.10" ? "private" : "secret"), + extractable: extractable || "false", algorithm: algorithm, usages: keyUsages || [], buffer: keyData @@ -491,30 +541,26 @@ function convertKey(algorithm, extractable, keyUsages, keyData, keyType) { } function convertKeyPair(publicAlgorithm, privateAlgorithm, extractable, keyUsages, publicBuffer, privateBuffer) { - - if (!keyUsages || !keyUsages.indexOf) - throw new SyntaxError('Key usages not defined'); + if (!keyUsages || !keyUsages.indexOf) throw new SyntaxError("Key usages not defined"); var publicUsages = keyUsages.filter(function (value) { - return value !== 'sign'; + return value !== "sign"; }); var privateUsages = keyUsages.filter(function (value) { - return value !== 'verify'; + return value !== "verify"; }); return { - publicKey: convertKey(publicAlgorithm, extractable, publicUsages, publicBuffer, 'public'), - privateKey: convertKey(privateAlgorithm, extractable, privateUsages, privateBuffer, 'private') + publicKey: convertKey(publicAlgorithm, extractable, publicUsages, publicBuffer, "public"), + privateKey: convertKey(privateAlgorithm, extractable, privateUsages, privateBuffer, "private") }; } // Swap bytes in buffer function swapBytes(src) { - if (src instanceof CryptoOperationData) - src = new Uint8Array(src); + if (src instanceof CryptoOperationData) src = new Uint8Array(src); var dst = new Uint8Array(src.length); - for (var i = 0, n = src.length; i < n; i++) - dst[n - i - 1] = src[i]; + for (var i = 0, n = src.length; i < n; i++) dst[n - i - 1] = src[i]; return dst.buffer; } // @@ -537,9 +583,7 @@ function swapBytes(src) { * We can call these functions, once our operation is completed. */ // if (!Promise) { - root.Promise = (function () { - function mswrap(value) { if (value && value.oncomplete === null && value.onerror === null) { return new Promise(function (resolve, reject) { @@ -550,39 +594,41 @@ if (!Promise) { reject(new OperationError(value.toString())); }; }); - } else - return value; + } else return value; } function Promise(executor) { - - var state = 'pending', result, - resolveQueue = [], rejectQueue = []; + var state = "pending", + result, + resolveQueue = [], + rejectQueue = []; function call(callback) { try { callback(); - } catch (e) { - } + } catch (e) {} } try { - executor(function (value) { - if (state === 'pending') { - state = 'fulfilled'; - result = value; - resolveQueue.forEach(call); + executor( + function (value) { + if (state === "pending") { + state = "fulfilled"; + result = value; + resolveQueue.forEach(call); + } + }, + function (reason) { + if (state === "pending") { + state = "rejected"; + result = reason; + rejectQueue.forEach(call); + } } - }, function (reason) { - if (state === 'pending') { - state = 'rejected'; - result = reason; - rejectQueue.forEach(call); - } - }); + ); } catch (error) { - if (state === 'pending') { - state = 'rejected'; + if (state === "pending") { + state = "rejected"; result = error; rejectQueue.forEach(call); } @@ -599,9 +645,7 @@ if (!Promise) { * @returns {Promise} */ this.then = function (onFulfilled, onRejected) { - return new Promise(function (resolve, reject) { - function asyncOnFulfilled() { var value; try { @@ -634,17 +678,15 @@ if (!Promise) { } } - if (state === 'fulfilled') { + if (state === "fulfilled") { asyncOnFulfilled(); - } else if (state === 'rejected') { + } else if (state === "rejected") { asyncOnRejected(); } else { resolveQueue.push(asyncOnFulfilled); rejectQueue.push(asyncOnRejected); } - }); - }; /** * The catch() method returns a Promise and deals with rejected cases only. @@ -656,7 +698,7 @@ if (!Promise) { * @param {function} onRejected A Function called when the Promise is rejected. This function has one argument, the rejection reason. * @returns {Promise} */ - this['catch'] = function (onRejected) { + this["catch"] = function (onRejected) { return this.then(undefined, onRejected); }; } @@ -679,33 +721,29 @@ if (!Promise) { */ Promise.all = function (promises) { return new Promise(function (resolve, reject) { - var result = [], count = 0; + var result = [], + count = 0; function asyncResolve(k) { count++; return function (data) { result[k] = data; count--; - if (count === 0) - resolve(result); + if (count === 0) resolve(result); }; } function asyncReject(reason) { - if (count > 0) - reject(reason); + if (count > 0) reject(reason); count = 0; } for (var i = 0, n = promises.length; i < n; i++) { var data = promises[i]; - if (data?.then?.call) - data.then(asyncResolve(i), asyncReject); - else - result[i] = data; + if (data?.then?.call) data.then(asyncResolve(i), asyncReject); + else result[i] = data; } - if (count === 0) - resolve(result); + if (count === 0) resolve(result); }); }; @@ -714,18 +752,19 @@ if (!Promise) { } // /* - * Worker executor - * - */ // + * Worker executor + * + */ // -var baseUrl = '', nameSuffix = ''; +var baseUrl = "", + nameSuffix = ""; // Try to define from DOM model -if (typeof document !== 'undefined') { +if (typeof document !== "undefined") { (function () { var regs = /^(.*)gostCrypto(.*)\.js$/i; - var list = document.querySelectorAll('script'); + var list = document.querySelectorAll("script"); for (var i = 0, n = list.length; i < n; i++) { - var value = list[i].getAttribute('src'); + var value = list[i].getAttribute("src"); var test = regs.exec(value); if (test) { baseUrl = test[1]; @@ -738,51 +777,46 @@ if (typeof document !== 'undefined') { // Local importScripts procedure for include dependens function importScripts() { for (var i = 0, n = arguments.length; i < n; i++) { - var name = arguments[i].split('.'), - src = baseUrl + name[0] + nameSuffix + '.' + name[1]; + var name = arguments[i].split("."), + src = baseUrl + name[0] + nameSuffix + "." + name[1]; var el = document.querySelector('script[src="' + src + '"]'); if (!el) { - el = document.createElement('script'); - el.setAttribute('src', src); + el = document.createElement("script"); + el.setAttribute("src", src); document.head.appendChild(el); } } } // Create Worker -var worker = false, tasks = [], sequence = 0; +var worker = false, + tasks = [], + sequence = 0; // Worker will create only for first child process and // Gost implementation libraries not yet loaded if (!root.importScripts && !root.gostEngine) { - try { - worker = new Worker(baseUrl + 'gostEngine' + nameSuffix + '.js'); + worker = new Worker(baseUrl + "gostEngine" + nameSuffix + ".js"); // Result of opertion worker.onmessage = function (event) { // Find task var id = event.data.id; - for (var i = 0, n = tasks.length; i < n; i++) - if (tasks[i].id === id) - break; + for (var i = 0, n = tasks.length; i < n; i++) if (tasks[i].id === id) break; if (i < n) { var task = tasks[i]; tasks.splice(i, 1); // Reject if error or resolve with result - if (event.data.error) - task.reject(new OperationError(event.data.error)); - else - task.resolve(event.data.result); + if (event.data.error) task.reject(new OperationError(event.data.error)); + else task.resolve(event.data.result); } }; // Worker error - reject all waiting tasks worker.onerror = function (event) { - for (var i = 0, n = tasks.length; i < n; i++) - tasks[i].reject(event.error); + for (var i = 0, n = tasks.length; i < n; i++) tasks[i].reject(event.error); tasks = []; }; - } catch (e) { // Worker is't supported worker = false; @@ -792,14 +826,13 @@ if (!root.importScripts && !root.gostEngine) { if (!root.importScripts) { // This procedure emulate load dependents as in Worker root.importScripts = importScripts; - } if (!worker) { // Import main module // Reason: we are already in worker process or Worker interface is not // yet supported - root.gostEngine || require('./gostEngine'); + root.gostEngine || require("./gostEngine"); } // Executor for any method @@ -814,14 +847,14 @@ function execute(algorithm, method, args) { reject: reject }); worker.postMessage({ - id: id, algorithm: algorithm, - method: method, args: args + id: id, + algorithm: algorithm, + method: method, + args: args }); } else { - if (root.gostEngine) - resolve(root.gostEngine.execute(algorithm, method, args)); - else - reject(new OperationError('Module gostEngine not found')); + if (root.gostEngine) resolve(root.gostEngine.execute(algorithm, method, args)); + else reject(new OperationError("Module gostEngine not found")); } } catch (error) { reject(error); @@ -833,16 +866,15 @@ function execute(algorithm, method, args) { function call(callback) { try { callback(); - } catch (e) { - } + } catch (e) {} } // /* - * WebCrypto common class references - * - */ // + * WebCrypto common class references + * + */ // /** * The Algorithm object is a dictionary object [WebIDL] which is used to * specify an algorithm and any additional parameters required to fully @@ -995,8 +1027,7 @@ var gostCrypto = {}; * * @class SubtleCrypto */ // -function SubtleCrypto() { -} +function SubtleCrypto() {} /** * The encrypt method returns a new Promise object that will encrypt data @@ -1026,15 +1057,13 @@ function SubtleCrypto() { * @param {CryptoOperationData} data Operation data * @returns {Promise} Promise that resolves with {@link CryptoOperationData} */ -SubtleCrypto.prototype.encrypt = function (algorithm, key, data) // -{ +SubtleCrypto.prototype.encrypt = function (algorithm, key, data) { + // return new Promise(call).then(function () { - if (checkNative(algorithm)) - return rootCrypto.subtle.encrypt(algorithm, key, data); + if (checkNative(algorithm)) return rootCrypto.subtle.encrypt(algorithm, key, data); - algorithm = normalize(algorithm, 'encrypt'); - return execute(algorithm, 'encrypt', - [extractKey('encrypt', algorithm, key), data]); + algorithm = normalize(algorithm, "encrypt"); + return execute(algorithm, "encrypt", [extractKey("encrypt", algorithm, key), data]); }); }; // @@ -1066,15 +1095,13 @@ SubtleCrypto.prototype.encrypt = function (algorithm, key, data) // -{ +SubtleCrypto.prototype.decrypt = function (algorithm, key, data) { + // return new Promise(call).then(function () { - if (checkNative(algorithm)) - return rootCrypto.subtle.decrypt(algorithm, key, data); + if (checkNative(algorithm)) return rootCrypto.subtle.decrypt(algorithm, key, data); - algorithm = normalize(algorithm, 'decrypt'); - return execute(algorithm, 'decrypt', - [extractKey('decrypt', algorithm, key), data]); + algorithm = normalize(algorithm, "decrypt"); + return execute(algorithm, "decrypt", [extractKey("decrypt", algorithm, key), data]); }); }; // @@ -1105,16 +1132,14 @@ SubtleCrypto.prototype.decrypt = function (algorithm, key, data) // -{ +SubtleCrypto.prototype.sign = function (algorithm, key, data) { + // return new Promise(call).then(function () { - if (checkNative(algorithm)) - return rootCrypto.subtle.sign(algorithm, key, data); + if (checkNative(algorithm)) return rootCrypto.subtle.sign(algorithm, key, data); - algorithm = normalize(algorithm, 'sign'); - var value = execute(algorithm, 'sign', - [extractKey('sign', algorithm, key), data]).then(function (data) { - if (algorithm.procreator === 'SC' && algorithm.mode === 'SIGN') { + algorithm = normalize(algorithm, "sign"); + var value = execute(algorithm, "sign", [extractKey("sign", algorithm, key), data]).then(function (data) { + if (algorithm.procreator === "SC" && algorithm.mode === "SIGN") { data = gostCrypto.asn1.GostSignature.encode(data); } return data; @@ -1151,19 +1176,17 @@ SubtleCrypto.prototype.sign = function (algorithm, key, data) // -{ +SubtleCrypto.prototype.verify = function (algorithm, key, signature, data) { + // return new Promise(call).then(function () { - if (checkNative(algorithm)) - return rootCrypto.subtle.verify(algorithm, key, signature, data); + if (checkNative(algorithm)) return rootCrypto.subtle.verify(algorithm, key, signature, data); - algorithm = normalize(algorithm, 'verify'); - if (algorithm.procreator === 'SC' && algorithm.mode === 'SIGN') { + algorithm = normalize(algorithm, "verify"); + if (algorithm.procreator === "SC" && algorithm.mode === "SIGN") { var obj = gostCrypto.asn1.GostSignature.decode(signature); - signature = {r: obj.r, s: obj.s}; + signature = { r: obj.r, s: obj.s }; } - return execute(algorithm, 'verify', - [extractKey('verify', algorithm, key), signature, data]); + return execute(algorithm, "verify", [extractKey("verify", algorithm, key), signature, data]); }); }; // @@ -1187,14 +1210,13 @@ SubtleCrypto.prototype.verify = function (algorithm, key, signature, data) // -{ +SubtleCrypto.prototype.digest = function (algorithm, data) { + // return new Promise(call).then(function () { - if (checkNative(algorithm)) - return rootCrypto.subtle.digest(algorithm, data); + if (checkNative(algorithm)) return rootCrypto.subtle.digest(algorithm, data); - algorithm = normalize(algorithm, 'digest'); - return execute(algorithm, 'digest', [data]); + algorithm = normalize(algorithm, "digest"); + return execute(algorithm, "digest", [data]); }); }; // @@ -1225,28 +1247,29 @@ SubtleCrypto.prototype.digest = function (algorithm, data) // -{ +SubtleCrypto.prototype.generateKey = function (algorithm, extractable, keyUsages) { + // return new Promise(call).then(function () { - if (checkNative(algorithm)) - return rootCrypto.subtle.generateKey(algorithm, extractable, keyUsages); + if (checkNative(algorithm)) return rootCrypto.subtle.generateKey(algorithm, extractable, keyUsages); var privateAlgorithm = algorithm.privateKey, - publicAlgorithm = algorithm.publicKey; - algorithm = normalize(algorithm, 'generateKey'); - if (privateAlgorithm) - privateAlgorithm = normalize(privateAlgorithm, 'generateKey'); - else - privateAlgorithm = algorithm; - if (publicAlgorithm) - publicAlgorithm = normalize(publicAlgorithm, 'generateKey'); - else - publicAlgorithm = algorithm; - return execute(algorithm, 'generateKey', []).then(function (data) { + publicAlgorithm = algorithm.publicKey; + algorithm = normalize(algorithm, "generateKey"); + if (privateAlgorithm) privateAlgorithm = normalize(privateAlgorithm, "generateKey"); + else privateAlgorithm = algorithm; + if (publicAlgorithm) publicAlgorithm = normalize(publicAlgorithm, "generateKey"); + else publicAlgorithm = algorithm; + return execute(algorithm, "generateKey", []).then(function (data) { if (data.publicKey && data.privateKey) - return convertKeyPair(publicAlgorithm, privateAlgorithm, extractable, keyUsages, data.publicKey, data.privateKey); - else - return convertKey(algorithm, extractable, keyUsages, data); + return convertKeyPair( + publicAlgorithm, + privateAlgorithm, + extractable, + keyUsages, + data.publicKey, + data.privateKey + ); + else return convertKey(algorithm, extractable, keyUsages, data); }); }); }; // @@ -1280,22 +1303,20 @@ SubtleCrypto.prototype.generateKey = function (algorithm, extractable, keyUsages * @param {KeyUsages} keyUsages Key usage array: type of operation that may be performed using a key * @returns {Promise} Promise that resolves with {@link Key} */ -SubtleCrypto.prototype.deriveKey = function (algorithm, baseKey, - derivedKeyType, extractable, keyUsages) // -{ +SubtleCrypto.prototype.deriveKey = function (algorithm, baseKey, derivedKeyType, extractable, keyUsages) { + // return new Promise(call).then(function () { if (checkNative(algorithm)) - return rootCrypto.subtle.deriveKey(algorithm, baseKey, - derivedKeyType, extractable, keyUsages); + return rootCrypto.subtle.deriveKey(algorithm, baseKey, derivedKeyType, extractable, keyUsages); - algorithm = normalize(algorithm, 'deriveKey'); - derivedKeyType = normalize(derivedKeyType, 'generateKey'); + algorithm = normalize(algorithm, "deriveKey"); + derivedKeyType = normalize(derivedKeyType, "generateKey"); algorithm.keySize = derivedKeyType.keySize; - if (algorithm['public']) { - algorithm['public'].algorithm = normalize(algorithm['public'].algorithm); - algorithm['public'] = extractKey('deriveKey', algorithm, algorithm['public']); + if (algorithm["public"]) { + algorithm["public"].algorithm = normalize(algorithm["public"].algorithm); + algorithm["public"] = extractKey("deriveKey", algorithm, algorithm["public"]); } - return execute(algorithm, 'deriveKey', [extractKey('deriveKey', algorithm, baseKey)]).then(function (data) { + return execute(algorithm, "deriveKey", [extractKey("deriveKey", algorithm, baseKey)]).then(function (data) { return convertKey(derivedKeyType, extractable, keyUsages, data); }); }); @@ -1326,16 +1347,14 @@ SubtleCrypto.prototype.deriveKey = function (algorithm, baseKey, * @param {number} length Length bits * @returns {Promise} Promise that resolves with {@link CryptoOperationData} */ -SubtleCrypto.prototype.deriveBits = function (algorithm, baseKey, length) // -{ +SubtleCrypto.prototype.deriveBits = function (algorithm, baseKey, length) { + // return new Promise(call).then(function () { - if (checkNative(algorithm)) - return rootCrypto.subtle.deriveBits(algorithm, baseKey, length); + if (checkNative(algorithm)) return rootCrypto.subtle.deriveBits(algorithm, baseKey, length); - algorithm = normalize(algorithm, 'deriveBits'); - if (algorithm['public']) - algorithm['public'] = extractKey('deriveBits', algorithm, algorithm['public']); - return execute(algorithm, 'deriveBits', [extractKey('deriveBits', algorithm, baseKey), length]); + algorithm = normalize(algorithm, "deriveBits"); + if (algorithm["public"]) algorithm["public"] = extractKey("deriveBits", algorithm, algorithm["public"]); + return execute(algorithm, "deriveBits", [extractKey("deriveBits", algorithm, baseKey), length]); }); }; // @@ -1375,74 +1394,69 @@ SubtleCrypto.prototype.deriveBits = function (algorithm, baseKey, length) // -{ +SubtleCrypto.prototype.importKey = function (format, keyData, algorithm, extractable, keyUsages) { + // var type; - return new Promise(call).then(function () { - if (checkNative(algorithm)) - return rootCrypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages); + return new Promise(call) + .then(function () { + if (checkNative(algorithm)) + return rootCrypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages); - if (format === 'raw') { - algorithm = normalize(algorithm, 'importKey'); - if (keyUsages && keyUsages.indexOf) { - var name = algorithm.name.toUpperCase().replace(/[\.\s]/g, ''); - if (name.indexOf('3410') >= 0 && keyUsages.indexOf('sign') >= 0) - type = 'private'; - else if (name.indexOf('3410') >= 0 && keyUsages.indexOf('verify') >= 0) - type = 'public'; - } - return keyData; - } else { - var key; - if (format === 'pkcs8') - key = gostCrypto.asn1.GostPrivateKeyInfo.decode(keyData).object; - else if (format === 'spki') - key = gostCrypto.asn1.GostSubjectPublicKeyInfo.decode(keyData).object; - else - throw new NotSupportedError('Key format not supported'); + if (format === "raw") { + algorithm = normalize(algorithm, "importKey"); + if (keyUsages && keyUsages.indexOf) { + var name = algorithm.name.toUpperCase().replace(/[\.\s]/g, ""); + if (name.indexOf("3410") >= 0 && keyUsages.indexOf("sign") >= 0) type = "private"; + else if (name.indexOf("3410") >= 0 && keyUsages.indexOf("verify") >= 0) type = "public"; + } + return keyData; + } else { + var key; + if (format === "pkcs8") key = gostCrypto.asn1.GostPrivateKeyInfo.decode(keyData).object; + else if (format === "spki") key = gostCrypto.asn1.GostSubjectPublicKeyInfo.decode(keyData).object; + else throw new NotSupportedError("Key format not supported"); - algorithm = normalize(key.algorithm, 'importKey'); - type = key.type; - if (extractable !== false) - extractable = extractable || key.extractable; - if (keyUsages) { - for (var i = 0; i < keyUsages.length; i++) { - if (key.usages.indexOf(keyUsages[i]) < 0) - throw DataError('Key usage not valid for this key'); + algorithm = normalize(key.algorithm, "importKey"); + type = key.type; + if (extractable !== false) extractable = extractable || key.extractable; + if (keyUsages) { + for (var i = 0; i < keyUsages.length; i++) { + if (key.usages.indexOf(keyUsages[i]) < 0) throw DataError("Key usage not valid for this key"); + } + } else keyUsages = key.usages; + var data = key.buffer, + keySize = algorithm.keySize, + dataLen = data.byteLength; + if (type === "public" || keySize === dataLen) return data; + else { + // Remove private key masks + if (dataLen % keySize > 0) throw new DataError("Invalid key size"); + algorithm.mode = "MASK"; + algorithm.procreator = "VN"; + var chain = []; + for (var i = keySize; i < dataLen; i += keySize) { + chain.push( + (function (mask) { + return function (data) { + return execute(algorithm, "unwrapKey", [mask, data]).then(function (data) { + var next = chain.pop(); + if (next) return next(data); + else { + delete algorithm.mode; + return data; + } + }); + }; + })(new Uint8Array(data, i, keySize)) + ); + } + return chain.pop()(new Uint8Array(data, 0, keySize)); } - } else - keyUsages = key.usages; - var data = key.buffer, keySize = algorithm.keySize, dataLen = data.byteLength; - if (type === 'public' || keySize === dataLen) - return data; - else { - // Remove private key masks - if (dataLen % keySize > 0) - throw new DataError('Invalid key size'); - algorithm.mode = 'MASK'; - algorithm.procreator = 'VN'; - var chain = []; - for (var i = keySize; i < dataLen; i += keySize) { - chain.push((function (mask) { - return function (data) { - return execute(algorithm, 'unwrapKey', [mask, data]).then(function (data) { - var next = chain.pop(); - if (next) - return next(data); - else { - delete algorithm.mode; - return data; - } - }); - }; - })(new Uint8Array(data, i, keySize))); - } - return chain.pop()(new Uint8Array(data, 0, keySize)); } - } - }).then(function (data) { - return convertKey(algorithm, extractable, keyUsages, data, type); - }); + }) + .then(function (data) { + return convertKey(algorithm, extractable, keyUsages, data, type); + }); }; // /** @@ -1480,44 +1494,41 @@ SubtleCrypto.prototype.importKey = function (format, keyData, algorithm, extract * @param {Key} key Key object * @returns {Promise} Promise that resolves with {@link CryptoOperationData} */ -SubtleCrypto.prototype.exportKey = function (format, key) // -{ +SubtleCrypto.prototype.exportKey = function (format, key) { + // return new Promise(call).then(function () { - if (key && checkNative(key.algorithm)) - return rootCrypto.subtle.exportKey(format, key); + if (key && checkNative(key.algorithm)) return rootCrypto.subtle.exportKey(format, key); - if (!key.extractable) - throw new InvalidAccessError('Key not extractable'); + if (!key.extractable) throw new InvalidAccessError("Key not extractable"); var raw = extractKey(null, null, key); - if (format === 'raw') - return raw; - else if (format === 'pkcs8' && key?.algorithm?.id) { - if (key.algorithm.procreator === 'VN') { + if (format === "raw") return raw; + else if (format === "pkcs8" && key?.algorithm?.id) { + if (key.algorithm.procreator === "VN") { // Add masks for ViPNet - var algorithm = key.algorithm, mask; - algorithm.mode = 'MASK'; - return execute(algorithm, 'generateKey').then(function (data) { - mask = data; - return execute(algorithm, 'wrapKey', [mask, key.buffer]); - }).then(function (data) { - delete algorithm.mode; - var d = new Uint8Array(data.byteLength + mask.byteLength); - d.set(new Uint8Array(data, 0, data.byteLength)); - d.set(new Uint8Array(mask, 0, mask.byteLength), data.byteLength); - var buffer = d.buffer; - buffer.enclosed = true; - return gostCrypto.asn1.GostPrivateKeyInfo.encode({ - algorithm: algorithm, - buffer: buffer + var algorithm = key.algorithm, + mask; + algorithm.mode = "MASK"; + return execute(algorithm, "generateKey") + .then(function (data) { + mask = data; + return execute(algorithm, "wrapKey", [mask, key.buffer]); + }) + .then(function (data) { + delete algorithm.mode; + var d = new Uint8Array(data.byteLength + mask.byteLength); + d.set(new Uint8Array(data, 0, data.byteLength)); + d.set(new Uint8Array(mask, 0, mask.byteLength), data.byteLength); + var buffer = d.buffer; + buffer.enclosed = true; + return gostCrypto.asn1.GostPrivateKeyInfo.encode({ + algorithm: algorithm, + buffer: buffer + }); }); - }); - } else - return gostCrypto.asn1.GostPrivateKeyInfo.encode(key); - } else if (format === 'spki' && key?.algorithm?.id) - return gostCrypto.asn1.GostSubjectPublicKeyInfo.encode(key); - else - throw new NotSupportedError('Key format not supported'); + } else return gostCrypto.asn1.GostPrivateKeyInfo.encode(key); + } else if (format === "spki" && key?.algorithm?.id) return gostCrypto.asn1.GostSubjectPublicKeyInfo.encode(key); + else throw new NotSupportedError("Key format not supported"); }); }; // @@ -1544,23 +1555,20 @@ SubtleCrypto.prototype.exportKey = function (format, key) // -{ +SubtleCrypto.prototype.wrapKey = function (format, key, wrappingKey, wrapAlgorithm) { + // return new Promise(call).then(function () { - if (checkNative(wrapAlgorithm)) - return rootCrypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm); + if (checkNative(wrapAlgorithm)) return rootCrypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm); - wrapAlgorithm = normalize(wrapAlgorithm, 'wrapKey'); + wrapAlgorithm = normalize(wrapAlgorithm, "wrapKey"); var keyData = extractKey(null, null, key); - if (wrapAlgorithm.procreator === 'SC' && key.type === 'private') - keyData = swapBytes(keyData); - return execute(wrapAlgorithm, 'wrapKey', - [extractKey('wrapKey', wrapAlgorithm, wrappingKey), keyData]).then(function (data) { - if (format === 'raw') - return data; - else - throw new NotSupportedError('Key format not supported'); - }); + if (wrapAlgorithm.procreator === "SC" && key.type === "private") keyData = swapBytes(keyData); + return execute(wrapAlgorithm, "wrapKey", [extractKey("wrapKey", wrapAlgorithm, wrappingKey), keyData]).then( + function (data) { + if (format === "raw") return data; + else throw new NotSupportedError("Key format not supported"); + } + ); }); }; // @@ -1590,30 +1598,43 @@ SubtleCrypto.prototype.wrapKey = function (format, key, wrappingKey, wrapAlgorit * @param {KeyUsages} keyUsages Key usage array: type of operation that may be performed using a key * @returns {Promise} Promise that resolves with {@link Key} */ -SubtleCrypto.prototype.unwrapKey = function (format, wrappedKey, unwrappingKey, - unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages) // -{ +SubtleCrypto.prototype.unwrapKey = function ( + format, + wrappedKey, + unwrappingKey, + unwrapAlgorithm, + unwrappedKeyAlgorithm, + extractable, + keyUsages +) { + // return new Promise(call).then(function () { if (checkNative(unwrapAlgorithm)) - return rootCrypto.subtle.unwrapKey(format, wrappedKey, unwrappingKey, - unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages); + return rootCrypto.subtle.unwrapKey( + format, + wrappedKey, + unwrappingKey, + unwrapAlgorithm, + unwrappedKeyAlgorithm, + extractable, + keyUsages + ); - unwrapAlgorithm = normalize(unwrapAlgorithm, 'unwrapKey'); - unwrappedKeyAlgorithm = normalize(unwrappedKeyAlgorithm, 'importKey'); - if (format !== 'raw') - throw new NotSupportedError('Key format not supported'); + unwrapAlgorithm = normalize(unwrapAlgorithm, "unwrapKey"); + unwrappedKeyAlgorithm = normalize(unwrappedKeyAlgorithm, "importKey"); + if (format !== "raw") throw new NotSupportedError("Key format not supported"); - return execute(unwrapAlgorithm, 'unwrapKey', [extractKey('unwrapKey', unwrapAlgorithm, unwrappingKey), wrappedKey]).then(function (data) { + return execute(unwrapAlgorithm, "unwrapKey", [ + extractKey("unwrapKey", unwrapAlgorithm, unwrappingKey), + wrappedKey + ]).then(function (data) { var type; if (unwrappedKeyAlgorithm && unwrappedKeyAlgorithm.name) { - var name = unwrappedKeyAlgorithm.name.toUpperCase().replace(/[\.\s]/g, ''); - if (name.indexOf('3410') >= 0 && keyUsages.indexOf('sign') >= 0) - type = 'private'; - else if (name.indexOf('3410') >= 0 && keyUsages.indexOf('verify') >= 0) - type = 'public'; + var name = unwrappedKeyAlgorithm.name.toUpperCase().replace(/[\.\s]/g, ""); + if (name.indexOf("3410") >= 0 && keyUsages.indexOf("sign") >= 0) type = "private"; + else if (name.indexOf("3410") >= 0 && keyUsages.indexOf("verify") >= 0) type = "public"; } - if (unwrapAlgorithm.procreator === 'SC' && type === 'private') - data = swapBytes(data); + if (unwrapAlgorithm.procreator === "SC" && type === "private") data = swapBytes(data); return convertKey(unwrappedKeyAlgorithm, extractable, keyUsages, data, type); }); }); @@ -1638,15 +1659,13 @@ gostCrypto.subtle = new SubtleCrypto(); * @memberOf gostCrypto * @param {(CryptoOperationData)} array Destination buffer for random data */ -gostCrypto.getRandomValues = function (array) // -{ +gostCrypto.getRandomValues = function (array) { + // // Execute randomizer GostRandom = GostRandom || root.GostRandom; var randomSource = GostRandom ? new GostRandom() : rootCrypto; - if (randomSource.getRandomValues) - randomSource.getRandomValues(array); - else - throw new NotSupportedError('Random generator not found'); + if (randomSource.getRandomValues) randomSource.getRandomValues(array); + else throw new NotSupportedError("Random generator not found"); }; // // diff --git a/src/core/vendor/gost/gostDigest.mjs b/src/core/vendor/gost/gostDigest.mjs index 4d5a04e1..b453a76e 100644 --- a/src/core/vendor/gost/gostDigest.mjs +++ b/src/core/vendor/gost/gostDigest.mjs @@ -36,34 +36,32 @@ * */ - import GostRandom from './gostRandom.mjs'; - import GostCipher from './gostCipher.mjs'; - import crypto from 'crypto'; +import GostRandom from "./gostRandom.mjs"; +import GostCipher from "./gostCipher.mjs"; +import crypto from "crypto"; /* - * GOST R 34.11 - * Common methods - * - */ // + * GOST R 34.11 + * Common methods + * + */ // var root = {}; -var rootCrypto = crypto +var rootCrypto = crypto; var DataError = Error, - NotSupportedError = Error; + NotSupportedError = Error; // Copy len values from s[sOfs] to d[dOfs] function arraycopy(s, sOfs, d, dOfs, len) { - for (var i = 0; i < len; i++) - d[dOfs + i] = s[sOfs + i]; + for (var i = 0; i < len; i++) d[dOfs + i] = s[sOfs + i]; } // Swap bytes in buffer function swap(s) { var src = new Uint8Array(s), - dst = new Uint8Array(src.length); - for (var i = 0, n = src.length; i < n; i++) - dst[n - i - 1] = src[i]; + dst = new Uint8Array(src.length); + for (var i = 0, n = src.length; i < n; i++) dst[n - i - 1] = src[i]; return dst.buffer; } @@ -72,26 +70,32 @@ function swap(s) { function b64decode(s) { // s = s.replace(/[^A-Za-z0-9\+\/]/g, ''); var n = s.length, - k = n * 3 + 1 >> 2, r = new Uint8Array(k); + k = (n * 3 + 1) >> 2, + r = new Uint8Array(k); for (var m3, m4, u24 = 0, j = 0, i = 0; i < n; i++) { m4 = i & 3; var c = s.charCodeAt(i); - c = c > 64 && c < 91 ? - c - 65 : c > 96 && c < 123 ? - c - 71 : c > 47 && c < 58 ? - c + 4 : c === 43 ? - 62 : c === 47 ? - 63 : 0; + c = + c > 64 && c < 91 + ? c - 65 + : c > 96 && c < 123 + ? c - 71 + : c > 47 && c < 58 + ? c + 4 + : c === 43 + ? 62 + : c === 47 + ? 63 + : 0; - u24 |= c << 18 - 6 * m4; + u24 |= c << (18 - 6 * m4); if (m4 === 3 || n - i === 1) { for (m3 = 0; m3 < 3 && j < k; m3++, j++) { - r[j] = u24 >>> (16 >>> m3 & 24) & 255; + r[j] = (u24 >>> ((16 >>> m3) & 24)) & 255; } u24 = 0; - } } return r.buffer; @@ -100,24 +104,22 @@ function b64decode(s) { // Random seed function getSeed(length) { GostRandom = GostRandom || root.GostRandom; - var randomSource = GostRandom ? new (GostRandom || root.GostRandom) : rootCrypto; + var randomSource = GostRandom ? new (GostRandom || root.GostRandom)() : rootCrypto; if (randomSource.getRandomValues) { var d = new Uint8Array(Math.ceil(length / 8)); randomSource.getRandomValues(d); return d; - } else - throw new NotSupportedError('Random generator not found'); + } else throw new NotSupportedError("Random generator not found"); } // Check buffer function buffer(d) { - if (d instanceof ArrayBuffer) - return d; + if (d instanceof ArrayBuffer) return d; else if (d && d?.buffer instanceof ArrayBuffer) - return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength ? - d.buffer : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; - else - throw new DataError('ArrayBuffer or ArrayBufferView required'); + return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength + ? d.buffer + : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; + else throw new DataError("ArrayBuffer or ArrayBufferView required"); } // /** @@ -138,8 +140,8 @@ function buffer(d) { * @param {(ArrayBuffer|TypedArray)} data Data * @returns {ArrayBuffer} Digest of data */ -var digest2012 = (function () // -{ +var digest2012 = (function () { + // // Constants var buffer0 = new Int32Array(16); // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; @@ -149,54 +151,55 @@ var digest2012 = (function () // // Constant C var C = (function (s) { var h = new Int32Array(b64decode(s)), - r = new Array(12); - for (var i = 0; i < 12; i++) - r[i] = new Int32Array(h.buffer, i * 64, 16); + r = new Array(12); + for (var i = 0; i < 12; i++) r[i] = new Int32Array(h.buffer, i * 64, 16); return r; })( - 'B0Wm8lllgN0jTXTMNnR2BRXTYKQIKkKiAWlnkpHgfEv8xIV1jbhOcRbQRS5DdmovH3xlwIEvy+vp2soe2lsIsbebsSFwBHnmVs3L1xui3VXKpwrbwmG1XFiZ1hJrF7WaMQG1Fg9e1WGYKyMKcur+89e1cA9GneNPGi+dqYq1o2+yCroK9ZYemTHbeoZD9LbCCdtiYDc6ycGxnjWQ5A/i03t7KbEUderyix+cUl9e8QY1hD1qKPw5Cscvzius3HT1LtHjhLy+DCLxN+iToepTNL4DUpMzE7fYddYD7YIs16k/NV5orRxynX08XDN+hY5I3eRxXaDhSPnSZhXos98f71f+bHz9WBdg9WPqqX6iVnoWGicjtwD/36P1OiVHF82/vf8PgNc1njVKEIYWHxwVf2MjqWwMQT+amUdHraxr6ktufWRGekBo+jVPkDZyxXG/tsa+wmYf8gq0t5oct6b6z8aO8Jq0mn8YbKRCUfnEZi3AOTB6O8Okb9nTOh2urk+uk9QUOk1WhojzSjyiTEUXNQQFSiiDaUcGNyyCLcWrkgnJk3oZMz5H08mHv+bHxp45VAkkv/6GrFHsxaruFg7H9B7nAr/UDX+k' + - '2ahRWTXCrDYvxKXRK43RaZAGm5LLK4n0msTbTTtEtIke3jaccfi3TkFBbgwCqucDp8mTTUJbH5vbWiODUURhcmAqH8uS3DgOVJwHppqKK3uxzrLbC0QKgIQJDeC3Vdk8JEKJJRs6fTreXxbs2JpMlJsiMRZUWo837ZxFmPvHtHTDtjsV0fqYNvRSdjswbB56SzNprwJn558DYTMbiuH/H9t4iv8c50GJ8/PkskjlKjhSbwWApt6+qxst84HNpMprXdhvwEpZot6Ybkd9Hc2678q5SOrvcR2KeWaEFCGAASBhB6vru2v62JT+WmPNxgIw+4nI79CezXsg1xvxSpK8SJkbstnVF/T6UijhiKqkHeeGzJEYne+AXZufITDUEiD4dx3fvDI8pM16sUkEsIAT0roxFvFn5443'); + "B0Wm8lllgN0jTXTMNnR2BRXTYKQIKkKiAWlnkpHgfEv8xIV1jbhOcRbQRS5DdmovH3xlwIEvy+vp2soe2lsIsbebsSFwBHnmVs3L1xui3VXKpwrbwmG1XFiZ1hJrF7WaMQG1Fg9e1WGYKyMKcur+89e1cA9GneNPGi+dqYq1o2+yCroK9ZYemTHbeoZD9LbCCdtiYDc6ycGxnjWQ5A/i03t7KbEUderyix+cUl9e8QY1hD1qKPw5Cscvzius3HT1LtHjhLy+DCLxN+iToepTNL4DUpMzE7fYddYD7YIs16k/NV5orRxynX08XDN+hY5I3eRxXaDhSPnSZhXos98f71f+bHz9WBdg9WPqqX6iVnoWGicjtwD/36P1OiVHF82/vf8PgNc1njVKEIYWHxwVf2MjqWwMQT+amUdHraxr6ktufWRGekBo+jVPkDZyxXG/tsa+wmYf8gq0t5oct6b6z8aO8Jq0mn8YbKRCUfnEZi3AOTB6O8Okb9nTOh2urk+uk9QUOk1WhojzSjyiTEUXNQQFSiiDaUcGNyyCLcWrkgnJk3oZMz5H08mHv+bHxp45VAkkv/6GrFHsxaruFg7H9B7nAr/UDX+k" + + "2ahRWTXCrDYvxKXRK43RaZAGm5LLK4n0msTbTTtEtIke3jaccfi3TkFBbgwCqucDp8mTTUJbH5vbWiODUURhcmAqH8uS3DgOVJwHppqKK3uxzrLbC0QKgIQJDeC3Vdk8JEKJJRs6fTreXxbs2JpMlJsiMRZUWo837ZxFmPvHtHTDtjsV0fqYNvRSdjswbB56SzNprwJn558DYTMbiuH/H9t4iv8c50GJ8/PkskjlKjhSbwWApt6+qxst84HNpMprXdhvwEpZot6Ybkd9Hc2678q5SOrvcR2KeWaEFCGAASBhB6vru2v62JT+WmPNxgIw+4nI79CezXsg1xvxSpK8SJkbstnVF/T6UijhiKqkHeeGzJEYne+AXZufITDUEiD4dx3fvDI8pM16sUkEsIAT0roxFvFn5443" + ); // Precalc Ax var Ax = (function (s) { return new Int32Array(b64decode(s)); })( - '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'); //== + "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" + ); //== // Variables var sigma, N, h; @@ -208,12 +211,14 @@ var digest2012 = (function () // // 512bit tools function add512(x, y) { - var CF = 0, w0, w1; + var CF = 0, + w0, + w1; for (var i = 0; i < 16; i++) { w0 = (x[i] & 0xffff) + (y[i] & 0xffff) + (CF || 0); w1 = (x[i] >>> 16) + (y[i] >>> 16) + (w0 >>> 16); x[i] = (w0 & 0xffff) | (w1 << 16); - CF = (w1 >>> 16); + CF = w1 >>> 16; } } @@ -221,10 +226,8 @@ var digest2012 = (function () // return new Int32Array(d.buffer, d.byteOffset, 16); } - function copy512(r, d) { - for (var i = 0; i < 16; i++) - r[i] = d[i]; + for (var i = 0; i < 16; i++) r[i] = d[i]; } function new512() { @@ -233,17 +236,17 @@ var digest2012 = (function () // // Core private algorithms function xor512(x, y) { - for (var i = 0; i < 16; i++) - x[i] = x[i] ^ y[i]; + for (var i = 0; i < 16; i++) x[i] = x[i] ^ y[i]; } - var r = new512(); function XLPS(x, y) { copy512(r, x); xor512(r, y); for (var i = 0; i < 8; i++) { - var z0, z1, k = get8(r, i) << 1; + var z0, + z1, + k = get8(r, i) << 1; z0 = Ax[k]; z1 = Ax[k + 1]; for (var j = 1; j < 8; j++) { @@ -256,9 +259,9 @@ var digest2012 = (function () // } } - var data = new512(), Ki = new512(); - function g(h, N, m) - { + var data = new512(), + Ki = new512(); + function g(h, N, m) { var i; copy512(data, h); @@ -292,18 +295,17 @@ var digest2012 = (function () // function stage3(d) { var n = d.length; - if (n > 63) - return; + if (n > 63) return; var b0 = new Int32Array(16); b0[0] = n << 3; var b = new Uint8Array(64); - for (var i = 0; i < n; i++) - b[i] = d[i]; + for (var i = 0; i < n; i++) b[i] = d[i]; b[n] = 0x01; - var m = get512(b), m0 = get512(b0); + var m = get512(b), + m0 = get512(b0); g(h, N, m); add512(N, m0); @@ -314,46 +316,38 @@ var digest2012 = (function () // } return function (data) { - // Cleanup sigma = new512(); N = new512(); // Initial vector h = new512(); - for (var i = 0; i < 16; i++) - if (this.bitLength === 256) - h[i] = 0x01010101; + for (var i = 0; i < 16; i++) if (this.bitLength === 256) h[i] = 0x01010101; // Make data var d = new Uint8Array(buffer(data)); var n = d.length; - var r = n % 64, q = (n - r) / 64; + var r = n % 64, + q = (n - r) / 64; - for (var i = 0; i < q; i++) - stage2.call(this, new Uint8Array(d.buffer, i * 64, 64)); + for (var i = 0; i < q; i++) stage2.call(this, new Uint8Array(d.buffer, i * 64, 64)); stage3.call(this, new Uint8Array(d.buffer, q * 64, r)); var digest; if (this.bitLength === 256) { digest = new Int32Array(8); - for (var i = 0; i < 8; i++) - digest[i] = h[8 + i]; + for (var i = 0; i < 8; i++) digest[i] = h[8 + i]; } else { digest = new Int32Array(16); - for (var i = 0; i < 16; i++) - digest[i] = h[i]; + for (var i = 0; i < 16; i++) digest[i] = h[i]; } // Swap hash for SignalCom - if (this.procreator === 'SC' || this.procreator === 'VN') - return swap(digest.buffer); - else - return digest.buffer; + if (this.procreator === "SC" || this.procreator === "VN") return swap(digest.buffer); + else return digest.buffer; }; -} // -)(); +})(); // /** * Algorithm name GOST R 34.11-94

    @@ -367,8 +361,8 @@ var digest2012 = (function () // * @param {(ArrayBuffer|TypedArray)} data Data * @returns {ArrayBuffer} Digest of data */ -var digest94 = (function () // -{ +var digest94 = (function () { + // var C, H, M, Sum; // (i + 1 + 4(k - 1)) = 8i + k i = 0-3, k = 1-8 @@ -377,7 +371,7 @@ var digest94 = (function () // for (var k = 0; k < 8; k++) { K[4 * k] = d[k]; - K[1 + 4 * k] = d[ 8 + k]; + K[1 + 4 * k] = d[8 + k]; K[2 + 4 * k] = d[16 + k]; K[3 + 4 * k] = d[24 + k]; } @@ -386,13 +380,11 @@ var digest94 = (function () // } //A (x) = (x0 ^ x1) || x3 || x2 || x1 - function A(d) - { + function A(d) { var a = new Uint8Array(8); - for (var j = 0; j < 8; j++) - { - a[j] = (d[j] ^ d[j + 8]); + for (var j = 0; j < 8; j++) { + a[j] = d[j] ^ d[j + 8]; } arraycopy(d, 8, d, 0, 24); @@ -419,8 +411,10 @@ var digest94 = (function () // // block processing function process(d, dOff) { - var S = new Uint8Array(32), U = new Uint8Array(32), - V = new Uint8Array(32), W = new Uint8Array(32); + var S = new Uint8Array(32), + U = new Uint8Array(32), + V = new Uint8Array(32), + W = new Uint8Array(32); arraycopy(d, dOff, M, 0, 32); @@ -430,9 +424,8 @@ var digest94 = (function () // // S = s3 || s2 || s1 || s0 arraycopy(H, 0, U, 0, 32); arraycopy(M, 0, V, 0, 32); - for (var j = 0; j < 32; j++) - { - W[j] = (U[j] ^ V[j]); + for (var j = 0; j < 32; j++) { + W[j] = U[j] ^ V[j]; } // Encrypt GOST 28147-ECB encrypt.call(this, P(W), S, 0, H, 0); // s0 = EK0 [h0] @@ -441,11 +434,11 @@ var digest94 = (function () // for (var i = 1; i < 4; i++) { var tmpA = A(U); for (var j = 0; j < 32; j++) { - U[j] = (tmpA[j] ^ C[i][j]); + U[j] = tmpA[j] ^ C[i][j]; } V = A(A(V)); for (var j = 0; j < 32; j++) { - W[j] = (U[j] ^ V[j]); + W[j] = U[j] ^ V[j]; } // Encrypt GOST 28147-ECB encrypt.call(this, P(W), S, i * 8, H, i * 8); // si = EKi [hi] @@ -456,13 +449,13 @@ var digest94 = (function () // fw(S); } for (var n = 0; n < 32; n++) { - S[n] = (S[n] ^ M[n]); + S[n] = S[n] ^ M[n]; } fw(S); for (var n = 0; n < 32; n++) { - S[n] = (H[n] ^ S[n]); + S[n] = H[n] ^ S[n]; } for (var n = 0; n < 61; n++) { fw(S); @@ -470,13 +463,10 @@ var digest94 = (function () // arraycopy(S, 0, H, 0, H.length); } - // 256 bitsblock modul -> (Sum + a mod (2^256)) - function summing(d) - { + function summing(d) { var carry = 0; - for (var i = 0; i < Sum.length; i++) - { + for (var i = 0; i < Sum.length; i++) { var sum = (Sum[i] & 0xff) + (d[i] & 0xff) + carry; Sum[i] = sum; @@ -487,14 +477,11 @@ var digest94 = (function () // // reset the chaining variables to the IV values. var C2 = new Uint8Array([ - 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, - 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, - 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff ]); return function (data) { - // Reset buffers H = new Uint8Array(32); M = new Uint8Array(32); @@ -502,15 +489,15 @@ var digest94 = (function () // // Reset IV value C = new Array(4); - for (var i = 0; i < 4; i++) - C[i] = new Uint8Array(32); + for (var i = 0; i < 4; i++) C[i] = new Uint8Array(32); arraycopy(C2, 0, C[2], 0, C2.length); // Make data var d = new Uint8Array(buffer(data)); var n = d.length; - var r = n % 32, q = (n - r) / 32; + var r = n % 32, + q = (n - r) / 32; // Proccess full blocks for (var i = 0; i < q; i++) { @@ -523,15 +510,16 @@ var digest94 = (function () // // load d the remadder with padding zero; if (r > 0) { var b = new Uint8Array(d.buffer, q * 32), - c = new Uint8Array(32); + c = new Uint8Array(32); arraycopy(b, 0, c, 0, r); summing.call(this, c); // calc sum M process.call(this, c, 0); - } // get length into L (byteCount * 8 = bitCount) in little endian. - var L = new Uint8Array(32), n8 = n * 8, k = 0; + var L = new Uint8Array(32), + n8 = n * 8, + k = 0; while (n8 > 0) { L[k++] = n8 & 0xff; n8 = Math.floor(n8 / 256); @@ -542,14 +530,11 @@ var digest94 = (function () // var h = H.buffer; // Swap hash for SignalCom - if (this.procreator === 'SC') - h = swap(h); + if (this.procreator === "SC") h = swap(h); return h; }; - -} // -)(); +})(); // /** * Algorithm name SHA-1

    @@ -564,49 +549,47 @@ var digest94 = (function () // * @param {(ArrayBuffer|TypedArray)} data Data * @returns {ArrayBuffer} Digest of data */ -var digestSHA1 = (function () // -{ - +var digestSHA1 = (function () { + // // Create a buffer for each 80 word block. - var state, block = new Uint32Array(80); + var state, + block = new Uint32Array(80); function common(a, e, w, k, f) { return (f + e + w + k + ((a << 5) | (a >>> 27))) >>> 0; } function f1(a, b, c, d, e, w) { - return common(a, e, w, 0x5A827999, d ^ (b & (c ^ d))); + return common(a, e, w, 0x5a827999, d ^ (b & (c ^ d))); } function f2(a, b, c, d, e, w) { - return common(a, e, w, 0x6ED9EBA1, b ^ c ^ d); + return common(a, e, w, 0x6ed9eba1, b ^ c ^ d); } function f3(a, b, c, d, e, w) { - return common(a, e, w, 0x8F1BBCDC, (b & c) | (d & (b | c))); + return common(a, e, w, 0x8f1bbcdc, (b & c) | (d & (b | c))); } function f4(a, b, c, d, e, w) { - return common(a, e, w, 0xCA62C1D6, b ^ c ^ d); + return common(a, e, w, 0xca62c1d6, b ^ c ^ d); } function cycle(state, block) { var a = state[0], - b = state[1], - c = state[2], - d = state[3], - e = state[4]; + b = state[1], + c = state[2], + d = state[3], + e = state[4]; // Partially unroll loops so we don't have to shift variables. var fn = f1; for (var i = 0; i < 80; i += 5) { if (i === 20) { fn = f2; - } - else if (i === 40) { + } else if (i === 40) { fn = f3; - } - else if (i === 60) { + } else if (i === 60) { fn = f4; } e = fn(a, b, c, d, e, block[i]); @@ -629,15 +612,13 @@ var digestSHA1 = (function () // // Swap bytes for 32bits word function swap32(b) { - return ((b & 0xff) << 24) - | ((b & 0xff00) << 8) - | ((b >> 8) & 0xff00) - | ((b >> 24) & 0xff); + return ((b & 0xff) << 24) | ((b & 0xff00) << 8) | ((b >> 8) & 0xff00) | ((b >> 24) & 0xff); } // input is a Uint8Array bitstream of the data return function (data) { - var d = new Uint8Array(buffer(data)), dlen = d.length; + var d = new Uint8Array(buffer(data)), + dlen = d.length; // Pad the input string length. var len = dlen + 9; @@ -653,30 +634,26 @@ var digestSHA1 = (function () // state[4] = 0xc3d2e1f0; for (var ofs = 0; ofs < len; ofs += 64) { - // Copy input to block and write padding as needed for (var i = 0; i < 64; i++) { var b = 0, - o = ofs + i; + o = ofs + i; if (o < dlen) { b = d[o]; - } - else if (o === dlen) { + } else if (o === dlen) { b = 0x80; - } - else { + } else { // Write original bit length as a 64bit big-endian integer to the end. var x = len - o - 1; if (x >= 0 && x < 4) { - b = (dlen << 3 >>> (x * 8)) & 0xff; + b = ((dlen << 3) >>> (x * 8)) & 0xff; } } // Interpret the input bytes as big-endian per the spec if (i % 4 === 0) { block[i >> 2] = b << 24; - } - else { + } else { block[i >> 2] |= b << ((3 - (i % 4)) * 8); } } @@ -688,17 +665,13 @@ var digestSHA1 = (function () // } cycle(state, block); - } // Swap the bytes around since they are big endian internally - for (var i = 0; i < 5; i++) - state[i] = swap32(state[i]); + for (var i = 0; i < 5; i++) state[i] = swap32(state[i]); return state.buffer; }; - -} // -)(); +})(); // /** * Algorithm name GOST R 34.11-HMAC

    @@ -710,17 +683,17 @@ var digestSHA1 = (function () // * @param {ArrayBuffer} key The key for HMAC. * @param {Hash} data Data */ -function signHMAC(key, data) // -{ +function signHMAC(key, data) { + // // GOST R 34.11-94 - B=32b, L=32b // GOST R 34.11-256 - B=64b, L=32b // GOST R 34.11-512 - B=64b, L=64b - var b = (this.digest === digest94) ? 32 : 64, - l = this.bitLength / 8, - k = buffer(key), - d = buffer(data), k0; - if (k.byteLength === b) - k0 = new Uint8Array(k); + var b = this.digest === digest94 ? 32 : 64, + l = this.bitLength / 8, + k = buffer(key), + d = buffer(data), + k0; + if (k.byteLength === b) k0 = new Uint8Array(k); else { var k0 = new Uint8Array(b); if (k.byteLength > b) { @@ -730,10 +703,10 @@ function signHMAC(key, data) // } } var s0 = new Uint8Array(b + d.byteLength), - s1 = new Uint8Array(b + l); + s1 = new Uint8Array(b + l); for (var i = 0; i < b; i++) { s0[i] = k0[i] ^ 0x36; - s1[i] = k0[i] ^ 0x5C; + s1[i] = k0[i] ^ 0x5c; } s0.set(new Uint8Array(d), b); s1.set(new Uint8Array(this.digest(s0)), b); @@ -753,19 +726,15 @@ function signHMAC(key, data) // * @param {(ArrayBuffer|TypedArray)} data Data * @returns {boolean} HMAC verified = true */ -function verifyHMAC(key, signature, data) // -{ +function verifyHMAC(key, signature, data) { + // var hmac = new Uint8Array(this.sign(key, data)), - test = new Uint8Array(signature); - if (hmac.length !== test.length) - return false; - for (var i = 0, n = hmac.length; i < n; i++) - if (hmac[i] !== test[i]) - return false; + test = new Uint8Array(signature); + if (hmac.length !== test.length) return false; + for (var i = 0, n = hmac.length; i < n; i++) if (hmac[i] !== test[i]) return false; return true; } // - /** * Algorithm name GOST R 34.11-KDF

    * @@ -776,8 +745,8 @@ function verifyHMAC(key, signature, data) // -{ +function generateKey() { + // return getSeed(this.bitLength).buffer; } // @@ -796,33 +765,36 @@ function generateKey() // * @param {number} length output bit-length * @returns {ArrayBuffer} result */ -function deriveBitsPFXKDF(baseKey, length) // -{ - if (length % 8 > 0) - throw new DataError('Length must multiple of 8'); - var u = this.bitLength / 8, v = (this.digest === digest94) ? 32 : 64, - n = length / 8, r = this.iterations; +function deriveBitsPFXKDF(baseKey, length) { + // + if (length % 8 > 0) throw new DataError("Length must multiple of 8"); + var u = this.bitLength / 8, + v = this.digest === digest94 ? 32 : 64, + n = length / 8, + r = this.iterations; // 1. Construct a string, D (the "diversifier"), by concatenating v/8 // copies of ID. - var ID = this.diversifier, D = new Uint8Array(v); - for (var i = 0; i < v; i++) - D[i] = ID; + var ID = this.diversifier, + D = new Uint8Array(v); + for (var i = 0; i < v; i++) D[i] = ID; // 2. Concatenate copies of the salt together to create a string S of // length v(ceiling(s/v)) bits (the final copy of the salt may be // truncated to create S). Note that if the salt is the empty // string, then so is S. - var S0 = new Uint8Array(buffer(this.salt)), s = S0.length, - slen = v * Math.ceil(s / v), S = new Uint8Array(slen); - for (var i = 0; i < slen; i++) - S[i] = S0[i % s]; + var S0 = new Uint8Array(buffer(this.salt)), + s = S0.length, + slen = v * Math.ceil(s / v), + S = new Uint8Array(slen); + for (var i = 0; i < slen; i++) S[i] = S0[i % s]; // 3. Concatenate copies of the password together to create a string P // of length v(ceiling(p/v)) bits (the final copy of the password // may be truncated to create P). Note that if the password is the // empty string, then so is P. - var P0 = new Uint8Array(buffer(baseKey)), p = P0.length, - plen = v * Math.ceil(p / v), P = new Uint8Array(plen); - for (var i = 0; i < plen; i++) - P[i] = P0[i % p]; + var P0 = new Uint8Array(buffer(baseKey)), + p = P0.length, + plen = v * Math.ceil(p / v), + P = new Uint8Array(plen); + for (var i = 0; i < plen; i++) P[i] = P0[i % p]; // 4. Set I=S||P to be the concatenation of S and P. var I = new Uint8Array(slen + plen); arraycopy(S, 0, I, 0, slen); @@ -837,20 +809,19 @@ function deriveBitsPFXKDF(baseKey, length) // -{ - if (length % 8 > 0) - throw new DataError('Length must be multiple of 8'); - var rlen = length / 8, label, context = new Uint8Array(buffer(this.context)), - blen = this.bitLength / 8, n = Math.ceil(rlen / blen); - if (this.label) - label = new Uint8Array(buffer(this.label)); - else - label = new Uint8Array([0x26, 0xBD, 0xB8, 0x78]); +function deriveBitsKDF(baseKey, length) { + // + if (length % 8 > 0) throw new DataError("Length must be multiple of 8"); + var rlen = length / 8, + label, + context = new Uint8Array(buffer(this.context)), + blen = this.bitLength / 8, + n = Math.ceil(rlen / blen); + if (this.label) label = new Uint8Array(buffer(this.label)); + else label = new Uint8Array([0x26, 0xbd, 0xb8, 0x78]); var result = new Uint8Array(rlen); for (var i = 0; i < n; i++) { var data = new Uint8Array(label.length + context.length + 4); @@ -899,8 +870,7 @@ function deriveBitsKDF(baseKey, length) // >> 8; data[data.length - 1] = length & 0xff; - result.set(new Uint8Array(signHMAC.call(this, baseKey, data), 0, - i < n - 1 ? blen : rlen - i * blen), i * blen); + result.set(new Uint8Array(signHMAC.call(this, baseKey, data), 0, i < n - 1 ? blen : rlen - i * blen), i * blen); } return result.buffer; } // @@ -920,23 +890,23 @@ function deriveBitsKDF(baseKey, length) // -{ +function deriveBitsPBKDF1(baseKey, length) { + // if (length < this.bitLength / 2 || length % 8 > 0) - throw new DataError('Length must be more than ' + this.bitLength / 2 + ' bits and multiple of 8'); - var hLen = this.bitLength / 8, dkLen = length / 8, - c = this.iterations, - P = new Uint8Array(buffer(baseKey)), - S = new Uint8Array(buffer(this.salt)), - slen = S.length, plen = P.length, - T = new Uint8Array(plen + slen), - DK = new Uint8Array(dkLen); - if (dkLen > hLen) - throw new DataError('Invalid parameters: Length value'); + throw new DataError("Length must be more than " + this.bitLength / 2 + " bits and multiple of 8"); + var hLen = this.bitLength / 8, + dkLen = length / 8, + c = this.iterations, + P = new Uint8Array(buffer(baseKey)), + S = new Uint8Array(buffer(this.salt)), + slen = S.length, + plen = P.length, + T = new Uint8Array(plen + slen), + DK = new Uint8Array(dkLen); + if (dkLen > hLen) throw new DataError("Invalid parameters: Length value"); arraycopy(P, 0, T, 0, plen); arraycopy(S, 0, T, plen, slen); - for (var i = 0; i < c; i++) - T = new Uint8Array(this.digest(T)); + for (var i = 0; i < c; i++) T = new Uint8Array(this.digest(T)); arraycopy(T, 0, DK, 0, dkLen); return DK.buffer; } // @@ -956,45 +926,45 @@ function deriveBitsPBKDF1(baseKey, length) // -{ +function deriveBitsPBKDF2(baseKey, length) { + // var diversifier = this.diversifier || 1; // For PKCS12 MAC required 3*length length = length * diversifier; if (length < this.bitLength / 2 || length % 8 > 0) - throw new DataError('Length must be more than ' + this.bitLength / 2 + ' bits and multiple of 8'); - var hLen = this.bitLength / 8, dkLen = length / 8, - c = this.iterations, - P = new Uint8Array(buffer(baseKey)), - S = new Uint8Array(buffer(this.salt)); + throw new DataError("Length must be more than " + this.bitLength / 2 + " bits and multiple of 8"); + var hLen = this.bitLength / 8, + dkLen = length / 8, + c = this.iterations, + P = new Uint8Array(buffer(baseKey)), + S = new Uint8Array(buffer(this.salt)); var slen = S.byteLength, - data = new Uint8Array(slen + 4); + data = new Uint8Array(slen + 4); arraycopy(S, 0, data, 0, slen); - if (dkLen > (0xffffffff - 1) * 32) - throw new DataError('Invalid parameters: Length value'); + if (dkLen > (0xffffffff - 1) * 32) throw new DataError("Invalid parameters: Length value"); var n = Math.ceil(dkLen / hLen), - DK = new Uint8Array(dkLen); + DK = new Uint8Array(dkLen); for (var i = 1; i <= n; i++) { - data[slen] = i >>> 24 & 0xff; - data[slen + 1] = i >>> 16 & 0xff; - data[slen + 2] = i >>> 8 & 0xff; + data[slen] = (i >>> 24) & 0xff; + data[slen + 1] = (i >>> 16) & 0xff; + data[slen + 2] = (i >>> 8) & 0xff; data[slen + 3] = i & 0xff; - var U = new Uint8Array(signHMAC.call(this, P, data)), Z = U; + var U = new Uint8Array(signHMAC.call(this, P, data)), + Z = U; for (var j = 1; j < c; j++) { U = new Uint8Array(signHMAC.call(this, P, U)); - for (var k = 0; k < hLen; k++) - Z[k] = U[k] ^ Z[k]; + for (var k = 0; k < hLen; k++) Z[k] = U[k] ^ Z[k]; } var ofs = (i - 1) * hLen; arraycopy(Z, 0, DK, ofs, Math.min(hLen, dkLen - ofs)); } if (diversifier > 1) { - var rLen = dkLen / diversifier, R = new Uint8Array(rLen); + var rLen = dkLen / diversifier, + R = new Uint8Array(rLen); arraycopy(DK, dkLen - rLen, R, 0, rLen); return R.buffer; - } else - return DK.buffer; + } else return DK.buffer; } // /** @@ -1014,35 +984,33 @@ function deriveBitsPBKDF2(baseKey, length) // 0 ? new Uint8Array(buffer(baseKey)) : false, - plen = p ? p.length : 0, - iterations = this.iterations, - salt = new Uint8Array(buffer(this.salt)), - slen = salt.length, - d = new Uint8Array(slen + plen); + var b = this.digest === digest94 ? 32 : 64, + l = this.bitLength / 8, + p = baseKey && baseKey.byteLength > 0 ? new Uint8Array(buffer(baseKey)) : false, + plen = p ? p.length : 0, + iterations = this.iterations, + salt = new Uint8Array(buffer(this.salt)), + slen = salt.length, + d = new Uint8Array(slen + plen); arraycopy(salt, 0, d, 0, slen); - if (p) - arraycopy(p, 0, d, slen, plen); + if (p) arraycopy(p, 0, d, slen, plen); var h = new Uint8Array(this.digest(d)), - k = new Uint8Array(b), - s0 = new Uint8Array(b), - s1 = new Uint8Array(b); - var c = 'DENEFH028.760246785.IUEFHWUIO.EF'; - for (var i = 0; i < c.length; i++) - k[i] = c.charCodeAt(i); + k = new Uint8Array(b), + s0 = new Uint8Array(b), + s1 = new Uint8Array(b); + var c = "DENEFH028.760246785.IUEFHWUIO.EF"; + for (var i = 0; i < c.length; i++) k[i] = c.charCodeAt(i); d = new Uint8Array(2 * (b + l)); for (var j = 0; j < iterations; j++) { for (var i = 0; i < b; i++) { s0[i] = k[i] ^ 0x36; - s1[i] = k[i] ^ 0x5C; + s1[i] = k[i] ^ 0x5c; k[i] = 0; } arraycopy(s0, 0, d, 0, b); @@ -1053,20 +1021,19 @@ function deriveBitsCP(baseKey, length) { } for (var i = 0; i < l; i++) { s0[i] = k[i] ^ 0x36; - s1[i] = k[i] ^ 0x5C; + s1[i] = k[i] ^ 0x5c; k[i] = 0; } d = new Uint8Array(2 * l + slen + plen); arraycopy(s0, 0, d, 0, l); arraycopy(salt, 0, d, l, slen); arraycopy(s1, 0, d, l + slen, l); - if (p) - arraycopy(p, 0, d, l + slen + l, plen); + if (p) arraycopy(p, 0, d, l + slen + l, plen); h = this.digest(this.digest(d)); - if (length === this.bitLength) - return h; + if (length === this.bitLength) return h; else { - var rlen = length / 8, r = new Uint8Array(rlen); + var rlen = length / 8, + r = new Uint8Array(rlen); arraycopy(h, 0, r, 0, rlen); return r.buffer; } @@ -1083,8 +1050,8 @@ function deriveBitsCP(baseKey, length) { * @param {ArrayBuffer} baseKey * @returns {ArrayBuffer} */ -function deriveKey(baseKey) // -{ +function deriveKey(baseKey) { + // return this.deriveBits(baseKey, this.keySize * 8); } // @@ -1165,16 +1132,18 @@ function deriveKey(baseKey) // * @class GostDigest * @param {AlgorithmIdentifier} algorithm WebCryptoAPI algorithm identifier */ -function GostDigest(algorithm) // -{ - +function GostDigest(algorithm) { + // algorithm = algorithm || {}; - this.name = (algorithm.name || 'GOST R 34.10') + '-' + ((algorithm.version || 2012) % 100) + - ((algorithm.version || 2012) > 1 ? '-' + (algorithm.length || 256) : '') + - (((algorithm.mode || 'HASH') !== 'HASH') ? '-' + algorithm.mode : '') + - (algorithm.procreator ? '/' + algorithm.procreator : '') + - (typeof algorithm.sBox === 'string' ? '/' + algorithm.sBox : ''); + this.name = + (algorithm.name || "GOST R 34.10") + + "-" + + ((algorithm.version || 2012) % 100) + + ((algorithm.version || 2012) > 1 ? "-" + (algorithm.length || 256) : "") + + ((algorithm.mode || "HASH") !== "HASH" ? "-" + algorithm.mode : "") + + (algorithm.procreator ? "/" + algorithm.procreator : "") + + (typeof algorithm.sBox === "string" ? "/" + algorithm.sBox : ""); // Algorithm procreator this.procreator = algorithm.procreator; @@ -1190,16 +1159,15 @@ function GostDigest(algorithm) // case 1994: this.digest = digest94; // Define chiper algorithm - this.sBox = (algorithm.sBox || (algorithm.procreator === 'SC' ? 'D-SC' : 'D-A')).toUpperCase(); + this.sBox = (algorithm.sBox || (algorithm.procreator === "SC" ? "D-SC" : "D-A")).toUpperCase(); //if (!GostCipher) // GostCipher = root.GostCipher; - if (!GostCipher) - throw new NotSupportedError('Object GostCipher not found'); + if (!GostCipher) throw new NotSupportedError("Object GostCipher not found"); this.cipher = new GostCipher({ - name: 'GOST 28147', - block: 'ECB', + name: "GOST 28147", + block: "ECB", sBox: this.sBox, procreator: this.procreator }); @@ -1209,27 +1177,27 @@ function GostDigest(algorithm) // this.digest = digest2012; break; default: - throw new NotSupportedError('Algorithm version ' + algorithm.version + ' not supported'); + throw new NotSupportedError("Algorithm version " + algorithm.version + " not supported"); } // Key size this.keySize = algorithm.keySize || (algorithm.version <= 2 ? this.bitLength / 8 : 32); - switch (algorithm.mode || 'HASH') { - case 'HASH': + switch (algorithm.mode || "HASH") { + case "HASH": break; - case 'HMAC': + case "HMAC": this.sign = signHMAC; this.verify = verifyHMAC; this.generateKey = generateKey; break; - case 'KDF': + case "KDF": this.deriveKey = deriveKey; this.deriveBits = deriveBitsKDF; this.label = algorithm.label; this.context = algorithm.context; break; - case 'PBKDF2': + case "PBKDF2": this.deriveKey = deriveKey; this.deriveBits = deriveBitsPBKDF2; this.generateKey = generateKey; @@ -1237,7 +1205,7 @@ function GostDigest(algorithm) // this.iterations = algorithm.iterations || 2000; this.diversifier = algorithm.diversifier || 1; break; - case 'PFXKDF': + case "PFXKDF": this.deriveKey = deriveKey; this.deriveBits = deriveBitsPFXKDF; this.generateKey = generateKey; @@ -1245,7 +1213,7 @@ function GostDigest(algorithm) // this.iterations = algorithm.iterations || 2000; this.diversifier = algorithm.diversifier || 1; break; - case 'CPKDF': + case "CPKDF": this.deriveKey = deriveKey; this.deriveBits = deriveBitsCP; this.generateKey = generateKey; @@ -1253,7 +1221,7 @@ function GostDigest(algorithm) // this.iterations = algorithm.iterations || 2000; break; default: - throw new NotSupportedError('Algorithm mode ' + algorithm.mode + ' not supported'); + throw new NotSupportedError("Algorithm mode " + algorithm.mode + " not supported"); } } // diff --git a/src/core/vendor/gost/gostEngine.mjs b/src/core/vendor/gost/gostEngine.mjs index b54819c6..8faf71c6 100755 --- a/src/core/vendor/gost/gostEngine.mjs +++ b/src/core/vendor/gost/gostEngine.mjs @@ -16,7 +16,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -27,55 +27,61 @@ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * */ -import GostRandom from './gostRandom.mjs'; -import GostCipher from './gostCipher.mjs'; -import GostDigest from './gostDigest.mjs'; -import GostSign from './gostSign.mjs'; +import GostRandom from "./gostRandom.mjs"; +import GostCipher from "./gostCipher.mjs"; +import GostDigest from "./gostDigest.mjs"; +import GostSign from "./gostSign.mjs"; /* - * Engine definition base on normalized algorithm identifier - * - */ // + * Engine definition base on normalized algorithm identifier + * + */ // var root = {}; // Define engine function defineEngine(method, algorithm) { - if (!algorithm) - throw new (root.SyntaxError || Error)('Algorithm not defined'); + if (!algorithm) throw new (root.SyntaxError || Error)("Algorithm not defined"); - if (!algorithm.name) - throw new (root.SyntaxError || Error)('Algorithm name not defined'); + if (!algorithm.name) throw new (root.SyntaxError || Error)("Algorithm name not defined"); - var name = algorithm.name, mode = algorithm.mode; - if ((name === 'GOST 28147' || name === 'GOST R 34.12' || name === 'RC2') && (method === 'generateKey' || - (mode === 'MAC' && (method === 'sign' || method === 'verify')) || - ((mode === 'KW' || mode === 'MASK') && (method === 'wrapKey' || method === 'unwrapKey')) || - ((!mode || mode === 'ES') && (method === 'encrypt' || method === 'decrypt')))) { - return 'GostCipher'; - - } else if ((name === 'GOST R 34.11' || name === 'SHA') && (method === 'digest' || - (mode === 'HMAC' && (method === 'sign' || method === 'verify' || method === 'generateKey')) || - ((mode === 'KDF' || mode === 'PBKDF2' || mode === 'PFXKDF' || mode === 'CPKDF') && - (method === 'deriveKey' || method === 'deriveBits' || method === 'generateKey')))) { - return 'GostDigest'; - - } else if (name === 'GOST R 34.10' && (method === 'generateKey' || - ((!mode || mode === 'SIGN') && (method === 'sign' || method === 'verify')) || - (mode === 'MASK' && (method === 'wrapKey' || method === 'unwrapKey')) || - (mode === 'DH' && (method === 'deriveKey' || method === 'deriveBits')))) { - return 'GostSign'; + var name = algorithm.name, + mode = algorithm.mode; + if ( + (name === "GOST 28147" || name === "GOST R 34.12" || name === "RC2") && + (method === "generateKey" || + (mode === "MAC" && (method === "sign" || method === "verify")) || + ((mode === "KW" || mode === "MASK") && (method === "wrapKey" || method === "unwrapKey")) || + ((!mode || mode === "ES") && (method === "encrypt" || method === "decrypt"))) + ) { + return "GostCipher"; + } else if ( + (name === "GOST R 34.11" || name === "SHA") && + (method === "digest" || + (mode === "HMAC" && (method === "sign" || method === "verify" || method === "generateKey")) || + ((mode === "KDF" || mode === "PBKDF2" || mode === "PFXKDF" || mode === "CPKDF") && + (method === "deriveKey" || method === "deriveBits" || method === "generateKey"))) + ) { + return "GostDigest"; + } else if ( + name === "GOST R 34.10" && + (method === "generateKey" || + ((!mode || mode === "SIGN") && (method === "sign" || method === "verify")) || + (mode === "MASK" && (method === "wrapKey" || method === "unwrapKey")) || + (mode === "DH" && (method === "deriveKey" || method === "deriveBits"))) + ) { + return "GostSign"; } else - throw new (root.NotSupportedError || Error)('Algorithm ' + name + '-' + mode + ' is not valid for ' + method); + throw new (root.NotSupportedError || Error)("Algorithm " + name + "-" + mode + " is not valid for " + method); } // /** - * Object implements dedicated Web Workers and provide a simple way to create - * and run GOST cryptographic algorithms in background thread. - * + * Object implements dedicated Web Workers and provide a simple way to create + * and run GOST cryptographic algorithms in background thread. + * * Object provide interface to GOST low-level cryptogric classes: *
      *
    • GostCipher - implementation of GOST 28147, GOST R 34.12, GOST R 34.13 Encryption algorithms. Reference {@link http://tools.ietf.org/html/rfc5830}
    • @@ -86,39 +92,39 @@ function defineEngine(method, algorithm) { */ var gostEngine = { /** - * gostEngine.execute(algorithm, method, args) Entry point to execution + * gostEngine.execute(algorithm, method, args) Entry point to execution * all low-level GOST cryptographic methods - * + * *
        *
      • Determine the appropriate engine for a given execution method
      • *
      • Create cipher object for determineted engine
      • *
      • Execute method of cipher with given args
      • *
      - * + * * @memberOf gostEngine * @param {AlgorithmIndentifier} algorithm Algorithm identifier * @param {string} method Crypto method for execution * @param {Array} args Method arguments (keys, data, additional parameters) * @returns {(CryptoOperationData|Key|KeyPair|boolean)} Result of method execution */ - execute: function (algorithm, method, args) // - { + execute: function (algorithm, method, args) { + // // Define engine for GOST algorithms var engine = defineEngine(method, algorithm); - // Create cipher - var cipher = this['get' + engine](algorithm); + // Create cipher + var cipher = this["get" + engine](algorithm); // Execute method return cipher[method].apply(cipher, args); }, // /** * gostEngine.getGostCipher(algorithm) returns GOST 28147 / GOST R 34.12 cipher instance

      - * - * GOST 28147-89 / GOST R 34.12-15 Encryption Algorithm

      - * When keys and initialization vectors are converted to/from byte arrays, + * + * GOST 28147-89 / GOST R 34.12-15 Encryption Algorithm

      + * When keys and initialization vectors are converted to/from byte arrays, * little-endian byte order is assumed.

      - * + * * Normalized algorithm identifier common parameters: - * + * *
        *
      • name Algorithm name 'GOST 28147' or 'GOST R 34.12'
      • *
      • version Algorithm version, number @@ -143,9 +149,9 @@ var gostEngine = { *
      • *
      • sBox Paramset sBox for GOST 28147-89, string. Used only if version = 1989
      • *
      - * + * * Supported algorithms, modes and parameters: - * + * *
        *
      • Encript/Decrypt mode (ES) *
          @@ -169,9 +175,9 @@ var gostEngine = { * *
        • Wrap/Unwrap key mode (MASK)
        • *
        - * + * * Supported paramters values: - * + * *
          *
        • Block modes (parameter 'block') *
            @@ -203,20 +209,20 @@ var gostEngine = { *
          *
        • *
        - * + * * @memberOf gostEngine * @param {AlgorithmIndentifier} algorithm Algorithm identifier * @returns {GostCipher} Instance of GostCipher */ - getGostCipher: function (algorithm) // - { + getGostCipher: function (algorithm) { + // return new (GostCipher || (GostCipher = root.GostCipher))(algorithm); }, // /** * gostEngine.getGostDigest(algorithm) returns GOST R 34.11 cipher instance

        - * + * * Normalized algorithm identifier common parameters: - * + * *
          *
        • name Algorithm name 'GOST R 34.11'
        • *
        • version Algorithm version @@ -243,9 +249,9 @@ var gostEngine = { *
        • *
        • sBox Paramset sBox for GOST 28147-89. Used only if version = 1994
        • *
        - * + * * Supported algorithms, modes and parameters: - * + * *
          *
        • Digest HASH mode (default)
        • *
        • Sign/Verify HMAC modes parameters depends on version and length @@ -271,7 +277,7 @@ var gostEngine = { *
            *
          • salt {@link CryptoOperationData} Random salt as input for HMAC algorithm
          • *
          • iterations Iteration count. GOST recomended value 1000 (default) or 2000
          • - *
          • diversifier Deversifier, ID=1 - key material for performing encryption or decryption, + *
          • diversifier Deversifier, ID=1 - key material for performing encryption or decryption, * ID=2 - IV (Initial Value) for encryption or decryption, ID=3 - integrity key for MACing
          • *
          *
        • @@ -282,20 +288,20 @@ var gostEngine = { *
        *
      • *
      - * + * * @memberOf gostEngine * @param {AlgorithmIndentifier} algorithm Algorithm identifier * @returns {GostDigest} Instance of GostDigest */ - getGostDigest: function (algorithm) // - { + getGostDigest: function (algorithm) { + // return new (GostDigest || (GostDigest = root.GostDigest))(algorithm); }, // /** * gostEngine.getGostSign(algorithm) returns GOST R 34.10 cipher instance

      - * + * * Normalized algorithm identifier common parameters: - * + * *
        *
      • name Algorithm name 'GOST R 34.10'
      • *
      • version Algorithm version @@ -320,9 +326,9 @@ var gostEngine = { *
      • *
      • sBox Paramset sBox for GOST 34.11-94. Used only if version = 1994 or 2001
      • *
      - * + * * Supported algorithms, modes and parameters: - * + * *
        *
      • Sign/Verify mode (SIGN)
      • *
      • Wrap/Unwrap mode (MASK)
      • @@ -359,32 +365,31 @@ var gostEngine = { *
      * *
    - * + * * @memberOf gostEngine * @param {AlgorithmIndentifier} algorithm Algorithm identifier * @returns {GostSign} Instance of GostSign */ - getGostSign: function (algorithm) // - { + getGostSign: function (algorithm) { + // return new (GostSign || (GostSign = root.GostSign))(algorithm); } // }; /* - * Worker method execution - * - */ // + * Worker method execution + * + */ // // Worker for gostCripto method execution if (root.importScripts) { - /** - * Method called when {@link SubtleCrypto} calls its own postMessage() + * Method called when {@link SubtleCrypto} calls its own postMessage() * method with data parameter: algorithm, method and arg.
    - * Call method execute and postMessage() results to onmessage event handler + * Call method execute and postMessage() results to onmessage event handler * in the main process.
    * If error occurred onerror event handler executed in main process. - * + * * @memberOf gostEngine * @name onmessage * @param {MessageEvent} event Message event with data {algorithm, method, args} @@ -393,8 +398,8 @@ if (root.importScripts) { try { postMessage({ id: event.data.id, - result: gostEngine.execute(event.data.algorithm, - event.data.method, event.data.args)}); + result: gostEngine.execute(event.data.algorithm, event.data.method, event.data.args) + }); } catch (e) { postMessage({ id: event.data.id, @@ -403,16 +408,16 @@ if (root.importScripts) { } }; } else { - // Load dependens - var baseUrl = '', nameSuffix = ''; + var baseUrl = "", + nameSuffix = ""; // Try to define from DOM model - if (typeof document !== 'undefined') { + if (typeof document !== "undefined") { (function () { var regs = /^(.*)gostCrypto(.*)\.js$/i; - var list = document.querySelectorAll('script'); + var list = document.querySelectorAll("script"); for (var i = 0, n = list.length; i < n; i++) { - var value = list[i].getAttribute('src'); + var value = list[i].getAttribute("src"); var test = regs.exec(value); if (test) { baseUrl = test[1]; @@ -425,27 +430,22 @@ if (root.importScripts) { // Local importScripts procedure for include dependens var importScripts = function () { for (var i = 0, n = arguments.length; i < n; i++) { - var name = arguments[i].split('.'), - src = baseUrl + name[0] + nameSuffix + '.' + name[1]; + var name = arguments[i].split("."), + src = baseUrl + name[0] + nameSuffix + "." + name[1]; var el = document.querySelector('script[src="' + src + '"]'); if (!el) { - el = document.createElement('script'); - el.setAttribute('src', src); + el = document.createElement("script"); + el.setAttribute("src", src); document.head.appendChild(el); } } }; // Import engines - if (!GostRandom) - importScripts('gostRandom.js'); - if (!GostCipher) - importScripts('gostCipher.js'); - if (!GostDigest) - importScripts('gostDigest.js'); - if (!GostSign) - importScripts('gostSign.js'); + if (!GostRandom) importScripts("gostRandom.js"); + if (!GostCipher) importScripts("gostCipher.js"); + if (!GostDigest) importScripts("gostDigest.js"); + if (!GostSign) importScripts("gostSign.js"); } //
    export default gostEngine; - diff --git a/src/core/vendor/gost/gostRandom.mjs b/src/core/vendor/gost/gostRandom.mjs index f9a38380..d1fb697d 100644 --- a/src/core/vendor/gost/gostRandom.mjs +++ b/src/core/vendor/gost/gostRandom.mjs @@ -1,8 +1,8 @@ -/** +/** * Implementation Web Crypto random generatore for GOST algorithms * 1.76 * 2014-2016, Rudolf Nickolaev. All rights reserved. - * + * * Exported for CyberChef by mshwed [m@ttshwed.com] */ @@ -18,7 +18,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -29,18 +29,17 @@ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * */ -import crypto from 'crypto'; - +import crypto from "crypto"; /** * The gostCrypto provide general purpose cryptographic functionality for - * GOST standards including a cryptographically strong pseudo-random number + * GOST standards including a cryptographically strong pseudo-random number * generator seeded with truly random values. - * + * * @Class GostRandom - * + * */ // var root = {}; @@ -49,65 +48,65 @@ var rootCrypto = crypto; var TypeMismatchError = Error; var QuotaExceededError = Error; -// Initialize mouse and time counters for random generator +// Initialize mouse and time counters for random generator var randomRing = { seed: new Uint8Array(1024), getIndex: 0, setIndex: 0, set: function (x) { - if (this.setIndex >= 1024) - this.setIndex = 0; + if (this.setIndex >= 1024) this.setIndex = 0; this.seed[this.setIndex++] = x; }, get: function () { - if (this.getIndex >= 1024) - this.getIndex = 0; + if (this.getIndex >= 1024) this.getIndex = 0; return this.seed[this.getIndex++]; } }; -if (typeof document !== 'undefined') { +if (typeof document !== "undefined") { try { // Mouse move event to fill random array - document.addEventListener('mousemove', function (e) { - randomRing.set((Date.now() & 255) ^ - ((e.clientX || e.pageX) & 255) ^ - ((e.clientY || e.pageY) & 255)); - }, false); - } catch (e) { - } + document.addEventListener( + "mousemove", + function (e) { + randomRing.set((Date.now() & 255) ^ ((e.clientX || e.pageX) & 255) ^ ((e.clientY || e.pageY) & 255)); + }, + false + ); + } catch (e) {} try { // Keypress event to fill random array - document.addEventListener('keydown', function (e) { - randomRing.set((Date.now() & 255) ^ - (e.keyCode & 255)); - }, false); - } catch (e) { - } + document.addEventListener( + "keydown", + function (e) { + randomRing.set((Date.now() & 255) ^ (e.keyCode & 255)); + }, + false + ); + } catch (e) {} } // -function GostRandom() { -} +function GostRandom() {} /** * The getRandomValues method generates cryptographically random values.

    - * - * Random generator based on JavaScript Web Crypto random genereator - * (if it is possible) or Math.random mixed with time and parameters of + * + * Random generator based on JavaScript Web Crypto random genereator + * (if it is possible) or Math.random mixed with time and parameters of * mouse and keyboard events - * + * * @memberOf GostRandom * @param {(ArrayBuffer|ArrayBufferView)} array Destination buffer for random data */ -GostRandom.prototype.getRandomValues = function (array) // -{ - +GostRandom.prototype.getRandomValues = function (array) { + // if (!array.byteLength) - throw new TypeMismatchError('Array is not of an integer type (Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, or Uint32Array)'); + throw new TypeMismatchError( + "Array is not of an integer type (Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, or Uint32Array)" + ); - if (array.byteLength > 65536) - throw new QuotaExceededError('Byte length of array can\'t be greate then 65536'); + if (array.byteLength > 65536) throw new QuotaExceededError("Byte length of array can't be greate then 65536"); var u8 = new Uint8Array(array.buffer, array.byteOffset, array.byteLength); if (rootCrypto && rootCrypto.getRandomValues) { @@ -115,13 +114,11 @@ GostRandom.prototype.getRandomValues = function (array) // diff --git a/src/core/vendor/gost/gostSign.mjs b/src/core/vendor/gost/gostSign.mjs index 36a87f63..8f857ff7 100755 --- a/src/core/vendor/gost/gostSign.mjs +++ b/src/core/vendor/gost/gostSign.mjs @@ -33,166 +33,170 @@ * */ - import GostRandom from './gostRandom.mjs'; - import GostDigest from './gostDigest.mjs'; +import GostRandom from "./gostRandom.mjs"; +import GostDigest from "./gostDigest.mjs"; - import crypto from 'crypto'; +import crypto from "crypto"; - /* - * Predefined curves and params collection - * - * http://tools.ietf.org/html/rfc5832 - * http://tools.ietf.org/html/rfc7091 - * http://tools.ietf.org/html/rfc4357 - * - */ // +/* + * Predefined curves and params collection + * + * http://tools.ietf.org/html/rfc5832 + * http://tools.ietf.org/html/rfc7091 + * http://tools.ietf.org/html/rfc4357 + * + */ // var root = {}; var rootCrypto = crypto; var CryptoOperationData = ArrayBuffer; var OperationError = Error, - DataError = Error, - NotSupportedError = Error; + DataError = Error, + NotSupportedError = Error; // Predefined named curve collection var ECGostParams = { - 'S-256-TEST': { + "S-256-TEST": { a: 7, - b: '0x5FBFF498AA938CE739B8E022FBAFEF40563F6E6A3472FC2A514C0CE9DAE23B7E', - p: '0x8000000000000000000000000000000000000000000000000000000000000431', - q: '0x8000000000000000000000000000000150FE8A1892976154C59CFC193ACCF5B3', + b: "0x5FBFF498AA938CE739B8E022FBAFEF40563F6E6A3472FC2A514C0CE9DAE23B7E", + p: "0x8000000000000000000000000000000000000000000000000000000000000431", + q: "0x8000000000000000000000000000000150FE8A1892976154C59CFC193ACCF5B3", x: 2, - y: '0x8E2A8A0E65147D4BD6316030E16D19C85C97F0A9CA267122B96ABBCEA7E8FC8' + y: "0x8E2A8A0E65147D4BD6316030E16D19C85C97F0A9CA267122B96ABBCEA7E8FC8" }, - 'S-256-A': { - a: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD94', + "S-256-A": { + a: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD94", b: 166, - p: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD97', - q: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C611070995AD10045841B09B761B893', + p: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD97", + q: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C611070995AD10045841B09B761B893", x: 1, - y: '0x8D91E471E0989CDA27DF505A453F2B7635294F2DDF23E3B122ACC99C9E9F1E14' + y: "0x8D91E471E0989CDA27DF505A453F2B7635294F2DDF23E3B122ACC99C9E9F1E14" }, - 'S-256-B': { - a: '0x8000000000000000000000000000000000000000000000000000000000000C96', - b: '0x3E1AF419A269A5F866A7D3C25C3DF80AE979259373FF2B182F49D4CE7E1BBC8B', - p: '0x8000000000000000000000000000000000000000000000000000000000000C99', - q: '0x800000000000000000000000000000015F700CFFF1A624E5E497161BCC8A198F', + "S-256-B": { + a: "0x8000000000000000000000000000000000000000000000000000000000000C96", + b: "0x3E1AF419A269A5F866A7D3C25C3DF80AE979259373FF2B182F49D4CE7E1BBC8B", + p: "0x8000000000000000000000000000000000000000000000000000000000000C99", + q: "0x800000000000000000000000000000015F700CFFF1A624E5E497161BCC8A198F", x: 1, - y: '0x3FA8124359F96680B83D1C3EB2C070E5C545C9858D03ECFB744BF8D717717EFC' + y: "0x3FA8124359F96680B83D1C3EB2C070E5C545C9858D03ECFB744BF8D717717EFC" }, - 'S-256-C': { - a: '0x9B9F605F5A858107AB1EC85E6B41C8AACF846E86789051D37998F7B9022D7598', + "S-256-C": { + a: "0x9B9F605F5A858107AB1EC85E6B41C8AACF846E86789051D37998F7B9022D7598", b: 32858, - p: '0x9B9F605F5A858107AB1EC85E6B41C8AACF846E86789051D37998F7B9022D759B', - q: '0x9B9F605F5A858107AB1EC85E6B41C8AA582CA3511EDDFB74F02F3A6598980BB9', + p: "0x9B9F605F5A858107AB1EC85E6B41C8AACF846E86789051D37998F7B9022D759B", + q: "0x9B9F605F5A858107AB1EC85E6B41C8AA582CA3511EDDFB74F02F3A6598980BB9", x: 0, - y: '0x41ECE55743711A8C3CBF3783CD08C0EE4D4DC440D4641A8F366E550DFDB3BB67' + y: "0x41ECE55743711A8C3CBF3783CD08C0EE4D4DC440D4641A8F366E550DFDB3BB67" }, - 'P-256': { - p: '0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF', - a: '0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC', - b: '0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B', - x: '0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296', - y: '0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5', - q: '0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551' + "P-256": { + p: "0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", + a: "0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", + b: "0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", + x: "0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", + y: "0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", + q: "0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" }, - 'T-512-TEST': { + "T-512-TEST": { a: 7, - b: '0x1CFF0806A31116DA29D8CFA54E57EB748BC5F377E49400FDD788B649ECA1AC4361834013B2AD7322480A89CA58E0CF74BC9E540C2ADD6897FAD0A3084F302ADC', - p: '0x4531ACD1FE0023C7550D267B6B2FEE80922B14B2FFB90F04D4EB7C09B5D2D15DF1D852741AF4704A0458047E80E4546D35B8336FAC224DD81664BBF528BE6373', - q: '0x4531ACD1FE0023C7550D267B6B2FEE80922B14B2FFB90F04D4EB7C09B5D2D15DA82F2D7ECB1DBAC719905C5EECC423F1D86E25EDBE23C595D644AAF187E6E6DF', - x: '0x24D19CC64572EE30F396BF6EBBFD7A6C5213B3B3D7057CC825F91093A68CD762FD60611262CD838DC6B60AA7EEE804E28BC849977FAC33B4B530F1B120248A9A', - y: '0x2BB312A43BD2CE6E0D020613C857ACDDCFBF061E91E5F2C3F32447C259F39B2C83AB156D77F1496BF7EB3351E1EE4E43DC1A18B91B24640B6DBB92CB1ADD371E' + b: "0x1CFF0806A31116DA29D8CFA54E57EB748BC5F377E49400FDD788B649ECA1AC4361834013B2AD7322480A89CA58E0CF74BC9E540C2ADD6897FAD0A3084F302ADC", + p: "0x4531ACD1FE0023C7550D267B6B2FEE80922B14B2FFB90F04D4EB7C09B5D2D15DF1D852741AF4704A0458047E80E4546D35B8336FAC224DD81664BBF528BE6373", + q: "0x4531ACD1FE0023C7550D267B6B2FEE80922B14B2FFB90F04D4EB7C09B5D2D15DA82F2D7ECB1DBAC719905C5EECC423F1D86E25EDBE23C595D644AAF187E6E6DF", + x: "0x24D19CC64572EE30F396BF6EBBFD7A6C5213B3B3D7057CC825F91093A68CD762FD60611262CD838DC6B60AA7EEE804E28BC849977FAC33B4B530F1B120248A9A", + y: "0x2BB312A43BD2CE6E0D020613C857ACDDCFBF061E91E5F2C3F32447C259F39B2C83AB156D77F1496BF7EB3351E1EE4E43DC1A18B91B24640B6DBB92CB1ADD371E" }, - 'T-512-A': { - p: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC7', - a: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC4', - b: '0xE8C2505DEDFC86DDC1BD0B2B6667F1DA34B82574761CB0E879BD081CFD0B6265EE3CB090F30D27614CB4574010DA90DD862EF9D4EBEE4761503190785A71C760', - q: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27E69532F48D89116FF22B8D4E0560609B4B38ABFAD2B85DCACDB1411F10B275', + "T-512-A": { + p: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC7", + a: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC4", + b: "0xE8C2505DEDFC86DDC1BD0B2B6667F1DA34B82574761CB0E879BD081CFD0B6265EE3CB090F30D27614CB4574010DA90DD862EF9D4EBEE4761503190785A71C760", + q: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27E69532F48D89116FF22B8D4E0560609B4B38ABFAD2B85DCACDB1411F10B275", x: 3, - y: '0x7503CFE87A836AE3A61B8816E25450E6CE5E1C93ACF1ABC1778064FDCBEFA921DF1626BE4FD036E93D75E6A50E3A41E98028FE5FC235F5B889A589CB5215F2A4' + y: "0x7503CFE87A836AE3A61B8816E25450E6CE5E1C93ACF1ABC1778064FDCBEFA921DF1626BE4FD036E93D75E6A50E3A41E98028FE5FC235F5B889A589CB5215F2A4" }, - 'T-512-B': { - p: '0x8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F', - a: '0x8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C', - b: '0x687D1B459DC841457E3E06CF6F5E2517B97C7D614AF138BCBF85DC806C4B289F3E965D2DB1416D217F8B276FAD1AB69C50F78BEE1FA3106EFB8CCBC7C5140116', - q: '0x800000000000000000000000000000000000000000000000000000000000000149A1EC142565A545ACFDB77BD9D40CFA8B996712101BEA0EC6346C54374F25BD', + "T-512-B": { + p: "0x8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F", + a: "0x8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C", + b: "0x687D1B459DC841457E3E06CF6F5E2517B97C7D614AF138BCBF85DC806C4B289F3E965D2DB1416D217F8B276FAD1AB69C50F78BEE1FA3106EFB8CCBC7C5140116", + q: "0x800000000000000000000000000000000000000000000000000000000000000149A1EC142565A545ACFDB77BD9D40CFA8B996712101BEA0EC6346C54374F25BD", x: 2, - y: '0x1A8F7EDA389B094C2C071E3647A8940F3C123B697578C213BE6DD9E6C8EC7335DCB228FD1EDF4A39152CBCAAF8C0398828041055F94CEEEC7E21340780FE41BD' + y: "0x1A8F7EDA389B094C2C071E3647A8940F3C123B697578C213BE6DD9E6C8EC7335DCB228FD1EDF4A39152CBCAAF8C0398828041055F94CEEEC7E21340780FE41BD" } }; -ECGostParams['X-256-A'] = ECGostParams['S-256-A']; -ECGostParams['X-256-B'] = ECGostParams['S-256-C']; -ECGostParams['T-256-TEST'] = ECGostParams['S-256-TEST']; -ECGostParams['T-256-A'] = ECGostParams['S-256-A']; -ECGostParams['T-256-B'] = ECGostParams['S-256-B']; -ECGostParams['T-256-C'] = ECGostParams['S-256-C']; - +ECGostParams["X-256-A"] = ECGostParams["S-256-A"]; +ECGostParams["X-256-B"] = ECGostParams["S-256-C"]; +ECGostParams["T-256-TEST"] = ECGostParams["S-256-TEST"]; +ECGostParams["T-256-A"] = ECGostParams["S-256-A"]; +ECGostParams["T-256-B"] = ECGostParams["S-256-B"]; +ECGostParams["T-256-C"] = ECGostParams["S-256-C"]; var GostParams = { - 'S-TEST': { + "S-TEST": { modulusLength: 512, // bit length of p (512 or 1024 bits) - p: '0xEE8172AE8996608FB69359B89EB82A69854510E2977A4D63BC97322CE5DC3386EA0A12B343E9190F23177539845839786BB0C345D165976EF2195EC9B1C379E3', - q: '0x98915E7EC8265EDFCDA31E88F24809DDB064BDC7285DD50D7289F0AC6F49DD2D', - a: '0x9e96031500c8774a869582d4afde2127afad2538b4b6270a6f7c8837b50d50f206755984a49e509304d648be2ab5aab18ebe2cd46ac3d8495b142aa6ce23e21c' + p: "0xEE8172AE8996608FB69359B89EB82A69854510E2977A4D63BC97322CE5DC3386EA0A12B343E9190F23177539845839786BB0C345D165976EF2195EC9B1C379E3", + q: "0x98915E7EC8265EDFCDA31E88F24809DDB064BDC7285DD50D7289F0AC6F49DD2D", + a: "0x9e96031500c8774a869582d4afde2127afad2538b4b6270a6f7c8837b50d50f206755984a49e509304d648be2ab5aab18ebe2cd46ac3d8495b142aa6ce23e21c" }, - 'S-A': { + "S-A": { modulusLength: 1024, - p: '0xB4E25EFB018E3C8B87505E2A67553C5EDC56C2914B7E4F89D23F03F03377E70A2903489DD60E78418D3D851EDB5317C4871E40B04228C3B7902963C4B7D85D52B9AA88F2AFDBEB28DA8869D6DF846A1D98924E925561BD69300B9DDD05D247B5922D967CBB02671881C57D10E5EF72D3E6DAD4223DC82AA1F7D0294651A480DF', - q: '0x972432A437178B30BD96195B773789AB2FFF15594B176DD175B63256EE5AF2CF', - a: '0x8FD36731237654BBE41F5F1F8453E71CA414FFC22C25D915309E5D2E62A2A26C7111F3FC79568DAFA028042FE1A52A0489805C0DE9A1A469C844C7CABBEE625C3078888C1D85EEA883F1AD5BC4E6776E8E1A0750912DF64F79956499F1E182475B0B60E2632ADCD8CF94E9C54FD1F3B109D81F00BF2AB8CB862ADF7D40B9369A' + p: "0xB4E25EFB018E3C8B87505E2A67553C5EDC56C2914B7E4F89D23F03F03377E70A2903489DD60E78418D3D851EDB5317C4871E40B04228C3B7902963C4B7D85D52B9AA88F2AFDBEB28DA8869D6DF846A1D98924E925561BD69300B9DDD05D247B5922D967CBB02671881C57D10E5EF72D3E6DAD4223DC82AA1F7D0294651A480DF", + q: "0x972432A437178B30BD96195B773789AB2FFF15594B176DD175B63256EE5AF2CF", + a: "0x8FD36731237654BBE41F5F1F8453E71CA414FFC22C25D915309E5D2E62A2A26C7111F3FC79568DAFA028042FE1A52A0489805C0DE9A1A469C844C7CABBEE625C3078888C1D85EEA883F1AD5BC4E6776E8E1A0750912DF64F79956499F1E182475B0B60E2632ADCD8CF94E9C54FD1F3B109D81F00BF2AB8CB862ADF7D40B9369A" }, - 'S-B': { + "S-B": { modulusLength: 1024, - p: '0xC6971FC57524B30C9018C5E621DE15499736854F56A6F8AEE65A7A404632B1BCF0349FFCAFCB0A103177971FC1612ADCDB8C8CC938C70225C8FD12AFF01B1D064E0AD6FDE6AB9159166CB9F2FC171D92F0CC7B6A6B2CD7FA342ACBE2C9315A42D576B1ECCE77A963157F3D0BD96A8EB0B0F3502AD238101B05116334F1E5B7AB', - q: '0xB09D634C10899CD7D4C3A7657403E05810B07C61A688BAB2C37F475E308B0607', - a: '0x3D26B467D94A3FFC9D71BF8DB8934084137264F3C2E9EB16DCA214B8BC7C872485336744934FD2EF5943F9ED0B745B90AA3EC8D70CDC91682478B664A2E1F8FB56CEF2972FEE7EDB084AF746419B854FAD02CC3E3646FF2E1A18DD4BEB3C44F7F2745588029649674546CC9187C207FB8F2CECE8E2293F68395C4704AF04BAB5' + p: "0xC6971FC57524B30C9018C5E621DE15499736854F56A6F8AEE65A7A404632B1BCF0349FFCAFCB0A103177971FC1612ADCDB8C8CC938C70225C8FD12AFF01B1D064E0AD6FDE6AB9159166CB9F2FC171D92F0CC7B6A6B2CD7FA342ACBE2C9315A42D576B1ECCE77A963157F3D0BD96A8EB0B0F3502AD238101B05116334F1E5B7AB", + q: "0xB09D634C10899CD7D4C3A7657403E05810B07C61A688BAB2C37F475E308B0607", + a: "0x3D26B467D94A3FFC9D71BF8DB8934084137264F3C2E9EB16DCA214B8BC7C872485336744934FD2EF5943F9ED0B745B90AA3EC8D70CDC91682478B664A2E1F8FB56CEF2972FEE7EDB084AF746419B854FAD02CC3E3646FF2E1A18DD4BEB3C44F7F2745588029649674546CC9187C207FB8F2CECE8E2293F68395C4704AF04BAB5" }, - 'S-C': { + "S-C": { modulusLength: 1024, - p: '0x9D88E6D7FE3313BD2E745C7CDD2AB9EE4AF3C8899E847DE74A33783EA68BC30588BA1F738C6AAF8AB350531F1854C3837CC3C860FFD7E2E106C3F63B3D8A4C034CE73942A6C3D585B599CF695ED7A3C4A93B2B947B7157BB1A1C043AB41EC8566C6145E938A611906DE0D32E562494569D7E999A0DDA5C879BDD91FE124DF1E9', - q: '0xFADD197ABD19A1B4653EECF7ECA4D6A22B1F7F893B641F901641FBB555354FAF', - a: '0x7447ED7156310599070B12609947A5C8C8A8625CF1CF252B407B331F93D639DDD1BA392656DECA992DD035354329A1E95A6E32D6F47882D960B8F10ACAFF796D13CD9611F853DAB6D2623483E46788708493937A1A29442598AEC2E0742022563440FE9C18740ECE6765AC05FAF024A64B026E7E408840819E962E7E5F401AE3' + p: "0x9D88E6D7FE3313BD2E745C7CDD2AB9EE4AF3C8899E847DE74A33783EA68BC30588BA1F738C6AAF8AB350531F1854C3837CC3C860FFD7E2E106C3F63B3D8A4C034CE73942A6C3D585B599CF695ED7A3C4A93B2B947B7157BB1A1C043AB41EC8566C6145E938A611906DE0D32E562494569D7E999A0DDA5C879BDD91FE124DF1E9", + q: "0xFADD197ABD19A1B4653EECF7ECA4D6A22B1F7F893B641F901641FBB555354FAF", + a: "0x7447ED7156310599070B12609947A5C8C8A8625CF1CF252B407B331F93D639DDD1BA392656DECA992DD035354329A1E95A6E32D6F47882D960B8F10ACAFF796D13CD9611F853DAB6D2623483E46788708493937A1A29442598AEC2E0742022563440FE9C18740ECE6765AC05FAF024A64B026E7E408840819E962E7E5F401AE3" }, - 'S-D': { + "S-D": { modulusLength: 1024, - p: '0x80F102D32B0FD167D069C27A307ADAD2C466091904DBAA55D5B8CC7026F2F7A1919B890CB652C40E054E1E9306735B43D7B279EDDF9102001CD9E1A831FE8A163EED89AB07CF2ABE8242AC9DEDDDBF98D62CDDD1EA4F5F15D3A42A6677BDD293B24260C0F27C0F1D15948614D567B66FA902BAA11A69AE3BCEADBB83E399C9B5', - q: '0xF0F544C418AAC234F683F033511B65C21651A6078BDA2D69BB9F732867502149', - a: '0x6BCC0B4FADB3889C1E06ADD23CC09B8AB6ECDEDF73F04632595EE4250005D6AF5F5ADE44CB1E26E6263C672347CFA26F9E9393681E6B759733784CDE5DBD9A14A39369DFD99FA85CC0D10241C4010343F34A91393A706CF12677CBFA1F578D6B6CFBE8A1242CFCC94B3B653A476E145E3862C18CC3FED8257CFEF74CDB205BF1' + p: "0x80F102D32B0FD167D069C27A307ADAD2C466091904DBAA55D5B8CC7026F2F7A1919B890CB652C40E054E1E9306735B43D7B279EDDF9102001CD9E1A831FE8A163EED89AB07CF2ABE8242AC9DEDDDBF98D62CDDD1EA4F5F15D3A42A6677BDD293B24260C0F27C0F1D15948614D567B66FA902BAA11A69AE3BCEADBB83E399C9B5", + q: "0xF0F544C418AAC234F683F033511B65C21651A6078BDA2D69BB9F732867502149", + a: "0x6BCC0B4FADB3889C1E06ADD23CC09B8AB6ECDEDF73F04632595EE4250005D6AF5F5ADE44CB1E26E6263C672347CFA26F9E9393681E6B759733784CDE5DBD9A14A39369DFD99FA85CC0D10241C4010343F34A91393A706CF12677CBFA1F578D6B6CFBE8A1242CFCC94B3B653A476E145E3862C18CC3FED8257CFEF74CDB205BF1" }, - 'X-A': { + "X-A": { modulusLength: 1024, - p: '0xCA3B3F2EEE9FD46317D49595A9E7518E6C63D8F4EB4D22D10D28AF0B8839F079F8289E603B03530784B9BB5A1E76859E4850C670C7B71C0DF84CA3E0D6C177FE9F78A9D8433230A883CD82A2B2B5C7A3306980278570CDB79BF01074A69C9623348824B0C53791D53C6A78CAB69E1CFB28368611A397F50F541E16DB348DBE5F', - q: '0xCAE4D85F80C147704B0CA48E85FB00A9057AA4ACC44668E17F1996D7152690D9', - a: '0xBE27D652F2F1E339DA734211B85B06AE4DE236AA8FBEEB3F1ADCC52CD43853777E834A6A518138678A8ADBD3A55C70A7EAB1BA7A0719548677AAF4E609FFB47F6B9D7E45B0D06D83D7ADC53310ABD85783E7317F7EC73268B6A9C08D260B85D8485696CA39C17B17F044D1E050489036ABD381C5E6BF82BA352A1AFF136601AF' + p: "0xCA3B3F2EEE9FD46317D49595A9E7518E6C63D8F4EB4D22D10D28AF0B8839F079F8289E603B03530784B9BB5A1E76859E4850C670C7B71C0DF84CA3E0D6C177FE9F78A9D8433230A883CD82A2B2B5C7A3306980278570CDB79BF01074A69C9623348824B0C53791D53C6A78CAB69E1CFB28368611A397F50F541E16DB348DBE5F", + q: "0xCAE4D85F80C147704B0CA48E85FB00A9057AA4ACC44668E17F1996D7152690D9", + a: "0xBE27D652F2F1E339DA734211B85B06AE4DE236AA8FBEEB3F1ADCC52CD43853777E834A6A518138678A8ADBD3A55C70A7EAB1BA7A0719548677AAF4E609FFB47F6B9D7E45B0D06D83D7ADC53310ABD85783E7317F7EC73268B6A9C08D260B85D8485696CA39C17B17F044D1E050489036ABD381C5E6BF82BA352A1AFF136601AF" }, - 'X-B': { + "X-B": { modulusLength: 1024, - p: '0x9286DBDA91ECCFC3060AA5598318E2A639F5BA90A4CA656157B2673FB191CD0589EE05F4CEF1BD13508408271458C30851CE7A4EF534742BFB11F4743C8F787B11193BA304C0E6BCA25701BF88AF1CB9B8FD4711D89F88E32B37D95316541BF1E5DBB4989B3DF13659B88C0F97A3C1087B9F2D5317D557DCD4AFC6D0A754E279', - q: '0xC966E9B3B8B7CDD82FF0F83AF87036C38F42238EC50A876CD390E43D67B6013F', - a: '0x7E9C3096676F51E3B2F9884CF0AC2156779496F410E049CED7E53D8B7B5B366B1A6008E5196605A55E89C3190DABF80B9F1163C979FCD18328DAE5E9048811B370107BB7715F82091BB9DE0E33EE2FED6255474F8769FCE5EAFAEEF1CB5A32E0D5C6C2F0FC0B3447072947F5B4C387666993A333FC06568E534AD56D2338D729' + p: "0x9286DBDA91ECCFC3060AA5598318E2A639F5BA90A4CA656157B2673FB191CD0589EE05F4CEF1BD13508408271458C30851CE7A4EF534742BFB11F4743C8F787B11193BA304C0E6BCA25701BF88AF1CB9B8FD4711D89F88E32B37D95316541BF1E5DBB4989B3DF13659B88C0F97A3C1087B9F2D5317D557DCD4AFC6D0A754E279", + q: "0xC966E9B3B8B7CDD82FF0F83AF87036C38F42238EC50A876CD390E43D67B6013F", + a: "0x7E9C3096676F51E3B2F9884CF0AC2156779496F410E049CED7E53D8B7B5B366B1A6008E5196605A55E89C3190DABF80B9F1163C979FCD18328DAE5E9048811B370107BB7715F82091BB9DE0E33EE2FED6255474F8769FCE5EAFAEEF1CB5A32E0D5C6C2F0FC0B3447072947F5B4C387666993A333FC06568E534AD56D2338D729" }, - 'X-C': { + "X-C": { modulusLength: 1024, - p: '0xB194036ACE14139D36D64295AE6C50FC4B7D65D8B340711366CA93F383653908EE637BE428051D86612670AD7B402C09B820FA77D9DA29C8111A8496DA6C261A53ED252E4D8A69A20376E6ADDB3BDCD331749A491A184B8FDA6D84C31CF05F9119B5ED35246EA4562D85928BA1136A8D0E5A7E5C764BA8902029A1336C631A1D', - q: '0x96120477DF0F3896628E6F4A88D83C93204C210FF262BCCB7DAE450355125259', - a: '0x3F1817052BAA7598FE3E4F4FC5C5F616E122CFF9EBD89EF81DC7CE8BF56CC64B43586C80F1C4F56DD5718FDD76300BE336784259CA25AADE5A483F64C02A20CF4A10F9C189C433DEFE31D263E6C9764660A731ECCAECB74C8279303731E8CF69205BC73E5A70BDF93E5BB681DAB4EEB9C733CAAB2F673C475E0ECA921D29782E' + p: "0xB194036ACE14139D36D64295AE6C50FC4B7D65D8B340711366CA93F383653908EE637BE428051D86612670AD7B402C09B820FA77D9DA29C8111A8496DA6C261A53ED252E4D8A69A20376E6ADDB3BDCD331749A491A184B8FDA6D84C31CF05F9119B5ED35246EA4562D85928BA1136A8D0E5A7E5C764BA8902029A1336C631A1D", + q: "0x96120477DF0F3896628E6F4A88D83C93204C210FF262BCCB7DAE450355125259", + a: "0x3F1817052BAA7598FE3E4F4FC5C5F616E122CFF9EBD89EF81DC7CE8BF56CC64B43586C80F1C4F56DD5718FDD76300BE336784259CA25AADE5A483F64C02A20CF4A10F9C189C433DEFE31D263E6C9764660A731ECCAECB74C8279303731E8CF69205BC73E5A70BDF93E5BB681DAB4EEB9C733CAAB2F673C475E0ECA921D29782E" } }; // /* - * BigInteger arithmetic tools - * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js - * - */ // + * BigInteger arithmetic tools + * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js + * + */ // // Bits per one element -var DB = 28, DM = (1 << DB) - 1, DV = 1 << DB, - FV = Math.pow(2, 52), F1 = 52 - DB, F2 = 2 * DB - 52; +var DB = 28, + DM = (1 << DB) - 1, + DV = 1 << DB, + FV = Math.pow(2, 52), + F1 = 52 - DB, + F2 = 2 * DB - 52; function am(y, i, x, w, j, c, n) { - var xl = x & 0x3fff, xh = x >> 14; + var xl = x & 0x3fff, + xh = x >> 14; while (--n >= 0) { var l = y[i] & 0x3fff; var h = y[i++] >> 14; @@ -212,8 +216,7 @@ function nbi(words) { } function copyTo(x, r) { - for (var i = x.t - 1; i >= 0; --i) - r[i] = x[i]; + for (var i = x.t - 1; i >= 0; --i) r[i] = x[i]; r.t = x.t; r.s = x.s; return r; @@ -225,13 +228,10 @@ function copy(x) { function setInt(x, i) { x.t = 1; - x.s = (i < 0) ? -1 : 0; - if (i > 0) - x[0] = i; - else if (i < -1) - x[0] = i + DV; - else - x.t = 0; + x.s = i < 0 ? -1 : 0; + if (i > 0) x[0] = i; + else if (i < -1) x[0] = i + DV; + else x.t = 0; return x; } @@ -241,17 +241,20 @@ function nbv(i) { return r; } -var ZERO = nbv(0), ONE = nbv(1), THREE = nbv(3); +var ZERO = nbv(0), + ONE = nbv(1), + THREE = nbv(3); function clamp(x) { var c = x.s & DM; - while (x.t > 0 && x[x.t - 1] === c) - --x.t; + while (x.t > 0 && x[x.t - 1] === c) --x.t; return x; } function subTo(x, a, r) { - var i = 0, c = 0, m = Math.min(a.t, x.t); + var i = 0, + c = 0, + m = Math.min(a.t, x.t); while (i < m) { c += x[i] - a[i]; r[i++] = c & DM; @@ -265,8 +268,7 @@ function subTo(x, a, r) { c >>= DB; } c += x.s; - } - else { + } else { c += x.s; while (i < a.t) { c -= a[i]; @@ -275,11 +277,9 @@ function subTo(x, a, r) { } c -= a.s; } - r.s = (c < 0) ? -1 : 0; - if (c < -1) - r[i++] = DV + c; - else if (c > 0) - r[i++] = c; + r.s = c < 0 ? -1 : 0; + if (c < -1) r[i++] = DV + c; + else if (c > 0) r[i++] = c; r.t = i; return clamp(r); } @@ -289,7 +289,9 @@ function sub(x, y) { } function addTo(x, a, r) { - var i = 0, c = 0, m = Math.min(a.t, x.t); + var i = 0, + c = 0, + m = Math.min(a.t, x.t); while (i < m) { c += x[i] + a[i]; r[i++] = c & DM; @@ -303,8 +305,7 @@ function addTo(x, a, r) { c >>= DB; } c += x.s; - } - else { + } else { c += x.s; while (i < a.t) { c += a[i]; @@ -313,11 +314,9 @@ function addTo(x, a, r) { } c += a.s; } - r.s = (c < 0) ? -1 : 0; - if (c > 0) - r[i++] = c; - else if (c < -1) - r[i++] = DV + c; + r.s = c < 0 ? -1 : 0; + if (c > 0) r[i++] = c; + else if (c < -1) r[i++] = DV + c; r.t = i; return clamp(r); } @@ -335,41 +334,38 @@ function neg(x) { } function absTo(x, r) { - return (x.s < 0) ? negTo(r) : copyTo(r); + return x.s < 0 ? negTo(r) : copyTo(r); } function abs(x) { - return (x.s < 0) ? neg(x) : x; + return x.s < 0 ? neg(x) : x; } function compare(x, a) { var r = x.s - a.s; - if (r !== 0) - return r; + if (r !== 0) return r; var i = x.t; r = i - a.t; - if (r !== 0) - return (x.s < 0) ? -r : r; - while (--i >= 0) - if ((r = x[i] - a[i]) !== 0) - return r; + if (r !== 0) return x.s < 0 ? -r : r; + while (--i >= 0) if ((r = x[i] - a[i]) !== 0) return r; return 0; } function equals(x, y) { - return(compare(x, y) === 0); + return compare(x, y) === 0; } function min(x, y) { - return(compare(x, y) < 0) ? x : y; + return compare(x, y) < 0 ? x : y; } function max(x, y) { - return(compare(x, y) > 0) ? x : y; + return compare(x, y) > 0 ? x : y; } function nbits(x) { - var r = 1, t; + var r = 1, + t; if ((t = x >>> 16) !== 0) { x = t; r += 16; @@ -395,17 +391,14 @@ function nbits(x) { function dshlTo(x, n, r) { var i; - for (i = x.t - 1; i >= 0; --i) - r[i + n] = x[i]; - for (i = n - 1; i >= 0; --i) - r[i] = 0; + for (i = x.t - 1; i >= 0; --i) r[i + n] = x[i]; + for (i = n - 1; i >= 0; --i) r[i] = 0; r.t = x.t + n; r.s = x.s; return r; } function dshrTo(x, n, r) { - for (var i = n; i < x.t; ++i) - r[i - n] = x[i]; + for (var i = n; i < x.t; ++i) r[i - n] = x[i]; r.t = Math.max(x.t - n, 0); r.s = x.s; return r; @@ -415,13 +408,14 @@ function shlTo(x, n, r) { var bs = n % DB; var cbs = DB - bs; var bm = (1 << cbs) - 1; - var ds = Math.floor(n / DB), c = (x.s << bs) & DM, i; + var ds = Math.floor(n / DB), + c = (x.s << bs) & DM, + i; for (i = x.t - 1; i >= 0; --i) { r[i + ds + 1] = (x[i] >> cbs) | c; c = (x[i] & bm) << bs; } - for (i = ds - 1; i >= 0; --i) - r[i] = 0; + for (i = ds - 1; i >= 0; --i) r[i] = 0; r[ds] = c; r.t = x.t + ds + 1; r.s = x.s; @@ -443,47 +437,39 @@ function shrTo(x, n, r) { r[i - ds - 1] |= (x[i] & bm) << cbs; r[i - ds] = x[i] >> bs; } - if (bs > 0) - r[x.t - ds - 1] |= (x.s & bm) << cbs; + if (bs > 0) r[x.t - ds - 1] |= (x.s & bm) << cbs; r.t = x.t - ds; return clamp(r); } function shl(x, n) { var r = nbi(x.t); - if (n < 0) - shrTo(x, -n, r); - else - shlTo(x, n, r); + if (n < 0) shrTo(x, -n, r); + else shlTo(x, n, r); return r; } function shr(x, n) { var r = nbi(x.t); - if (n < 0) - shlTo(x, -n, r); - else - shrTo(x, n, r); + if (n < 0) shlTo(x, -n, r); + else shrTo(x, n, r); return r; } function bitLength(x) { - if (x.t <= 0) - return 0; + if (x.t <= 0) return 0; return DB * (x.t - 1) + nbits(x[x.t - 1] ^ (x.s & DM)); } function mulTo(b, a, r) { - var x = abs(b), y = abs(a); + var x = abs(b), + y = abs(a); var i = x.t; r.t = i + y.t; - while (--i >= 0) - r[i] = 0; - for (i = 0; i < y.t; ++i) - r[i + x.t] = am(x, 0, y[i], r, i, 0, x.t); + while (--i >= 0) r[i] = 0; + for (i = 0; i < y.t; ++i) r[i + x.t] = am(x, 0, y[i], r, i, 0, x.t); r.s = 0; - if (b.s !== a.s) - subTo(ZERO, r, r); + if (b.s !== a.s) subTo(ZERO, r, r); return clamp(r); } @@ -493,9 +479,8 @@ function mul(x, y) { function sqrTo(a, r) { var x = abs(a); - var i = r.t = 2 * x.t; - while (--i >= 0) - r[i] = 0; + var i = (r.t = 2 * x.t); + while (--i >= 0) r[i] = 0; for (i = 0; i < x.t - 1; ++i) { var c = am(x, i, x[i], r, 2 * i, 0, 1); if ((r[i + x.t] += am(x, i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { @@ -503,8 +488,7 @@ function sqrTo(a, r) { r[i + x.t + 1] = 1; } } - if (r.t > 0) - r[r.t - 1] += am(x, i, x[i], r, 2 * i, 0, 1); + if (r.t > 0) r[r.t - 1] += am(x, i, x[i], r, 2 * i, 0, 1); r.s = 0; return clamp(r); } @@ -515,35 +499,35 @@ function sqr(a) { function divRemTo(n, m, q, r) { var pm = abs(m); - if (pm.t <= 0) - throw new OperationError('Division by zero'); + if (pm.t <= 0) throw new OperationError("Division by zero"); var pt = abs(n); if (pt.t < pm.t) { - if (q) - setInt(q, 0); - if (r) - copyTo(n, r); + if (q) setInt(q, 0); + if (r) copyTo(n, r); return q; } - if (!r) - r = nbi(m.t); - var y = nbi(m.t), ts = n.s, ms = m.s; + if (!r) r = nbi(m.t); + var y = nbi(m.t), + ts = n.s, + ms = m.s; var nsh = DB - nbits(pm[pm.t - 1]); if (nsh > 0) { shlTo(pm, nsh, y); shlTo(pt, nsh, r); - } - else { + } else { copyTo(pm, y); copyTo(pt, r); } var ys = y.t; var y0 = y[ys - 1]; - if (y0 === 0) - return q; - var yt = y0 * (1 << F1) + ((ys > 1) ? y[ys - 2] >> F2 : 0); - var d1 = FV / yt, d2 = (1 << F1) / yt, e = 1 << F2; - var i = r.t, j = i - ys, t = !q ? nbi(Math.max(n.t - m.t, 1)) : q; + if (y0 === 0) return q; + var yt = y0 * (1 << F1) + (ys > 1 ? y[ys - 2] >> F2 : 0); + var d1 = FV / yt, + d2 = (1 << F1) / yt, + e = 1 << F2; + var i = r.t, + j = i - ys, + t = !q ? nbi(Math.max(n.t - m.t, 1)) : q; dshlTo(y, j, t); if (compare(r, t) >= 0) { r[r.t++] = 1; @@ -551,35 +535,29 @@ function divRemTo(n, m, q, r) { } dshlTo(ONE, ys, t); subTo(t, y, y); - while (y.t < ys) - y[y.t++] = 0; + while (y.t < ys) y[y.t++] = 0; while (--j >= 0) { - var qd = (r[--i] === y0) ? DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); + var qd = r[--i] === y0 ? DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); if ((r[i] += am(y, 0, qd, r, j, 0, ys)) < qd) { dshlTo(y, j, t); subTo(r, t, r); - while (r[i] < --qd) - subTo(r, t, r); + while (r[i] < --qd) subTo(r, t, r); } } if (q) { dshrTo(r, ys, q); - if (ts !== ms) - subTo(ZERO, q, q); + if (ts !== ms) subTo(ZERO, q, q); } r.t = ys; clamp(r); - if (nsh > 0) - shrTo(r, nsh, r); - if (ts < 0) - subTo(ZERO, r, r); + if (nsh > 0) shrTo(r, nsh, r); + if (ts < 0) subTo(ZERO, r, r); return q; } function modTo(b, a, r) { divRemTo(abs(b), a, null, r); - if (b.s < 0 && compare(r, ZERO) > 0) - subTo(a, r, r); + if (b.s < 0 && compare(r, ZERO) > 0) subTo(a, r, r); return r; } @@ -592,8 +570,7 @@ function div(b, a) { } function isEven(x) { - - return ((x.t > 0) ? (x[0] & 1) : x.s) === 0; + return (x.t > 0 ? x[0] & 1 : x.s) === 0; } function isZero(x) { @@ -601,20 +578,20 @@ function isZero(x) { } function sig(x) { - if (x.s < 0) - return -1; - else if (x.t <= 0 || (x.t === 1 && x[0] <= 0)) - return 0; - else - return 1; + if (x.s < 0) return -1; + else if (x.t <= 0 || (x.t === 1 && x[0] <= 0)) return 0; + else return 1; } function invMod(x, m) { var ac = isEven(m); - if ((isEven(x) && ac) || sig(m) === 0) - return ZERO; - var u = copy(m), v = copy(x); - var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1); + if ((isEven(x) && ac) || sig(m) === 0) return ZERO; + var u = copy(m), + v = copy(x); + var a = nbv(1), + b = nbv(0), + c = nbv(0), + d = nbv(1); while (sig(u) !== 0) { while (isEven(u)) { shrTo(u, 1, u); @@ -624,9 +601,7 @@ function invMod(x, m) { subTo(b, m, b); } shrTo(a, 1, a); - } - else if (!isEven(b)) - subTo(b, m, b); + } else if (!isEven(b)) subTo(b, m, b); shrTo(b, 1, b); } while (isEven(v)) { @@ -637,43 +612,31 @@ function invMod(x, m) { subTo(d, m, d); } shrTo(c, 1, c); - } - else if (!isEven(d)) - subTo(d, m, d); + } else if (!isEven(d)) subTo(d, m, d); shrTo(d, 1, d); } if (compare(u, v) >= 0) { subTo(u, v, u); - if (ac) - subTo(a, c, a); + if (ac) subTo(a, c, a); subTo(b, d, b); - } - else { + } else { subTo(v, u, v); - if (ac) - subTo(c, a, c); + if (ac) subTo(c, a, c); subTo(d, b, d); } } - if (compare(v, ONE) !== 0) - return ZERO; - if (compare(d, m) >= 0) - return subtract(d, m); - if (sig(d) < 0) - addTo(d, m, d); - else - return d; - if (sig(d) < 0) - return add(d, m); - else - return d; + if (compare(v, ONE) !== 0) return ZERO; + if (compare(d, m) >= 0) return subtract(d, m); + if (sig(d) < 0) addTo(d, m, d); + else return d; + if (sig(d) < 0) return add(d, m); + else return d; } function testBit(x, n) { var j = Math.floor(n / DB); - if (j >= x.t) - return (x.s !== 0); - return ((x[j] & (1 << (n % DB))) !== 0); + if (j >= x.t) return x.s !== 0; + return (x[j] & (1 << n % DB)) !== 0; } function nothing(x) { @@ -681,15 +644,14 @@ function nothing(x) { } function extend(c, o) { - for (var i in o) - c.prototype[i] = o[i]; + for (var i in o) c.prototype[i] = o[i]; } // /* - * Classic, Barret, Mongomery reductions, optimized ExpMod algorithms - * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js - * - */ // + * Classic, Barret, Mongomery reductions, optimized ExpMod algorithms + * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js + * + */ // // Classic reduction var Classic = function (m) { @@ -698,10 +660,8 @@ var Classic = function (m) { extend(Classic, { convert: function (x) { - if (x.s < 0 || compare(x, this.m) >= 0) - return mod(x, this.m); - else - return x; + if (x.s < 0 || compare(x, this.m) >= 0) return mod(x, this.m); + else return x; }, revert: nothing, reduce: function (x) { @@ -718,17 +678,15 @@ extend(Classic, { }); function invDig(a) { - if (a.t < 1) - return 0; + if (a.t < 1) return 0; var x = a[0]; - if ((x & 1) === 0) - return 0; + if ((x & 1) === 0) return 0; var y = x & 3; y = (y * (2 - (x & 0xf) * y)) & 0xf; y = (y * (2 - (x & 0xff) * y)) & 0xff; y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; - y = (y * (2 - x * y % DV)) % DV; - return (y > 0) ? DV - y : -y; + y = (y * (2 - ((x * y) % DV))) % DV; + return y > 0 ? DV - y : -y; } // Montgomery reduction @@ -747,8 +705,7 @@ extend(Montgomery, { var r = nbi(x.t); dshlTo(abs(x), this.m.t, r); divRemTo(r, this.m, null, r); - if (x.s < 0 && compare(r, ZERO) > 0) - subTo(this.m, r, r); + if (x.s < 0 && compare(r, ZERO) > 0) subTo(this.m, r, r); return r; }, // x/R mod m @@ -760,8 +717,7 @@ extend(Montgomery, { }, // x = x/R mod m (HAC 14.32) reduce: function (x) { - while (x.t <= this.mt2) - x[x.t++] = 0; + while (x.t <= this.mt2) x[x.t++] = 0; for (var i = 0; i < this.m.t; ++i) { var j = x[i] & 0x7fff; var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & DM; @@ -774,8 +730,7 @@ extend(Montgomery, { } clamp(x); dshrTo(x, this.m.t, x); - if (compare(x, this.m) >= 0) - subTo(x, this.m, x); + if (compare(x, this.m) >= 0) subTo(x, this.m, x); }, // r = "x^2/R mod m"; x != r sqrTo: function (x, r) { @@ -790,15 +745,12 @@ extend(Montgomery, { }); function dAddOffset(x, n, w) { - if (n === 0) - return; - while (x.t <= w) - x[x.t++] = 0; + if (n === 0) return; + while (x.t <= w) x[x.t++] = 0; x[w] += n; while (x[w] >= DV) { x[w] -= DV; - if (++w >= x.t) - x[x.t++] = 0; + if (++w >= x.t) x[x.t++] = 0; ++x[w]; } } @@ -807,24 +759,19 @@ function mulLowerTo(x, a, n, r) { var i = Math.min(x.t + a.t, n); r.s = 0; // assumes a,x >= 0 r.t = i; - while (i > 0) - r[--i] = 0; + while (i > 0) r[--i] = 0; var j; - for (j = r.t - x.t; i < j; ++i) - r[i + x.t] = am(x, 0, a[i], r, i, 0, x.t); - for (j = Math.min(a.t, n); i < j; ++i) - am(x, 0, a[i], r, i, 0, n - i); + for (j = r.t - x.t; i < j; ++i) r[i + x.t] = am(x, 0, a[i], r, i, 0, x.t); + for (j = Math.min(a.t, n); i < j; ++i) am(x, 0, a[i], r, i, 0, n - i); return clamp(r); } function mulUpperTo(x, a, n, r) { --n; - var i = r.t = x.t + a.t - n; + var i = (r.t = x.t + a.t - n); r.s = 0; // assumes a,x >= 0 - while (--i >= 0) - r[i] = 0; - for (i = Math.max(n - x.t, 0); i < a.t; ++i) - r[x.t + i - n] = am(x, n - i, a[i], r, 0, 0, x.t + i - n); + while (--i >= 0) r[i] = 0; + for (i = Math.max(n - x.t, 0); i < a.t; ++i) r[x.t + i - n] = am(x, n - i, a[i], r, 0, 0, x.t + i - n); clamp(r); return dshrTo(r, 1, r); } @@ -841,10 +788,8 @@ function Barrett(m) { extend(Barrett, { convert: function (x) { - if (x.s < 0 || x.t > 2 * this.m.t) - return mod(x, this.m); - else if (compare(x, this.m) < 0) - return x; + if (x.s < 0 || x.t > 2 * this.m.t) return mod(x, this.m); + else if (compare(x, this.m) < 0) return x; else { var r = nbi(x.t); copyTo(x, r); @@ -864,11 +809,9 @@ extend(Barrett, { } mulUpperTo(this.mu, this.r2, this.m.t + 1, this.q3); mulLowerTo(this.m, this.q3, this.m.t + 1, this.r2); - while (compare(x, this.r2) < 0) - dAddOffset(x, 1, this.m.t + 1); + while (compare(x, this.r2) < 0) dAddOffset(x, 1, this.m.t + 1); subTo(x, this.r2, x); - while (compare(x, this.m) >= 0) - subTo(x, this.m, x); + while (compare(x, this.m) >= 0) subTo(x, this.m, x); }, // r = x^2 mod m; x != r sqrTo: function (x, r) { @@ -880,33 +823,29 @@ extend(Barrett, { mulTo(x, y, r); this.reduce(r); } - }); // x^e % m (HAC 14.85) function expMod(x, e, m) { - var i = bitLength(e), k, r = nbv(1), z; - if (i <= 0) - return r; - else if (i < 18) - k = 1; - else if (i < 48) - k = 3; - else if (i < 144) - k = 4; - else if (i < 768) - k = 5; - else - k = 6; - if (i < 8) - z = new Classic(m); - else if (isEven(m)) - z = new Barrett(m); - else - z = new Montgomery(m); + var i = bitLength(e), + k, + r = nbv(1), + z; + if (i <= 0) return r; + else if (i < 18) k = 1; + else if (i < 48) k = 3; + else if (i < 144) k = 4; + else if (i < 768) k = 5; + else k = 6; + if (i < 8) z = new Classic(m); + else if (isEven(m)) z = new Barrett(m); + else z = new Montgomery(m); // precomputation - var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1; + var g = new Array(), + n = 3, + k1 = k - 1, + km = (1 << k) - 1; g[1] = z.convert(x); if (k > 1) { var g2 = nbi(m.t * 2); @@ -918,15 +857,17 @@ function expMod(x, e, m) { } } - var j = e.t - 1, w, is1 = true, r2 = nbi(m.t * 2), t; + var j = e.t - 1, + w, + is1 = true, + r2 = nbi(m.t * 2), + t; i = nbits(e[j]) - 1; while (j >= 0) { - if (i >= k1) - w = (e[j] >> (i - k1)) & km; + if (i >= k1) w = (e[j] >> (i - k1)) & km; else { w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); - if (j > 0) - w |= e[j - 1] >> (DB + i - k1); + if (j > 0) w |= e[j - 1] >> (DB + i - k1); } n = k; @@ -938,18 +879,17 @@ function expMod(x, e, m) { i += DB; --j; } - if (is1) { // ret == 1, don't bother squaring or multiplying it + if (is1) { + // ret == 1, don't bother squaring or multiplying it copyTo(g[w], r); is1 = false; - } - else { + } else { while (n > 1) { z.sqrTo(r, r2); z.sqrTo(r2, r); n -= 2; } - if (n > 0) - z.sqrTo(r, r2); + if (n > 0) z.sqrTo(r, r2); else { t = r; r = r2; @@ -972,10 +912,10 @@ function expMod(x, e, m) { } // /* - * EC Field Elements, Points, Curves - * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/ec.js - * - */ // + * EC Field Elements, Points, Curves + * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/ec.js + * + */ // // EC Field Elemets function newFE(a, x) { @@ -997,15 +937,13 @@ function negFE(a) { function addFE(a, b) { var r = add(a, b); - if (compare(r, a.q) > 0) - subTo(r, a.q, r); + if (compare(r, a.q) > 0) subTo(r, a.q, r); return copyFE(a, r); } function subFE(a, b) { var r = sub(a, b); - if (r.s < 0) - addTo(a.q, r, r); + if (r.s < 0) addTo(a.q, r, r); return copyFE(a, r); } @@ -1036,20 +974,17 @@ function newEC(curve, x, y, z) { } function getX(point) { - if (!point.zinv) - point.zinv = invFE(point.z); + if (!point.zinv) point.zinv = invFE(point.z); return mulFE(point.x, point.zinv); } function getY(point) { - if (!point.zinv) - point.zinv = invFE(point.z); + if (!point.zinv) point.zinv = invFE(point.z); return mulFE(point.y, point.zinv); } function isInfinity(a) { - if ((!a.x) && (!a.y)) - return true; + if (!a.x && !a.y) return true; return isZero(a.z) && !isZero(a.y); } @@ -1058,17 +993,13 @@ function getInfinity(a) { } function equalsEC(a, b) { - if (a === b) - return true; - if (isInfinity(a)) - return isInfinity(b); - if (isInfinity(b)) - return isInfinity(a); + if (a === b) return true; + if (isInfinity(a)) return isInfinity(b); + if (isInfinity(b)) return isInfinity(a); var u, v; // u = Y2 * Z1 - Y1 * Z2 u = subFE(mulFE(b.y, a.z), mulFE(a.y, b.z)); - if (!isZero(u)) - return false; + if (!isZero(u)) return false; // v = X2 * Z1 - X1 * Z2 v = subFE(mulFE(b.x, a.z), mulFE(a.x, b.z)); return isZero(v); @@ -1079,10 +1010,8 @@ function negEC(a) { } function addEC(a, b) { - if (isInfinity(a)) - return b; - if (isInfinity(b)) - return a; + if (isInfinity(a)) return b; + if (isInfinity(b)) return a; // u = Y2 * Z1 - Y1 * Z2 var u = subFE(mulFE(b.y, a.z), mulFE(a.y, b.z)); @@ -1115,10 +1044,8 @@ function addEC(a, b) { } function twiceEC(b) { - if (isInfinity(b)) - return b; - if (sig(b.y) === 0) - return getInfinity(b); + if (isInfinity(b)) return b; + if (sig(b.y) === 0) return getInfinity(b); var x1 = b.x; var y1 = b.y; @@ -1145,10 +1072,8 @@ function twiceEC(b) { // Simple NAF (Non-Adjacent Form) multiplication algorithm function mulEC(a, k) { - if (isInfinity(a)) - return a; - if (sig(k) === 0) - return getInfinity(a); + if (isInfinity(a)) return a; + if (sig(k) === 0) return getInfinity(a); var e = k; var h = mul(e, THREE); @@ -1174,17 +1099,15 @@ function mulEC(a, k) { function mul2AndAddEC(a, k) { var nbits = bitLength(k); var R = a, - Q = getInfinity(a); + Q = getInfinity(a); for (var i = 0; i < nbits - 1; i++) { - if (testBit(k, i) === 1) - Q = addEC(Q, R); + if (testBit(k, i) === 1) Q = addEC(Q, R); R = twiceEC(R); } - if (testBit(k, nbits - 1) === 1) - Q = addEC(Q, R); + if (testBit(k, nbits - 1) === 1) Q = addEC(Q, R); return Q; } @@ -1192,10 +1115,8 @@ function mul2AndAddEC(a, k) { // Compute a*j + x*k (simultaneous multiplication) function mulTwoEC(a, j, x, k) { var i; - if (bitLength(j) > bitLength(k)) - i = bitLength(j) - 1; - else - i = bitLength(k) - 1; + if (bitLength(j) > bitLength(k)) i = bitLength(j) - 1; + else i = bitLength(k) - 1; var R = getInfinity(a); var both = addEC(a, x); @@ -1204,12 +1125,10 @@ function mulTwoEC(a, j, x, k) { if (testBit(j, i)) { if (testBit(k, i)) { R = addEC(R, both); - } - else { + } else { R = addEC(R, a); } - } - else { + } else { if (testBit(k, i)) { R = addEC(R, x); } @@ -1232,38 +1151,38 @@ function newCurve(q, a, b) { } // /* - * Converion tools (hex, binary) - * - */ // + * Converion tools (hex, binary) + * + */ // function atobi(d) { var k = 8; var a = new Uint8Array(d); - var r = nbi(a.length * 8 / DB); + var r = nbi((a.length * 8) / DB); r.t = 0; r.s = 0; var sh = 0; for (var i = 0, n = a.length; i < n; i++) { var x = a[i]; - if (sh === 0) - r[r.t++] = x; + if (sh === 0) r[r.t++] = x; else if (sh + k > DB) { r[r.t - 1] |= (x & ((1 << (DB - sh)) - 1)) << sh; - r[r.t++] = (x >> (DB - sh)); - } - else - r[r.t - 1] |= x << sh; + r[r.t++] = x >> (DB - sh); + } else r[r.t - 1] |= x << sh; sh += k; - if (sh >= DB) - sh -= DB; + if (sh >= DB) sh -= DB; } return clamp(r); } function bitoa(s, bitLength) { var k = 8; - var km = (1 << k) - 1, d, m = false, r = [], i = s.t; - var p = DB - (i * DB) % k; + var km = (1 << k) - 1, + d, + m = false, + r = [], + i = s.t; + var p = DB - ((i * DB) % k); if (i-- > 0) { if (p < DB && (d = s[i] >> p) > 0) { m = true; @@ -1273,67 +1192,60 @@ function bitoa(s, bitLength) { if (p < k) { d = (s[i] & ((1 << p) - 1)) << (k - p); d |= s[--i] >> (p += DB - k); - } - else { + } else { d = (s[i] >> (p -= k)) & km; if (p <= 0) { p += DB; --i; } } - if (d > 0) - m = true; - if (m) - r.push(d); + if (d > 0) m = true; + if (m) r.push(d); } } var r8 = new Uint8Array(bitLength ? bitLength / 8 : r.length); - if (m) - r8.set(r.reverse()); + if (m) r8.set(r.reverse()); return r8.buffer; } - function htobi(s) { - if (typeof s === 'number' || s instanceof Number) - return nbv(s); - s = s.replace(/[^\-A-Fa-f0-9]/g, ''); - if (!s) - s = '0'; + if (typeof s === "number" || s instanceof Number) return nbv(s); + s = s.replace(/[^\-A-Fa-f0-9]/g, ""); + if (!s) s = "0"; var k = 4; var r = nbi(s.length / 7); - var i = s.length, mi = false, sh = 0; + var i = s.length, + mi = false, + sh = 0; while (--i >= 0) { var c = s.charAt(i); - if (c === '-') { + if (c === "-") { mi = true; continue; } var x = parseInt(s.charAt(i), 16); mi = false; - if (sh === 0) - r[r.t++] = x; + if (sh === 0) r[r.t++] = x; else if (sh + k > DB) { r[r.t - 1] |= (x & ((1 << (DB - sh)) - 1)) << sh; - r[r.t++] = (x >> (DB - sh)); - } - else - r[r.t - 1] |= x << sh; + r[r.t++] = x >> (DB - sh); + } else r[r.t - 1] |= x << sh; sh += k; - if (sh >= DB) - sh -= DB; + if (sh >= DB) sh -= DB; } - if (mi) - subTo(ZERO, r, r); + if (mi) subTo(ZERO, r, r); return clamp(r); } function bitoh(x) { - if (x.s < 0) - return "-" + bitoh(negTo(x, nbi(x.t))); + if (x.s < 0) return "-" + bitoh(negTo(x, nbi(x.t))); var k = 4; - var km = (1 << k) - 1, d, m = false, r = "", i = x.t; - var p = DB - (i * DB) % k; + var km = (1 << k) - 1, + d, + m = false, + r = "", + i = x.t; + var p = DB - ((i * DB) % k); if (i-- > 0) { if (p < DB && (d = x[i] >> p) > 0) { m = true; @@ -1343,18 +1255,15 @@ function bitoh(x) { if (p < k) { d = (x[i] & ((1 << p) - 1)) << (k - p); d |= x[--i] >> (p += DB - k); - } - else { + } else { d = (x[i] >> (p -= k)) & km; if (p <= 0) { p += DB; --i; } } - if (d > 0) - m = true; - if (m) - r += d.toString(16); + if (d > 0) m = true; + if (m) r += d.toString(16); } } return "0x" + (m ? r : "0"); @@ -1362,30 +1271,28 @@ function bitoh(x) { // biginteger to big-endian integer bytearray function bitoi(s) { - var i = s.t, r = []; + var i = s.t, + r = []; r[0] = s.s; - var p = DB - (i * DB) % 8, d, k = 0; + var p = DB - ((i * DB) % 8), + d, + k = 0; if (i-- > 0) { - if (p < DB && (d = s[i] >> p) !== (s.s & DM) >> p) - r[k++] = d | (s.s << (DB - p)); + if (p < DB && (d = s[i] >> p) !== (s.s & DM) >> p) r[k++] = d | (s.s << (DB - p)); while (i >= 0) { if (p < 8) { d = (s[i] & ((1 << p) - 1)) << (8 - p); d |= s[--i] >> (p += DB - 8); - } - else { + } else { d = (s[i] >> (p -= 8)) & 0xff; if (p <= 0) { p += DB; --i; } } - if ((d & 0x80) !== 0) - d |= -256; - if (k === 0 && (s.s & 0x80) !== (d & 0x80)) - ++k; - if (k > 0 || d !== s.s) - r[k++] = d; + if ((d & 0x80) !== 0) d |= -256; + if (k === 0 && (s.s & 0x80) !== (d & 0x80)) ++k; + if (k > 0 || d !== s.s) r[k++] = d; } } return new Uint8Array(r).buffer; @@ -1393,78 +1300,68 @@ function bitoi(s) { // big-endian integer bytearray to biginteger function itobi(d) { - var k = 8, s = new Uint8Array(d), - r = nbi(s.length / 7); + var k = 8, + s = new Uint8Array(d), + r = nbi(s.length / 7); r.t = 0; r.s = 0; - var i = s.length, sh = 0; + var i = s.length, + sh = 0; while (--i >= 0) { var x = s[i] & 0xff; - if (sh === 0) - r[r.t++] = x; + if (sh === 0) r[r.t++] = x; else if (sh + k > DB) { r[r.t - 1] |= (x & ((1 << (DB - sh)) - 1)) << sh; - r[r.t++] = (x >> (DB - sh)); - } - else - r[r.t - 1] |= x << sh; + r[r.t++] = x >> (DB - sh); + } else r[r.t - 1] |= x << sh; sh += k; - if (sh >= DB) - sh -= DB; + if (sh >= DB) sh -= DB; } if ((s[0] & 0x80) !== 0) { r.s = -1; - if (sh > 0) - r[r.t - 1] |= ((1 << (DB - sh)) - 1) << sh; + if (sh > 0) r[r.t - 1] |= ((1 << (DB - sh)) - 1) << sh; } return clamp(r); } - // Swap bytes in buffer function swap(s) { var src = new Uint8Array(s), - dst = new Uint8Array(src.length); - for (var i = 0, n = src.length; i < n; i++) - dst[n - i - 1] = src[i]; + dst = new Uint8Array(src.length); + for (var i = 0, n = src.length; i < n; i++) dst[n - i - 1] = src[i]; return dst.buffer; } // Calculate hash of data function hash(d) { - if (this.hash) - d = this.hash.digest(d); + if (this.hash) d = this.hash.digest(d); // Swap hash for SignalCom - if (this.procreator === 'SC' || - (this.procreator === 'VN' && this.hash.version === 2012)) - d = swap(d); + if (this.procreator === "SC" || (this.procreator === "VN" && this.hash.version === 2012)) d = swap(d); return d; } // Check buffer function buffer(d) { - if (d instanceof CryptoOperationData) - return d; + if (d instanceof CryptoOperationData) return d; else if (d && d?.buffer instanceof CryptoOperationData) - return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength ? - d.buffer : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; - else - throw new DataError('CryptoOperationData or CryptoOperationDataView required'); + return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength + ? d.buffer + : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; + else throw new DataError("CryptoOperationData or CryptoOperationDataView required"); } // Check double buffer function to2(d) { var b = buffer(d); - if (b.byteLength % 2 > 0) - throw new DataError('Buffer length must be even'); + if (b.byteLength % 2 > 0) throw new DataError("Buffer length must be even"); var n = b.byteLength / 2; return [atobi(new Uint8Array(b, 0, n)), atobi(new Uint8Array(b, n, n))]; } function from2(x, y, bitLength) { var a = bitoa(x, bitLength), - b = bitoa(y, bitLength), - d = new Uint8Array(a.byteLength + b.byteLength); + b = bitoa(y, bitLength), + d = new Uint8Array(a.byteLength + b.byteLength); d.set(new Uint8Array(a)); d.set(new Uint8Array(b), a.byteLength); return d.buffer; @@ -1472,13 +1369,12 @@ function from2(x, y, bitLength) { function getSeed(length) { GostRandom = GostRandom || root.GostRandom; - var randomSource = GostRandom ? new (GostRandom || root.GostRandom) : rootCrypto; + var randomSource = GostRandom ? new (GostRandom || root.GostRandom)() : rootCrypto; if (randomSource.getRandomValues) { var d = new Uint8Array(Math.ceil(length / 8)); randomSource.getRandomValues(d); return d; - } else - throw new NotSupportedError('Random generator not found'); + } else throw new NotSupportedError("Random generator not found"); } // /** @@ -1493,9 +1389,8 @@ function getSeed(length) { * @param {(CryptoOperationData|TypedArray)} data Data * @returns {CryptoOperationData} Signature */ -function sign(privateKey, data) // -{ - +function sign(privateKey, data) { + // // Stage 1 var b = buffer(data); var alpha = atobi(hash.call(this, b)); @@ -1505,17 +1400,14 @@ function sign(privateKey, data) // // Stage 2 var e = mod(alpha, q); - if (isZero(e)) - e = ONE; + if (isZero(e)) e = ONE; var s = ZERO; while (isZero(s)) { var r = ZERO; while (isZero(r)) { - // Stage 3 - var k = mod(atobi(this.ukm || - getSeed(this.bitLength)), q); // pseudo random 0 < k < q + var k = mod(atobi(this.ukm || getSeed(this.bitLength)), q); // pseudo random 0 < k < q // Stage 4 if (this.curve) { // Gost R 34.10-2001 || Gost R 34.10-2012 @@ -1524,7 +1416,8 @@ function sign(privateKey, data) // r = mod(getX(C), q); } else { // Gost R 34.10-94 - var p = this.p, a = this.a; + var p = this.p, + a = this.a; r = mod(expMod(a, k, p), q); } } @@ -1536,7 +1429,7 @@ function sign(privateKey, data) // // console.log('r', bitoh(r)); var zetta; // Integer structure for SignalCom algorithm - if (this.procreator === 'SC') { + if (this.procreator === "SC") { zetta = { r: bitoh(r), s: bitoh(s) @@ -1544,8 +1437,7 @@ function sign(privateKey, data) // } else { zetta = from2(r, s, this.bitLength); // Swap bytes for CryptoPro algorithm - if (this.procreator === 'CP' || this.procreator === 'VN') - zetta = swap(zetta); + if (this.procreator === "CP" || this.procreator === "VN") zetta = swap(zetta); } return zetta; } // @@ -1563,33 +1455,29 @@ function sign(privateKey, data) // * @param {(CryptoOperationData|TypedArray)} data Data * @returns {boolean} Signature verified = true */ -function verify(publicKey, signature, data) // -{ - +function verify(publicKey, signature, data) { + // // Stage 1 var q = this.q; var r, s; // Ready int for SignalCom algorithm - if (this.procreator === 'SC') { + if (this.procreator === "SC") { r = htobi(signature.r); s = htobi(signature.s); } else { - if (this.procreator === 'CP' || this.procreator === 'VN') - signature = swap(signature); + if (this.procreator === "CP" || this.procreator === "VN") signature = swap(signature); var zetta = to2(signature); // Swap bytes for CryptoPro algorithm s = zetta[1]; // first 32 octets contain the big-endian representation of s r = zetta[0]; // and second 32 octets contain the big-endian representation of r } - if (compare(r, q) >= 0 || compare(s, q) >= 0) - return false; + if (compare(r, q) >= 0 || compare(s, q) >= 0) return false; // Stage 2 var b = buffer(data); var alpha = atobi(hash.call(this, b)); // Stage 3 var e = mod(alpha, q); - if (isZero(e) === 0) - e = ONE; + if (isZero(e) === 0) e = ONE; // Stage 4 var v = invMod(e, q); // Stage 5 @@ -1599,21 +1487,22 @@ function verify(publicKey, signature, data) // -{ +function generateKey() { + // var curve = this.curve; if (curve) { - var Q = curve.infinity; while (isInfinity(Q)) { - // Generate random private key var d = ZERO; if (this.ukm) { d = atobi(this.ukm); } else { - while (isZero(d)) - d = mod(atobi(getSeed(this.bitLength)), this.q); // 0 < d < q + while (isZero(d)) d = mod(atobi(getSeed(this.bitLength)), this.q); // 0 < d < q } // Calculate public key Q = mulEC(this.P, d); - var x = getX(Q), y = getY(Q); + var x = getX(Q), + y = getY(Q); // console.log('d', bitoh(d)); // console.log('x', bitoh(x)); // console.log('y', bitoh(y)); @@ -1657,9 +1544,7 @@ function generateKey() // privateKey: bitoa(d, this.bitLength), publicKey: from2(x, y, this.bitLength) // This corresponds to the binary representation of (256||256) }; - - } else - throw new NotSupportedError('Key generation for GOST R 34.10-94 not supported'); + } else throw new NotSupportedError("Key generation for GOST R 34.10-94 not supported"); } // /** @@ -1672,19 +1557,17 @@ function generateKey() // * @instance * @returns {Object} Object with two CryptoOperationData members: privateKey and publicKey */ -function generateMaskKey() // -{ +function generateMaskKey() { + // var curve = this.curve; if (curve) { // Generate random private key var d = ZERO; - while (isZero(d)) - d = mod(atobi(getSeed(this.bitLength)), this.q); // 0 < d < q + while (isZero(d)) d = mod(atobi(getSeed(this.bitLength)), this.q); // 0 < d < q // Return result return bitoa(d, this.bitLength); - } else - throw new NotSupportedError('Key generation for GOST R 34.10-94 not supported'); + } else throw new NotSupportedError("Key generation for GOST R 34.10-94 not supported"); } // /** @@ -1699,17 +1582,16 @@ function generateMaskKey() // * @param {(CryptoOperationData|TypedArray)} data Wrapped key * @returns {Object} CryptoOperationData unwrapped privateKey */ -function unwrapKey(baseKey, data) // -{ +function unwrapKey(baseKey, data) { + // var curve = this.curve; if (curve) { var q = this.q; var x = mod(atobi(buffer(data)), q); var y = mod(atobi(buffer(baseKey)), q); - var z = this.procreator === 'VN' ? mod(mul(x, y), q) : mod(mul(x, invMod(y, q)), q); + var z = this.procreator === "VN" ? mod(mul(x, y), q) : mod(mul(x, invMod(y, q)), q); return bitoa(z); - } else - throw new NotSupportedError('Key wrapping GOST R 34.10-94 not supported'); + } else throw new NotSupportedError("Key wrapping GOST R 34.10-94 not supported"); } // /** @@ -1724,17 +1606,16 @@ function unwrapKey(baseKey, data) // * @param {(CryptoOperationData|TypedArray)} data Key * @returns {Object} CryptoOperationData unwrapped privateKey */ -function wrapKey(baseKey, data) // -{ +function wrapKey(baseKey, data) { + // var curve = this.curve; if (curve) { var q = this.q; var x = mod(atobi(buffer(data)), q); var y = mod(atobi(buffer(baseKey)), q); - var z = this.procreator === 'VN' ? mod(mul(x, invMod(y, q)), q) : mod(mul(x, y), q); + var z = this.procreator === "VN" ? mod(mul(x, invMod(y, q)), q) : mod(mul(x, y), q); return bitoa(z); - } else - throw new NotSupportedError('Key wrapping GOST R 34.10-94 not supported'); + } else throw new NotSupportedError("Key wrapping GOST R 34.10-94 not supported"); } // /** @@ -1747,10 +1628,10 @@ function wrapKey(baseKey, data) // * @param {CryptoOperationData} baseKey Key for deriviation * @returns {CryptoOperationData} */ -function derive(baseKey) // -{ - - var k, ukm = atobi(this.ukm); +function derive(baseKey) { + // + var k, + ukm = atobi(this.ukm); var q = this.q; var x = mod(atobi(buffer(baseKey)), q); @@ -1765,14 +1646,18 @@ function derive(baseKey) // // UKM*x - x multiplied by UKM as integers // x.P - a multiple point var K = mulEC(this.peer_Q, mod(mul(ukm, x), q)); - k = from2(getX(K), getY(K), // This corresponds to the binary representation of (256||256) - this.bitLength); + k = from2( + getX(K), + getY(K), // This corresponds to the binary representation of (256||256) + this.bitLength + ); } else { // 1) Let K(x,y) = a^(x*y) (mod p), where // x - sender’s private key, a^x - sender’s public key // y - recipient’s private key, a^y - recipient’s public key // a, p - parameters - var p = this.p, a = this.a; + var p = this.p, + a = this.a; k = bitoa(expMod(this.peer_y, x, p)); } // 2) Calculate a 256-bit hash of K(x,y,UKM): @@ -1792,13 +1677,13 @@ function derive(baseKey) // * @param {number} length output bit-length * @returns {CryptoOperationData} result */ -function deriveBits(baseKey, length) // -{ +function deriveBits(baseKey, length) { + // if (length < 8 || length > this.bitLength || length % 8 > 0) - throw new DataError('Length must be no more than ' + this.bitLength + ' bits and multiple of 8'); + throw new DataError("Length must be no more than " + this.bitLength + " bits and multiple of 8"); var n = length / 8, - b = derive.call(this, baseKey), - r = new Uint8Array(n); + b = derive.call(this, baseKey), + r = new Uint8Array(n); r.set(new Uint8Array(b, 0, n)); return r.buffer; @@ -1819,16 +1704,15 @@ function deriveBits(baseKey, length) // * @param {(CryptoOperationData|TypedArray)} baseKey Key for deriviation * @returns {CryptoOperationData} result */ -function deriveKey(baseKey) // -{ +function deriveKey(baseKey) { + // var b = derive.call(this, baseKey), - r = new Uint8Array(32); + r = new Uint8Array(32); r.set(new Uint8Array(b, 0, 32)); return r.buffer; } // - /** * Gost R 34.10 universal object

    * @@ -1901,31 +1785,35 @@ function deriveKey(baseKey) // * @class GostSign * @param {AlgorithmIndentifier} algorithm */ -function GostSign(algorithm) // -{ +function GostSign(algorithm) { + // algorithm = algorithm || {}; - this.name = (algorithm.name || 'GOST R 34.10') + '-' + - ((algorithm.version || 2012) % 100) + '-' + (algorithm.length || 256) + - (((algorithm.mode || 'SIGN') !== 'SIGN') ? '-' + algorithm.mode : '') + - (typeof algorithm.namedParam === 'string' ? '/' + algorithm.namedParam : '') + - (typeof algorithm.namedCurve === 'string' ? '/' + algorithm.namedCurve : '') + - (typeof algorithm.sBox === 'string' ? '/' + algorithm.sBox : ''); + this.name = + (algorithm.name || "GOST R 34.10") + + "-" + + ((algorithm.version || 2012) % 100) + + "-" + + (algorithm.length || 256) + + ((algorithm.mode || "SIGN") !== "SIGN" ? "-" + algorithm.mode : "") + + (typeof algorithm.namedParam === "string" ? "/" + algorithm.namedParam : "") + + (typeof algorithm.namedCurve === "string" ? "/" + algorithm.namedCurve : "") + + (typeof algorithm.sBox === "string" ? "/" + algorithm.sBox : ""); var version = algorithm.version || 2012; // Functions - switch (algorithm.mode || 'SIGN') { - case 'SIGN': + switch (algorithm.mode || "SIGN") { + case "SIGN": this.sign = sign; this.verify = verify; this.generateKey = generateKey; break; - case 'DH': + case "DH": this.deriveBits = deriveBits; this.deriveKey = deriveKey; this.generateKey = generateKey; break; - case 'MASK': + case "MASK": this.wrapKey = wrapKey; this.unwrapKey = unwrapKey; this.generateKey = generateMaskKey; @@ -1936,31 +1824,28 @@ function GostSign(algorithm) // if (version === 1994) { // Named or parameters algorithm var param = algorithm.param; - if (!param) - param = GostParams[this.namedParam = (algorithm.namedParam || 'S-A').toUpperCase()]; + if (!param) param = GostParams[(this.namedParam = (algorithm.namedParam || "S-A").toUpperCase())]; this.modulusLength = algorithm.modulusLength || param.modulusLength || 1024; this.p = htobi(param.p); this.q = htobi(param.q); this.a = htobi(param.a); // Public key for derive - if (algorithm['public']) - this.peer_y = atobi(algorithm['public']); + if (algorithm["public"]) this.peer_y = atobi(algorithm["public"]); } else { // Named or parameters algorithm var param = algorithm.curve; - if (!param) - param = ECGostParams[this.namedCurve = (algorithm.namedCurve || 'S-256-A').toUpperCase()]; - var curve = this.curve = newCurve(htobi(param.p), htobi(param.a), htobi(param.b)); - this.P = newEC(curve, - newFE(curve, htobi(param.x)), - newFE(curve, htobi(param.y))); + if (!param) param = ECGostParams[(this.namedCurve = (algorithm.namedCurve || "S-256-A").toUpperCase())]; + var curve = (this.curve = newCurve(htobi(param.p), htobi(param.a), htobi(param.b))); + this.P = newEC(curve, newFE(curve, htobi(param.x)), newFE(curve, htobi(param.y))); this.q = htobi(param.q); // Public key for derive - if (algorithm['public']) { - var k2 = to2(algorithm['public']); - this.peer_Q = new newEC(this.curve, // This corresponds to the binary representation of (256||256) - newFE(this.curve, k2[0]), // first 32 octets contain the little-endian representation of x - newFE(this.curve, k2[1])); // and second 32 octets contain the little-endian representation of y. + if (algorithm["public"]) { + var k2 = to2(algorithm["public"]); + this.peer_Q = new newEC( + this.curve, // This corresponds to the binary representation of (256||256) + newFE(this.curve, k2[0]), // first 32 octets contain the little-endian representation of x + newFE(this.curve, k2[1]) + ); // and second 32 octets contain the little-endian representation of y. } } @@ -1968,21 +1853,15 @@ function GostSign(algorithm) // var hashLen, keyLen; if (this.curve) { keyLen = algorithm.length || bitLength(this.q); - if (keyLen > 508 && keyLen <= 512) - keyLen = 512; - else if (keyLen > 254 && keyLen <= 256) - keyLen = 256; - else - throw new NotSupportedError('Support keys only 256 or 512 bits length'); + if (keyLen > 508 && keyLen <= 512) keyLen = 512; + else if (keyLen > 254 && keyLen <= 256) keyLen = 256; + else throw new NotSupportedError("Support keys only 256 or 512 bits length"); hashLen = keyLen; } else { keyLen = algorithm.modulusLength || bitLength(this.p); - if (keyLen > 1016 && keyLen <= 1024) - keyLen = 1024; - else if (keyLen > 508 && keyLen <= 512) - keyLen = 512; - else - throw new NotSupportedError('Support keys only 512 or 1024 bits length'); + if (keyLen > 1016 && keyLen <= 1024) keyLen = 1024; + else if (keyLen > 508 && keyLen <= 512) keyLen = 512; + else throw new NotSupportedError("Support keys only 512 or 1024 bits length"); hashLen = 256; } this.bitLength = hashLen; @@ -1994,8 +1873,7 @@ function GostSign(algorithm) // // Hash function definition var hash = algorithm.hash; if (hash) { - if (typeof hash === 'string' || hash instanceof String) - hash = {name: hash}; + if (typeof hash === "string" || hash instanceof String) hash = { name: hash }; if (algorithm.version === 1994 || algorithm.version === 2001) { hash.version = 1994; hash.length = 256; @@ -2006,18 +1884,16 @@ function GostSign(algorithm) // } hash.procreator = hash.procreator || algorithm.procreator; - if (!GostDigest) - GostDigest = root.GostDigest; - if (!GostDigest) - throw new NotSupportedError('Object GostDigest not found'); + if (!GostDigest) GostDigest = root.GostDigest; + if (!GostDigest) throw new NotSupportedError("Object GostDigest not found"); this.hash = new GostDigest(hash); } // Pregenerated seed for key exchange algorithms - if (algorithm.ukm) // Now don't check size + if (algorithm.ukm) + // Now don't check size this.ukm = algorithm.ukm; - } // export default GostSign; diff --git a/src/core/vendor/remove-exif.mjs b/src/core/vendor/remove-exif.mjs index 6c5c9e53..0f08b6b1 100644 --- a/src/core/vendor/remove-exif.mjs +++ b/src/core/vendor/remove-exif.mjs @@ -22,130 +22,128 @@ import Utils from "../Utils.mjs"; // Param jpeg should be a binaryArray export function removeEXIF(jpeg) { - // Convert binaryArray to char string - jpeg = Utils.byteArrayToChars(jpeg); - if (jpeg.slice(0, 2) != "\xff\xd8") { - throw ("Given data is not jpeg."); - } + // Convert binaryArray to char string + jpeg = Utils.byteArrayToChars(jpeg); + if (jpeg.slice(0, 2) != "\xff\xd8") { + throw "Given data is not jpeg."; + } - var segments = splitIntoSegments(jpeg); - if (segments[1].slice(0, 2) == "\xff\xe1" && - segments[1].slice(4, 10) == "Exif\x00\x00") { - segments = [segments[0]].concat(segments.slice(2)); - } else if (segments[2].slice(0, 2) == "\xff\xe1" && - segments[2].slice(4, 10) == "Exif\x00\x00") { - segments = segments.slice(0, 2).concat(segments.slice(3)); - } else { - throw ("Exif not found."); - } + var segments = splitIntoSegments(jpeg); + if (segments[1].slice(0, 2) == "\xff\xe1" && segments[1].slice(4, 10) == "Exif\x00\x00") { + segments = [segments[0]].concat(segments.slice(2)); + } else if (segments[2].slice(0, 2) == "\xff\xe1" && segments[2].slice(4, 10) == "Exif\x00\x00") { + segments = segments.slice(0, 2).concat(segments.slice(3)); + } else { + throw "Exif not found."; + } - var new_data = segments.join(""); + var new_data = segments.join(""); - // Convert back to binaryArray - new_data = Utils.strToCharcode(new_data); + // Convert back to binaryArray + new_data = Utils.strToCharcode(new_data); - return new_data; -}; + return new_data; +} function splitIntoSegments(data) { - if (data.slice(0, 2) != "\xff\xd8") { - throw ("Given data isn't JPEG."); - } - - var head = 2; - var segments = ["\xff\xd8"]; - while (true) { - if (data.slice(head, head + 2) == "\xff\xda") { - segments.push(data.slice(head)); - break; - } else { - var length = unpack(">H", data.slice(head + 2, head + 4))[0]; - var endPoint = head + length + 2; - segments.push(data.slice(head, endPoint)); - head = endPoint; + if (data.slice(0, 2) != "\xff\xd8") { + throw "Given data isn't JPEG."; } - if (head >= data.length) { - throw ("Wrong JPEG data."); + var head = 2; + var segments = ["\xff\xd8"]; + while (true) { + if (data.slice(head, head + 2) == "\xff\xda") { + segments.push(data.slice(head)); + break; + } else { + var length = unpack(">H", data.slice(head + 2, head + 4))[0]; + var endPoint = head + length + 2; + segments.push(data.slice(head, endPoint)); + head = endPoint; + } + + if (head >= data.length) { + throw "Wrong JPEG data."; + } } - } - return segments; + return segments; } function unpack(mark, str) { - if (typeof(str) != "string") { - throw ("'unpack' error. Got invalid type argument."); - } - var l = 0; - for (var markPointer = 1; markPointer < mark.length; markPointer++) { - if (mark[markPointer].toLowerCase() == "b") { - l += 1; - } else if (mark[markPointer].toLowerCase() == "h") { - l += 2; - } else if (mark[markPointer].toLowerCase() == "l") { - l += 4; - } else { - throw ("'unpack' error. Got invalid mark."); + if (typeof str != "string") { + throw "'unpack' error. Got invalid type argument."; } - } - - if (l != str.length) { - throw ("'unpack' error. Mismatch between symbol and string length. " + l + ":" + str.length); - } - - var littleEndian; - if (mark[0] == "<") { - littleEndian = true; - } else if (mark[0] == ">") { - littleEndian = false; - } else { - throw ("'unpack' error."); - } - var unpacked = []; - var strPointer = 0; - var p = 1; - var val = null; - var c = null; - var length = null; - var sliced = ""; - - while (c = mark[p]) { - if (c.toLowerCase() == "b") { - length = 1; - sliced = str.slice(strPointer, strPointer + length); - val = sliced.charCodeAt(0); - if ((c == "b") && (val >= 0x80)) { - val -= 0x100; - } - } else if (c == "H") { - length = 2; - sliced = str.slice(strPointer, strPointer + length); - if (littleEndian) { - sliced = sliced.split("").reverse().join(""); - } - val = sliced.charCodeAt(0) * 0x100 + - sliced.charCodeAt(1); - } else if (c.toLowerCase() == "l") { - length = 4; - sliced = str.slice(strPointer, strPointer + length); - if (littleEndian) { - sliced = sliced.split("").reverse().join(""); - } - val = sliced.charCodeAt(0) * 0x1000000 + - sliced.charCodeAt(1) * 0x10000 + - sliced.charCodeAt(2) * 0x100 + - sliced.charCodeAt(3); - if ((c == "l") && (val >= 0x80000000)) { - val -= 0x100000000; - } - } else { - throw ("'unpack' error. " + c); + var l = 0; + for (var markPointer = 1; markPointer < mark.length; markPointer++) { + if (mark[markPointer].toLowerCase() == "b") { + l += 1; + } else if (mark[markPointer].toLowerCase() == "h") { + l += 2; + } else if (mark[markPointer].toLowerCase() == "l") { + l += 4; + } else { + throw "'unpack' error. Got invalid mark."; + } } - unpacked.push(val); - strPointer += length; - p += 1; - } + if (l != str.length) { + throw "'unpack' error. Mismatch between symbol and string length. " + l + ":" + str.length; + } - return unpacked; + var littleEndian; + if (mark[0] == "<") { + littleEndian = true; + } else if (mark[0] == ">") { + littleEndian = false; + } else { + throw "'unpack' error."; + } + var unpacked = []; + var strPointer = 0; + var p = 1; + var val = null; + var c = null; + var length = null; + var sliced = ""; + + while ((c = mark[p])) { + if (c.toLowerCase() == "b") { + length = 1; + sliced = str.slice(strPointer, strPointer + length); + val = sliced.charCodeAt(0); + if (c == "b" && val >= 0x80) { + val -= 0x100; + } + } else if (c == "H") { + length = 2; + sliced = str.slice(strPointer, strPointer + length); + if (littleEndian) { + sliced = sliced.split("").reverse().join(""); + } + val = sliced.charCodeAt(0) * 0x100 + sliced.charCodeAt(1); + } else if (c.toLowerCase() == "l") { + length = 4; + sliced = str.slice(strPointer, strPointer + length); + if (littleEndian) { + sliced = sliced.split("").reverse().join(""); + } + val = + sliced.charCodeAt(0) * 0x1000000 + + sliced.charCodeAt(1) * 0x10000 + + sliced.charCodeAt(2) * 0x100 + + sliced.charCodeAt(3); + if (c == "l" && val >= 0x80000000) { + val -= 0x100000000; + } + } else { + throw "'unpack' error. " + c; + } + + unpacked.push(val); + strPointer += length; + p += 1; + } + + return unpacked; } diff --git a/src/node/File.mjs b/src/node/File.mjs index 7a38ba16..f4b2a50e 100644 --- a/src/node/File.mjs +++ b/src/node/File.mjs @@ -6,7 +6,6 @@ import { detectFileType } from "../core/lib/FileType.mjs"; - /** * FileShim * @@ -16,7 +15,6 @@ import { detectFileType } from "../core/lib/FileType.mjs"; * File doesn't write to disk, but it would be easy to do so with e.gfs.writeFile. */ class File { - /** * Constructor * @@ -26,8 +24,7 @@ class File { * @param {String} name (optional) - file name * @param {Object} stats (optional) - file stats e.g. lastModified */ - constructor(data, name="", stats={}) { - + constructor(data, name = "", stats = {}) { if (!Array.isArray(data)) { data = [data]; } @@ -70,7 +67,6 @@ class File { get lastModifiedDate() { return new Date(this.lastModified); } - } export default File; diff --git a/src/node/NodeDish.mjs b/src/node/NodeDish.mjs index ef9fd11a..dcfc8e7d 100644 --- a/src/node/NodeDish.mjs +++ b/src/node/NodeDish.mjs @@ -13,14 +13,12 @@ import Dish from "../core/Dish.mjs"; * Adds some helper functions and improves coercion for Node.js logging. */ class NodeDish extends Dish { - /** - * Create a Dish - * @param {any} inputOrDish - The dish input - * @param {String|Number} - The dish type, as enum or string - */ - constructor(inputOrDish=null, type=null) { - + * Create a Dish + * @param {any} inputOrDish - The dish input + * @param {String|Number} - The dish type, as enum or string + */ + constructor(inputOrDish = null, type = null) { // Allow `fs` file input: // Any node fs Buffers transformed to array buffer // Use Array.from as Uint8Array doesnt pass instanceof Array test @@ -38,7 +36,7 @@ class NodeDish extends Dish { * @param {*} args - any arguments for the operation * @returns {Dish} a new dish with the result of the operation. */ - apply(operation, args=null) { + apply(operation, args = null) { return operation(this, args); } @@ -78,7 +76,6 @@ class NodeDish extends Dish { valueOf() { return this.presentAs(Dish.typeEnum("number")); } - } export default NodeDish; diff --git a/src/node/NodeRecipe.mjs b/src/node/NodeRecipe.mjs index bad8fc27..7841d230 100644 --- a/src/node/NodeRecipe.mjs +++ b/src/node/NodeRecipe.mjs @@ -4,7 +4,7 @@ * @license Apache-2.0 */ -import {operations} from "./index.mjs"; +import { operations } from "./index.mjs"; import { sanitise } from "./apiUtils.mjs"; /** @@ -13,7 +13,6 @@ import { sanitise } from "./apiUtils.mjs"; * environment. */ class NodeRecipe { - /** * Recipe constructor * @param recipeConfig @@ -22,7 +21,6 @@ class NodeRecipe { this._parseConfig(recipeConfig); } - /** * Validate an ingredient & coerce to operation if necessary. * @param {String | Function | Object} ing @@ -42,10 +40,12 @@ class NodeRecipe { } else { throw new TypeError(`Couldn't find an operation with name '${ing}'.`); } - // CASE operation given. Check its a chef operation and check its not flowcontrol + // CASE operation given. Check its a chef operation and check its not flowcontrol } else if (typeof ing === "function") { if (ing.flowControl) { - throw new TypeError(`flowControl operations like ${ing.opName} are not currently allowed in recipes for chef.bake in the Node API`); + throw new TypeError( + `flowControl operations like ${ing.opName} are not currently allowed in recipes for chef.bake in the Node API` + ); } if (operations.includes(ing)) { @@ -53,11 +53,11 @@ class NodeRecipe { } else { throw new TypeError("Inputted function not a Chef operation."); } - // CASE: op, maybe with configuration + // CASE: op, maybe with configuration } else if (ing.op) { const sanitisedOp = this._validateIngredient(ing.op); if (ing.args) { - return {op: sanitisedOp, args: ing.args}; + return { op: sanitisedOp, args: ing.args }; } return sanitisedOp; } else { @@ -65,7 +65,6 @@ class NodeRecipe { } } - /** * Parse an opList from a recipeConfig and assign it to the recipe's opList. * @param {String | Function | String[] | Function[] | [String | Function]} recipeConfig @@ -91,8 +90,10 @@ class NodeRecipe { execute(dish) { return this.opList.reduce((prev, curr) => { // CASE where opList item is op and args - if (Object.prototype.hasOwnProperty.call(curr, "op") && - Object.prototype.hasOwnProperty.call(curr, "args")) { + if ( + Object.prototype.hasOwnProperty.call(curr, "op") + && Object.prototype.hasOwnProperty.call(curr, "args") + ) { return curr.op(prev, curr.args); } // CASE opList item is just op. diff --git a/src/node/api.mjs b/src/node/api.mjs index 0c9dd8a7..a19eaed1 100644 --- a/src/node/api.mjs +++ b/src/node/api.mjs @@ -10,11 +10,10 @@ import NodeDish from "./NodeDish.mjs"; import NodeRecipe from "./NodeRecipe.mjs"; -import OperationConfig from "../core/config/OperationConfig.json" assert {type: "json"}; +import OperationConfig from "../core/config/OperationConfig.json" assert { type: "json" }; import { sanitise, removeSubheadingsFromArray, sentenceToCamelCase } from "./apiUtils.mjs"; import ExcludedOperationError from "../core/errors/ExcludedOperationError.mjs"; - /** * transformArgs * @@ -29,7 +28,6 @@ import ExcludedOperationError from "../core/errors/ExcludedOperationError.mjs"; * @param {Object} newArgs - any inputted args */ function transformArgs(opArgsList, newArgs) { - if (newArgs && Array.isArray(newArgs)) { return newArgs; } @@ -47,8 +45,7 @@ function transformArgs(opArgsList, newArgs) { if (newArgs) { Object.keys(newArgs).map((key) => { const index = opArgs.findIndex((arg) => { - return arg.name.toLowerCase().replace(/ /g, "") === - key.toLowerCase().replace(/ /g, ""); + return arg.name.toLowerCase().replace(/ /g, "") === key.toLowerCase().replace(/ /g, ""); }); if (index > -1) { @@ -62,7 +59,7 @@ function transformArgs(opArgsList, newArgs) { } } else if (argument.type === "editableOption") { // takes key: "option", key: {name, val: "string"}, key: {name, val: [...]} - argument.value = typeof newArgs[key] === "string" ? newArgs[key]: newArgs[key].value; + argument.value = typeof newArgs[key] === "string" ? newArgs[key] : newArgs[key].value; } else { argument.value = newArgs[key]; } @@ -92,7 +89,6 @@ function transformArgs(opArgsList, newArgs) { }); } - /** * Ensure an input is a SyncDish object. * @param input @@ -109,7 +105,6 @@ function ensureIsDish(input) { } } - /** * prepareOp: transform args, make input the right type. * Also convert any Buffers to ArrayBuffers. @@ -122,10 +117,9 @@ function prepareOp(opInstance, input, args) { // Transform object-style args to original args array const transformedArgs = transformArgs(opInstance.args, args); const transformedInput = dish.get(opInstance.inputType); - return {transformedInput, transformedArgs}; + return { transformedInput, transformedArgs }; } - /** * createArgInfo * @@ -135,7 +129,7 @@ function prepareOp(opInstance, input, args) { * * @param {Operation} op - the operation to extract args from * @returns {{}} - arrays of options for args. -*/ + */ function createArgInfo(op) { const result = {}; op.args.forEach((a) => { @@ -148,12 +142,12 @@ function createArgInfo(op) { result[sentenceToCamelCase(a.name)] = { type: a.type, value: a.value, - toggleValues: removeSubheadingsFromArray(a.toggleValues), + toggleValues: removeSubheadingsFromArray(a.toggleValues) }; } else { result[sentenceToCamelCase(a.name)] = { type: a.type, - value: a.value, + value: a.value }; } }); @@ -161,7 +155,6 @@ function createArgInfo(op) { return result; } - /** * Wrap an operation to be consumed by node API. * Checks to see if run function is async or not. @@ -173,7 +166,6 @@ function createArgInfo(op) { * some type conversion logic */ export function _wrap(OpClass) { - // Check to see if class's run function is async. const opInstance = new OpClass(); const isAsync = opInstance.run.constructor.name === "AsyncFunction"; @@ -190,8 +182,8 @@ export function _wrap(OpClass) { * @returns {Promise} operation's output, on a Dish. * @throws {OperationError} if the operation throws one. */ - wrapped = async (input, args=null) => { - const {transformedInput, transformedArgs} = prepareOp(opInstance, input, args); + wrapped = async (input, args = null) => { + const { transformedInput, transformedArgs } = prepareOp(opInstance, input, args); // SPECIAL CASE for Magic. Other flowControl operations will // not work because the opList is not passed in. @@ -201,14 +193,14 @@ export function _wrap(OpClass) { const state = { progress: 0, dish: ensureIsDish(transformedInput), - opList: [opInstance], + opList: [opInstance] }; const updatedState = await opInstance.run(state); return new NodeDish({ value: updatedState.dish.value, - type: opInstance.outputType, + type: opInstance.outputType }); } @@ -216,7 +208,7 @@ export function _wrap(OpClass) { return new NodeDish({ value: result, - type: opInstance.outputType, + type: opInstance.outputType }); }; } else { @@ -227,12 +219,12 @@ export function _wrap(OpClass) { * @returns {SyncDish} operation's output, on a Dish. * @throws {OperationError} if the operation throws one. */ - wrapped = (input, args=null) => { - const {transformedInput, transformedArgs} = prepareOp(opInstance, input, args); + wrapped = (input, args = null) => { + const { transformedInput, transformedArgs } = prepareOp(opInstance, input, args); const result = opInstance.run(transformedInput, transformedArgs); return new NodeDish({ value: result, - type: opInstance.outputType, + type: opInstance.outputType }); }; } @@ -246,7 +238,6 @@ export function _wrap(OpClass) { return wrapped; } - /** * help: Give information about operations matching the given search term, * or inputted operation. @@ -299,11 +290,11 @@ export function help(input) { // sort results with name match first .sort((a, b) => { const aInt = a.nameMatch ? 1 : 0; - const bInt = b.nameMatch ? 1 : 0; + const bInt = b.nameMatch ? 1 : 0; return bInt - aInt; }) // extract just the hydrated config - .map(result => result.hydrated); + .map((result) => result.hydrated); if (matches && matches.length) { // console.log(`${matches.length} result${matches.length > 1 ? "s" : ""} found.`); @@ -314,7 +305,6 @@ export function help(input) { return null; } - /** * bake * @@ -325,12 +315,11 @@ export function help(input) { * @throws {TypeError} if invalid recipe given. */ export function bake(input, recipeConfig) { - const recipe = new NodeRecipe(recipeConfig); + const recipe = new NodeRecipe(recipeConfig); const dish = ensureIsDish(input); return recipe.execute(dish); } - /** * explainExcludedFunction * @@ -340,9 +329,11 @@ export function bake(input, recipeConfig) { export function _explainExcludedFunction(name) { /** * Throw new error type with useful message. - */ + */ const func = () => { - throw new ExcludedOperationError(`Sorry, the ${name} operation is not available in the Node.js version of CyberChef.`); + throw new ExcludedOperationError( + `Sorry, the ${name} operation is not available in the Node.js version of CyberChef.` + ); }; // Add opName prop so NodeRecipe can handle it, just like wrap does. func.opName = name; diff --git a/src/node/apiUtils.mjs b/src/node/apiUtils.mjs index 64688073..ac8b139d 100644 --- a/src/node/apiUtils.mjs +++ b/src/node/apiUtils.mjs @@ -6,7 +6,6 @@ * @license Apache-2.0 */ - /** * someName => Somename * @@ -26,7 +25,6 @@ const capitalise = function capitalise(str) { return `${str.charAt(0).toUpperCase()}${str.substr(1).toLowerCase()}`; }; - /** * SomeName => someName * @param {String} name - string to be altered @@ -45,10 +43,9 @@ export function decapitalise(str) { return `${str.charAt(0).toLowerCase()}${str.substr(1)}`; } - /** * Remove strings surrounded with [] from the given array. -*/ + */ export function removeSubheadingsFromArray(array) { if (Array.isArray(array)) { return array.filter((i) => { @@ -60,7 +57,6 @@ export function removeSubheadingsFromArray(array) { } } - /** * Remove spaces, make lower case. * @param str @@ -69,13 +65,13 @@ export function sanitise(str) { return str.replace(/ /g, "").toLowerCase(); } - /** * something like this => somethingLikeThis * ABC a sentence => ABCASentence -*/ + */ export function sentenceToCamelCase(str) { - return str.split(" ") + return str + .split(" ") .map((s, index) => { if (index === 0) { return decapitalise(s); diff --git a/src/node/config/excludedOperations.mjs b/src/node/config/excludedOperations.mjs index 9359475d..5970f20f 100644 --- a/src/node/config/excludedOperations.mjs +++ b/src/node/config/excludedOperations.mjs @@ -5,7 +5,7 @@ * @copyright Crown Copyright 2018 * @license Apache-2.0 */ -export default [ +export default [ // This functionality can be done more easily using JavaScript "Fork", "Merge", @@ -20,5 +20,5 @@ export default [ "JavaScriptParser", // Irrelevant in Node console - "SyntaxHighlighter", + "SyntaxHighlighter" ]; diff --git a/src/node/config/scripts/generateNodeIndex.mjs b/src/node/config/scripts/generateNodeIndex.mjs index 4e16fbeb..17baac8e 100644 --- a/src/node/config/scripts/generateNodeIndex.mjs +++ b/src/node/config/scripts/generateNodeIndex.mjs @@ -17,7 +17,7 @@ import * as operations from "../../../core/operations/index.mjs"; import { decapitalise } from "../../apiUtils.mjs"; import excludedOperations from "../excludedOperations.mjs"; -const includedOperations = Object.keys(operations).filter((op => excludedOperations.indexOf(op) === -1)); +const includedOperations = Object.keys(operations).filter((op) => excludedOperations.indexOf(op) === -1); const dir = path.join(`${process.cwd()}/src/node`); if (!fs.existsSync(dir)) { @@ -51,7 +51,7 @@ includedOperations.forEach((op) => { code += ` ${op} as core_${op},\n`; }); -code +=` +code += ` } from "../core/operations/index.mjs"; global.File = File; @@ -89,7 +89,7 @@ Object.keys(operations).forEach((op) => { code += `const ${decapitalise(op)} = chef.${decapitalise(op)};\n`; }); -code +=` +code += ` // Define array of all operations to create register for bake. const operations = [\n`; @@ -120,8 +120,4 @@ code += " ExcludedOperationError,\n"; code += " DishError,\n"; code += "};\n"; - -fs.writeFileSync( - path.join(dir, "./index.mjs"), - code -); +fs.writeFileSync(path.join(dir, "./index.mjs"), code); diff --git a/src/node/repl.mjs b/src/node/repl.mjs index 9846ff31..dedc99d5 100644 --- a/src/node/repl.mjs +++ b/src/node/repl.mjs @@ -10,7 +10,6 @@ import chef from "./index.mjs"; import repl from "repl"; - /* eslint no-console: ["off"] */ console.log(` @@ -23,7 +22,7 @@ console.log(` `); const replServer = repl.start({ - prompt: "chef > ", + prompt: "chef > " }); global.File = chef.File; @@ -33,4 +32,3 @@ Object.keys(chef).forEach((key) => { replServer.context[key] = chef[key]; } }); - diff --git a/src/web/App.mjs b/src/web/App.mjs index cce91b1e..d0d7810f 100755 --- a/src/web/App.mjs +++ b/src/web/App.mjs @@ -5,7 +5,7 @@ */ import Utils, { debounce } from "../core/Utils.mjs"; -import {fromBase64} from "../core/lib/Base64.mjs"; +import { fromBase64 } from "../core/lib/Base64.mjs"; import Manager from "./Manager.mjs"; import HTMLCategory from "./HTMLCategory.mjs"; import HTMLOperation from "./HTMLOperation.mjs"; @@ -13,13 +13,11 @@ import Split from "split.js"; import moment from "moment-timezone"; import cptable from "codepage"; - /** * HTML view for CyberChef responsible for building the web page and dealing with all user * interactions. */ class App { - /** * App constructor. * @@ -29,26 +27,25 @@ class App { * @param {Object} options - Default setting for app options. */ constructor(categories, operations, defaultFavourites, defaultOptions) { - this.categories = categories; - this.operations = operations; - this.dfavourites = defaultFavourites; - this.doptions = defaultOptions; - this.options = Object.assign({}, defaultOptions); + this.categories = categories; + this.operations = operations; + this.dfavourites = defaultFavourites; + this.doptions = defaultOptions; + this.options = Object.assign({}, defaultOptions); - this.manager = new Manager(this); + this.manager = new Manager(this); - this.baking = false; - this.autoBake_ = false; + this.baking = false; + this.autoBake_ = false; this.autoBakePause = false; - this.progress = 0; - this.ingId = 0; + this.progress = 0; + this.ingId = 0; - this.appLoaded = false; - this.workerLoaded = false; + this.appLoaded = false; + this.workerLoaded = false; this.waitersLoaded = false; } - /** * This function sets up the stage and creates listeners for all events. * @@ -71,7 +68,6 @@ class App { this.loaded(); } - /** * Fires once all setup activities have completed. * @@ -80,8 +76,8 @@ class App { loaded() { // Check that both the app and the worker have loaded successfully, and that // we haven't already loaded before attempting to remove the loading screen. - if (!this.workerLoaded || !this.appLoaded || !this.waitersLoaded || - !document.getElementById("loader-wrapper")) return; + if (!this.workerLoaded || !this.appLoaded || !this.waitersLoaded || !document.getElementById("loader-wrapper")) + return; // Load state from URI this.loadURIParams(this.uriParams); @@ -91,13 +87,16 @@ class App { // Wait for animations to complete then remove the preloader and loaded style // so that the animations for existing elements don't play again. - setTimeout(function() { - document.getElementById("loader-wrapper").remove(); - document.body.classList.remove("loaded"); + setTimeout( + function () { + document.getElementById("loader-wrapper").remove(); + document.body.classList.remove("loaded"); - // Bake initial input - this.manager.input.bakeAll(); - }.bind(this), 1000); + // Bake initial input + this.manager.input.bakeAll(); + }.bind(this), + 1000 + ); // Clear the loading message interval clearInterval(window.loadingMsgsInt); @@ -111,7 +110,6 @@ class App { this.manager.output.calcMaxTabs(); } - /** * An error handler for displaying the error to the user. * @@ -124,14 +122,13 @@ class App { this.alert(Utils.escapeHtml(msg), this.options.errorTimeout, !this.options.showErrors); } - /** * Asks the ChefWorker to bake the current input using the current recipe. * * @param {boolean} [step] - Set to true if we should only execute one operation instead of the * whole recipe. */ - bake(step=false) { + bake(step = false) { if (this.baking) return; // Reset attemptHighlight flag @@ -142,13 +139,12 @@ class App { this.manager.worker.bake( this.getRecipeConfig(), // The configuration of the recipe - this.options, // Options set by the user - this.progress, // The current position in the recipe - step // Whether or not to take one step or execute the whole recipe + this.options, // Options set by the user + this.progress, // The current position in the recipe + step // Whether or not to take one step or execute the whole recipe ); } - /** * Runs Auto Bake if it is set. */ @@ -169,7 +165,6 @@ class App { } } - /** * Executes the next step of the recipe. */ @@ -197,7 +192,6 @@ class App { }); } - /** * Runs a silent bake, forcing the browser to load and cache all the relevant JavaScript code needed * to do a real bake. @@ -217,7 +211,6 @@ class App { this.manager.worker.silentBake(recipeConfig); } - /** * Sets the user's input data. * @@ -239,7 +232,6 @@ class App { }); } - /** * Populates the operations accordion list with the categories and operations specified in the * view constructor. @@ -284,21 +276,23 @@ class App { const favCat = document.querySelector("#categories a"); favCat.appendChild(document.getElementById("edit-favourites")); favCat.setAttribute("data-help-title", "Favourite operations"); - favCat.setAttribute("data-help", `

    This category displays your favourite operations.

    + favCat.setAttribute( + "data-help", + `

    This category displays your favourite operations.

    • To add: drag an operation over the Favourites category
    • To reorder: Click on the 'Edit favourites' button and drag operations up and down in the list provided
    • To remove: Click on the 'Edit favourites' button and hit the delete button next to the operation you want to remove
    • -
    `); + ` + ); } - /** * Sets up the adjustable splitter to allow the user to resize areas of the page. * * @param {boolean} [minimise=false] - Set this flag if attempting to minimise frames to 0 width */ - initialiseSplitter(minimise=false) { + initialiseSplitter(minimise = false) { if (this.columnSplitter) this.columnSplitter.destroy(); if (this.ioSplitter) this.ioSplitter.destroy(); @@ -307,9 +301,15 @@ class App { minSize: minimise ? [0, 0, 0] : [240, 310, 450], gutterSize: 4, expandToMin: true, - onDrag: debounce(function() { - this.adjustComponentSizes(); - }, 50, "dragSplitter", this, []) + onDrag: debounce( + function () { + this.adjustComponentSizes(); + }, + 50, + "dragSplitter", + this, + [] + ) }); this.ioSplitter = Split(["#input", "#output"], { @@ -321,7 +321,6 @@ class App { this.adjustComponentSizes(); } - /** * Loads the information previously saved to the HTML5 local storage object so that user options * and favourites can be restored. @@ -338,7 +337,6 @@ class App { this.loadFavourites(); } - /** * Loads the user's favourite operations from the HTML5 local storage object and populates the * Favourites category with them. @@ -348,16 +346,14 @@ class App { let favourites; if (this.isLocalStorageAvailable()) { - favourites = localStorage?.favourites?.length > 2 ? - JSON.parse(localStorage.favourites) : - this.dfavourites; + favourites = localStorage?.favourites?.length > 2 ? JSON.parse(localStorage.favourites) : this.dfavourites; favourites = this.validFavourites(favourites); this.saveFavourites(favourites); } else { favourites = this.dfavourites; } - const favCat = this.categories.filter(function(c) { + const favCat = this.categories.filter(function (c) { return c.name === "Favourites"; })[0]; @@ -371,7 +367,6 @@ class App { } } - /** * Filters the list of favourite operations that the user had stored and removes any that are no * longer available. The user is notified if this is the case. @@ -385,14 +380,15 @@ class App { if (favourites[i] in this.operations) { validFavs.push(favourites[i]); } else { - this.alert(`The operation "${Utils.escapeHtml(favourites[i])}" is no longer available. ` + - "It has been removed from your favourites."); + this.alert( + `The operation "${Utils.escapeHtml(favourites[i])}" is no longer available. ` + + "It has been removed from your favourites." + ); } } return validFavs; } - /** * Saves a list of favourite operations to the HTML5 local storage object. * @@ -410,7 +406,6 @@ class App { localStorage.setItem("favourites", JSON.stringify(this.validFavourites(favourites))); } - /** * Resets favourite operations back to the default as specified in the view constructor and * refreshes the operation list. @@ -422,7 +417,6 @@ class App { this.manager.recipe.initialiseOperationDragNDrop(); } - /** * Adds an operation to the user's favourites. * @@ -453,9 +447,7 @@ class App { // We prefer getting the hash by splitting the href rather than referencing // location.hash as some browsers (Firefox) automatically URL decode it, // which cause issues. - const params = window.location.search || - window.location.href.split("#")[1] || - window.location.hash; + const params = window.location.search || window.location.href.split("#")[1] || window.location.hash; const parsedParams = Utils.parseURIParams(params); return parsedParams; } @@ -470,7 +462,7 @@ class App { * @param {Object} params * @fires Manager#statechange */ - loadURIParams(params=this.getURIParams()) { + loadURIParams(params = this.getURIParams()) { this.autoBakePause = true; this.uriParams = params; @@ -542,7 +534,6 @@ class App { window.dispatchEvent(this.manager.statechange); } - /** * Returns the next ingredient ID and increments it for next time. * @@ -552,7 +543,6 @@ class App { return this.ingId++; } - /** * Gets the current recipe configuration. * @@ -562,7 +552,6 @@ class App { return this.manager.recipe.getConfig(); } - /** * Given a recipe configuration, sets the recipe to that configuration. * @@ -590,8 +579,9 @@ class App { } else if (args[j].classList.contains("toggle-string")) { // toggleString args[j].value = recipeConfig[i].args[j].string; - args[j].parentNode.parentNode.querySelector("button").innerHTML = - Utils.escapeHtml(recipeConfig[i].args[j].option); + args[j].parentNode.parentNode.querySelector("button").innerHTML = Utils.escapeHtml( + recipeConfig[i].args[j].option + ); } else { // all others args[j].value = recipeConfig[i].args[j]; @@ -615,7 +605,6 @@ class App { this.autoBakePause = false; } - /** * Resets the splitter positions to default. */ @@ -635,7 +624,6 @@ class App { this.manager.controls.calcControlsHeight(); } - /** * Sets the compile message. */ @@ -646,7 +634,7 @@ class App { timeSinceCompile = moment.duration(msSinceCompile, "milliseconds").humanize(); // Calculate previous version to compare to - const prev = PKG_VERSION.split(".").map(n => { + const prev = PKG_VERSION.split(".").map((n) => { return parseInt(n, 10); }); if (prev[2] > 0) prev[2]--; @@ -665,10 +653,12 @@ class App { notice.innerHTML = compileInfo; notice.setAttribute("title", Utils.stripHtmlTags(window.compileMessage)); notice.setAttribute("data-help-title", "Last build"); - notice.setAttribute("data-help", "This live version of CyberChef is updated whenever new commits are added to the master branch of the CyberChef repository. It represents the latest, most up-to-date build of CyberChef."); + notice.setAttribute( + "data-help", + "This live version of CyberChef is updated whenever new commits are added to the master branch of the CyberChef repository. It represents the latest, most up-to-date build of CyberChef." + ); } - /** * Determines whether the browser supports Local Storage and if it is accessible. * @@ -684,7 +674,6 @@ class App { } } - /** * Pops up a message to the user and writes it to the console log. * @@ -702,7 +691,7 @@ class App { * // Pops up a box with the message "Happy Christmas!" that will disappear after 5 seconds. * this.alert("Happy Christmas!", 5000); */ - alert(str, timeout=0, silent=false) { + alert(str, timeout = 0, silent = false) { const time = new Date(); log.info("[" + time.toLocaleString() + "] " + str); @@ -718,7 +707,6 @@ class App { }); } - /** * Pops up a box asking the user a question and sending the answer to a specified callback function. * @@ -743,28 +731,42 @@ class App { document.getElementById("confirm-modal").style.display = "block"; this.confirmClosed = false; - $("#confirm-modal").modal() - .one("show.bs.modal", function(e) { - this.confirmClosed = false; - }.bind(this)) - .one("click", "#confirm-yes", function() { - this.confirmClosed = true; - callback.bind(scope)(true); - $("#confirm-modal").modal("hide"); - }.bind(this)) - .one("click", "#confirm-no", function() { - this.confirmClosed = true; - callback.bind(scope)(false); - }.bind(this)) - .one("hide.bs.modal", function(e) { - if (!this.confirmClosed) { - callback.bind(scope)(undefined); - } - this.confirmClosed = true; - }.bind(this)); + $("#confirm-modal") + .modal() + .one( + "show.bs.modal", + function (e) { + this.confirmClosed = false; + }.bind(this) + ) + .one( + "click", + "#confirm-yes", + function () { + this.confirmClosed = true; + callback.bind(scope)(true); + $("#confirm-modal").modal("hide"); + }.bind(this) + ) + .one( + "click", + "#confirm-no", + function () { + this.confirmClosed = true; + callback.bind(scope)(false); + }.bind(this) + ) + .one( + "hide.bs.modal", + function (e) { + if (!this.confirmClosed) { + callback.bind(scope)(undefined); + } + this.confirmClosed = true; + }.bind(this) + ); } - /** * Handler for CyerChef statechange events. * Fires whenever the input or recipe changes in any way. @@ -773,14 +775,19 @@ class App { * @param {event} e */ stateChange(e) { - debounce(function() { - this.progress = 0; - this.autoBake(); - this.updateURL(true, null, true); - }, 20, "stateChange", this, [])(); + debounce( + function () { + this.progress = 0; + this.autoBake(); + this.updateURL(true, null, true); + }, + 20, + "stateChange", + this, + [] + )(); } - /** * Update the page title and URL to contain the new recipe * @@ -788,7 +795,7 @@ class App { * @param {string} [input=null] * @param {boolean} [changeUrl=true] */ - updateURL(includeInput, input=null, changeUrl=true) { + updateURL(includeInput, input = null, changeUrl = true) { // Set title const recipeConfig = this.getRecipeConfig(); let title = "CyberChef"; @@ -796,7 +803,7 @@ class App { title = `${recipeConfig[0].op} - ${title}`; } else if (recipeConfig.length > 1) { // See how long the full recipe is - const ops = recipeConfig.map(op => op.op).join(", "); + const ops = recipeConfig.map((op) => op.op).join(", "); if (ops.length < 45) { title = `${ops} - ${title}`; } else { @@ -813,7 +820,6 @@ class App { } } - /** * Handler for the history popstate event. * Reloads parameters from the URL. @@ -823,7 +829,6 @@ class App { popState(e) { this.loadURIParams(); } - } export default App; diff --git a/src/web/HTMLCategory.mjs b/src/web/HTMLCategory.mjs index 0414fd71..02e25bbb 100755 --- a/src/web/HTMLCategory.mjs +++ b/src/web/HTMLCategory.mjs @@ -8,7 +8,6 @@ * Object to handle the creation of operation categories. */ class HTMLCategory { - /** * HTMLCategory constructor. * @@ -21,7 +20,6 @@ class HTMLCategory { this.opList = []; } - /** * Adds an operation to this category. * @@ -31,7 +29,6 @@ class HTMLCategory { this.opList.push(operation); } - /** * Renders the category and all operations within it in HTML. * @@ -43,7 +40,7 @@ class HTMLCategory { ${this.name} -
    +
      `; for (let i = 0; i < this.opList.length; i++) { @@ -53,7 +50,6 @@ class HTMLCategory { html += "
    "; return html; } - } export default HTMLCategory; diff --git a/src/web/HTMLIngredient.mjs b/src/web/HTMLIngredient.mjs index 7eddb32c..d5da9266 100755 --- a/src/web/HTMLIngredient.mjs +++ b/src/web/HTMLIngredient.mjs @@ -10,7 +10,6 @@ import Utils from "../core/Utils.mjs"; * Object to handle the creation of operation ingredients. */ class HTMLIngredient { - /** * HTMLIngredient constructor. * @@ -35,12 +34,11 @@ class HTMLIngredient { this.ingId = this.app.nextIngId(); this.id = "ing-" + this.ingId; this.tabIndex = this.ingId + 2; // Input = 1, Search = 2 - this.min = (typeof config.min === "number") ? config.min : ""; - this.max = (typeof config.max === "number") ? config.max : ""; + this.min = typeof config.min === "number" ? config.min : ""; + this.max = typeof config.max === "number" ? config.max : ""; this.step = config.step || 1; } - /** * Renders the ingredient in HTML. * @@ -48,7 +46,9 @@ class HTMLIngredient { */ toHtml() { let html = "", - i, m, eventFn; + i, + m, + eventFn; switch (this.type) { case "string": @@ -184,18 +184,18 @@ class HTMLIngredient { } else if (this.value[i].name.match(/\[\/([a-z0-9 -()^]+)\]/i)) { html += ""; } else { - const val = this.type === "populateMultiOption" ? - JSON.stringify(this.value[i].value) : - this.value[i].value; + const val + = this.type === "populateMultiOption" + ? JSON.stringify(this.value[i].value) + : this.value[i].value; html += ``; } } html += ` `; - eventFn = this.type === "populateMultiOption" ? - this.populateMultiOptionChange : - this.populateOptionChange; + eventFn + = this.type === "populateMultiOption" ? this.populateMultiOptionChange : this.populateOptionChange; this.manager.addDynamicListener("#" + this.id, "change", eventFn, this); break; case "editableOption": @@ -314,7 +314,6 @@ class HTMLIngredient { return html; } - /** * Handler for populate option changes. * Populates the relevant argument with the specified value. @@ -338,7 +337,6 @@ class HTMLIngredient { this.manager.recipe.ingChange(); } - /** * Handler for populate multi option changes. * Populates the relevant arguments with the specified values. @@ -352,7 +350,7 @@ class HTMLIngredient { const el = e.target; const op = el.parentNode.parentNode; const args = op.querySelectorAll(".arg"); - const targets = this.target.map(i => args[i]); + const targets = this.target.map((i) => args[i]); const vals = JSON.parse(el.childNodes[el.selectedIndex].getAttribute("populate-value")); const evt = new Event("change"); @@ -369,7 +367,6 @@ class HTMLIngredient { } } - /** * Handler for editable option clicks. * Populates the input box with the selected value. @@ -390,7 +387,6 @@ class HTMLIngredient { this.manager.recipe.ingChange(); } - /** * Handler for argument selector changes. * Shows or hides the relevant arguments for this operation. @@ -416,7 +412,6 @@ class HTMLIngredient { } }); } - } export default HTMLIngredient; diff --git a/src/web/HTMLOperation.mjs b/src/web/HTMLOperation.mjs index ae61b58d..14033b73 100755 --- a/src/web/HTMLOperation.mjs +++ b/src/web/HTMLOperation.mjs @@ -8,12 +8,10 @@ import HTMLIngredient from "./HTMLIngredient.mjs"; import Utils from "../core/Utils.mjs"; import url from "url"; - /** * Object to handle the creation of operations. */ class HTMLOperation { - /** * HTMLOperation constructor. * @@ -23,15 +21,15 @@ class HTMLOperation { * @param {Manager} manager - The CyberChef event manager. */ constructor(name, config, app, manager) { - this.app = app; - this.manager = manager; + this.app = app; + this.manager = manager; - this.name = name; + this.name = name; this.description = config.description; - this.infoURL = config.infoURL; - this.manualBake = config.manualBake || false; - this.config = config; - this.ingList = []; + this.infoURL = config.infoURL; + this.manualBake = config.manualBake || false; + this.config = config; + this.ingList = []; for (let i = 0; i < config.args.length; i++) { const ing = new HTMLIngredient(config.args[i], this.app, this.manager); @@ -39,7 +37,6 @@ class HTMLOperation { } } - /** * Renders the operation in HTML as a stub operation with no ingredients. * @@ -67,7 +64,6 @@ class HTMLOperation { return html; } - /** * Renders the operation in HTML as a full operation with ingredients. * @@ -91,7 +87,6 @@ class HTMLOperation { return html; } - /** * Highlights searched strings in the name and description of the operation. * @@ -103,11 +98,10 @@ class HTMLOperation { let opName = "", pos = 0; - nameIdxs.forEach(idxs => { + nameIdxs.forEach((idxs) => { const [start, length] = idxs; if (typeof start !== "number") return; - opName += this.name.slice(pos, start) + "" + - this.name.slice(start, start + length) + ""; + opName += this.name.slice(pos, start) + "" + this.name.slice(start, start + length) + ""; pos = start + length; }); opName += this.name.slice(pos, this.name.length); @@ -122,7 +116,7 @@ class HTMLOperation { // If the search string occurs within an HTML tag, return without highlighting it. const inHTMLTag = descIdxs.reduce((acc, idxs) => { const start = idxs[0]; - return start >= match.index && start <= (match.index + match[0].length); + return start >= match.index && start <= match.index + match[0].length; }, false); if (inHTMLTag) return; @@ -131,20 +125,21 @@ class HTMLOperation { let desc = "", pos = 0; - descIdxs.forEach(idxs => { + descIdxs.forEach((idxs) => { const [start, length] = idxs; - desc += this.description.slice(pos, start) + "" + - this.description.slice(start, start + length) + ""; + desc + += this.description.slice(pos, start) + + "" + + this.description.slice(start, start + length) + + ""; pos = start + length; }); desc += this.description.slice(pos, this.description.length); this.description = desc; } } - } - /** * Given a URL for a Wikipedia (or other wiki) page, this function returns a link to that page. * diff --git a/src/web/Manager.mjs b/src/web/Manager.mjs index b02a7eee..7ce5218c 100755 --- a/src/web/Manager.mjs +++ b/src/web/Manager.mjs @@ -19,12 +19,10 @@ import BackgroundWorkerWaiter from "./waiters/BackgroundWorkerWaiter.mjs"; import TabWaiter from "./waiters/TabWaiter.mjs"; import TimingWaiter from "./waiters/TimingWaiter.mjs"; - /** * This object controls the Waiters responsible for handling events from all areas of the app. */ class Manager { - /** * Manager constructor. * @@ -37,43 +35,43 @@ class Manager { /** * @event Manager#appstart */ - this.appstart = new CustomEvent("appstart", {bubbles: true}); + this.appstart = new CustomEvent("appstart", { bubbles: true }); /** * @event Manager#apploaded */ - this.apploaded = new CustomEvent("apploaded", {bubbles: true}); + this.apploaded = new CustomEvent("apploaded", { bubbles: true }); /** * @event Manager#operationadd */ - this.operationadd = new CustomEvent("operationadd", {bubbles: true}); + this.operationadd = new CustomEvent("operationadd", { bubbles: true }); /** * @event Manager#operationremove */ - this.operationremove = new CustomEvent("operationremove", {bubbles: true}); + this.operationremove = new CustomEvent("operationremove", { bubbles: true }); /** * @event Manager#oplistcreate */ - this.oplistcreate = new CustomEvent("oplistcreate", {bubbles: true}); + this.oplistcreate = new CustomEvent("oplistcreate", { bubbles: true }); /** * @event Manager#statechange */ - this.statechange = new CustomEvent("statechange", {bubbles: true}); + this.statechange = new CustomEvent("statechange", { bubbles: true }); // Define Waiter objects to handle various areas - this.timing = new TimingWaiter(this.app, this); - this.worker = new WorkerWaiter(this.app, this); - this.window = new WindowWaiter(this.app); - this.controls = new ControlsWaiter(this.app, this); - this.recipe = new RecipeWaiter(this.app, this); - this.ops = new OperationsWaiter(this.app, this); - this.tabs = new TabWaiter(this.app, this); - this.input = new InputWaiter(this.app, this); - this.output = new OutputWaiter(this.app, this); - this.options = new OptionsWaiter(this.app, this); + this.timing = new TimingWaiter(this.app, this); + this.worker = new WorkerWaiter(this.app, this); + this.window = new WindowWaiter(this.app); + this.controls = new ControlsWaiter(this.app, this); + this.recipe = new RecipeWaiter(this.app, this); + this.ops = new OperationsWaiter(this.app, this); + this.tabs = new TabWaiter(this.app, this); + this.input = new InputWaiter(this.app, this); + this.output = new OutputWaiter(this.app, this); + this.options = new OptionsWaiter(this.app, this); this.highlighter = new HighlighterWaiter(this.app, this); - this.seasonal = new SeasonalWaiter(this.app, this); - this.bindings = new BindingsWaiter(this.app, this); - this.background = new BackgroundWorkerWaiter(this.app, this); + this.seasonal = new SeasonalWaiter(this.app, this); + this.bindings = new BindingsWaiter(this.app, this); + this.background = new BackgroundWorkerWaiter(this.app, this); // Object to store dynamic handlers to fire on elements that may not exist yet this.dynamicHandlers = {}; @@ -81,7 +79,6 @@ class Manager { this.initialiseEventListeners(); } - /** * Sets up the various components and listeners. */ @@ -103,8 +100,7 @@ class Manager { * Confirms that all Waiters have loaded correctly. */ confirmWaitersLoaded() { - if (this.tabs.getActiveTab("input") >= 0 && - this.tabs.getActiveTab("output") >= 0) { + if (this.tabs.getActiveTab("input") >= 0 && this.tabs.getActiveTab("output") >= 0) { log.debug("Waiters loaded"); this.app.waitersLoaded = true; this.app.loaded(); @@ -114,7 +110,6 @@ class Manager { } } - /** * Main function to handle the creation of the event listeners. */ @@ -128,37 +123,76 @@ class Manager { // Controls document.getElementById("bake").addEventListener("click", this.controls.bakeClick.bind(this.controls)); - document.getElementById("auto-bake").addEventListener("change", this.controls.autoBakeChange.bind(this.controls)); + document + .getElementById("auto-bake") + .addEventListener("change", this.controls.autoBakeChange.bind(this.controls)); document.getElementById("step").addEventListener("click", this.controls.stepClick.bind(this.controls)); - document.getElementById("clr-recipe").addEventListener("click", this.controls.clearRecipeClick.bind(this.controls)); + document + .getElementById("clr-recipe") + .addEventListener("click", this.controls.clearRecipeClick.bind(this.controls)); document.getElementById("save").addEventListener("click", this.controls.saveClick.bind(this.controls)); - document.getElementById("save-button").addEventListener("click", this.controls.saveButtonClick.bind(this.controls)); - document.getElementById("save-link-recipe-checkbox").addEventListener("change", this.controls.slrCheckChange.bind(this.controls)); - document.getElementById("save-link-input-checkbox").addEventListener("change", this.controls.sliCheckChange.bind(this.controls)); + document + .getElementById("save-button") + .addEventListener("click", this.controls.saveButtonClick.bind(this.controls)); + document + .getElementById("save-link-recipe-checkbox") + .addEventListener("change", this.controls.slrCheckChange.bind(this.controls)); + document + .getElementById("save-link-input-checkbox") + .addEventListener("change", this.controls.sliCheckChange.bind(this.controls)); document.getElementById("load").addEventListener("click", this.controls.loadClick.bind(this.controls)); - document.getElementById("load-delete-button").addEventListener("click", this.controls.loadDeleteClick.bind(this.controls)); - document.getElementById("load-name").addEventListener("change", this.controls.loadNameChange.bind(this.controls)); - document.getElementById("load-button").addEventListener("click", this.controls.loadButtonClick.bind(this.controls)); - document.getElementById("support").addEventListener("click", this.controls.supportButtonClick.bind(this.controls)); + document + .getElementById("load-delete-button") + .addEventListener("click", this.controls.loadDeleteClick.bind(this.controls)); + document + .getElementById("load-name") + .addEventListener("change", this.controls.loadNameChange.bind(this.controls)); + document + .getElementById("load-button") + .addEventListener("click", this.controls.loadButtonClick.bind(this.controls)); + document + .getElementById("support") + .addEventListener("click", this.controls.supportButtonClick.bind(this.controls)); this.addMultiEventListeners("#save-texts textarea", "keyup paste", this.controls.saveTextChange, this.controls); // Operations this.addMultiEventListener("#search", "keyup paste search", this.ops.searchOperations, this.ops); this.addDynamicListener(".op-list li.operation", "dblclick", this.ops.operationDblclick, this.ops); - document.getElementById("edit-favourites").addEventListener("click", this.ops.editFavouritesClick.bind(this.ops)); - document.getElementById("save-favourites").addEventListener("click", this.ops.saveFavouritesClick.bind(this.ops)); - document.getElementById("reset-favourites").addEventListener("click", this.ops.resetFavouritesClick.bind(this.ops)); + document + .getElementById("edit-favourites") + .addEventListener("click", this.ops.editFavouritesClick.bind(this.ops)); + document + .getElementById("save-favourites") + .addEventListener("click", this.ops.saveFavouritesClick.bind(this.ops)); + document + .getElementById("reset-favourites") + .addEventListener("click", this.ops.resetFavouritesClick.bind(this.ops)); this.addDynamicListener(".op-list", "oplistcreate", this.ops.opListCreate, this.ops); this.addDynamicListener("li.operation", "operationadd", this.recipe.opAdd, this.recipe); // Recipe this.addDynamicListener(".arg:not(select)", "input", this.recipe.ingChange, this.recipe); - this.addDynamicListener(".arg[type=checkbox], .arg[type=radio], select.arg", "change", this.recipe.ingChange, this.recipe); + this.addDynamicListener( + ".arg[type=checkbox], .arg[type=radio], select.arg", + "change", + this.recipe.ingChange, + this.recipe + ); this.addDynamicListener(".disable-icon", "click", this.recipe.disableClick, this.recipe); this.addDynamicListener(".breakpoint", "click", this.recipe.breakpointClick, this.recipe); this.addDynamicListener("#rec-list li.operation", "dblclick", this.recipe.operationDblclick, this.recipe); - this.addDynamicListener("#rec-list li.operation > div", "dblclick", this.recipe.operationChildDblclick, this.recipe); - this.addDynamicListener("#rec-list .dropdown-menu.toggle-dropdown a", "click", this.recipe.dropdownToggleClick, this.recipe); + this.addDynamicListener( + "#rec-list li.operation > div", + "dblclick", + this.recipe.operationChildDblclick, + this.recipe + ); + this.addDynamicListener( + "#rec-list .dropdown-menu.toggle-dropdown a", + "click", + this.recipe.dropdownToggleClick, + this.recipe + ); this.addDynamicListener("#rec-list", "operationremove", this.recipe.opRemove.bind(this.recipe)); this.addDynamicListener("textarea.arg", "dragover", this.recipe.textArgDragover, this.recipe); this.addDynamicListener("textarea.arg", "dragleave", this.recipe.textArgDragLeave, this.recipe); @@ -169,64 +203,142 @@ class Manager { this.addListeners("#clr-io,#btn-close-all-tabs", "click", this.input.clearAllIoClick, this.input); this.addListeners("#open-file,#open-folder", "change", this.input.inputOpen, this.input); document.getElementById("btn-open-file").addEventListener("click", this.input.inputOpenClick.bind(this.input)); - document.getElementById("btn-open-folder").addEventListener("click", this.input.folderOpenClick.bind(this.input)); + document + .getElementById("btn-open-folder") + .addEventListener("click", this.input.folderOpenClick.bind(this.input)); this.addListeners("#input-wrapper", "dragover", this.input.inputDragover, this.input); this.addListeners("#input-wrapper", "dragleave", this.input.inputDragleave, this.input); this.addListeners("#input-wrapper", "drop", this.input.inputDrop, this.input); document.getElementById("btn-new-tab").addEventListener("click", this.input.addInputClick.bind(this.input)); - document.getElementById("btn-previous-input-tab").addEventListener("mousedown", this.input.previousTabClick.bind(this.input)); - document.getElementById("btn-next-input-tab").addEventListener("mousedown", this.input.nextTabClick.bind(this.input)); + document + .getElementById("btn-previous-input-tab") + .addEventListener("mousedown", this.input.previousTabClick.bind(this.input)); + document + .getElementById("btn-next-input-tab") + .addEventListener("mousedown", this.input.nextTabClick.bind(this.input)); this.addListeners("#btn-next-input-tab,#btn-previous-input-tab", "mouseup", this.input.tabMouseUp, this.input); this.addListeners("#btn-next-input-tab,#btn-previous-input-tab", "mouseout", this.input.tabMouseUp, this.input); document.getElementById("btn-go-to-input-tab").addEventListener("click", this.input.goToTab.bind(this.input)); document.getElementById("btn-find-input-tab").addEventListener("click", this.input.findTab.bind(this.input)); this.addDynamicListener("#input-tabs li .input-tab-content", "click", this.input.changeTabClick, this.input); - document.getElementById("input-show-pending").addEventListener("change", this.input.filterTabSearch.bind(this.input)); - document.getElementById("input-show-loading").addEventListener("change", this.input.filterTabSearch.bind(this.input)); - document.getElementById("input-show-loaded").addEventListener("change", this.input.filterTabSearch.bind(this.input)); - this.addListeners("#input-filter-content,#input-filter-filename", "click", this.input.filterOptionClick, this.input); + document + .getElementById("input-show-pending") + .addEventListener("change", this.input.filterTabSearch.bind(this.input)); + document + .getElementById("input-show-loading") + .addEventListener("change", this.input.filterTabSearch.bind(this.input)); + document + .getElementById("input-show-loaded") + .addEventListener("change", this.input.filterTabSearch.bind(this.input)); + this.addListeners( + "#input-filter-content,#input-filter-filename", + "click", + this.input.filterOptionClick, + this.input + ); document.getElementById("input-filter").addEventListener("change", this.input.filterTabSearch.bind(this.input)); document.getElementById("input-filter").addEventListener("keyup", this.input.filterTabSearch.bind(this.input)); - document.getElementById("input-num-results").addEventListener("change", this.input.filterTabSearch.bind(this.input)); - document.getElementById("input-num-results").addEventListener("keyup", this.input.filterTabSearch.bind(this.input)); - document.getElementById("input-filter-refresh").addEventListener("click", this.input.filterTabSearch.bind(this.input)); + document + .getElementById("input-num-results") + .addEventListener("change", this.input.filterTabSearch.bind(this.input)); + document + .getElementById("input-num-results") + .addEventListener("keyup", this.input.filterTabSearch.bind(this.input)); + document + .getElementById("input-filter-refresh") + .addEventListener("click", this.input.filterTabSearch.bind(this.input)); this.addDynamicListener(".input-filter-result", "click", this.input.filterItemClick, this.input); - // Output document.getElementById("save-to-file").addEventListener("click", this.output.saveClick.bind(this.output)); - document.getElementById("save-all-to-file").addEventListener("click", this.output.saveAllClick.bind(this.output)); + document + .getElementById("save-all-to-file") + .addEventListener("click", this.output.saveAllClick.bind(this.output)); document.getElementById("copy-output").addEventListener("click", this.output.copyClick.bind(this.output)); document.getElementById("switch").addEventListener("click", this.output.switchClick.bind(this.output)); - document.getElementById("maximise-output").addEventListener("click", this.output.maximiseOutputClick.bind(this.output)); + document + .getElementById("maximise-output") + .addEventListener("click", this.output.maximiseOutputClick.bind(this.output)); document.getElementById("magic").addEventListener("click", this.output.magicClick.bind(this.output)); this.addDynamicListener(".extract-file,.extract-file i", "click", this.output.extractFileClick, this.output); - this.addDynamicListener("#output-tabs-wrapper #output-tabs li .output-tab-content", "click", this.output.changeTabClick, this.output); - document.getElementById("btn-previous-output-tab").addEventListener("mousedown", this.output.previousTabClick.bind(this.output)); - document.getElementById("btn-next-output-tab").addEventListener("mousedown", this.output.nextTabClick.bind(this.output)); - this.addListeners("#btn-next-output-tab,#btn-previous-output-tab", "mouseup", this.output.tabMouseUp, this.output); - this.addListeners("#btn-next-output-tab,#btn-previous-output-tab", "mouseout", this.output.tabMouseUp, this.output); - document.getElementById("btn-go-to-output-tab").addEventListener("click", this.output.goToTab.bind(this.output)); + this.addDynamicListener( + "#output-tabs-wrapper #output-tabs li .output-tab-content", + "click", + this.output.changeTabClick, + this.output + ); + document + .getElementById("btn-previous-output-tab") + .addEventListener("mousedown", this.output.previousTabClick.bind(this.output)); + document + .getElementById("btn-next-output-tab") + .addEventListener("mousedown", this.output.nextTabClick.bind(this.output)); + this.addListeners( + "#btn-next-output-tab,#btn-previous-output-tab", + "mouseup", + this.output.tabMouseUp, + this.output + ); + this.addListeners( + "#btn-next-output-tab,#btn-previous-output-tab", + "mouseout", + this.output.tabMouseUp, + this.output + ); + document + .getElementById("btn-go-to-output-tab") + .addEventListener("click", this.output.goToTab.bind(this.output)); document.getElementById("btn-find-output-tab").addEventListener("click", this.output.findTab.bind(this.output)); - document.getElementById("output-show-pending").addEventListener("change", this.output.filterTabSearch.bind(this.output)); - document.getElementById("output-show-baking").addEventListener("change", this.output.filterTabSearch.bind(this.output)); - document.getElementById("output-show-baked").addEventListener("change", this.output.filterTabSearch.bind(this.output)); - document.getElementById("output-show-stale").addEventListener("change", this.output.filterTabSearch.bind(this.output)); - document.getElementById("output-show-errored").addEventListener("change", this.output.filterTabSearch.bind(this.output)); - document.getElementById("output-content-filter").addEventListener("change", this.output.filterTabSearch.bind(this.output)); - document.getElementById("output-content-filter").addEventListener("keyup", this.output.filterTabSearch.bind(this.output)); - document.getElementById("output-num-results").addEventListener("change", this.output.filterTabSearch.bind(this.output)); - document.getElementById("output-num-results").addEventListener("keyup", this.output.filterTabSearch.bind(this.output)); - document.getElementById("output-filter-refresh").addEventListener("click", this.output.filterTabSearch.bind(this.output)); + document + .getElementById("output-show-pending") + .addEventListener("change", this.output.filterTabSearch.bind(this.output)); + document + .getElementById("output-show-baking") + .addEventListener("change", this.output.filterTabSearch.bind(this.output)); + document + .getElementById("output-show-baked") + .addEventListener("change", this.output.filterTabSearch.bind(this.output)); + document + .getElementById("output-show-stale") + .addEventListener("change", this.output.filterTabSearch.bind(this.output)); + document + .getElementById("output-show-errored") + .addEventListener("change", this.output.filterTabSearch.bind(this.output)); + document + .getElementById("output-content-filter") + .addEventListener("change", this.output.filterTabSearch.bind(this.output)); + document + .getElementById("output-content-filter") + .addEventListener("keyup", this.output.filterTabSearch.bind(this.output)); + document + .getElementById("output-num-results") + .addEventListener("change", this.output.filterTabSearch.bind(this.output)); + document + .getElementById("output-num-results") + .addEventListener("keyup", this.output.filterTabSearch.bind(this.output)); + document + .getElementById("output-filter-refresh") + .addEventListener("click", this.output.filterTabSearch.bind(this.output)); this.addDynamicListener(".output-filter-result", "click", this.output.filterItemClick, this.output); - // Options document.getElementById("options").addEventListener("click", this.options.optionsClick.bind(this.options)); - document.getElementById("reset-options").addEventListener("click", this.options.resetOptionsClick.bind(this.options)); + document + .getElementById("reset-options") + .addEventListener("click", this.options.resetOptionsClick.bind(this.options)); this.addDynamicListener(".option-item input[type=checkbox]", "change", this.options.switchChange, this.options); - this.addDynamicListener(".option-item input[type=checkbox]#wordWrap", "change", this.options.setWordWrap, this.options); - this.addDynamicListener(".option-item input[type=checkbox]#useMetaKey", "change", this.bindings.updateKeybList, this.bindings); + this.addDynamicListener( + ".option-item input[type=checkbox]#wordWrap", + "change", + this.options.setWordWrap, + this.options + ); + this.addDynamicListener( + ".option-item input[type=checkbox]#useMetaKey", + "change", + this.bindings.updateKeybList, + this.bindings + ); this.addDynamicListener(".option-item input[type=number]", "keyup", this.options.numberChange, this.options); this.addDynamicListener(".option-item input[type=number]", "change", this.options.numberChange, this.options); this.addDynamicListener(".option-item select", "change", this.options.selectChange, this.options); @@ -237,7 +349,6 @@ class Manager { window.addEventListener("keydown", this.bindings.parseInput.bind(this.bindings)); } - /** * Adds an event listener to each element in the specified group. * @@ -253,12 +364,11 @@ class Manager { */ addListeners(selector, eventType, callback, scope) { scope = scope || this; - [].forEach.call(document.querySelectorAll(selector), function(el) { + [].forEach.call(document.querySelectorAll(selector), function (el) { el.addEventListener(eventType, callback.bind(scope)); }); } - /** * Adds multiple event listeners to the specified element. * @@ -279,7 +389,6 @@ class Manager { } } - /** * Adds multiple event listeners to each element in the specified group. * @@ -300,7 +409,6 @@ class Manager { } } - /** * Adds an event listener to the global document object which will listen on dynamic elements which * may not exist in the DOM yet. @@ -331,7 +439,6 @@ class Manager { } } - /** * Handler for dynamic events. This function is called for any dynamic event and decides which * callback(s) to execute based on the type and selector. @@ -341,11 +448,12 @@ class Manager { dynamicListenerHandler(e) { const { type, target } = e; const handlers = this.dynamicHandlers[type]; - const matches = target.matches || - target.webkitMatchesSelector || - target.mozMatchesSelector || - target.msMatchesSelector || - target.oMatchesSelector; + const matches + = target.matches + || target.webkitMatchesSelector + || target.mozMatchesSelector + || target.msMatchesSelector + || target.oMatchesSelector; for (let i = 0; i < handlers.length; i++) { if (matches && matches.call(target, handlers[i].selector)) { diff --git a/src/web/index.js b/src/web/index.js index 82039931..4609960c 100755 --- a/src/web/index.js +++ b/src/web/index.js @@ -17,9 +17,8 @@ import * as CanvasComponents from "../core/lib/CanvasComponents.mjs"; // CyberChef import App from "./App.mjs"; -import Categories from "../core/config/Categories.json" assert {type: "json"}; -import OperationConfig from "../core/config/OperationConfig.json" assert {type: "json"}; - +import Categories from "../core/config/Categories.json" assert { type: "json" }; +import OperationConfig from "../core/config/OperationConfig.json" assert { type: "json" }; /** * Main function used to build the CyberChef web app. @@ -40,18 +39,18 @@ function main() { ]; const defaultOptions = { - updateUrl: true, - showHighlighter: true, - wordWrap: true, - showErrors: true, - errorTimeout: 4000, - attemptHighlight: true, - theme: "classic", - useMetaKey: false, - logLevel: "info", - autoMagic: true, - imagePreview: true, - syncTabs: true + updateUrl: true, + showHighlighter: true, + wordWrap: true, + showErrors: true, + errorTimeout: 4000, + attemptHighlight: true, + theme: "classic", + useMetaKey: false, + logLevel: "info", + autoMagic: true, + imagePreview: true, + syncTabs: true }; document.removeEventListener("DOMContentLoaded", main, false); @@ -66,4 +65,3 @@ window.compileMessage = COMPILE_MSG; window.CanvasComponents = CanvasComponents; document.addEventListener("DOMContentLoaded", main, false); - diff --git a/src/web/static/ga.html b/src/web/static/ga.html index d285cdf9..5622d406 100755 --- a/src/web/static/ga.html +++ b/src/web/static/ga.html @@ -1,12 +1,11 @@ - - - diff --git a/src/web/static/sitemap.mjs b/src/web/static/sitemap.mjs index b96047fc..b74f58be 100644 --- a/src/web/static/sitemap.mjs +++ b/src/web/static/sitemap.mjs @@ -1,6 +1,5 @@ import sm from "sitemap"; -import OperationConfig from "../../core/config/OperationConfig.json" assert {type: "json"}; - +import OperationConfig from "../../core/config/OperationConfig.json" assert { type: "json" }; /** * Generates an XML sitemap for all CyberChef operations and a number of recipes. @@ -11,7 +10,7 @@ import OperationConfig from "../../core/config/OperationConfig.json" assert {typ */ const smStream = new sm.SitemapStream({ - hostname: "https://gchq.github.io/CyberChef", + hostname: "https://gchq.github.io/CyberChef" }); smStream.write({ @@ -30,5 +29,5 @@ for (const op in OperationConfig) { smStream.end(); sm.streamToPromise(smStream).then( - buffer => console.log(buffer.toString()) // eslint-disable-line no-console + (buffer) => console.log(buffer.toString()) // eslint-disable-line no-console ); diff --git a/src/web/static/structuredData.json b/src/web/static/structuredData.json index 08677281..5e64fbfc 100755 --- a/src/web/static/structuredData.json +++ b/src/web/static/structuredData.json @@ -4,10 +4,7 @@ "@type": "Organization", "url": "https://gchq.github.io/CyberChef/", "logo": "https://gchq.github.io/CyberChef/images/cyberchef-128x128.png", - "sameAs": [ - "https://github.com/gchq/CyberChef", - "https://www.npmjs.com/package/cyberchef" - ] + "sameAs": ["https://github.com/gchq/CyberChef", "https://www.npmjs.com/package/cyberchef"] }, { "@context": "http://schema.org", diff --git a/src/web/stylesheets/components/_list.css b/src/web/stylesheets/components/_list.css index 31e40837..d6c9c758 100755 --- a/src/web/stylesheets/components/_list.css +++ b/src/web/stylesheets/components/_list.css @@ -20,11 +20,11 @@ font-weight: var(--title-weight); } -.category-title[href='#catFavourites'] { +.category-title[href="#catFavourites"] { border-bottom-color: var(--primary-border-colour); } -.category-title[aria-expanded=true] { +.category-title[aria-expanded="true"] { border-bottom-color: var(--primary-border-colour); } @@ -40,4 +40,4 @@ margin: 0 !important; border-radius: 0 !important; border: none; -} \ No newline at end of file +} diff --git a/src/web/stylesheets/components/_operation.css b/src/web/stylesheets/components/_operation.css index 685a368a..3715695d 100755 --- a/src/web/stylesheets/components/_operation.css +++ b/src/web/stylesheets/components/_operation.css @@ -83,8 +83,8 @@ input.toggle-string { height: 42px !important; } -.operation [class^='bmd-label'], -.operation [class*=' bmd-label'] { +.operation [class^="bmd-label"], +.operation [class*=" bmd-label"] { top: 13px !important; left: 12px; z-index: 10; @@ -95,47 +95,53 @@ input.toggle-string { color: var(--arg-label-colour); } -.operation .is-focused [class^='bmd-label'], -.operation .is-focused [class*=' bmd-label'], -.operation .is-focused [class^='bmd-label'], -.operation .is-focused [class*=' bmd-label'], +.operation .is-focused [class^="bmd-label"], +.operation .is-focused [class*=" bmd-label"], +.operation .is-focused [class^="bmd-label"], +.operation .is-focused [class*=" bmd-label"], .operation .is-focused label, .operation .checkbox label:hover { color: var(--input-highlight-colour); } -.ingredients .checkbox label input[type=checkbox]+.checkbox-decorator .check, -.ingredients .checkbox label input[type=checkbox]+.checkbox-decorator .check::before { +.ingredients .checkbox label input[type="checkbox"] + .checkbox-decorator .check, +.ingredients .checkbox label input[type="checkbox"] + .checkbox-decorator .check::before { border-color: var(--input-border-colour); color: var(--input-highlight-colour); } -.ingredients .checkbox label input[type=checkbox]:checked+.checkbox-decorator .check, -.ingredients .checkbox label input[type=checkbox]:checked+.checkbox-decorator .check::before { +.ingredients .checkbox label input[type="checkbox"]:checked + .checkbox-decorator .check, +.ingredients .checkbox label input[type="checkbox"]:checked + .checkbox-decorator .check::before { border-color: var(--input-highlight-colour); color: var(--input-highlight-colour); } -.disabled .ingredients .checkbox label input[type=checkbox]+.checkbox-decorator .check, -.disabled .ingredients .checkbox label input[type=checkbox]+.checkbox-decorator .check::before, -.disabled .ingredients .checkbox label input[type=checkbox]:checked+.checkbox-decorator .check, -.disabled .ingredients .checkbox label input[type=checkbox]:checked+.checkbox-decorator .check::before { +.disabled .ingredients .checkbox label input[type="checkbox"] + .checkbox-decorator .check, +.disabled .ingredients .checkbox label input[type="checkbox"] + .checkbox-decorator .check::before, +.disabled .ingredients .checkbox label input[type="checkbox"]:checked + .checkbox-decorator .check, +.disabled .ingredients .checkbox label input[type="checkbox"]:checked + .checkbox-decorator .check::before { border-color: var(--disabled-font-colour); color: var(--disabled-font-colour); } -.break .ingredients .checkbox label input[type=checkbox]+.checkbox-decorator .check, -.break .ingredients .checkbox label input[type=checkbox]+.checkbox-decorator .check::before, -.break .ingredients .checkbox label input[type=checkbox]:checked+.checkbox-decorator .check, -.break .ingredients .checkbox label input[type=checkbox]:checked+.checkbox-decorator .check::before { +.break .ingredients .checkbox label input[type="checkbox"] + .checkbox-decorator .check, +.break .ingredients .checkbox label input[type="checkbox"] + .checkbox-decorator .check::before, +.break .ingredients .checkbox label input[type="checkbox"]:checked + .checkbox-decorator .check, +.break .ingredients .checkbox label input[type="checkbox"]:checked + .checkbox-decorator .check::before { border-color: var(--breakpoint-font-colour); color: var(--breakpoint-font-colour); } -.flow-control-op.break .ingredients .checkbox label input[type=checkbox]+.checkbox-decorator .check, -.flow-control-op.break .ingredients .checkbox label input[type=checkbox]+.checkbox-decorator .check::before, -.flow-control-op.break .ingredients .checkbox label input[type=checkbox]:checked+.checkbox-decorator .check, -.flow-control-op.break .ingredients .checkbox label input[type=checkbox]:checked+.checkbox-decorator .check::before { +.flow-control-op.break .ingredients .checkbox label input[type="checkbox"] + .checkbox-decorator .check, +.flow-control-op.break .ingredients .checkbox label input[type="checkbox"] + .checkbox-decorator .check::before, +.flow-control-op.break .ingredients .checkbox label input[type="checkbox"]:checked + .checkbox-decorator .check, +.flow-control-op.break + .ingredients + .checkbox + label + input[type="checkbox"]:checked + + .checkbox-decorator + .check::before { border-color: var(--fc-breakpoint-operation-font-colour); color: var(--fc-breakpoint-operation-font-colour); } @@ -151,16 +157,14 @@ input.toggle-string { } .operation .form-control:hover { - background-image: - linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(25, 118, 210, 0) 2px), + background-image: linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(25, 118, 210, 0) 2px), linear-gradient(to top, rgba(0, 0, 0, 0.26) 1px, rgba(0, 0, 0, 0) 1px); filter: brightness(97%); } .operation .form-control:focus { background-color: var(--arg-background); - background-image: - linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(25, 118, 210, 0) 2px), + background-image: linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(25, 118, 210, 0) 2px), linear-gradient(to top, rgba(0, 0, 0, 0.26) 1px, rgba(0, 0, 0, 0) 1px); filter: brightness(100%); } @@ -277,7 +281,9 @@ input.toggle-string { border-color: var(--breakpoint-border-colour) !important; } -.break .form-group * { color: var(--breakpoint-font-colour) !important; } +.break .form-group * { + color: var(--breakpoint-font-colour) !important; +} .selected-op { color: var(--selected-operation-font-color) !important; @@ -285,7 +291,9 @@ input.toggle-string { border-color: var(--selected-operation-border-colour) !important; } -.selected-op .form-group * { color: var(--selected-operation-font-color) !important; } +.selected-op .form-group * { + color: var(--selected-operation-font-color) !important; +} .flow-control-op { color: var(--fc-operation-font-colour) !important; @@ -293,7 +301,9 @@ input.toggle-string { border-color: var(--fc-operation-border-colour) !important; } -.flow-control-op .form-group *:not(.arg) { color: var(--fc-operation-font-colour) } +.flow-control-op .form-group *:not(.arg) { + color: var(--fc-operation-font-colour); +} .flow-control-op.break { color: var(--fc-breakpoint-operation-font-colour) !important; @@ -301,7 +311,9 @@ input.toggle-string { border-color: var(--fc-breakpoint-operation-border-colour) !important; } -.flow-control-op.break .form-group * { color: var(--fc-breakpoint-operation-font-colour) !important; } +.flow-control-op.break .form-group * { + color: var(--fc-breakpoint-operation-font-colour) !important; +} .disabled { color: var(--disabled-font-colour) !important; @@ -309,7 +321,9 @@ input.toggle-string { border-color: var(--disabled-border-colour) !important; } -.disabled .form-group * { color: var(--disabled-font-colour) !important; } +.disabled .form-group * { + color: var(--disabled-font-colour) !important; +} .break .register-list { color: var(--fc-breakpoint-operation-font-colour) !important; diff --git a/src/web/stylesheets/layout/_controls.css b/src/web/stylesheets/layout/_controls.css index 1edc41b5..e91ac449 100755 --- a/src/web/stylesheets/layout/_controls.css +++ b/src/web/stylesheets/layout/_controls.css @@ -64,6 +64,10 @@ } @keyframes spin { - 0% {transform: rotate(0deg);} - 100% {transform: rotate(360deg);} + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } } diff --git a/src/web/stylesheets/layout/_io.css b/src/web/stylesheets/layout/_io.css index 0146bf27..c11c934d 100755 --- a/src/web/stylesheets/layout/_io.css +++ b/src/web/stylesheets/layout/_io.css @@ -25,7 +25,7 @@ user-select: auto; } #output-text.html-output .cm-line .cm-widgetBuffer, -#output-text.html-output .cm-line>br { +#output-text.html-output .cm-line > br { display: none; } @@ -81,14 +81,14 @@ background-color: var(--primary-background-colour); } -.input-tab-content+.btn-close-tab { +.input-tab-content + .btn-close-tab { display: block; margin-top: auto; margin-bottom: auto; margin-right: 2px; } -.input-tab-content+.btn-close-tab i { +.input-tab-content + .btn-close-tab i { font-size: 0.8em; } @@ -110,7 +110,6 @@ background-color: var(--primary-background-colour); } - #btn-next-input-tab, #btn-input-tab-dropdown, #btn-next-output-tab, @@ -224,7 +223,9 @@ #stale-indicator { opacity: 1; visibility: visible; - transition: margin 0s, opacity 0.3s; + transition: + margin 0s, + opacity 0.3s; margin-left: 5px; cursor: help; } @@ -237,7 +238,10 @@ #magic { opacity: 1; visibility: visible; - transition: margin 0s 0.3s, opacity 0.3s 0.3s, visibility 0.3s 0.3s; + transition: + margin 0s 0.3s, + opacity 0.3s 0.3s, + visibility 0.3s 0.3s; margin-left: 5px; margin-bottom: 5px; } @@ -245,7 +249,10 @@ #magic.hidden, #stale-indicator.hidden { visibility: hidden; - transition: opacity 0.3s, margin 0.3s 0.3s, visibility 0.3s; + transition: + opacity 0.3s, + margin 0.3s 0.3s, + visibility 0.3s; opacity: 0; } @@ -258,7 +265,7 @@ } .pulse { - box-shadow: 0 0 0 0 rgba(90, 153, 212, .3); + box-shadow: 0 0 0 0 rgba(90, 153, 212, 0.3); animation: pulse 1.5s 1; } @@ -343,7 +350,6 @@ text-align: center; } - #input-search-results, #output-search-results { list-style: none; @@ -402,7 +408,6 @@ border-color: var(--subtext-font-colour); } - /* Status bar */ .cm-panel input::placeholder { @@ -432,7 +437,7 @@ vertical-align: middle; margin-left: 8px; } -.cm-status-bar>div>span:first-child i { +.cm-status-bar > div > span:first-child i { margin-left: 0; } @@ -461,7 +466,7 @@ right: 0; background-color: #f1f1f1; min-width: 200px; - box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2); + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.2); z-index: 1; } @@ -475,7 +480,7 @@ /* Change color of dropup links on hover */ .cm-status-bar-select-content a:hover { - background-color: #ddd + background-color: #ddd; } /* Change the background color of the dropup button when the dropup content is shown */ @@ -514,7 +519,6 @@ vertical-align: middle; } - /* File details panel */ .cm-file-details { diff --git a/src/web/stylesheets/layout/_modals.css b/src/web/stylesheets/layout/_modals.css index affc372d..1db4ca4d 100755 --- a/src/web/stylesheets/layout/_modals.css +++ b/src/web/stylesheets/layout/_modals.css @@ -78,14 +78,14 @@ border-left: 2px solid var(--primary-border-colour); } -.checkbox label input[type=checkbox]+.checkbox-decorator .check, -.checkbox label input[type=checkbox]+.checkbox-decorator .check::before { +.checkbox label input[type="checkbox"] + .checkbox-decorator .check, +.checkbox label input[type="checkbox"] + .checkbox-decorator .check::before { border-color: var(--input-border-colour); color: var(--input-highlight-colour); } -.checkbox label input[type=checkbox]:checked+.checkbox-decorator .check, -.checkbox label input[type=checkbox]:checked+.checkbox-decorator .check::before { +.checkbox label input[type="checkbox"]:checked + .checkbox-decorator .check, +.checkbox label input[type="checkbox"]:checked + .checkbox-decorator .check::before { border-color: var(--input-highlight-colour); color: var(--input-highlight-colour); } @@ -94,17 +94,16 @@ color: var(--input-highlight-colour); } -.bmd-form-group.is-focused [class^='bmd-label'], -.bmd-form-group.is-focused [class*=' bmd-label'], -.bmd-form-group.is-focused [class^='bmd-label'], -.bmd-form-group.is-focused [class*=' bmd-label'], +.bmd-form-group.is-focused [class^="bmd-label"], +.bmd-form-group.is-focused [class*=" bmd-label"], +.bmd-form-group.is-focused [class^="bmd-label"], +.bmd-form-group.is-focused [class*=" bmd-label"], .bmd-form-group.is-focused label, .checkbox label:hover { color: var(--input-highlight-colour); } -.bmd-form-group.option-item label+.form-control{ - background-image: - linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(0, 0, 0, 0) 2px), +.bmd-form-group.option-item label + .form-control { + background-image: linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(0, 0, 0, 0) 2px), linear-gradient(to top, var(--primary-border-colour) 1px, rgba(0, 0, 0, 0) 1px); } diff --git a/src/web/stylesheets/layout/_operations.css b/src/web/stylesheets/layout/_operations.css index b73dfa84..525dc984 100755 --- a/src/web/stylesheets/layout/_operations.css +++ b/src/web/stylesheets/layout/_operations.css @@ -15,8 +15,7 @@ #search { padding-left: 10px; padding-right: 10px; - background-image: - linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(0, 0, 0, 0) 2px), + background-image: linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(0, 0, 0, 0) 2px), linear-gradient(to top, var(--primary-border-colour) 1px, rgba(0, 0, 0, 0) 1px); } diff --git a/src/web/stylesheets/layout/_structure.css b/src/web/stylesheets/layout/_structure.css index 4f262029..862f90b1 100755 --- a/src/web/stylesheets/layout/_structure.css +++ b/src/web/stylesheets/layout/_structure.css @@ -49,7 +49,8 @@ div#output { overflow: auto; } -.split.split-horizontal, .gutter.gutter-horizontal { +.split.split-horizontal, +.gutter.gutter-horizontal { height: 100%; float: left; } @@ -61,11 +62,11 @@ div#output { } .gutter.gutter-horizontal { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAeCAYAAAAGos/EAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+EFBhEwBDmIiYYAAAAjSURBVBjTYzxz5sx/BgYGBiYGKGB89+4dA4oIy71790aGGgCn+DBbOcAB0wAAAABJRU5ErkJggg=='); + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAeCAYAAAAGos/EAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+EFBhEwBDmIiYYAAAAjSURBVBjTYzxz5sx/BgYGBiYGKGB89+4dA4oIy71790aGGgCn+DBbOcAB0wAAAABJRU5ErkJggg=="); cursor: ew-resize; } .gutter.gutter-vertical { - background-image: url('data:image/png;base64,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'); + background-image: url("data:image/png;base64,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"); cursor: ns-resize; } diff --git a/src/web/stylesheets/operations/json.css b/src/web/stylesheets/operations/json.css index 27861c8f..0633ca4e 100644 --- a/src/web/stylesheets/operations/json.css +++ b/src/web/stylesheets/operations/json.css @@ -13,11 +13,12 @@ /* Root element */ .json-document { - padding: .5em 1.5em; + padding: 0.5em 1.5em; } /* Syntax highlighting for JSON objects */ -ul.json-dict, ol.json-array { +ul.json-dict, +ol.json-array { list-style-type: none; margin: 0 0 0 1px; border-left: 1px dotted #ccc; @@ -51,14 +52,14 @@ ul.json-dict, ol.json-array { /* Display object and array brackets when closed */ .json-summary.json-obj::after { color: gray; - content: "{ ... }" + content: "{ ... }"; } .json-summary.json-arr::after { color: gray; - content: "[ ... ]" + content: "[ ... ]"; } .json-details[open] > .json-summary.json-obj::after, -.json-details[open] > .json-summary.json-arr::after { +.json-details[open] > .json-summary.json-arr::after { content: ""; } diff --git a/src/web/stylesheets/preloader.css b/src/web/stylesheets/preloader.css index 01e6d3d2..accbe40a 100755 --- a/src/web/stylesheets/preloader.css +++ b/src/web/stylesheets/preloader.css @@ -6,7 +6,7 @@ * @license Apache-2.0 */ - #loader-wrapper { +#loader-wrapper { position: fixed; top: 0; left: 0; @@ -82,7 +82,6 @@ top: 10%; } - /* Loaded */ .loaded .loading-msg { opacity: 0; @@ -95,58 +94,57 @@ } .loaded #rec-list li { - animation: bump 0.7s cubic-bezier(0.7, 0, 0.3, 1) both; + animation: bump 0.7s cubic-bezier(0.7, 0, 0.3, 1) both; } .loaded #content-wrapper { - animation-delay: 0.10s; + animation-delay: 0.1s; } .loaded #rec-list li:first-child { - animation-delay: 0.20s; + animation-delay: 0.2s; } .loaded #rec-list li:nth-child(2) { - animation-delay: 0.25s; + animation-delay: 0.25s; } .loaded #rec-list li:nth-child(3) { - animation-delay: 0.30s; + animation-delay: 0.3s; } .loaded #rec-list li:nth-child(4) { - animation-delay: 0.35s; + animation-delay: 0.35s; } .loaded #rec-list li:nth-child(5) { - animation-delay: 0.40s; + animation-delay: 0.4s; } .loaded #rec-list li:nth-child(6) { - animation-delay: 0.45s; + animation-delay: 0.45s; } .loaded #rec-list li:nth-child(7) { - animation-delay: 0.50s; + animation-delay: 0.5s; } .loaded #rec-list li:nth-child(8) { - animation-delay: 0.55s; + animation-delay: 0.55s; } .loaded #rec-list li:nth-child(9) { - animation-delay: 0.60s; + animation-delay: 0.6s; } .loaded #rec-list li:nth-child(10) { - animation-delay: 0.65s; + animation-delay: 0.65s; } - /* Animations */ @keyframes spin { - 0% { + 0% { transform: rotate(0deg); } 100% { @@ -155,7 +153,7 @@ } @keyframes bump { - from { + from { opacity: 0; transform: translate3d(0, 200px, 0); } diff --git a/src/web/stylesheets/themes/_classic.css b/src/web/stylesheets/themes/_classic.css index 971c1c57..79ab522d 100755 --- a/src/web/stylesheets/themes/_classic.css +++ b/src/web/stylesheets/themes/_classic.css @@ -8,14 +8,12 @@ :root, :root.classic { - --primary-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", - Roboto, "Helvetica Neue", Arial, sans-serif; + --primary-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; --primary-font-colour: #333; --primary-font-size: 14px; --primary-line-height: 20px; - --fixed-width-font-family: SFMono-Regular, Menlo, Monaco, Consolas, - "Liberation Mono", "Courier New", monospace; + --fixed-width-font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --fixed-width-font-colour: inherit; --fixed-width-font-size: inherit; @@ -44,7 +42,6 @@ --loader-middle-colour: #e74c3c; --loader-inner-colour: #f9c922; - /* Operation colours */ --op-list-operation-font-colour: #3a87ad; --op-list-operation-bg-colour: #d9edf7; @@ -74,7 +71,6 @@ --fc-breakpoint-operation-bg-colour: #eabfbf; --fc-breakpoint-operation-border-colour: #e2aeb5; - /* Operation arguments */ --op-title-font-weight: bold; --arg-font-colour: #424242; @@ -83,14 +79,12 @@ --arg-disabled-background: #eee; --arg-label-colour: #388e3c; - /* Operation buttons */ --disable-icon-colour: #9e9e9e; --disable-icon-selected-colour: #f44336; --breakpoint-icon-colour: #9e9e9e; --breakpoint-icon-selected-colour: #f44336; - /* Buttons */ --btn-default-font-colour: #333; --btn-default-bg-colour: #fff; @@ -108,7 +102,6 @@ --btn-success-hover-bg-colour: #449d44; --btn-success-hover-border-colour: #398439; - /* Highlighter colours */ --hl1: #ffee00aa; --hl2: #95dfffaa; @@ -116,13 +109,11 @@ --hl4: #fcf8e3aa; --hl5: #8de768aa; - /* Scrollbar */ --scrollbar-track: var(--secondary-background-colour); --scrollbar-thumb: #ccc; --scrollbar-hover: #bbb; - /* Misc. */ --drop-file-border-colour: #3a87ad; --table-border-colour: #ccc; diff --git a/src/web/stylesheets/themes/_dark.css b/src/web/stylesheets/themes/_dark.css index 4d2941f2..7320e33a 100755 --- a/src/web/stylesheets/themes/_dark.css +++ b/src/web/stylesheets/themes/_dark.css @@ -40,7 +40,6 @@ --loader-middle-colour: #e74c3c; --loader-inner-colour: #f9c922; - /* Operation colours */ --op-list-operation-font-colour: #c5c5c5; --op-list-operation-bg-colour: #333; @@ -70,7 +69,6 @@ --fc-breakpoint-operation-bg-colour: #072b49; --fc-breakpoint-operation-border-colour: #444; - /* Operation arguments */ --op-title-font-weight: bold; --arg-font-colour: #bbb; @@ -79,14 +77,12 @@ --arg-disabled-background: #4f4f4f; --arg-label-colour: rgb(25, 118, 210); - /* Operation buttons */ --disable-icon-colour: #9e9e9e; --disable-icon-selected-colour: #f44336; --breakpoint-icon-colour: #9e9e9e; --breakpoint-icon-selected-colour: #f44336; - /* Buttons */ --btn-default-font-colour: #c5c5c5; --btn-default-bg-colour: #2d2d2d; @@ -104,7 +100,6 @@ --btn-success-hover-bg-colour: #0e639c; --btn-success-hover-border-colour: #0e639c; - /* Highlighter colours */ --hl1: #264f78; --hl2: #675351; @@ -112,13 +107,11 @@ --hl4: #fcf8e3; --hl5: #38811b; - /* Scrollbar */ --scrollbar-track: #1e1e1e; --scrollbar-thumb: #424242; --scrollbar-hover: #4e4e4e; - /* Misc. */ --drop-file-border-colour: #0e639c; --table-border-colour: #555; diff --git a/src/web/stylesheets/themes/_geocities.css b/src/web/stylesheets/themes/_geocities.css index fcf3cdb5..e9bbb1bc 100755 --- a/src/web/stylesheets/themes/_geocities.css +++ b/src/web/stylesheets/themes/_geocities.css @@ -7,7 +7,8 @@ */ :root.geocities { - --primary-font-family: "Comic Sans", "Comic Sans MS", "Chalkboard", "ChalkboardSE-Regular", "Marker Felt", "Purisa", "URW Chancery L", cursive, sans-serif; + --primary-font-family: "Comic Sans", "Comic Sans MS", "Chalkboard", "ChalkboardSE-Regular", "Marker Felt", "Purisa", + "URW Chancery L", cursive, sans-serif; --primary-font-colour: black; --primary-font-size: 14px; --primary-line-height: 20px; @@ -40,7 +41,6 @@ --loader-middle-colour: red; --loader-inner-colour: yellow; - /* Operation colours */ --op-list-operation-font-colour: blue; --op-list-operation-bg-colour: yellow; @@ -70,7 +70,6 @@ --fc-breakpoint-operation-bg-colour: deeppink; --fc-breakpoint-operation-border-colour: yellowgreen; - /* Operation arguments */ --op-title-font-weight: bold; --arg-font-colour: white; @@ -79,14 +78,12 @@ --arg-disabled-background: grey; --arg-label-colour: red; - /* Operation buttons */ --disable-icon-colour: #0f0; --disable-icon-selected-colour: yellow; --breakpoint-icon-colour: #0f0; --breakpoint-icon-selected-colour: yellow; - /* Buttons */ --btn-default-font-colour: black; --btn-default-bg-colour: white; @@ -104,7 +101,6 @@ --btn-success-hover-bg-colour: lime; --btn-success-hover-border-colour: grey; - /* Highlighter colours */ --hl1: #fff000; --hl2: #95dfff; @@ -112,13 +108,11 @@ --hl4: #fcf8e3; --hl5: #8de768; - /* Scrollbar */ --scrollbar-track: lightsteelblue; --scrollbar-thumb: lightslategrey; --scrollbar-hover: grey; - /* Misc. */ --drop-file-border-colour: purple; --table-border-colour: var(--hl3); diff --git a/src/web/stylesheets/themes/_solarizedDark.css b/src/web/stylesheets/themes/_solarizedDark.css index 5bb18d2e..51faa34c 100755 --- a/src/web/stylesheets/themes/_solarizedDark.css +++ b/src/web/stylesheets/themes/_solarizedDark.css @@ -24,14 +24,12 @@ --sol-cyan: #2aa198; --sol-green: #859900; - --primary-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", - Roboto, "Helvetica Neue", Arial, sans-serif; + --primary-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; --primary-font-colour: var(--base0); --primary-font-size: 14px; --primary-line-height: 20px; - --fixed-width-font-family: SFMono-Regular, Menlo, Monaco, Consolas, - "Liberation Mono", "Courier New", monospace; + --fixed-width-font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --fixed-width-font-colour: inherit; --fixed-width-font-size: inherit; @@ -59,7 +57,6 @@ --loader-middle-colour: var(--base0); --loader-inner-colour: var(--base00); - /* Operation colours */ --op-list-operation-font-colour: var(--base0); --op-list-operation-bg-colour: var(--base03); @@ -89,7 +86,6 @@ --fc-breakpoint-operation-bg-colour: var(--base02); --fc-breakpoint-operation-border-colour: var(--base00); - /* Operation arguments */ --op-title-font-weight: bold; --arg-font-colour: var(--base0); @@ -98,7 +94,6 @@ --arg-disabled-background: var(--base03); --arg-label-colour: var(--base1); - /* Operation buttons */ --disable-icon-colour: var(--base00); --disable-icon-selected-colour: var(--sol-red); @@ -129,13 +124,11 @@ --hl4: var(--sol-yellow); --hl5: var(--sol-magenta); - /* Scrollbar */ --scrollbar-track: var(--base03); --scrollbar-thumb: var(--base00); --scrollbar-hover: var(--base01); - /* Misc. */ --drop-file-border-colour: var(--base01); --table-border-colour: var(--base01); diff --git a/src/web/stylesheets/themes/_solarizedLight.css b/src/web/stylesheets/themes/_solarizedLight.css index f884c3e8..7fdb34ec 100755 --- a/src/web/stylesheets/themes/_solarizedLight.css +++ b/src/web/stylesheets/themes/_solarizedLight.css @@ -24,14 +24,12 @@ --sol-cyan: #2aa198; --sol-green: #859900; - --primary-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", - Roboto, "Helvetica Neue", Arial, sans-serif; + --primary-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; --primary-font-colour: var(--base00); --primary-font-size: 14px; --primary-line-height: 20px; - --fixed-width-font-family: SFMono-Regular, Menlo, Monaco, Consolas, - "Liberation Mono", "Courier New", monospace; + --fixed-width-font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --fixed-width-font-colour: inherit; --fixed-width-font-size: inherit; @@ -59,7 +57,6 @@ --loader-middle-colour: var(--base00); --loader-inner-colour: var(--base0); - /* Operation colours */ --op-list-operation-font-colour: var(--base00); --op-list-operation-bg-colour: var(--base3); @@ -89,7 +86,6 @@ --fc-breakpoint-operation-bg-colour: var(--base1); --fc-breakpoint-operation-border-colour: var(--base0); - /* Operation arguments */ --op-title-font-weight: bold; --arg-font-colour: var(--base00); @@ -98,14 +94,12 @@ --arg-disabled-background: var(--base3); --arg-label-colour: var(--base01); - /* Operation buttons */ --disable-icon-colour: #9e9e9e; --disable-icon-selected-colour: #f44336; --breakpoint-icon-colour: #9e9e9e; --breakpoint-icon-selected-colour: #f44336; - /* Buttons */ --btn-default-font-colour: var(--base00); --btn-default-bg-colour: var(--base2); @@ -123,7 +117,6 @@ --btn-success-hover-bg-colour: var(--base1); --btn-success-hover-border-colour: var(--base0); - /* Highlighter colours */ --hl1: var(--base1); --hl2: var(--sol-blue); @@ -131,13 +124,11 @@ --hl4: var(--sol-yellow); --hl5: var(--sol-magenta); - /* Scrollbar */ --scrollbar-track: var(--base3); --scrollbar-thumb: var(--base1); --scrollbar-hover: var(--base0); - /* Misc. */ --drop-file-border-colour: var(--base1); --table-border-colour: var(--base1); diff --git a/src/web/stylesheets/utils/_general.css b/src/web/stylesheets/utils/_general.css index 56a8cbfe..4512b6ed 100755 --- a/src/web/stylesheets/utils/_general.css +++ b/src/web/stylesheets/utils/_general.css @@ -81,8 +81,18 @@ body { } /* Highlighters */ -.hl1 { background-color: var(--hl1); } -.hl2 { background-color: var(--hl2); } -.hl3 { background-color: var(--hl3); } /* Half-Life 3 confirmed :O */ -.hl4 { background-color: var(--hl4); } -.hl5 { background-color: var(--hl5); } +.hl1 { + background-color: var(--hl1); +} +.hl2 { + background-color: var(--hl2); +} +.hl3 { + background-color: var(--hl3); +} /* Half-Life 3 confirmed :O */ +.hl4 { + background-color: var(--hl4); +} +.hl5 { + background-color: var(--hl5); +} diff --git a/src/web/stylesheets/utils/_overrides.css b/src/web/stylesheets/utils/_overrides.css index a2f8b029..93850dab 100755 --- a/src/web/stylesheets/utils/_overrides.css +++ b/src/web/stylesheets/utils/_overrides.css @@ -10,14 +10,14 @@ /* fallback */ @font-face { - font-family: 'Material Icons'; + font-family: "Material Icons"; font-style: normal; font-weight: 400; - src: url("../static/fonts/MaterialIcons-Regular.ttf") format('truetype'); + src: url("../static/fonts/MaterialIcons-Regular.ttf") format("truetype"); } .material-icons { - font-family: 'Material Icons'; + font-family: "Material Icons"; font-weight: normal; font-style: normal; font-size: 24px; @@ -28,7 +28,7 @@ white-space: nowrap; word-wrap: normal; direction: ltr; - font-feature-settings: 'liga'; + font-feature-settings: "liga"; -webkit-font-smoothing: antialiased; } @@ -36,7 +36,6 @@ margin-bottom: 0; } - button, a:focus { outline: none; @@ -108,8 +107,7 @@ select.custom-file-control:not([size]):not([multiple]) { .form-control, .is-focused .form-control { - background-image: - linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(0, 0, 0, 0) 2px), + background-image: linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(0, 0, 0, 0) 2px), linear-gradient(to top, var(--primary-border-colour) 1px, rgba(0, 0, 0, 0) 1px); } @@ -171,11 +169,11 @@ optgroup { color: var(--primary-font-colour); } -.bs-popover-right>.arrow { +.bs-popover-right > .arrow { border-right-color: var(--popover-border-colour); } -.bs-popover-right>.arrow:after { +.bs-popover-right > .arrow:after { border-right-color: var(--popover-background); } @@ -183,9 +181,9 @@ optgroup { color: var(--subtext-font-colour); } -.nav-tabs>li>a.nav-link.active, -.nav-tabs>li>a.nav-link.active:focus, -.nav-tabs>li>a.nav-link.active:hover { +.nav-tabs > li > a.nav-link.active, +.nav-tabs > li > a.nav-link.active:focus, +.nav-tabs > li > a.nav-link.active:hover { background-color: var(--secondary-background-colour); border-color: var(--secondary-border-colour); border-bottom-color: transparent; @@ -224,18 +222,16 @@ optgroup { border-right: 0; } -.input-group-btn:first-child>.btn { +.input-group-btn:first-child > .btn { border-right: 0; } - /* Sortable */ .sortable-ghost { opacity: 0.6; } - /* Bootstrap Colorpicker */ .colorpicker-element { @@ -248,7 +244,6 @@ optgroup { height: 100px; } - /* CodeMirror */ .ͼ2 .cm-specialChar, diff --git a/src/web/utils/copyOverride.mjs b/src/web/utils/copyOverride.mjs index 51b2386b..a8a7c2c8 100644 --- a/src/web/utils/copyOverride.mjs +++ b/src/web/utils/copyOverride.mjs @@ -16,7 +16,7 @@ * impact of breaking changes. */ -import {EditorView} from "@codemirror/view"; +import { EditorView } from "@codemirror/view"; /** * Copies the currently selected text from the state doc. @@ -29,13 +29,14 @@ import {EditorView} from "@codemirror/view"; function copiedRange(state) { const content = []; let linewise = false; - for (const range of state.selection.ranges) if (!range.empty) { - content.push(state.sliceDoc(range.from, range.to)); - } + for (const range of state.selection.ranges) + if (!range.empty) { + content.push(state.sliceDoc(range.from, range.to)); + } if (!content.length) { // Nothing selected, do a line-wise copy let upto = -1; - for (const {from} of state.selection.ranges) { + for (const { from } of state.selection.ranges) { const line = state.doc.lineAt(from); if (line.number > upto) { content.push(line.text); @@ -45,7 +46,7 @@ function copiedRange(state) { linewise = true; } - return {text: content.join(state.lineBreak), linewise}; + return { text: content.join(state.lineBreak), linewise }; } /** @@ -73,7 +74,7 @@ const CPRegexG = new RegExp("[\u2400-\u243f]", "g"); export function copyOverride() { return EditorView.domEventHandlers({ copy(event, view) { - const {text, linewise} = copiedRange(view.state); + const { text, linewise } = copiedRange(view.state); if (!text && !linewise) return; // If there are no PUA chars in the copied text, return false and allow the built-in @@ -81,7 +82,7 @@ export function copyOverride() { if (!PUARegex.test(text)) return false; // If PUA chars are detected, modify them back to their original values and copy that instead - const rawText = text.replace(PUARegexG, function(c) { + const rawText = text.replace(PUARegexG, function (c) { return String.fromCharCode(c.charCodeAt(0) - 0xe000); }); @@ -95,7 +96,6 @@ export function copyOverride() { }); } - /** * Handler for copy events in output-html decorations. If there are control pictures present, * this handler will convert them back to their raw form before copying. If there are no @@ -113,7 +113,7 @@ export function htmlCopyOverride(event) { if (!CPRegex.test(text)) return false; // If control picture chars are detected, modify them back to their original values and copy that instead - const rawText = text.replace(CPRegexG, function(c) { + const rawText = text.replace(CPRegexG, function (c) { return String.fromCharCode(c.charCodeAt(0) - 0x2400); }); diff --git a/src/web/utils/editorUtils.mjs b/src/web/utils/editorUtils.mjs index e02e692b..d2d5f3c1 100644 --- a/src/web/utils/editorUtils.mjs +++ b/src/web/utils/editorUtils.mjs @@ -35,8 +35,10 @@ const Names = { // Regex for Special Characters to be replaced const UnicodeRegexpSupport = /x/.unicode != null ? "gu" : "g"; -const Specials = new RegExp("[\u0000-\u0008\u000a-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc\ue000-\uf8ff]", UnicodeRegexpSupport); - +const Specials = new RegExp( + "[\u0000-\u0008\u000a-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc\ue000-\uf8ff]", + UnicodeRegexpSupport +); /** * Override for rendering special characters. @@ -72,7 +74,6 @@ export function renderSpecialChar(code, desc, placeholder) { return s; } - /** * Given a string, returns that string with any control characters replaced with HTML * renderings of control pictures. @@ -82,11 +83,10 @@ export function renderSpecialChar(code, desc, placeholder) { * @param {string} [lineBreak="\n"] * @returns {html} */ -export function escapeControlChars(str, preserveWs=false, lineBreak="\n") { - if (!preserveWs) - str = Utils.escapeWhitespace(str); +export function escapeControlChars(str, preserveWs = false, lineBreak = "\n") { + if (!preserveWs) str = Utils.escapeWhitespace(str); - return str.replace(Specials, function(c) { + return str.replace(Specials, function (c) { if (lineBreak.includes(c)) return c; const code = c.charCodeAt(0); const desc = "Control character " + (Names[code] || "0x" + code.toString(16)); diff --git a/src/web/utils/fileDetails.mjs b/src/web/utils/fileDetails.mjs index 94f125f8..66599ac5 100644 --- a/src/web/utils/fileDetails.mjs +++ b/src/web/utils/fileDetails.mjs @@ -4,15 +4,14 @@ * @license Apache-2.0 */ -import {showSidePanel} from "./sidePanel.mjs"; +import { showSidePanel } from "./sidePanel.mjs"; import Utils from "../../core/Utils.mjs"; -import {isImage, detectFileType} from "../../core/lib/FileType.mjs"; +import { isImage, detectFileType } from "../../core/lib/FileType.mjs"; /** * A File Details extension for CodeMirror */ class FileDetailsPanel { - /** * FileDetailsPanel constructor * @param {Object} opts @@ -74,8 +73,11 @@ class FileDetailsPanel { `; - dom.querySelector(".file-details-toggle-shown,.file-details-toggle-hidden") - .addEventListener("click", this.toggleHandler, false); + dom.querySelector(".file-details-toggle-shown,.file-details-toggle-hidden").addEventListener( + "click", + this.toggleHandler, + false + ); return dom; } @@ -96,7 +98,7 @@ class FileDetailsPanel { if (type && type !== "image/tiff" && fileBuffer.byteLength <= 512000) { // Most browsers don't support displaying TIFFs, so ignore them // Don't render images over 512,000 bytes - const blob = new Blob([fileBuffer], {type: type}), + const blob = new Blob([fileBuffer], { type: type }), url = URL.createObjectURL(blob); fileThumb.src = url; } else { @@ -112,7 +114,6 @@ class FileDetailsPanel { const fileThumb = this.dom.querySelector(".file-details-thumbnail"); fileThumb.src = require("../static/images/file-128x128.png"); } - } /** @@ -127,8 +128,7 @@ function makePanel(opts) { return { dom: fdPanel.dom, width: opts?.hidden ? 1 : 200, - update(update) { - }, + update(update) {}, mount() { $("[data-toggle='tooltip']").tooltip(); } diff --git a/src/web/utils/htmlWidget.mjs b/src/web/utils/htmlWidget.mjs index 642cd7e1..bd526767 100644 --- a/src/web/utils/htmlWidget.mjs +++ b/src/web/utils/htmlWidget.mjs @@ -4,17 +4,15 @@ * @license Apache-2.0 */ -import {WidgetType, Decoration, ViewPlugin} from "@codemirror/view"; -import {escapeControlChars} from "./editorUtils.mjs"; -import {htmlCopyOverride} from "./copyOverride.mjs"; +import { WidgetType, Decoration, ViewPlugin } from "@codemirror/view"; +import { escapeControlChars } from "./editorUtils.mjs"; +import { htmlCopyOverride } from "./copyOverride.mjs"; import Utils from "../../core/Utils.mjs"; - /** * Adds an HTML widget to the Code Mirror editor */ class HTMLWidget extends WidgetType { - /** * HTMLWidget consructor */ @@ -52,9 +50,7 @@ class HTMLWidget extends WidgetType { this.replaceControlChars(node); break; default: - if (node.nodeName !== "SCRIPT" && - node.nodeName !== "STYLE") - this.walkTextNodes(node); + if (node.nodeName !== "SCRIPT" && node.nodeName !== "STYLE") this.walkTextNodes(node); break; } } @@ -76,7 +72,6 @@ class HTMLWidget extends WidgetType { textNode.parentNode.replaceChild(node, textNode); } } - } /** @@ -97,7 +92,6 @@ function decorateHTML(view, html) { return Decoration.set(widgets); } - /** * An HTML Plugin builder * @param {Object} htmlOutput @@ -125,8 +119,9 @@ export function htmlPlugin(htmlOutput) { this.htmlOutput.changed = false; } } - }, { - decorations: v => v.decorations + }, + { + decorations: (v) => v.decorations } ); diff --git a/src/web/utils/sidePanel.mjs b/src/web/utils/sidePanel.mjs index b54c08a0..4c4b3649 100644 --- a/src/web/utils/sidePanel.mjs +++ b/src/web/utils/sidePanel.mjs @@ -8,8 +8,8 @@ * @license Apache-2.0 */ -import {EditorView, ViewPlugin} from "@codemirror/view"; -import {Facet} from "@codemirror/state"; +import { EditorView, ViewPlugin } from "@codemirror/view"; +import { Facet } from "@codemirror/state"; const panelConfig = Facet.define({ combine(configs) { @@ -18,7 +18,7 @@ const panelConfig = Facet.define({ leftContainer = leftContainer || c.leftContainer; rightContainer = rightContainer || c.rightContainer; } - return {leftContainer, rightContainer}; + return { leftContainer, rightContainer }; } }); @@ -45,87 +45,91 @@ export function getPanel(view, panel) { return index > -1 ? plugin.panels[index] : null; } -const panelPlugin = ViewPlugin.fromClass(class { - - /** - * @param {EditorView} view - */ - constructor(view) { - this.input = view.state.facet(showSidePanel); - this.specs = this.input.filter(s => s); - this.panels = this.specs.map(spec => spec(view)); - const conf = view.state.facet(panelConfig); - this.left = new PanelGroup(view, true, conf.leftContainer); - this.right = new PanelGroup(view, false, conf.rightContainer); - this.left.sync(this.panels.filter(p => p.left)); - this.right.sync(this.panels.filter(p => !p.left)); - for (const p of this.panels) { - p.dom.classList.add("cm-panel"); - if (p.mount) p.mount(); - } - } - - /** - * @param {ViewUpdate} update - */ - update(update) { - const conf = update.state.facet(panelConfig); - if (this.left.container !== conf.leftContainer) { - this.left.sync([]); - this.left = new PanelGroup(update.view, true, conf.leftContainer); - } - if (this.right.container !== conf.rightContainer) { - this.right.sync([]); - this.right = new PanelGroup(update.view, false, conf.rightContainer); - } - this.left.syncClasses(); - this.right.syncClasses(); - const input = update.state.facet(showSidePanel); - if (input !== this.input) { - const specs = input.filter(x => x); - const panels = [], left = [], right = [], mount = []; - for (const spec of specs) { - const known = this.specs.indexOf(spec); - let panel; - if (known < 0) { - panel = spec(update.view); - mount.push(panel); - } else { - panel = this.panels[known]; - if (panel.update) panel.update(update); - } - panels.push(panel) - ;(panel.left ? left : right).push(panel); - } - this.specs = specs; - this.panels = panels; - this.left.sync(left); - this.right.sync(right); - for (const p of mount) { +const panelPlugin = ViewPlugin.fromClass( + class { + /** + * @param {EditorView} view + */ + constructor(view) { + this.input = view.state.facet(showSidePanel); + this.specs = this.input.filter((s) => s); + this.panels = this.specs.map((spec) => spec(view)); + const conf = view.state.facet(panelConfig); + this.left = new PanelGroup(view, true, conf.leftContainer); + this.right = new PanelGroup(view, false, conf.rightContainer); + this.left.sync(this.panels.filter((p) => p.left)); + this.right.sync(this.panels.filter((p) => !p.left)); + for (const p of this.panels) { p.dom.classList.add("cm-panel"); if (p.mount) p.mount(); } - } else { - for (const p of this.panels) if (p.update) p.update(update); } - } - /** - * Destroy panel - */ - destroy() { - this.left.sync([]); - this.right.sync([]); + /** + * @param {ViewUpdate} update + */ + update(update) { + const conf = update.state.facet(panelConfig); + if (this.left.container !== conf.leftContainer) { + this.left.sync([]); + this.left = new PanelGroup(update.view, true, conf.leftContainer); + } + if (this.right.container !== conf.rightContainer) { + this.right.sync([]); + this.right = new PanelGroup(update.view, false, conf.rightContainer); + } + this.left.syncClasses(); + this.right.syncClasses(); + const input = update.state.facet(showSidePanel); + if (input !== this.input) { + const specs = input.filter((x) => x); + const panels = [], + left = [], + right = [], + mount = []; + for (const spec of specs) { + const known = this.specs.indexOf(spec); + let panel; + if (known < 0) { + panel = spec(update.view); + mount.push(panel); + } else { + panel = this.panels[known]; + if (panel.update) panel.update(update); + } + panels.push(panel); + (panel.left ? left : right).push(panel); + } + this.specs = specs; + this.panels = panels; + this.left.sync(left); + this.right.sync(right); + for (const p of mount) { + p.dom.classList.add("cm-panel"); + if (p.mount) p.mount(); + } + } else { + for (const p of this.panels) if (p.update) p.update(update); + } + } + + /** + * Destroy panel + */ + destroy() { + this.left.sync([]); + this.right.sync([]); + } + }, + { + // provide: PluginField.scrollMargins.from(value => ({left: value.left.scrollMargin(), right: value.right.scrollMargin()})) } -}, { - // provide: PluginField.scrollMargins.from(value => ({left: value.left.scrollMargin(), right: value.right.scrollMargin()})) -}); +); /** * PanelGroup */ class PanelGroup { - /** * @param {EditorView} view * @param {boolean} left @@ -201,10 +205,16 @@ class PanelGroup { * */ scrollMargin() { - return !this.dom || this.container ? 0 : - Math.max(0, this.left ? - this.dom.getBoundingClientRect().right - Math.max(0, this.view.scrollDOM.getBoundingClientRect().left) : - Math.min(innerHeight, this.view.scrollDOM.getBoundingClientRect().right) - this.dom.getBoundingClientRect().left); + return !this.dom || this.container + ? 0 + : Math.max( + 0, + this.left + ? this.dom.getBoundingClientRect().right + - Math.max(0, this.view.scrollDOM.getBoundingClientRect().left) + : Math.min(innerHeight, this.view.scrollDOM.getBoundingClientRect().right) + - this.dom.getBoundingClientRect().left + ); } /** @@ -213,7 +223,8 @@ class PanelGroup { syncClasses() { if (!this.container || this.classes === this.view.themeClasses) return; for (const cls of this.classes.split(" ")) if (cls) this.container.classList.remove(cls); - for (const cls of (this.classes = this.view.themeClasses).split(" ")) if (cls) this.container.classList.add(cls); + for (const cls of (this.classes = this.view.themeClasses).split(" ")) + if (cls) this.container.classList.add(cls); } } diff --git a/src/web/utils/statusBar.mjs b/src/web/utils/statusBar.mjs index 6469379a..7c74f27c 100644 --- a/src/web/utils/statusBar.mjs +++ b/src/web/utils/statusBar.mjs @@ -4,14 +4,13 @@ * @license Apache-2.0 */ -import {showPanel} from "@codemirror/view"; -import {CHR_ENC_SIMPLE_LOOKUP, CHR_ENC_SIMPLE_REVERSE_LOOKUP} from "../../core/lib/ChrEnc.mjs"; +import { showPanel } from "@codemirror/view"; +import { CHR_ENC_SIMPLE_LOOKUP, CHR_ENC_SIMPLE_REVERSE_LOOKUP } from "../../core/lib/ChrEnc.mjs"; /** * A Status bar extension for CodeMirror */ class StatusBarPanel { - /** * StatusBarPanel constructor * @param {Object} opts @@ -42,7 +41,10 @@ class StatusBarPanel { dom.className = "cm-status-bar"; dom.setAttribute("data-help-title", `${this.label} status bar`); - dom.setAttribute("data-help", `This status bar provides information about data in the ${this.label}. Help topics are available for each of the components by activating help when hovering over them.`); + dom.setAttribute( + "data-help", + `This status bar provides information about data in the ${this.label}. Help topics are available for each of the components by activating help when hovering over them.` + ); lhs.innerHTML = this.constructLHS(); rhs.innerHTML = this.constructRHS(); @@ -50,8 +52,8 @@ class StatusBarPanel { dom.appendChild(rhs); // Event listeners - dom.querySelectorAll(".cm-status-bar-select-btn").forEach( - el => el.addEventListener("click", this.showDropUp.bind(this), false) + dom.querySelectorAll(".cm-status-bar-select-btn").forEach((el) => + el.addEventListener("click", this.showDropUp.bind(this), false) ); dom.querySelector(".eol-select").addEventListener("click", this.eolSelectClick.bind(this), false); dom.querySelector(".chr-enc-select").addEventListener("click", this.chrEncSelectClick.bind(this), false); @@ -66,9 +68,7 @@ class StatusBarPanel { * @param {Event} e */ showDropUp(e) { - const el = e.target - .closest(".cm-status-bar-select") - .querySelector(".cm-status-bar-select-content"); + const el = e.target.closest(".cm-status-bar-select").querySelector(".cm-status-bar-select-content"); const btn = e.target.closest(".cm-status-bar-select-btn"); if (btn.classList.contains("disabled")) return; @@ -161,7 +161,7 @@ class StatusBarPanel { // CodeMirror always counts line breaks as one character. // We want to show an accurate reading of how many bytes there are. if (state.lineBreak.length !== 1) { - docLength += (state.lineBreak.length * state.doc.lines) - state.doc.lines - 1; + docLength += state.lineBreak.length * state.doc.lines - state.doc.lines - 1; } length.textContent = docLength; lines.textContent = state.doc.lines; @@ -173,9 +173,7 @@ class StatusBarPanel { * @param {boolean} selectionSet */ updateSelection(state, selectionSet) { - const selLen = state?.selection?.main ? - state.selection.main.to - state.selection.main.from : - 0; + const selLen = state?.selection?.main ? state.selection.main.to - state.selection.main.from : 0; const selInfo = this.dom.querySelector(".sel-info"), curOffsetInfo = this.dom.querySelector(".cur-offset-info"); @@ -193,11 +191,12 @@ class StatusBarPanel { if (state.lineBreak.length !== 1) { const fromLine = state.doc.lineAt(from).number; const toLine = state.doc.lineAt(to).number; - from += (state.lineBreak.length * fromLine) - fromLine - 1; - to += (state.lineBreak.length * toLine) - toLine - 1; + from += state.lineBreak.length * fromLine - fromLine - 1; + to += state.lineBreak.length * toLine - toLine - 1; } - if (selLen > 0) { // Range + if (selLen > 0) { + // Range const start = this.dom.querySelector(".sel-start-value"), end = this.dom.querySelector(".sel-end-value"), length = this.dom.querySelector(".sel-length-value"); @@ -207,7 +206,8 @@ class StatusBarPanel { start.textContent = from; end.textContent = to; length.textContent = to - from; - } else { // Position + } else { + // Position const offset = this.dom.querySelector(".cur-offset-value"); selInfo.style.display = "none"; @@ -243,7 +243,6 @@ class StatusBarPanel { this.eolVal = state.lineBreak; } - /** * Sets the current character encoding of the document */ @@ -287,11 +286,9 @@ class StatusBarPanel { */ updateSizing(view) { const viewHeight = view.contentDOM.parentNode.clientHeight; - this.dom.querySelectorAll(".cm-status-bar-select-scroll").forEach( - el => { - el.style.maxHeight = (viewHeight - 50) + "px"; - } - ); + this.dom.querySelectorAll(".cm-status-bar-select-scroll").forEach((el) => { + el.style.maxHeight = viewHeight - 50 + "px"; + }); } /** @@ -302,12 +299,12 @@ class StatusBarPanel { if (this.htmlOutput?.html === "") { // Enable all controls - this.dom.querySelectorAll(".disabled").forEach(el => { + this.dom.querySelectorAll(".disabled").forEach((el) => { el.classList.remove("disabled"); }); } else { // Disable chrenc, length, selection etc. - this.dom.querySelectorAll(".cm-status-bar-select-btn").forEach(el => { + this.dom.querySelectorAll(".cm-status-bar-select-btn").forEach((el) => { el.classList.add("disabled"); }); @@ -351,18 +348,22 @@ class StatusBarPanel { * @returns {string} */ constructRHS() { - const chrEncOptions = Object.keys(CHR_ENC_SIMPLE_LOOKUP).map(name => - `${name}` - ).join(""); + const chrEncOptions = Object.keys(CHR_ENC_SIMPLE_LOOKUP) + .map((name) => `${name}`) + .join(""); let chrEncHelpText = "", eolHelpText = ""; if (this.label === "Input") { - chrEncHelpText = "The input character encoding defines how the input text is encoded into bytes which are then processed by the Recipe.

    The 'Raw bytes' option attempts to treat the input as individual bytes in the range 0-255. If it detects any characters with Unicode values above 255, it will treat the entire input as UTF-8. 'Raw bytes' is usually the best option if you are inputting binary data, such as a file."; - eolHelpText = "The End of Line Sequence defines which bytes are considered EOL terminators. Pressing the return key will enter this value into the input and create a new line.

    Changing the EOL sequence will not modify any existing data in the input but may change how previously entered line breaks are displayed. Lines added while a different EOL terminator was set may not now result in a new line, but may be displayed as control characters instead."; + chrEncHelpText + = "The input character encoding defines how the input text is encoded into bytes which are then processed by the Recipe.

    The 'Raw bytes' option attempts to treat the input as individual bytes in the range 0-255. If it detects any characters with Unicode values above 255, it will treat the entire input as UTF-8. 'Raw bytes' is usually the best option if you are inputting binary data, such as a file."; + eolHelpText + = "The End of Line Sequence defines which bytes are considered EOL terminators. Pressing the return key will enter this value into the input and create a new line.

    Changing the EOL sequence will not modify any existing data in the input but may change how previously entered line breaks are displayed. Lines added while a different EOL terminator was set may not now result in a new line, but may be displayed as control characters instead."; } else { - chrEncHelpText = "The output character encoding defines how the output bytes are decoded into text which can be displayed to you.

    The 'Raw bytes' option treats the output data as individual bytes in the range 0-255."; - eolHelpText = "The End of Line Sequence defines which bytes are considered EOL terminators.

    Changing this value will not modify the value of the output, but may change how certain bytes are displayed and whether they result in a new line being created."; + chrEncHelpText + = "The output character encoding defines how the output bytes are decoded into text which can be displayed to you.

    The 'Raw bytes' option treats the output data as individual bytes in the range 0-255."; + eolHelpText + = "The End of Line Sequence defines which bytes are considered EOL terminators.

    Changing this value will not modify the value of the output, but may change how certain bytes are displayed and whether they result in a new line being created."; } return ` @@ -407,7 +408,6 @@ class StatusBarPanel { `; } - } const elementsWithListeners = {}; @@ -423,11 +423,10 @@ function hideOnClickOutside(element, instantiatingEvent) { * Closes element if click is outside it. * @param {Event} event */ - const outsideClickListener = event => { + const outsideClickListener = (event) => { // Don't trigger if we're clicking inside the element, or if the element // is not visible, or if this is the same click event that opened it. - if (!element.contains(event.target) && - event.timeStamp !== instantiatingEvent.timeStamp) { + if (!element.contains(event.target) && event.timeStamp !== instantiatingEvent.timeStamp) { hideElement(element); } }; @@ -448,7 +447,6 @@ function hideElement(element) { delete elementsWithListeners[element]; } - /** * A panel constructor factory building a panel that re-counts the stats every time the document changes. * @param {Object} opts diff --git a/src/web/waiters/BackgroundWorkerWaiter.mjs b/src/web/waiters/BackgroundWorkerWaiter.mjs index 409c2bbb..dfb55579 100644 --- a/src/web/waiters/BackgroundWorkerWaiter.mjs +++ b/src/web/waiters/BackgroundWorkerWaiter.mjs @@ -10,7 +10,6 @@ import ChefWorker from "worker-loader?inline=no-fallback!../../core/ChefWorker.j * Waiter to handle conversations with a ChefWorker in the background. */ class BackgroundWorkerWaiter { - /** * BackgroundWorkerWaiter constructor. * @@ -27,7 +26,6 @@ class BackgroundWorkerWaiter { this.timeout = null; } - /** * Sets up the ChefWorker and associated listeners. */ @@ -49,10 +47,9 @@ class BackgroundWorkerWaiter { if (index > 0) { docURL = docURL.substring(0, index); } - this.chefWorker.postMessage({"action": "docURL", "data": docURL}); + this.chefWorker.postMessage({ "action": "docURL", "data": docURL }); } - /** * Handler for messages sent back by the ChefWorker. * @@ -85,17 +82,14 @@ class BackgroundWorkerWaiter { } } - /** * Cancels the current bake by terminating the ChefWorker and creating a new one. */ cancelBake() { - if (this.chefWorker) - this.chefWorker.terminate(); + if (this.chefWorker) this.chefWorker.terminate(); this.registerChefWorker(); } - /** * Asks the ChefWorker to bake the input using the specified recipe. * @@ -123,7 +117,6 @@ class BackgroundWorkerWaiter { }); } - /** * Asks the Magic operation what it can do with the input data. * @@ -136,18 +129,24 @@ class BackgroundWorkerWaiter { this.cancelBake(); } - this.bake(input, [ - { - "op": "Magic", - "args": [3, false, false] - } - ], {}, 0, false, this.magicComplete); + this.bake( + input, + [ + { + "op": "Magic", + "args": [3, false, false] + } + ], + {}, + 0, + false, + this.magicComplete + ); // Cancel this bake if it takes too long. this.timeout = setTimeout(this.cancelBake.bind(this), 3000); } - /** * Handler for completed Magic bakes. * @@ -160,7 +159,6 @@ class BackgroundWorkerWaiter { this.manager.output.backgroundMagicResult(response.dish.value); } - /** * Sets the console log level in the workers. */ @@ -171,8 +169,6 @@ class BackgroundWorkerWaiter { data: log.getLevel() }); } - } - export default BackgroundWorkerWaiter; diff --git a/src/web/waiters/BindingsWaiter.mjs b/src/web/waiters/BindingsWaiter.mjs index 3766b8d5..ee1b3d3a 100755 --- a/src/web/waiters/BindingsWaiter.mjs +++ b/src/web/waiters/BindingsWaiter.mjs @@ -8,7 +8,6 @@ * Waiter to handle keybindings to CyberChef functions (i.e. Bake, Step, Save, Load etc.) */ class BindingsWaiter { - /** * BindingsWaiter constructor. * @@ -20,7 +19,6 @@ class BindingsWaiter { this.manager = manager; } - /** * Handler for all keydown events * Checks whether valid keyboard shortcut has been instated @@ -49,7 +47,9 @@ class BindingsWaiter { case "Period": // Focus next operation e.preventDefault(); try { - elem = document.activeElement.closest(".operation") || document.querySelector("#rec-list .operation"); + elem + = document.activeElement.closest(".operation") + || document.querySelector("#rec-list .operation"); if (elem.parentNode.lastChild === elem) { // If operation is last in recipe, loop around to the top operation's first argument elem.parentNode.firstChild.querySelectorAll(".arg")[0].focus(); @@ -137,7 +137,8 @@ class BindingsWaiter { this.manager.input.changeTabRight(); break; default: - if (e.code.match(/Digit[0-9]/g)) { // Select nth operation + if (e.code.match(/Digit[0-9]/g)) { + // Select nth operation e.preventDefault(); try { // Select the first argument of the operation corresponding to the number pressed @@ -158,7 +159,6 @@ class BindingsWaiter { } } - /** * Updates keybinding list when metaKey option is toggled */ @@ -292,17 +292,14 @@ class BindingsWaiter { const helpText = el.getAttribute("data-help"); let helpTitle = el.getAttribute("data-help-title"); - if (helpTitle) - helpTitle = "Help topic: " + helpTitle; - else - helpTitle = "Help topic"; + if (helpTitle) helpTitle = "Help topic: " + helpTitle; + else helpTitle = "Help topic"; document.querySelector("#help-modal .modal-body").innerHTML = helpText; document.querySelector("#help-modal #help-title").innerHTML = helpTitle; $("#help-modal").modal(); } - } export default BindingsWaiter; diff --git a/src/web/waiters/ControlsWaiter.mjs b/src/web/waiters/ControlsWaiter.mjs index 6a0ef6f2..92903cba 100755 --- a/src/web/waiters/ControlsWaiter.mjs +++ b/src/web/waiters/ControlsWaiter.mjs @@ -6,12 +6,10 @@ import Utils from "../../core/Utils.mjs"; - /** * Waiter to handle events related to the CyberChef controls (i.e. Bake, Step, Save, Load etc.) */ class ControlsWaiter { - /** * ControlsWaiter constructor. * @@ -23,7 +21,6 @@ class ControlsWaiter { this.manager = manager; } - /** * Initialise Bootstrap components */ @@ -37,7 +34,6 @@ class ControlsWaiter { }); } - /** * Checks or unchecks the Auto Bake checkbox based on the given value. * @@ -51,7 +47,6 @@ class ControlsWaiter { } } - /** * Handler to trigger baking. */ @@ -64,7 +59,6 @@ class ControlsWaiter { } } - /** * Handler for the 'Step through' command. Executes the next step of the recipe. */ @@ -72,7 +66,6 @@ class ControlsWaiter { this.app.step(); } - /** * Handler for changes made to the Auto Bake checkbox. */ @@ -80,7 +73,6 @@ class ControlsWaiter { this.app.autoBake_ = document.getElementById("auto-bake").checked; } - /** * Handler for the 'Clear recipe' command. Removes all operations from the recipe. */ @@ -88,7 +80,6 @@ class ControlsWaiter { this.manager.recipe.clearRecipe(); } - /** * Populates the save dialog box with a URL incorporating the recipe and input. * @@ -106,7 +97,6 @@ class ControlsWaiter { saveLinkEl.setAttribute("href", saveLink); } - /** * Generates a URL containing the current recipe and input state. * @@ -120,12 +110,10 @@ class ControlsWaiter { generateStateUrl(includeRecipe, includeInput, input, recipeConfig, baseURL) { recipeConfig = recipeConfig || this.app.getRecipeConfig(); - const link = baseURL || window.location.protocol + "//" + - window.location.host + - window.location.pathname; + const link = baseURL || window.location.protocol + "//" + window.location.host + window.location.pathname; const recipeStr = Utils.generatePrettyRecipe(recipeConfig); - includeRecipe = includeRecipe && (recipeConfig.length > 0); + includeRecipe = includeRecipe && recipeConfig.length > 0; // If we don't get passed an input, get it from the current URI if (input === null && includeInput) { @@ -153,7 +141,7 @@ class ControlsWaiter { ]; const hash = params - .filter(v => v) + .filter((v) => v) .map(([key, value]) => `${key}=${Utils.encodeURIFragment(value)}`) .join("&"); @@ -164,7 +152,6 @@ class ControlsWaiter { return link; } - /** * Handler for changes made to the save dialog text area. Re-initialises the save link. */ @@ -175,7 +162,6 @@ class ControlsWaiter { } catch (err) {} } - /** * Handler for the 'Save' command. Pops up the save dialog box. */ @@ -185,7 +171,7 @@ class ControlsWaiter { document.getElementById("save-text-chef").value = Utils.generatePrettyRecipe(recipeConfig, true); document.getElementById("save-text-clean").value = JSON.stringify(recipeConfig, null, 2) - .replace(/{\n\s+"/g, "{ \"") + .replace(/{\n\s+"/g, '{ "') .replace(/\[\n\s{3,}/g, "[") .replace(/\n\s{3,}]/g, "]") .replace(/\s*\n\s*}/g, " }") @@ -196,7 +182,6 @@ class ControlsWaiter { $("#save-modal").modal(); } - /** * Handler for the save link recipe checkbox change event. */ @@ -204,7 +189,6 @@ class ControlsWaiter { this.initialiseSaveLink(); } - /** * Handler for the save link input checkbox change event. */ @@ -212,7 +196,6 @@ class ControlsWaiter { this.initialiseSaveLink(); } - /** * Handler for the 'Load' command. Pops up the load dialog box. */ @@ -221,7 +204,6 @@ class ControlsWaiter { $("#load-modal").modal(); } - /** * Saves the recipe specified in the save textarea to local storage. */ @@ -235,15 +217,14 @@ class ControlsWaiter { } const recipeName = Utils.escapeHtml(document.getElementById("save-name").value); - const recipeStr = document.querySelector("#save-texts .tab-pane.active textarea").value; + const recipeStr = document.querySelector("#save-texts .tab-pane.active textarea").value; if (!recipeName) { this.app.alert("Please enter a recipe name", 3000); return; } - const savedRecipes = localStorage.savedRecipes ? - JSON.parse(localStorage.savedRecipes) : []; + const savedRecipes = localStorage.savedRecipes ? JSON.parse(localStorage.savedRecipes) : []; let recipeId = localStorage.recipeId || 0; savedRecipes.push({ @@ -258,7 +239,6 @@ class ControlsWaiter { this.app.alert(`Recipe saved as "${recipeName}".`, 3000); } - /** * Populates the list of saved recipes in the load dialog box from local storage. */ @@ -274,8 +254,7 @@ class ControlsWaiter { } // Add recipes to select - const savedRecipes = localStorage.savedRecipes ? - JSON.parse(localStorage.savedRecipes) : []; + const savedRecipes = localStorage.savedRecipes ? JSON.parse(localStorage.savedRecipes) : []; for (i = 0; i < savedRecipes.length; i++) { const opt = document.createElement("option"); @@ -293,7 +272,6 @@ class ControlsWaiter { loadText.dispatchEvent(evt); } - /** * Removes the currently selected recipe from local storage. */ @@ -301,16 +279,14 @@ class ControlsWaiter { if (!this.app.isLocalStorageAvailable()) return false; const id = parseInt(document.getElementById("load-name").value, 10); - const rawSavedRecipes = localStorage.savedRecipes ? - JSON.parse(localStorage.savedRecipes) : []; + const rawSavedRecipes = localStorage.savedRecipes ? JSON.parse(localStorage.savedRecipes) : []; - const savedRecipes = rawSavedRecipes.filter(r => r.id !== id); + const savedRecipes = rawSavedRecipes.filter((r) => r.id !== id); localStorage.savedRecipes = JSON.stringify(savedRecipes); this.populateLoadRecipesList(); } - /** * Displays the selected recipe in the load text box. */ @@ -318,16 +294,14 @@ class ControlsWaiter { if (!this.app.isLocalStorageAvailable()) return false; const el = e.target; - const savedRecipes = localStorage.savedRecipes ? - JSON.parse(localStorage.savedRecipes) : []; + const savedRecipes = localStorage.savedRecipes ? JSON.parse(localStorage.savedRecipes) : []; const id = parseInt(el.value, 10); - const recipe = savedRecipes.find(r => r.id === id); + const recipe = savedRecipes.find((r) => r.id === id); document.getElementById("load-text").value = recipe.recipe; } - /** * Loads the selected recipe and populates the Recipe with its operations. */ @@ -343,7 +317,6 @@ class ControlsWaiter { } } - /** * Populates the bug report information box with useful technical info. * @@ -366,7 +339,6 @@ ${navigator.userAgent} } } - /** * Shows the stale indicator to show that the input or recipe has changed * since the last bake. @@ -376,7 +348,6 @@ ${navigator.userAgent} staleIndicator.classList.remove("hidden"); } - /** * Hides the stale indicator to show that the input or recipe has not changed * since the last bake. @@ -386,7 +357,6 @@ ${navigator.userAgent} staleIndicator.classList.add("hidden"); } - /** * Switches the Bake button between 'Bake', 'Cancel' and 'Loading' functions. * @@ -429,7 +399,6 @@ ${navigator.userAgent} recList.style.bottom = controls.clientHeight + "px"; } - } export default ControlsWaiter; diff --git a/src/web/waiters/HighlighterWaiter.mjs b/src/web/waiters/HighlighterWaiter.mjs index 20ad0c6a..b63a915a 100755 --- a/src/web/waiters/HighlighterWaiter.mjs +++ b/src/web/waiters/HighlighterWaiter.mjs @@ -4,14 +4,13 @@ * @license Apache-2.0 */ -import {EditorSelection} from "@codemirror/state"; -import {chrEncWidth} from "../../core/lib/ChrEnc.mjs"; +import { EditorSelection } from "@codemirror/state"; +import { chrEncWidth } from "../../core/lib/ChrEnc.mjs"; /** * Waiter to handle events related to highlighting in CyberChef. */ class HighlighterWaiter { - /** * HighlighterWaiter constructor. * @@ -54,20 +53,22 @@ class HighlighterWaiter { const inputCharacterWidth = chrEncWidth(this.manager.input.getChrEnc()); const outputCharacterWidth = chrEncWidth(this.manager.output.getChrEnc()); let ratio = 1; - if (inputCharacterWidth !== outputCharacterWidth && - inputCharacterWidth !== 0 && outputCharacterWidth !== 0) { - ratio = io === "input" ? - inputCharacterWidth / outputCharacterWidth : - outputCharacterWidth / inputCharacterWidth; + if (inputCharacterWidth !== outputCharacterWidth && inputCharacterWidth !== 0 && outputCharacterWidth !== 0) { + ratio + = io === "input" + ? inputCharacterWidth / outputCharacterWidth + : outputCharacterWidth / inputCharacterWidth; } // Loop through ranges and send request for output offsets for each one const direction = io === "input" ? "forward" : "reverse"; for (const range of selectionRanges) { - const pos = [{ - start: Math.floor(range.from * ratio), - end: Math.floor(range.to * ratio) - }]; + const pos = [ + { + start: Math.floor(range.from * ratio), + end: Math.floor(range.to * ratio) + } + ]; this.manager.worker.highlight(this.app.getRecipeConfig(), direction, pos); } } @@ -101,18 +102,15 @@ class HighlighterWaiter { if (!this.app.options.attemptHighlight) return false; if (!ranges || !ranges.length) return false; - const view = io === "input" ? - this.manager.input.inputEditorView : - this.manager.output.outputEditorView; + const view = io === "input" ? this.manager.input.inputEditorView : this.manager.output.outputEditorView; // Add new SelectionRanges to existing ones for (const range of ranges) { - if (typeof range.start !== "number" || - typeof range.end !== "number") - continue; - const selection = range.end <= range.start ? - EditorSelection.cursor(range.start) : - EditorSelection.range(range.start, range.end); + if (typeof range.start !== "number" || typeof range.end !== "number") continue; + const selection + = range.end <= range.start + ? EditorSelection.cursor(range.start) + : EditorSelection.range(range.start, range.end); this.currentSelectionRanges.push(selection); } @@ -132,7 +130,6 @@ class HighlighterWaiter { } } } - } export default HighlighterWaiter; diff --git a/src/web/waiters/InputWaiter.mjs b/src/web/waiters/InputWaiter.mjs index 25c1629d..4a901f4d 100644 --- a/src/web/waiters/InputWaiter.mjs +++ b/src/web/waiters/InputWaiter.mjs @@ -7,8 +7,8 @@ import LoaderWorker from "worker-loader?inline=no-fallback!../workers/LoaderWorker.js"; import InputWorker from "worker-loader?inline=no-fallback!../workers/InputWorker.mjs"; -import Utils, {debounce} from "../../core/Utils.mjs"; -import {toBase64} from "../../core/lib/Base64.mjs"; +import Utils, { debounce } from "../../core/Utils.mjs"; +import { toBase64 } from "../../core/lib/Base64.mjs"; import cptable from "codepage"; import { @@ -20,36 +20,19 @@ import { crosshairCursor, dropCursor } from "@codemirror/view"; -import { - EditorState, - Compartment -} from "@codemirror/state"; -import { - defaultKeymap, - insertTab, - insertNewline, - history, - historyKeymap -} from "@codemirror/commands"; -import { - bracketMatching -} from "@codemirror/language"; -import { - search, - searchKeymap, - highlightSelectionMatches -} from "@codemirror/search"; - -import {statusBar} from "../utils/statusBar.mjs"; -import {fileDetailsPanel} from "../utils/fileDetails.mjs"; -import {renderSpecialChar} from "../utils/editorUtils.mjs"; +import { EditorState, Compartment } from "@codemirror/state"; +import { defaultKeymap, insertTab, insertNewline, history, historyKeymap } from "@codemirror/commands"; +import { bracketMatching } from "@codemirror/language"; +import { search, searchKeymap, highlightSelectionMatches } from "@codemirror/search"; +import { statusBar } from "../utils/statusBar.mjs"; +import { fileDetailsPanel } from "../utils/fileDetails.mjs"; +import { renderSpecialChar } from "../utils/editorUtils.mjs"; /** * Waiter to handle events related to the input. */ class InputWaiter { - /** * InputWaiter constructor. * @@ -73,8 +56,7 @@ class InputWaiter { this.fileDetails = {}; this.maxWorkers = 1; - if (navigator.hardwareConcurrency !== undefined && - navigator.hardwareConcurrency > 1) { + if (navigator.hardwareConcurrency !== undefined && navigator.hardwareConcurrency > 1) { // Subtract 1 from hardwareConcurrency value to avoid using // the entire available resources this.maxWorkers = navigator.hardwareConcurrency - 1; @@ -87,9 +69,9 @@ class InputWaiter { initEditor() { // Mutable extensions this.inputEditorConf = { - eol: new Compartment, - lineWrapping: new Compartment, - fileDetailsPanel: new Compartment + eol: new Compartment(), + lineWrapping: new Compartment(), + fileDetailsPanel: new Compartment() }; const initialState = EditorState.create({ @@ -106,7 +88,7 @@ class InputWaiter { dropCursor(), bracketMatching(), highlightSelectionMatches(), - search({top: true}), + search({ top: true }), EditorState.allowMultipleSelections.of(true), // Custom extensions @@ -135,11 +117,9 @@ class InputWaiter { ]), // Event listeners - EditorView.updateListener.of(e => { - if (e.selectionSet) - this.manager.highlighter.selectionChange("input", e); - if (e.docChanged && !this.silentInputChange) - this.inputChange(e); + EditorView.updateListener.of((e) => { + if (e.selectionSet) this.manager.highlighter.selectionChange("input", e); + if (e.docChanged && !this.silentInputChange) this.inputChange(e); this.silentInputChange = false; }) ] @@ -201,9 +181,7 @@ class InputWaiter { */ setWordWrap(wrap) { this.inputEditorView.dispatch({ - effects: this.inputEditorConf.lineWrapping.reconfigure( - wrap ? EditorView.lineWrapping : [] - ) + effects: this.inputEditorConf.lineWrapping.reconfigure(wrap ? EditorView.lineWrapping : []) }); } @@ -222,18 +200,19 @@ class InputWaiter { * @param {string} data * @param {boolean} [silent=false] */ - setInput(data, silent=false) { + setInput(data, silent = false) { const lineLengthThreshold = 131072; // 128KB let wrap = this.app.options.wordWrap; if (data.length > lineLengthThreshold) { const lines = data.split(this.getEOLSeq()); - const longest = lines.reduce((a, b) => - a > b.length ? a : b.length, 0 - ); + const longest = lines.reduce((a, b) => (a > b.length ? a : b.length), 0); if (longest > lineLengthThreshold) { // If we are exceeding the max line length, turn off word wrap wrap = false; - this.app.alert("Maximum line length exceeded. Word wrap will be temporarily disabled to improve performance.", 20000); + this.app.alert( + "Maximum line length exceeded. Word wrap will be temporarily disabled to improve performance.", + 20000 + ); } } @@ -433,19 +412,23 @@ class InputWaiter { handleLoaderMessage(e) { const r = e.data; - if (Object.prototype.hasOwnProperty.call(r, "progress") && - Object.prototype.hasOwnProperty.call(r, "inputNum")) { + if ( + Object.prototype.hasOwnProperty.call(r, "progress") + && Object.prototype.hasOwnProperty.call(r, "inputNum") + ) { this.manager.tabs.updateTabProgress(r.inputNum, r.progress, 100, "input"); } const transferable = Object.prototype.hasOwnProperty.call(r, "fileBuffer") ? [r.fileBuffer] : undefined; - this.inputWorker.postMessage({ - action: "loaderWorkerMessage", - data: r - }, transferable); + this.inputWorker.postMessage( + { + action: "loaderWorkerMessage", + data: r + }, + transferable + ); } - /** * Handler for messages sent back by the InputWorker * @@ -551,54 +534,53 @@ class InputWaiter { * @param {string} eolSequence * @param {boolean} [silent=false] - If false, fires the manager statechange event */ - async set(inputNum, inputData, silent=false) { - return new Promise(function(resolve, reject) { - const activeTab = this.manager.tabs.getActiveTab("input"); - if (inputNum !== activeTab) { - this.changeTab(inputNum, this.app.options.syncTabs); - return; - } + async set(inputNum, inputData, silent = false) { + return new Promise( + function (resolve, reject) { + const activeTab = this.manager.tabs.getActiveTab("input"); + if (inputNum !== activeTab) { + this.changeTab(inputNum, this.app.options.syncTabs); + return; + } - // Update current character encoding - this.inputChrEnc = inputData.encoding; + // Update current character encoding + this.inputChrEnc = inputData.encoding; - // Update current eol sequence - this.inputEditorView.dispatch({ - effects: this.inputEditorConf.eol.reconfigure( - EditorState.lineSeparator.of(inputData.eolSequence) - ) - }); + // Update current eol sequence + this.inputEditorView.dispatch({ + effects: this.inputEditorConf.eol.reconfigure(EditorState.lineSeparator.of(inputData.eolSequence)) + }); - // Handle file previews - if (inputData.file) { - this.setFile(inputNum, inputData); - } else { - this.clearFile(inputNum); - } + // Handle file previews + if (inputData.file) { + this.setFile(inputNum, inputData); + } else { + this.clearFile(inputNum); + } - // Decode the data to a string - this.manager.timing.recordTime("inputEncodingStart", inputNum); - let inputVal; - if (this.getChrEnc() > 0) { - inputVal = cptable.utils.decode(this.inputChrEnc, new Uint8Array(inputData.buffer)); - } else { - inputVal = Utils.arrayBufferToStr(inputData.buffer); - } - this.manager.timing.recordTime("inputEncodingEnd", inputNum); + // Decode the data to a string + this.manager.timing.recordTime("inputEncodingStart", inputNum); + let inputVal; + if (this.getChrEnc() > 0) { + inputVal = cptable.utils.decode(this.inputChrEnc, new Uint8Array(inputData.buffer)); + } else { + inputVal = Utils.arrayBufferToStr(inputData.buffer); + } + this.manager.timing.recordTime("inputEncodingEnd", inputNum); - // Populate the input editor - this.setInput(inputVal, silent); + // Populate the input editor + this.setInput(inputVal, silent); - // Set URL to current input - if (inputVal.length >= 0 && inputVal.length <= 51200) { - const inputStr = toBase64(inputVal, "A-Za-z0-9+/"); - this.app.updateURL(true, inputStr); - } + // Set URL to current input + if (inputVal.length >= 0 && inputVal.length <= 51200) { + const inputStr = toBase64(inputVal, "A-Za-z0-9+/"); + this.app.updateURL(true, inputStr); + } - // Trigger a state change - if (!silent) window.dispatchEvent(this.manager.statechange); - - }.bind(this)); + // Trigger a state change + if (!silent) window.dispatchEvent(this.manager.statechange); + }.bind(this) + ); } /** @@ -631,9 +613,7 @@ class InputWaiter { hidden: false }; this.inputEditorView.dispatch({ - effects: this.inputEditorConf.fileDetailsPanel.reconfigure( - fileDetailsPanel(this.fileDetails) - ) + effects: this.inputEditorConf.fileDetailsPanel.reconfigure(fileDetailsPanel(this.fileDetails)) }); } @@ -660,9 +640,7 @@ class InputWaiter { $("[data-toggle='tooltip']").tooltip("hide"); this.fileDetails.hidden = !this.fileDetails.hidden; this.inputEditorView.dispatch({ - effects: this.inputEditorConf.fileDetailsPanel.reconfigure( - fileDetailsPanel(this.fileDetails) - ) + effects: this.inputEditorConf.fileDetailsPanel.reconfigure(fileDetailsPanel(this.fileDetails)) }); } @@ -701,9 +679,7 @@ class InputWaiter { this.fileDetails.progress = progress; if (progress === "error") this.fileDetails.status = "error"; this.inputEditorView.dispatch({ - effects: this.inputEditorConf.fileDetailsPanel.reconfigure( - fileDetailsPanel(this.fileDetails) - ) + effects: this.inputEditorConf.fileDetailsPanel.reconfigure(fileDetailsPanel(this.fileDetails)) }); } @@ -713,7 +689,7 @@ class InputWaiter { * @param {number} inputNum * @param {string | ArrayBuffer} value */ - updateInputValue(inputNum, value, force=false) { + updateInputValue(inputNum, value, force = false) { // Prepare the value as a buffer (full value) and a string sample (up to 4096 bytes) let buffer; let stringSample = ""; @@ -742,16 +718,19 @@ class InputWaiter { // Post new value to the InputWorker const transferable = [buffer]; - this.inputWorker.postMessage({ - action: "updateInputValue", - data: { - inputNum: inputNum, - buffer: buffer, - stringSample: stringSample, - encoding: this.getChrEnc(), - eolSequence: this.getEOLSeq() - } - }, transferable); + this.inputWorker.postMessage( + { + action: "updateInputValue", + data: { + inputNum: inputNum, + buffer: buffer, + stringSample: stringSample, + encoding: this.getChrEnc(), + eolSequence: this.getEOLSeq() + } + }, + transferable + ); } /** @@ -761,8 +740,8 @@ class InputWaiter { * @returns {ArrayBuffer | string} */ async getInputValue(inputNum) { - return await new Promise(resolve => { - this.getInputFromWorker(inputNum, false, r => { + return await new Promise((resolve) => { + this.getInputFromWorker(inputNum, false, (r) => { resolve(r.data); }); }); @@ -775,8 +754,8 @@ class InputWaiter { * @returns {object} */ async getInputObj(inputNum) { - return await new Promise(resolve => { - this.getInputFromWorker(inputNum, true, r => { + return await new Promise((resolve) => { + this.getInputFromWorker(inputNum, true, (r) => { resolve(r.data); }); }); @@ -811,8 +790,8 @@ class InputWaiter { * @returns {object} */ async getInputNums() { - return await new Promise(resolve => { - this.getNums(r => { + return await new Promise((resolve) => { + this.getNums((r) => { resolve(r); }); }); @@ -851,19 +830,25 @@ class InputWaiter { else if (inputLength < 1000000) delay = 200; else delay = 500; - debounce(function(e) { - const value = this.getInput(); - const activeTab = this.manager.tabs.getActiveTab("input"); + debounce( + function (e) { + const value = this.getInput(); + const activeTab = this.manager.tabs.getActiveTab("input"); - this.updateInputValue(activeTab, value); - this.inputWorker.postMessage({ - action: "updateTabHeader", - data: activeTab - }); + this.updateInputValue(activeTab, value); + this.inputWorker.postMessage({ + action: "updateTabHeader", + data: activeTab + }); - // Fire the statechange event as the input has been modified - window.dispatchEvent(this.manager.statechange); - }, delay, "inputChange", this, [e])(); + // Fire the statechange event as the input has been modified + window.dispatchEvent(this.manager.statechange); + }, + delay, + "inputChange", + this, + [e] + )(); } /** @@ -874,8 +859,7 @@ class InputWaiter { */ inputDragover(e) { // This will be set if we're dragging an operation - if (e.dataTransfer.effectAllowed === "move") - return false; + if (e.dataTransfer.effectAllowed === "move") return false; e.stopPropagation(); e.preventDefault(); @@ -907,8 +891,7 @@ class InputWaiter { */ async inputDrop(e) { // This will be set if we're dragging an operation - if (e.dataTransfer.effectAllowed === "move") - return false; + if (e.dataTransfer.effectAllowed === "move") return false; e.stopPropagation(); e.preventDefault(); @@ -926,7 +909,7 @@ class InputWaiter { if (Object.prototype.hasOwnProperty.call(DataTransferItem.prototype, "webkitGetAsEntry")) { const fileEntries = await this.getAllFileEntries(e.dataTransfer.items); // Read all FileEntry objects into File objects - files = await Promise.all(fileEntries.map(async fe => await this.getFile(fe))); + files = await Promise.all(fileEntries.map(async (fe) => await this.getFile(fe))); } else { files = e.dataTransfer.files; } @@ -955,7 +938,7 @@ class InputWaiter { if (entry.isFile) { fileEntries.push(entry); } else if (entry.isDirectory) { - queue.push(...await this.readAllDirectoryEntries(entry.createReader())); + queue.push(...(await this.readAllDirectoryEntries(entry.createReader()))); } } return fileEntries; @@ -1052,16 +1035,19 @@ class InputWaiter { // Display the number of files as pending so the user // knows that we've received the files. - this.showLoadingInfo({ - pending: numFiles, - loading: 0, - loaded: 0, - total: numFiles, - activeProgress: { - inputNum: activeTab, - progress: 0 - } - }, false); + this.showLoadingInfo( + { + pending: numFiles, + loading: 0, + loaded: 0, + total: numFiles, + activeProgress: { + inputNum: activeTab, + progress: 0 + } + }, + false + ); this.inputWorker.postMessage({ action: "loadUIFiles", @@ -1120,19 +1106,22 @@ class InputWaiter { const inputTitle = document.getElementById("input").firstElementChild; if (loaded < total) { - const percentComplete = loaded / total * 100; + const percentComplete = (loaded / total) * 100; inputTitle.style.background = `linear-gradient(to right, var(--title-background-colour) ${percentComplete}%, var(--primary-background-colour) ${percentComplete}%)`; } else { inputTitle.style.background = ""; } if (loaded < total && autoRefresh) { - setTimeout(function() { - this.inputWorker.postMessage({ - action: "getLoadProgress", - data: this.manager.tabs.getActiveTab("input") - }); - }.bind(this), 100); + setTimeout( + function () { + this.inputWorker.postMessage({ + action: "getLoadProgress", + data: this.manager.tabs.getActiveTab("input") + }); + }.bind(this), + 100 + ); } } @@ -1142,7 +1131,7 @@ class InputWaiter { * @param {number} inputNum - The inputNum of the tab to change to * @param {boolean} [changeOutput=false] - If true, also changes the output */ - changeTab(inputNum, changeOutput=false) { + changeTab(inputNum, changeOutput = false) { if (this.manager.tabs.getTabItem(inputNum, "input") !== null) { this.manager.tabs.changeTab(inputNum, "input"); this.inputWorker.postMessage({ @@ -1228,7 +1217,7 @@ class InputWaiter { * Sets the console log level in the workers. */ setLogLevel() { - this.loaderWorkers.forEach(w => { + this.loaderWorkers.forEach((w) => { w.postMessage({ action: "setLogLevel", data: log.getLevel() @@ -1246,7 +1235,7 @@ class InputWaiter { * Sends a message to the inputWorker to add a new input. * @param {boolean} [changeTab=false] - If true, changes the tab to the new input */ - addInput(changeTab=false) { + addInput(changeTab = false) { if (!this.inputWorker) return; this.inputWorker.postMessage({ action: "addInput", @@ -1289,7 +1278,7 @@ class InputWaiter { * @param {number} inputNum - The inputNum of the new tab * @param {boolean} [changeTab=true] - If true, changes to the new tab once it's been added */ - addTab(inputNum, changeTab=true) { + addTab(inputNum, changeTab = true) { const tabsWrapper = document.getElementById("input-tabs"), numTabs = tabsWrapper.children.length; @@ -1395,10 +1384,10 @@ class InputWaiter { this.mousedown = true; this.changeTabRight(); const time = 200; - const func = function(time) { + const func = function (time) { if (this.mousedown) { this.changeTabRight(); - const newTime = (time > 50) ? time - 10 : 50; + const newTime = time > 50 ? time - 10 : 50; setTimeout(func.bind(this, [newTime]), newTime); } }; @@ -1412,10 +1401,10 @@ class InputWaiter { this.mousedown = true; this.changeTabLeft(); const time = 200; - const func = function(time) { + const func = function (time) { if (this.mousedown) { this.changeTabLeft(); - const newTime = (time > 50) ? time - 10 : 50; + const newTime = time > 50 ? time - 10 : 50; setTimeout(func.bind(this, [newTime]), newTime); } }; @@ -1465,7 +1454,10 @@ class InputWaiter { */ async goToTab() { const inputNums = await this.getInputNums(); - let tabNum = window.prompt(`Enter tab number (${inputNums.min} - ${inputNums.max}):`, this.manager.tabs.getActiveTab("input").toString()); + let tabNum = window.prompt( + `Enter tab number (${inputNums.min} - ${inputNums.max}):`, + this.manager.tabs.getActiveTab("input").toString() + ); if (tabNum === null) return; tabNum = parseInt(tabNum, 10); @@ -1552,7 +1544,6 @@ class InputWaiter { $("#input-tab-modal").modal("hide"); this.changeTab(inputNum, this.app.options.syncTabs); } - } export default InputWaiter; diff --git a/src/web/waiters/OperationsWaiter.mjs b/src/web/waiters/OperationsWaiter.mjs index dee0dd06..cc9794f9 100755 --- a/src/web/waiters/OperationsWaiter.mjs +++ b/src/web/waiters/OperationsWaiter.mjs @@ -6,14 +6,12 @@ import HTMLOperation from "../HTMLOperation.mjs"; import Sortable from "sortablejs"; -import {fuzzyMatch, calcMatchRanges} from "../../core/lib/FuzzyMatch.mjs"; - +import { fuzzyMatch, calcMatchRanges } from "../../core/lib/FuzzyMatch.mjs"; /** * Waiter to handle events related to the operations. */ class OperationsWaiter { - /** * OperationsWaiter constructor. * @@ -28,7 +26,6 @@ class OperationsWaiter { this.removeIntent = false; } - /** * Handler for search events. * Finds operations which match the given search term and displays them under the search box. @@ -38,7 +35,8 @@ class OperationsWaiter { searchOperations(e) { let ops, selected; - if (e.type === "search" || e.keyCode === 13) { // Search or Return + if (e.type === "search" || e.keyCode === 13) { + // Search or Return e.preventDefault(); ops = document.querySelectorAll("#search-results li"); if (ops.length) { @@ -49,7 +47,8 @@ class OperationsWaiter { } } - if (e.keyCode === 40) { // Down + if (e.keyCode === 40) { + // Down e.preventDefault(); ops = document.querySelectorAll("#search-results li"); if (ops.length) { @@ -57,10 +56,11 @@ class OperationsWaiter { if (selected > -1) { ops[selected].classList.remove("selected-op"); } - if (selected === ops.length-1) selected = -1; - ops[selected+1].classList.add("selected-op"); + if (selected === ops.length - 1) selected = -1; + ops[selected + 1].classList.add("selected-op"); } - } else if (e.keyCode === 38) { // Up + } else if (e.keyCode === 38) { + // Up e.preventDefault(); ops = document.querySelectorAll("#search-results li"); if (ops.length) { @@ -69,7 +69,7 @@ class OperationsWaiter { ops[selected].classList.remove("selected-op"); } if (selected === 0) selected = ops.length; - ops[selected-1].classList.add("selected-op"); + ops[selected - 1].classList.add("selected-op"); } } else { const searchResultsEl = document.getElementById("search-results"); @@ -86,9 +86,7 @@ class OperationsWaiter { $("#categories .show").collapse("hide"); if (str) { const matchedOps = this.filterOperations(str, true); - const matchedOpsHtml = matchedOps - .map(v => v.toStubHtml()) - .join(""); + const matchedOpsHtml = matchedOps.map((v) => v.toStubHtml()).join(""); searchResultsEl.innerHTML = matchedOpsHtml; searchResultsEl.dispatchEvent(this.manager.oplistcreate); @@ -96,7 +94,6 @@ class OperationsWaiter { } } - /** * Filters operations based on the search string and returns the matching ones. * @@ -139,10 +136,9 @@ class OperationsWaiter { // Sort matched operations based on fuzzy score matchedOps.sort((a, b) => b[1] - a[1]); - return matchedOps.map(a => a[0]).concat(matchedDescs); + return matchedOps.map((a) => a[0]).concat(matchedDescs); } - /** * Finds the operation which has been selected using keyboard shortcuts. This will have the class * 'selected-op' set. Returns the index of the operation within the given list. @@ -159,7 +155,6 @@ class OperationsWaiter { return -1; } - /** * Handler for oplistcreate events. * @@ -171,7 +166,6 @@ class OperationsWaiter { this.enableOpsListPopovers(e.target); } - /** * Sets up popovers, allowing the popover itself to gain focus which enables scrolling * and other interactions. @@ -179,28 +173,33 @@ class OperationsWaiter { * @param {Element} el - The element to start selecting from */ enableOpsListPopovers(el) { - $(el).find("[data-toggle=popover]").addBack("[data-toggle=popover]") - .popover({trigger: "manual"}) - .on("mouseenter", function(e) { + $(el) + .find("[data-toggle=popover]") + .addBack("[data-toggle=popover]") + .popover({ trigger: "manual" }) + .on("mouseenter", function (e) { if (e.buttons > 0) return; // Mouse button held down - likely dragging an operation const _this = this; $(this).popover("show"); $(".popover").on("mouseleave", function () { $(_this).popover("hide"); }); - }).on("mouseleave", function () { + }) + .on("mouseleave", function () { const _this = this; - setTimeout(function() { + setTimeout(function () { // Determine if the popover associated with this element is being hovered over - if ($(_this).data("bs.popover") && - ($(_this).data("bs.popover").tip && !$($(_this).data("bs.popover").tip).is(":hover"))) { + if ( + $(_this).data("bs.popover") + && $(_this).data("bs.popover").tip + && !$($(_this).data("bs.popover").tip).is(":hover") + ) { $(_this).popover("hide"); } }, 50); }); } - /** * Handler for operation doubleclick events. * Adds the operation to the recipe and auto bakes. @@ -213,7 +212,6 @@ class OperationsWaiter { this.manager.recipe.addOperation(li.textContent); } - /** * Handler for edit favourites click events. * Sets up the 'Edit favourites' pane and displays it. @@ -225,7 +223,7 @@ class OperationsWaiter { e.stopPropagation(); // Add favourites to modal - const favCat = this.app.categories.filter(function(c) { + const favCat = this.app.categories.filter(function (c) { return c.name === "Favourites"; })[0]; @@ -249,34 +247,41 @@ class OperationsWaiter { el.parentNode.removeChild(el); } }, - onEnd: function(evt) { + onEnd: function (evt) { if (this.removeIntent) { $(evt.item).popover("dispose"); evt.item.remove(); } - }.bind(this), + }.bind(this) }); - Sortable.utils.on(editFavouritesList, "dragleave", function() { - this.removeIntent = true; - }.bind(this)); + Sortable.utils.on( + editFavouritesList, + "dragleave", + function () { + this.removeIntent = true; + }.bind(this) + ); - Sortable.utils.on(editFavouritesList, "dragover", function() { - this.removeIntent = false; - }.bind(this)); + Sortable.utils.on( + editFavouritesList, + "dragover", + function () { + this.removeIntent = false; + }.bind(this) + ); $("#edit-favourites-list [data-toggle=popover]").popover(); $("#favourites-modal").modal(); } - /** * Handler for save favourites click events. * Saves the selected favourites and reloads them. */ saveFavouritesClick() { const favs = document.querySelectorAll("#edit-favourites-list li"); - const favouritesList = Array.from(favs, e => e.childNodes[0].textContent); + const favouritesList = Array.from(favs, (e) => e.childNodes[0].textContent); this.app.saveFavourites(favouritesList); this.app.loadFavourites(); @@ -284,7 +289,6 @@ class OperationsWaiter { this.manager.recipe.initialiseOperationDragNDrop(); } - /** * Handler for reset favourites click events. * Resets favourites to their defaults. @@ -292,7 +296,6 @@ class OperationsWaiter { resetFavouritesClick() { this.app.resetFavourites(); } - } export default OperationsWaiter; diff --git a/src/web/waiters/OptionsWaiter.mjs b/src/web/waiters/OptionsWaiter.mjs index b09ddd87..442c237d 100755 --- a/src/web/waiters/OptionsWaiter.mjs +++ b/src/web/waiters/OptionsWaiter.mjs @@ -8,7 +8,6 @@ * Waiter to handle events related to the CyberChef options. */ class OptionsWaiter { - /** * OptionsWaiter constructor. * @@ -29,20 +28,20 @@ class OptionsWaiter { Object.assign(this.app.options, options); // Set options to match object - document.querySelectorAll("#options-body input[type=checkbox]").forEach(cbox => { + document.querySelectorAll("#options-body input[type=checkbox]").forEach((cbox) => { cbox.checked = this.app.options[cbox.getAttribute("option")]; }); - document.querySelectorAll("#options-body input[type=number]").forEach(nbox => { + document.querySelectorAll("#options-body input[type=number]").forEach((nbox) => { nbox.value = this.app.options[nbox.getAttribute("option")]; - nbox.dispatchEvent(new CustomEvent("change", {bubbles: true})); + nbox.dispatchEvent(new CustomEvent("change", { bubbles: true })); }); - document.querySelectorAll("#options-body select").forEach(select => { + document.querySelectorAll("#options-body select").forEach((select) => { const val = this.app.options[select.getAttribute("option")]; if (val) { select.value = val; - select.dispatchEvent(new CustomEvent("change", {bubbles: true})); + select.dispatchEvent(new CustomEvent("change", { bubbles: true })); } else { select.selectedIndex = 0; } @@ -52,7 +51,6 @@ class OptionsWaiter { this.setWordWrap(); } - /** * Handler for options click events. * Displays the options pane. @@ -64,7 +62,6 @@ class OptionsWaiter { $("#options-modal").modal(); } - /** * Handler for reset options click events. * Resets options back to their default values. @@ -73,7 +70,6 @@ class OptionsWaiter { this.load(this.app.doptions); } - /** * Handler for switch change events. * @@ -87,7 +83,6 @@ class OptionsWaiter { this.updateOption(option, state); } - /** * Handler for number change events. * @@ -101,7 +96,6 @@ class OptionsWaiter { this.updateOption(option, val); } - /** * Handler for select change events. * @@ -124,11 +118,9 @@ class OptionsWaiter { log.debug(`Setting ${option} to ${value}`); this.app.options[option] = value; - if (this.app.isLocalStorageAvailable()) - localStorage.setItem("options", JSON.stringify(this.app.options)); + if (this.app.isLocalStorageAvailable()) localStorage.setItem("options", JSON.stringify(this.app.options)); } - /** * Sets or unsets word wrap on the input and output depending on the wordWrap option value. */ @@ -137,7 +129,6 @@ class OptionsWaiter { this.manager.output.setWordWrap(this.app.options.wordWrap); } - /** * Theme change event listener * @@ -148,7 +139,6 @@ class OptionsWaiter { this.changeTheme(themeClass); } - /** * Changes the theme by setting the class of the element. * @@ -162,7 +152,6 @@ class OptionsWaiter { themeSelect.selectedIndex = themeSelect.querySelector(`option[value="${theme}"`).index; } - /** * Changes the console logging level. * diff --git a/src/web/waiters/OutputWaiter.mjs b/src/web/waiters/OutputWaiter.mjs index dae27f3e..b989c655 100755 --- a/src/web/waiters/OutputWaiter.mjs +++ b/src/web/waiters/OutputWaiter.mjs @@ -5,9 +5,9 @@ * @license Apache-2.0 */ -import Utils, {debounce} from "../../core/Utils.mjs"; +import Utils, { debounce } from "../../core/Utils.mjs"; import Dish from "../../core/Dish.mjs"; -import {detectFileType} from "../../core/lib/FileType.mjs"; +import { detectFileType } from "../../core/lib/FileType.mjs"; import FileSaver from "file-saver"; import ZipWorker from "worker-loader?inline=no-fallback!../workers/ZipWorker.mjs"; @@ -19,33 +19,20 @@ import { rectangularSelection, crosshairCursor } from "@codemirror/view"; -import { - EditorState, - Compartment -} from "@codemirror/state"; -import { - defaultKeymap -} from "@codemirror/commands"; -import { - bracketMatching -} from "@codemirror/language"; -import { - search, - searchKeymap, - highlightSelectionMatches -} from "@codemirror/search"; - -import {statusBar} from "../utils/statusBar.mjs"; -import {htmlPlugin} from "../utils/htmlWidget.mjs"; -import {copyOverride} from "../utils/copyOverride.mjs"; -import {renderSpecialChar} from "../utils/editorUtils.mjs"; +import { EditorState, Compartment } from "@codemirror/state"; +import { defaultKeymap } from "@codemirror/commands"; +import { bracketMatching } from "@codemirror/language"; +import { search, searchKeymap, highlightSelectionMatches } from "@codemirror/search"; +import { statusBar } from "../utils/statusBar.mjs"; +import { htmlPlugin } from "../utils/htmlWidget.mjs"; +import { copyOverride } from "../utils/copyOverride.mjs"; +import { renderSpecialChar } from "../utils/editorUtils.mjs"; /** - * Waiter to handle events related to the output - */ + * Waiter to handle events related to the output + */ class OutputWaiter { - /** * OutputWaiter constructor. * @@ -78,9 +65,9 @@ class OutputWaiter { initEditor() { // Mutable extensions this.outputEditorConf = { - eol: new Compartment, - lineWrapping: new Compartment, - drawSelection: new Compartment + eol: new Compartment(), + lineWrapping: new Compartment(), + drawSelection: new Compartment() }; const initialState = EditorState.create({ @@ -96,14 +83,14 @@ class OutputWaiter { crosshairCursor(), bracketMatching(), highlightSelectionMatches(), - search({top: true}), + search({ top: true }), EditorState.allowMultipleSelections.of(true), // Custom extensions statusBar({ label: "Output", timing: this.manager.timing, - tabNumGetter: function() { + tabNumGetter: function () { return this.manager.tabs.getActiveTab("output"); }.bind(this), eolHandler: this.eolChange.bind(this), @@ -120,15 +107,11 @@ class OutputWaiter { this.outputEditorConf.drawSelection.of(drawSelection()), // Keymap - keymap.of([ - ...defaultKeymap, - ...searchKeymap - ]), + keymap.of([...defaultKeymap, ...searchKeymap]), // Event listeners - EditorView.updateListener.of(e => { - if (e.selectionSet) - this.manager.highlighter.selectionChange("output", e); + EditorView.updateListener.of((e) => { + if (e.selectionSet) this.manager.highlighter.selectionChange("output", e); if (e.docChanged || this.docChanging) { this.docChanging = false; this.toggleLoader(false); @@ -219,9 +202,7 @@ class OutputWaiter { */ setWordWrap(wrap) { this.outputEditorView.dispatch({ - effects: this.outputEditorConf.lineWrapping.reconfigure( - wrap ? EditorView.lineWrapping : [] - ) + effects: this.outputEditorConf.lineWrapping.reconfigure(wrap ? EditorView.lineWrapping : []) }); } @@ -230,7 +211,7 @@ class OutputWaiter { * @param {string|ArrayBuffer} data * @param {boolean} [force=false] */ - async setOutput(data, force=false) { + async setOutput(data, force = false) { // Don't do anything if the output hasn't changed if (!force && data === this.currentOutputCache) { this.manager.controls.hideStaleIndicator(); @@ -254,9 +235,7 @@ class OutputWaiter { // Turn drawSelection back on this.outputEditorView.dispatch({ - effects: this.outputEditorConf.drawSelection.reconfigure( - drawSelection() - ) + effects: this.outputEditorConf.drawSelection.reconfigure(drawSelection()) }); // Ensure we're not exceeding the maximum line length @@ -264,9 +243,7 @@ class OutputWaiter { const lineLengthThreshold = 131072; // 128KB if (data.length > lineLengthThreshold) { const lines = data.split(this.getEOLSeq()); - const longest = lines.reduce((a, b) => - a > b.length ? a : b.length, 0 - ); + const longest = lines.reduce((a, b) => (a > b.length ? a : b.length), 0); if (longest > lineLengthThreshold) { // If we are exceeding the max line length, turn off word wrap wrap = false; @@ -363,9 +340,7 @@ class OutputWaiter { * @returns {Dish} */ getOutputDish(inputNum) { - if (this.outputExists(inputNum) && - this.outputs[inputNum].data && - this.outputs[inputNum].data.dish) { + if (this.outputExists(inputNum) && this.outputs[inputNum].data && this.outputs[inputNum].data.dish) { return this.outputs[inputNum].data.dish; } return null; @@ -378,8 +353,7 @@ class OutputWaiter { * @returns {boolean} */ outputExists(inputNum) { - if (this.outputs[inputNum] === undefined || - this.outputs[inputNum] === null) { + if (this.outputs[inputNum] === undefined || this.outputs[inputNum] === null) { return false; } return true; @@ -421,7 +395,7 @@ class OutputWaiter { * @param {number} inputNum * @param {boolean} set */ - updateOutputValue(data, inputNum, set=true) { + updateOutputValue(data, inputNum, set = true) { if (!this.outputExists(inputNum)) { this.addOutput(inputNum); } @@ -446,7 +420,7 @@ class OutputWaiter { * @param {number} inputNum * @param {boolean} [set=true] */ - updateOutputMessage(statusMessage, inputNum, set=true) { + updateOutputMessage(statusMessage, inputNum, set = true) { if (!this.outputExists(inputNum)) return; this.outputs[inputNum].statusMessage = statusMessage; if (set) this.set(inputNum); @@ -461,7 +435,7 @@ class OutputWaiter { * @param {number} inputNum * @param {number} [progress=0] */ - updateOutputError(error, inputNum, progress=0) { + updateOutputError(error, inputNum, progress = 0) { if (!this.outputExists(inputNum)) return; const errorString = error.displayStr || error.toString(); @@ -514,7 +488,6 @@ class OutputWaiter { if (progress !== false) { this.manager.tabs.updateTabProgress(inputNum, progress, total, "output"); } - } /** @@ -551,84 +524,85 @@ class OutputWaiter { */ async set(inputNum) { inputNum = parseInt(inputNum, 10); - if (inputNum !== this.manager.tabs.getActiveTab("output") || - !this.outputExists(inputNum)) return; + if (inputNum !== this.manager.tabs.getActiveTab("output") || !this.outputExists(inputNum)) return; this.toggleLoader(true); - return new Promise(async function(resolve, reject) { - const output = this.outputs[inputNum]; - this.manager.timing.recordTime("settingOutput", inputNum); + return new Promise( + async function (resolve, reject) { + const output = this.outputs[inputNum]; + this.manager.timing.recordTime("settingOutput", inputNum); - // Update the EOL value - this.outputEditorView.dispatch({ - effects: this.outputEditorConf.eol.reconfigure( - EditorState.lineSeparator.of(output.eolSequence) - ) - }); - - // If pending or baking, show loader and status message - // If error, style the tab and handle the error - // If done, display the output if it's the active tab - // If inactive, show the last bake value (or blank) - if (output.status === "inactive" || - output.status === "stale" || - (output.status === "baked" && output.bakeId < this.manager.worker.bakeId)) { - this.manager.controls.showStaleIndicator(); - } else { - this.manager.controls.hideStaleIndicator(); - } - - if (output.progress !== undefined && !this.app.baking) { - this.manager.recipe.updateBreakpointIndicator(output.progress); - } else { - this.manager.recipe.updateBreakpointIndicator(false); - } - - if (output.status === "pending" || output.status === "baking") { - // show the loader and the status message if it's being shown - // otherwise don't do anything - document.querySelector("#output-loader .loading-msg").textContent = output.statusMessage; - } else if (output.status === "error") { - this.clearHTMLOutput(); - - if (output.error) { - await this.setOutput(output.error); - } else { - await this.setOutput(output.data.result); - } - } else if (output.status === "baked" || output.status === "inactive") { - document.querySelector("#output-loader .loading-msg").textContent = `Loading output ${inputNum}`; - - if (output.data === null) { - this.clearHTMLOutput(); - await this.setOutput(""); - return; - } - - switch (output.data.type) { - case "html": - await this.setHTMLOutput(output.data.result); - break; - case "ArrayBuffer": - case "string": - default: - this.clearHTMLOutput(); - await this.setOutput(output.data.result); - break; - } - this.manager.timing.recordTime("complete", inputNum); - - // Trigger an update so that the status bar recalculates timings + // Update the EOL value this.outputEditorView.dispatch({ - changes: { - from: 0, - to: 0 - } + effects: this.outputEditorConf.eol.reconfigure(EditorState.lineSeparator.of(output.eolSequence)) }); - debounce(this.backgroundMagic, 50, "backgroundMagic", this, [])(); - } - }.bind(this)); + // If pending or baking, show loader and status message + // If error, style the tab and handle the error + // If done, display the output if it's the active tab + // If inactive, show the last bake value (or blank) + if ( + output.status === "inactive" + || output.status === "stale" + || (output.status === "baked" && output.bakeId < this.manager.worker.bakeId) + ) { + this.manager.controls.showStaleIndicator(); + } else { + this.manager.controls.hideStaleIndicator(); + } + + if (output.progress !== undefined && !this.app.baking) { + this.manager.recipe.updateBreakpointIndicator(output.progress); + } else { + this.manager.recipe.updateBreakpointIndicator(false); + } + + if (output.status === "pending" || output.status === "baking") { + // show the loader and the status message if it's being shown + // otherwise don't do anything + document.querySelector("#output-loader .loading-msg").textContent = output.statusMessage; + } else if (output.status === "error") { + this.clearHTMLOutput(); + + if (output.error) { + await this.setOutput(output.error); + } else { + await this.setOutput(output.data.result); + } + } else if (output.status === "baked" || output.status === "inactive") { + document.querySelector("#output-loader .loading-msg").textContent = `Loading output ${inputNum}`; + + if (output.data === null) { + this.clearHTMLOutput(); + await this.setOutput(""); + return; + } + + switch (output.data.type) { + case "html": + await this.setHTMLOutput(output.data.result); + break; + case "ArrayBuffer": + case "string": + default: + this.clearHTMLOutput(); + await this.setOutput(output.data.result); + break; + } + this.manager.timing.recordTime("complete", inputNum); + + // Trigger an update so that the status bar recalculates timings + this.outputEditorView.dispatch({ + changes: { + from: 0, + to: 0 + } + }); + + debounce(this.backgroundMagic, 50, "backgroundMagic", this, [])(); + } + }.bind(this) + ); } /** @@ -638,8 +612,8 @@ class OutputWaiter { * @returns {string} */ async getDishStr(dish) { - return await new Promise(resolve => { - this.manager.worker.getDishAs(dish, "string", r => { + return await new Promise((resolve) => { + this.manager.worker.getDishAs(dish, "string", (r) => { resolve(r.value); }); }); @@ -652,8 +626,8 @@ class OutputWaiter { * @returns {ArrayBuffer} */ async getDishBuffer(dish) { - return await new Promise(resolve => { - this.manager.worker.getDishAs(dish, "ArrayBuffer", r => { + return await new Promise((resolve) => { + this.manager.worker.getDishAs(dish, "ArrayBuffer", (r) => { resolve(r.value); }); }); @@ -667,8 +641,8 @@ class OutputWaiter { * @returns {string} */ async getDishTitle(dish, maxLength) { - return await new Promise(resolve => { - this.manager.worker.getDishTitle(dish, maxLength, r => { + return await new Promise((resolve) => { + this.manager.worker.getDishTitle(dish, maxLength, (r) => { resolve(r.value); }); }); @@ -684,8 +658,8 @@ class OutputWaiter { const encoding = this.getChrEnc(); if (buffer.byteLength === 0) return ""; - return await new Promise(resolve => { - this.manager.worker.bufferToStr(buffer, encoding, r => { + return await new Promise((resolve) => { + this.manager.worker.bufferToStr(buffer, encoding, (r) => { resolve(r.value); }); }); @@ -718,15 +692,18 @@ class OutputWaiter { if (animation.children.length === 0 && !this.appendBombeTimeout) { // Start a timer to add the Bombe to the DOM just before we make it // visible so that there is no stuttering - this.appendBombeTimeout = setTimeout(function() { - this.appendBombeTimeout = null; - animation.appendChild(this.bombeEl); - }.bind(this), 150); + this.appendBombeTimeout = setTimeout( + function () { + this.appendBombeTimeout = null; + animation.appendChild(this.bombeEl); + }.bind(this), + 150 + ); } if (outputLoader.style.visibility !== "visible" && !this.outputLoaderTimeout) { // Show the loading screen - this.outputLoaderTimeout = setTimeout(function() { + this.outputLoaderTimeout = setTimeout(function () { this.outputLoaderTimeout = null; outputLoader.style.visibility = "visible"; outputLoader.style.opacity = 1; @@ -739,11 +716,13 @@ class OutputWaiter { this.outputLoaderTimeout = null; // Remove the Bombe from the DOM to save resources - this.outputLoaderTimeout = setTimeout(function () { - this.outputLoaderTimeout = null; - if (animation.children.length > 0) - animation.removeChild(this.bombeEl); - }.bind(this), 500); + this.outputLoaderTimeout = setTimeout( + function () { + this.outputLoaderTimeout = null; + if (animation.children.length > 0) animation.removeChild(this.bombeEl); + }.bind(this), + 500 + ); outputLoader.style.opacity = 0; outputLoader.style.visibility = "hidden"; } @@ -782,7 +761,7 @@ class OutputWaiter { if (fileName === null) return; const file = new File([data], fileName); - FileSaver.saveAs(file, fileName, {autoBom: false}); + FileSaver.saveAs(file, fileName, { autoBom: false }); } /** @@ -794,14 +773,18 @@ class OutputWaiter { if (downloadButton.firstElementChild.innerHTML === "archive") { this.downloadAllFiles(); } else { - const cancel = await new Promise(function(resolve, reject) { - this.app.confirm( - "Cancel zipping?", - "The outputs are currently being zipped for download.
    Cancel zipping?", - "Continue zipping", - "Cancel zipping", - resolve, this); - }.bind(this)); + const cancel = await new Promise( + function (resolve, reject) { + this.app.confirm( + "Cancel zipping?", + "The outputs are currently being zipped for download.
    Cancel zipping?", + "Continue zipping", + "Cancel zipping", + resolve, + this + ); + }.bind(this) + ); if (!cancel) { this.terminateZipWorker(); } @@ -816,14 +799,19 @@ class OutputWaiter { const inputNums = Object.keys(this.outputs); for (let i = 0; i < inputNums.length; i++) { const iNum = inputNums[i]; - if (this.outputs[iNum].status !== "baked" || - this.outputs[iNum].bakeId !== this.manager.worker.bakeId) { - const continueDownloading = await new Promise(function(resolve, reject) { - this.app.confirm( - "Incomplete outputs", - "Not all outputs have been baked yet. Continue downloading outputs?", - "Download", "Cancel", resolve, this); - }.bind(this)); + if (this.outputs[iNum].status !== "baked" || this.outputs[iNum].bakeId !== this.manager.worker.bakeId) { + const continueDownloading = await new Promise( + function (resolve, reject) { + this.app.confirm( + "Incomplete outputs", + "Not all outputs have been baked yet. Continue downloading outputs?", + "Download", + "Cancel", + resolve, + this + ); + }.bind(this) + ); if (continueDownloading) { break; } else { @@ -844,7 +832,10 @@ class OutputWaiter { fileName += ".zip"; } - let fileExt = window.prompt("Please enter a file extension for the files, or leave blank to detect automatically.", ""); + let fileExt = window.prompt( + "Please enter a file extension for the files, or leave blank to detect automatically.", + "" + ); if (fileExt === null) fileExt = ""; @@ -912,7 +903,7 @@ class OutputWaiter { } const file = new File([r.zippedFile], r.filename); - FileSaver.saveAs(file, r.filename, {autoBom: false}); + FileSaver.saveAs(file, r.filename, { autoBom: false }); this.terminateZipWorker(); } @@ -962,8 +953,8 @@ class OutputWaiter { } const newOutputs = this.getNearbyNums(inputNum, direction); - const tabsLeft = (newOutputs[0] !== this.getSmallestInputNum()); - const tabsRight = (newOutputs[newOutputs.length - 1] !== this.getLargestInputNum()); + const tabsLeft = newOutputs[0] !== this.getSmallestInputNum(); + const tabsRight = newOutputs[newOutputs.length - 1] !== this.getLargestInputNum(); this.manager.tabs.refreshTabs(newOutputs, inputNum, tabsLeft, tabsRight, "output"); @@ -1015,10 +1006,10 @@ class OutputWaiter { this.mousedown = true; this.changeTabRight(); const time = 200; - const func = function(time) { + const func = function (time) { if (this.mousedown) { this.changeTabRight(); - const newTime = (time > 50) ? time - 10 : 50; + const newTime = time > 50 ? time - 10 : 50; setTimeout(func.bind(this, [newTime]), newTime); } }; @@ -1032,10 +1023,10 @@ class OutputWaiter { this.mousedown = true; this.changeTabLeft(); const time = 200; - const func = function(time) { + const func = function (time) { if (this.mousedown) { this.changeTabLeft(); - const newTime = (time > 50) ? time - 10 : 50; + const newTime = time > 50 ? time - 10 : 50; setTimeout(func.bind(this, [newTime]), newTime); } }; @@ -1075,7 +1066,10 @@ class OutputWaiter { const min = this.getSmallestInputNum(), max = this.getLargestInputNum(); - let tabNum = window.prompt(`Enter tab number (${min} - ${max}):`, this.manager.tabs.getActiveTab("output").toString()); + let tabNum = window.prompt( + `Enter tab number (${min} - ${max}):`, + this.manager.tabs.getActiveTab("output").toString() + ); if (tabNum === null) return; tabNum = parseInt(tabNum, 10); @@ -1112,7 +1106,7 @@ class OutputWaiter { } } } - if (!nums.includes(newNum) && (newNum > 0)) { + if (!nums.includes(newNum) && newNum > 0) { nums.push(newNum); } } @@ -1209,8 +1203,8 @@ class OutputWaiter { */ refreshTabs(activeTab, direction) { const newNums = this.getNearbyNums(activeTab, direction), - tabsLeft = (newNums[0] !== this.getSmallestInputNum() && newNums.length > 0), - tabsRight = (newNums[newNums.length - 1] !== this.getLargestInputNum() && newNums.length > 0); + tabsLeft = newNums[0] !== this.getSmallestInputNum() && newNums.length > 0, + tabsRight = newNums[newNums.length - 1] !== this.getLargestInputNum() && newNums.length > 0; this.manager.tabs.refreshTabs(newNums, activeTab, tabsLeft, tabsRight, "output"); @@ -1237,7 +1231,12 @@ class OutputWaiter { } this.manager.tabs.updateTabHeader(inputNum, tabStr, "output"); if (this.manager.worker.recipeConfig !== undefined) { - this.manager.tabs.updateTabProgress(inputNum, this.outputs[inputNum]?.progress, this.manager.worker.recipeConfig.length, "output"); + this.manager.tabs.updateTabProgress( + inputNum, + this.outputs[inputNum]?.progress, + this.manager.worker.recipeConfig.length, + "output" + ); } const tabItem = this.manager.tabs.getTabItem(inputNum, "output"); @@ -1278,12 +1277,12 @@ class OutputWaiter { newRecipeConfig; if (options[0].recipe.length) { - const opSequence = options[0].recipe.map(o => o.op).join(", "); + const opSequence = options[0].recipe.map((o) => o.op).join(", "); newRecipeConfig = currentRecipeConfig.concat(options[0].recipe); msg = `${opSequence} will produce "${Utils.escapeHtml(Utils.truncate(options[0].data), 30)}"`; } else if (options[0].fileType && options[0].fileType.name) { const ft = options[0].fileType; - newRecipeConfig = currentRecipeConfig.concat([{op: "Detect File Type", args: []}]); + newRecipeConfig = currentRecipeConfig.concat([{ op: "Detect File Type", args: [] }]); msg = `${ft.name} file detected`; } else { return; @@ -1320,7 +1319,6 @@ class OutputWaiter { magicButton.classList.add("pulse"); } - /** * Hides the Magic button and resets its values. */ @@ -1345,11 +1343,10 @@ class OutputWaiter { const blobURL = el.getAttribute("blob-url"); const fileName = el.getAttribute("file-name"); - const blob = await fetch(blobURL).then(r => r.blob()); - this.manager.input.loadUIFiles([new File([blob], fileName, {type: blob.type})]); + const blob = await fetch(blobURL).then((r) => r.blob()); + this.manager.input.loadUIFiles([new File([blob], fileName, { type: blob.type })]); } - /** * Handler for copy click events. * Copies the output to the clipboard @@ -1364,11 +1361,14 @@ class OutputWaiter { const output = await this.getDishStr(dish); const self = this; - navigator.clipboard.writeText(output).then(function() { - self.app.alert("Copied raw output successfully.", 2000); - }, function(err) { - self.app.alert("Sorry, the output could not be copied.", 3000); - }); + navigator.clipboard.writeText(output).then( + function () { + self.app.alert("Copied raw output successfully.", 2000); + }, + function (err) { + self.app.alert("Sorry, the output could not be copied.", 3000); + } + ); } /** @@ -1461,11 +1461,13 @@ class OutputWaiter { const iNum = inputNums[i], output = this.outputs[iNum]; - if (output.status === "pending" && showPending || - output.status === "baking" && showBaking || - output.status === "error" && showErrored || - output.status === "stale" && showStale || - output.status === "inactive" && showStale) { + if ( + (output.status === "pending" && showPending) + || (output.status === "baking" && showBaking) + || (output.status === "error" && showErrored) + || (output.status === "stale" && showStale) + || (output.status === "inactive" && showStale) + ) { const outDisplay = { "pending": "Not baked yet", "baking": "Baking", @@ -1475,9 +1477,11 @@ class OutputWaiter { }; // If the output has a dish object, check it against the filter - if (Object.prototype.hasOwnProperty.call(output, "data") && - output.data && - Object.prototype.hasOwnProperty.call(output.data, "dish")) { + if ( + Object.prototype.hasOwnProperty.call(output, "data") + && output.data + && Object.prototype.hasOwnProperty.call(output.data, "dish") + ) { const data = await output.data.dish.get(Dish.STRING); if (contentFilterExp.test(data)) { results.push({ @@ -1545,7 +1549,6 @@ class OutputWaiter { this.changeTab(inputNum, this.app.options.syncTabs); } - /** * Sets the console log level in the workers. */ diff --git a/src/web/waiters/RecipeWaiter.mjs b/src/web/waiters/RecipeWaiter.mjs index 42e763b0..1b379b57 100755 --- a/src/web/waiters/RecipeWaiter.mjs +++ b/src/web/waiters/RecipeWaiter.mjs @@ -7,14 +7,12 @@ import HTMLOperation from "../HTMLOperation.mjs"; import Sortable from "sortablejs"; import Utils from "../../core/Utils.mjs"; -import {escapeControlChars} from "../utils/editorUtils.mjs"; - +import { escapeControlChars } from "../utils/editorUtils.mjs"; /** * Waiter to handle events related to the recipe. */ class RecipeWaiter { - /** * RecipeWaiter constructor. * @@ -27,7 +25,6 @@ class RecipeWaiter { this.removeIntent = false; } - /** * Sets up the drag and drop capability for operations in the operations and recipe areas. */ @@ -42,37 +39,49 @@ class RecipeWaiter { delay: 0, filter: ".arg", preventOnFilter: false, - setData: function(dataTransfer, dragEl) { + setData: function (dataTransfer, dragEl) { dataTransfer.setData("Text", dragEl.querySelector(".op-title").textContent); }, - onEnd: function(evt) { + onEnd: function (evt) { if (this.removeIntent) { evt.item.remove(); evt.target.dispatchEvent(this.manager.operationremove); } }.bind(this), - onSort: function(evt) { + onSort: function (evt) { if (evt.from.id === "rec-list") { document.dispatchEvent(this.manager.statechange); } }.bind(this) }); - Sortable.utils.on(recList, "dragover", function() { - this.removeIntent = false; - }.bind(this)); + Sortable.utils.on( + recList, + "dragover", + function () { + this.removeIntent = false; + }.bind(this) + ); - Sortable.utils.on(recList, "dragleave", function() { - this.removeIntent = true; - this.app.progress = 0; - }.bind(this)); + Sortable.utils.on( + recList, + "dragleave", + function () { + this.removeIntent = true; + this.app.progress = 0; + }.bind(this) + ); - Sortable.utils.on(recList, "touchend", function(e) { - const loc = e.changedTouches[0]; - const target = document.elementFromPoint(loc.clientX, loc.clientY); + Sortable.utils.on( + recList, + "touchend", + function (e) { + const loc = e.changedTouches[0]; + const target = document.elementFromPoint(loc.clientX, loc.clientY); - this.removeIntent = !recList.contains(target); - }.bind(this)); + this.removeIntent = !recList.contains(target); + }.bind(this) + ); // Favourites category document.querySelector("#categories a").addEventListener("dragover", this.favDragover.bind(this)); @@ -80,7 +89,6 @@ class RecipeWaiter { document.querySelector("#categories a").addEventListener("drop", this.favDrop.bind(this)); } - /** * Creates a drag-n-droppable seed list of operations. * @@ -91,13 +99,13 @@ class RecipeWaiter { group: { name: "recipe", pull: "clone", - put: false, + put: false }, sort: false, - setData: function(dataTransfer, dragEl) { + setData: function (dataTransfer, dragEl) { dataTransfer.setData("Text", dragEl.textContent); }, - onStart: function(evt) { + onStart: function (evt) { // Removes popover element and event bindings from the dragged operation but not the // event bindings from the one left in the operations list. Without manually removing // these bindings, we cannot re-initialise the popover on the stub operation. @@ -107,15 +115,12 @@ class RecipeWaiter { .off("mouseenter") .off("mouseleave") .attr("data-toggle", "popover-disabled"); - $(evt.clone) - .off(".popover") - .removeData("bs.popover"); + $(evt.clone).off(".popover").removeData("bs.popover"); }, onEnd: this.opSortEnd.bind(this) }); } - /** * Handler for operation sort end events. * Removes the operation from the list if it has been dropped outside. If not, adds it to the list @@ -149,7 +154,6 @@ class RecipeWaiter { evt.item.dispatchEvent(this.manager.operationadd); } - /** * Handler for favourite dragover events. * If the element being dragged is an operation, displays a visual cue so that the user knows it can @@ -158,8 +162,7 @@ class RecipeWaiter { * @param {event} e */ favDragover(e) { - if (e.dataTransfer.effectAllowed !== "move") - return false; + if (e.dataTransfer.effectAllowed !== "move") return false; e.stopPropagation(); e.preventDefault(); @@ -175,7 +178,6 @@ class RecipeWaiter { } } - /** * Handler for favourite dragleave events. * Removes the visual cue. @@ -188,7 +190,6 @@ class RecipeWaiter { document.querySelector("#categories a").classList.remove("favourites-hover"); } - /** * Handler for favourite drop events. * Adds the dragged operation to the favourites list. @@ -204,7 +205,6 @@ class RecipeWaiter { this.app.addFavourite(opName); } - /** * Handler for ingredient change events. * @@ -215,7 +215,6 @@ class RecipeWaiter { window.dispatchEvent(this.manager.statechange); } - /** * Handler for disable click events. * Updates the icon status. @@ -240,7 +239,6 @@ class RecipeWaiter { window.dispatchEvent(this.manager.statechange); } - /** * Handler for breakpoint click events. * Updates the icon status. @@ -262,7 +260,6 @@ class RecipeWaiter { window.dispatchEvent(this.manager.statechange); } - /** * Handler for operation doubleclick events. * Removes the operation from the recipe and auto bakes. @@ -275,7 +272,6 @@ class RecipeWaiter { this.opRemove(e); } - /** * Handler for operation child doubleclick events. * Removes the operation from the recipe. @@ -288,7 +284,6 @@ class RecipeWaiter { this.opRemove(e); } - /** * Generates a configuration object to represent the current recipe. * @@ -343,7 +338,6 @@ class RecipeWaiter { return config; } - /** * Moves or removes the breakpoint indicator in the recipe based on the position. * @@ -361,7 +355,6 @@ class RecipeWaiter { } } - /** * Given an operation stub element, this function converts it into a full recipe element with * arguments. @@ -384,7 +377,6 @@ class RecipeWaiter { } } - /** * Adds the specified operation to the recipe. * @@ -406,7 +398,6 @@ class RecipeWaiter { return item; } - /** * Removes all operations from the recipe. * @@ -420,7 +411,6 @@ class RecipeWaiter { recList.dispatchEvent(this.manager.operationremove); } - /** * Handler for operation dropdown events from toggleString arguments. * Sets the selected option as the name of the button. @@ -438,7 +428,6 @@ class RecipeWaiter { this.ingChange(); } - /** * Triggers various change events for operation arguments that have just been initialised. * @@ -447,7 +436,7 @@ class RecipeWaiter { triggerArgEvents(op) { // Trigger populateOption and argSelector events const triggerableOptions = op.querySelectorAll(".populate-option, .arg-selector"); - const evt = new Event("change", {bubbles: true}); + const evt = new Event("change", { bubbles: true }); if (triggerableOptions.length) { for (const el of triggerableOptions) { el.dispatchEvent(evt); @@ -455,7 +444,6 @@ class RecipeWaiter { } } - /** * Handler for operationadd events. * @@ -470,7 +458,6 @@ class RecipeWaiter { window.dispatchEvent(this.manager.statechange); } - /** * Handler for operationremove events. * @@ -483,37 +470,33 @@ class RecipeWaiter { window.dispatchEvent(this.manager.statechange); } - /** * Handler for text argument dragover events. * Gives the user a visual cue to show that items can be dropped here. * * @param {event} e */ - textArgDragover (e) { + textArgDragover(e) { // This will be set if we're dragging an operation - if (e.dataTransfer.effectAllowed === "move") - return false; + if (e.dataTransfer.effectAllowed === "move") return false; e.stopPropagation(); e.preventDefault(); e.target.closest("textarea.arg").classList.add("dropping-file"); } - /** * Handler for text argument dragleave events. * Removes the visual cue. * * @param {event} e */ - textArgDragLeave (e) { + textArgDragLeave(e) { e.stopPropagation(); e.preventDefault(); e.target.classList.remove("dropping-file"); } - /** * Handler for text argument drop events. * Loads the dragged data into the argument textarea. @@ -522,8 +505,7 @@ class RecipeWaiter { */ textArgDrop(e) { // This will be set if we're dragging an operation - if (e.dataTransfer.effectAllowed === "move") - return false; + if (e.dataTransfer.effectAllowed === "move") return false; e.stopPropagation(); e.preventDefault(); @@ -552,7 +534,6 @@ class RecipeWaiter { } } - /** * Sets register values. * @@ -569,7 +550,9 @@ class RecipeWaiter { const registerList = []; for (let i = 0; i < registers.length; i++) { - registerList.push(`$R${numPrevRegisters + i} = ${escapeControlChars(Utils.escapeHtml(Utils.truncate(registers[i], 100)))}`); + registerList.push( + `$R${numPrevRegisters + i} = ${escapeControlChars(Utils.escapeHtml(Utils.truncate(registers[i], 100)))}` + ); } const registerListEl = `
    ${registerList.join("
    ")} @@ -578,7 +561,6 @@ class RecipeWaiter { op.insertAdjacentHTML("beforeend", registerListEl); } - /** * Adjusts the number of ingredient columns as the width of the recipe changes. */ @@ -602,7 +584,6 @@ class RecipeWaiter { controlsContent.style.transform = `scale(${scale})`; } - } export default RecipeWaiter; diff --git a/src/web/waiters/SeasonalWaiter.mjs b/src/web/waiters/SeasonalWaiter.mjs index c754dc8f..5125d01d 100755 --- a/src/web/waiters/SeasonalWaiter.mjs +++ b/src/web/waiters/SeasonalWaiter.mjs @@ -8,7 +8,6 @@ * Waiter to handle seasonal events and easter eggs. */ class SeasonalWaiter { - /** * SeasonalWaiter constructor. * @@ -20,7 +19,6 @@ class SeasonalWaiter { this.manager = manager; } - /** * Loads all relevant items depending on the current date. */ @@ -30,10 +28,11 @@ class SeasonalWaiter { window.addEventListener("keydown", this.konamiCodeListener.bind(this)); // CyberChef Challenge - log.info("43 6f 6e 67 72 61 74 75 6c 61 74 69 6f 6e 73 2c 20 79 6f 75 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 20 43 79 62 65 72 43 68 65 66 20 63 68 61 6c 6c 65 6e 67 65 20 23 31 21 0a 0a 54 68 69 73 20 63 68 61 6c 6c 65 6e 67 65 20 65 78 70 6c 6f 72 65 64 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 2e 20 54 6f 20 6c 65 61 72 6e 20 6d 6f 72 65 2c 20 76 69 73 69 74 20 77 69 6b 69 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 48 65 78 61 64 65 63 69 6d 61 6c 2e 0a 0a 54 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 63 68 61 6c 6c 65 6e 67 65 20 69 73 20 39 64 34 63 62 63 65 66 2d 62 65 35 32 2d 34 37 35 31 2d 61 32 62 32 2d 38 33 33 38 65 36 34 30 39 34 31 36 20 28 6b 65 65 70 20 74 68 69 73 20 70 72 69 76 61 74 65 29 2e 0a 0a 54 68 65 20 6e 65 78 74 20 63 68 61 6c 6c 65 6e 67 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 61 74 20 68 74 74 70 73 3a 2f 2f 70 61 73 74 65 62 69 6e 2e 63 6f 6d 2f 47 53 6e 54 41 6d 6b 56 2e"); + log.info( + "43 6f 6e 67 72 61 74 75 6c 61 74 69 6f 6e 73 2c 20 79 6f 75 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 20 43 79 62 65 72 43 68 65 66 20 63 68 61 6c 6c 65 6e 67 65 20 23 31 21 0a 0a 54 68 69 73 20 63 68 61 6c 6c 65 6e 67 65 20 65 78 70 6c 6f 72 65 64 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 2e 20 54 6f 20 6c 65 61 72 6e 20 6d 6f 72 65 2c 20 76 69 73 69 74 20 77 69 6b 69 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 48 65 78 61 64 65 63 69 6d 61 6c 2e 0a 0a 54 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 63 68 61 6c 6c 65 6e 67 65 20 69 73 20 39 64 34 63 62 63 65 66 2d 62 65 35 32 2d 34 37 35 31 2d 61 32 62 32 2d 38 33 33 38 65 36 34 30 39 34 31 36 20 28 6b 65 65 70 20 74 68 69 73 20 70 72 69 76 61 74 65 29 2e 0a 0a 54 68 65 20 6e 65 78 74 20 63 68 61 6c 6c 65 6e 67 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 61 74 20 68 74 74 70 73 3a 2f 2f 70 61 73 74 65 62 69 6e 2e 63 6f 6d 2f 47 53 6e 54 41 6d 6b 56 2e" + ); } - /** * Listen for the Konami code sequence of keys. Turn the page upside down if they are all heard in * sequence. @@ -53,7 +52,6 @@ class SeasonalWaiter { } } } - } export default SeasonalWaiter; diff --git a/src/web/waiters/TabWaiter.mjs b/src/web/waiters/TabWaiter.mjs index a3361837..91ea1d7b 100644 --- a/src/web/waiters/TabWaiter.mjs +++ b/src/web/waiters/TabWaiter.mjs @@ -8,7 +8,6 @@ * Waiter to handle events related to the input and output tabs */ class TabWaiter { - /** * TabWaiter constructor. * @@ -26,8 +25,8 @@ class TabWaiter { * @returns {number} */ calcMaxTabs() { - let numTabs = Math.floor((document.getElementById("IO").offsetWidth - 75) / 120); - numTabs = (numTabs > 1) ? numTabs : 2; + let numTabs = Math.floor((document.getElementById("IO").offsetWidth - 75) / 120); + numTabs = numTabs > 1 ? numTabs : 2; return numTabs; } @@ -99,7 +98,7 @@ class TabWaiter { const newTabContent = document.createElement("div"); newTabContent.classList.add(`${io}-tab-content`); newTabContent.innerText = `Tab ${inputNum.toString()}`; - newTabContent.addEventListener("wheel", this.manager[io].scrollTab.bind(this.manager[io]), {passive: false}); + newTabContent.addEventListener("wheel", this.manager[io].scrollTab.bind(this.manager[io]), { passive: false }); newTab.appendChild(newTabContent); if (io === "input") { @@ -158,7 +157,7 @@ class TabWaiter { // Create and add new tab elements for (let i = 0; i < nums.length; i++) { - const active = (nums[i] === activeTab); + const active = nums[i] === activeTab; tabsList.appendChild(this.createTabElement(nums[i], active, io)); } @@ -244,7 +243,6 @@ class TabWaiter { tabItem.style.background = `linear-gradient(to right, var(--title-background-colour) ${percentComplete}%, var(--primary-background-colour) ${percentComplete}%)`; } } - } export default TabWaiter; diff --git a/src/web/waiters/TimingWaiter.mjs b/src/web/waiters/TimingWaiter.mjs index 88f281bb..f1b11845 100644 --- a/src/web/waiters/TimingWaiter.mjs +++ b/src/web/waiters/TimingWaiter.mjs @@ -8,7 +8,6 @@ * Waiter to handle timing of the baking process. */ class TimingWaiter { - /** * TimingWaiter constructor. * @@ -37,7 +36,6 @@ class TimingWaiter { */ } - /** * Record the time for an input * @@ -45,7 +43,7 @@ class TimingWaiter { * @param {number} inputNum * @param {number} value */ - recordTime(event, inputNum, value=Date.now()) { + recordTime(event, inputNum, value = Date.now()) { inputNum = inputNum.toString(); if (!Object.keys(this.inputs).includes(inputNum)) { this.inputs[inputNum] = {}; @@ -64,25 +62,24 @@ class TimingWaiter { const input = this.inputs[inputNum.toString()]; // If this input has not been encoded yet, we cannot calculate a time - if (!input || - !input.trigger || - !input.inputEncodingEnd || - !input.inputEncodingStart) - return 0; + if (!input || !input.trigger || !input.inputEncodingEnd || !input.inputEncodingStart) return 0; // input encoding can happen before a bake is triggered, so it is calculated separately const inputEncodingTotal = input.inputEncodingEnd - input.inputEncodingStart; - let total = 0, outputDecodingTotal = 0; + let total = 0, + outputDecodingTotal = 0; - if (input.bakeComplete && input.bakeComplete > input.trigger) - total = input.bakeComplete - input.trigger; + if (input.bakeComplete && input.bakeComplete > input.trigger) total = input.bakeComplete - input.trigger; - if (input.settingOutput && input.settingOutput > input.trigger) - total = input.settingOutput - input.trigger; + if (input.settingOutput && input.settingOutput > input.trigger) total = input.settingOutput - input.trigger; - if (input.outputDecodingStart && (input.outputDecodingStart > input.trigger) && - input.outputDecodingEnd && (input.outputDecodingEnd > input.trigger)) { + if ( + input.outputDecodingStart + && input.outputDecodingStart > input.trigger + && input.outputDecodingEnd + && input.outputDecodingEnd > input.trigger + ) { total = input.outputDecodingEnd - input.trigger; outputDecodingTotal = input.outputDecodingEnd - input.outputDecodingStart; } @@ -103,21 +100,15 @@ class TimingWaiter { const input = this.inputs[inputNum.toString()]; // If this input has not been encoded yet, we cannot calculate a time - if (!input || - !input.trigger || - !input.inputEncodingEnd || - !input.inputEncodingStart) - return 0; + if (!input || !input.trigger || !input.inputEncodingEnd || !input.inputEncodingStart) return 0; // input encoding can happen before a bake is triggered, so it is calculated separately const inputEncodingTotal = input.inputEncodingEnd - input.inputEncodingStart; let total = 0; - if (input.bakeComplete && input.bakeComplete > input.trigger) - total = input.bakeComplete - input.trigger; + if (input.bakeComplete && input.bakeComplete > input.trigger) total = input.bakeComplete - input.trigger; - if (input.settingOutput && input.settingOutput > input.trigger) - total = input.settingOutput - input.trigger; + if (input.settingOutput && input.settingOutput > input.trigger) total = input.settingOutput - input.trigger; if (input.outputDecodingStart && input.outputDecodingStart > input.trigger) total = input.outputDecodingStart - input.trigger; @@ -125,8 +116,7 @@ class TimingWaiter { if (input.outputDecodingEnd && input.outputDecodingEnd > input.trigger) total = input.outputDecodingEnd - input.trigger; - if (input.complete && input.complete > input.trigger) - total = input.complete - input.trigger; + if (input.complete && input.complete > input.trigger) total = input.complete - input.trigger; return total + inputEncodingTotal; } @@ -174,9 +164,7 @@ outputDecodingEnd: ${input.outputDecodingEnd} | ${input.outputDecodingEnd - in complete: ${input.complete} | ${input.complete - input.outputDecodingEnd}ms since output decoded Total: | ${input.complete - input.trigger}ms since trigger`); } catch (err) {} - } - } export default TimingWaiter; diff --git a/src/web/waiters/WindowWaiter.mjs b/src/web/waiters/WindowWaiter.mjs index bb80e453..35c6a01a 100755 --- a/src/web/waiters/WindowWaiter.mjs +++ b/src/web/waiters/WindowWaiter.mjs @@ -10,7 +10,6 @@ import { debounce } from "../../core/Utils.mjs"; * Waiter to handle events related to the window object. */ class WindowWaiter { - /** * WindowWaiter constructor. * @@ -20,7 +19,6 @@ class WindowWaiter { this.app = app; } - /** * Handler for window resize events. * Resets adjustable component sizes after 200ms (so that continuous resizing doesn't cause @@ -30,7 +28,6 @@ class WindowWaiter { debounce(this.app.adjustComponentSizes, 200, "windowResize", this.app, [])(); } - /** * Handler for window blur events. * Saves the current time so that we can calculate how long the window was unfocused for when @@ -40,7 +37,6 @@ class WindowWaiter { this.windowBlurTime = Date.now(); } - /** * Handler for window focus events. * @@ -57,7 +53,6 @@ class WindowWaiter { this.app.silentBake(); } } - } export default WindowWaiter; diff --git a/src/web/waiters/WorkerWaiter.mjs b/src/web/waiters/WorkerWaiter.mjs index 3ad9695e..4c912264 100644 --- a/src/web/waiters/WorkerWaiter.mjs +++ b/src/web/waiters/WorkerWaiter.mjs @@ -13,7 +13,6 @@ import { debounce } from "../../core/Utils.mjs"; * Waiter to handle conversations with the ChefWorker */ class WorkerWaiter { - /** * WorkerWaiter constructor * @@ -35,8 +34,7 @@ class WorkerWaiter { this.callbackID = 0; this.maxWorkers = 1; - if (navigator.hardwareConcurrency !== undefined && - navigator.hardwareConcurrency > 1) { + if (navigator.hardwareConcurrency !== undefined && navigator.hardwareConcurrency > 1) { this.maxWorkers = navigator.hardwareConcurrency - 1; } @@ -112,8 +110,7 @@ class WorkerWaiter { if (index > 0) { docURL = docURL.substring(0, index); } - newWorker.postMessage({"action": "docURL", "data": docURL}); - + newWorker.postMessage({ "action": "docURL", "data": docURL }); // Store the worker, whether or not it's active, and the inputNum as an object const newWorkerObj = { @@ -132,7 +129,7 @@ class WorkerWaiter { * @param {boolean} [setActive=true] - If true, set the worker status to active * @returns {number} - The index of the ChefWorker */ - getInactiveChefWorker(setActive=true) { + getInactiveChefWorker(setActive = true) { for (let i = 0; i < this.chefWorkers.length; i++) { if (!this.chefWorkers[i].active) { this.chefWorkers[i].active = setActive; @@ -280,7 +277,6 @@ class WorkerWaiter { if (inputNum === this.manager.tabs.getActiveTab("input")) { this.manager.recipe.updateBreakpointIndicator(progress); } - } else { this.manager.output.updateOutputStatus("baked", inputNum); } @@ -293,7 +289,9 @@ class WorkerWaiter { */ setBakingStatus(bakingStatus) { this.app.baking = bakingStatus; - debounce(this.manager.controls.toggleBakeButtonFunction, 20, "toggleBakeButton", this, [bakingStatus ? "cancel" : "bake"])(); + debounce(this.manager.controls.toggleBakeButtonFunction, 20, "toggleBakeButton", this, [ + bakingStatus ? "cancel" : "bake" + ])(); if (bakingStatus) this.manager.output.hideMagicButton(); } @@ -328,7 +326,7 @@ class WorkerWaiter { * @param {boolean} [silent=false] - If true, don't set the output * @param {boolean} [killAll=false] - If true, kills all chefWorkers regardless of status */ - cancelBake(silent=false, killAll=false) { + cancelBake(silent = false, killAll = false) { const deactiveOutputs = new Set(); for (let i = this.chefWorkers.length - 1; i >= 0; i--) { @@ -340,20 +338,20 @@ class WorkerWaiter { } this.setBakingStatus(false); - this.inputs.forEach(input => { + this.inputs.forEach((input) => { deactiveOutputs.add(input.inputNum); }); - this.inputNums.forEach(inputNum => { + this.inputNums.forEach((inputNum) => { deactiveOutputs.add(inputNum); }); - deactiveOutputs.forEach(num => { + deactiveOutputs.forEach((num) => { this.manager.output.updateOutputStatus("inactive", num); }); const tabList = this.manager.tabs.getTabList("output"); - tabList.forEach(tab => { + tabList.forEach((tab) => { this.manager.tabs.getTabItem(tab, "output").style.background = ""; }); @@ -473,16 +471,19 @@ class WorkerWaiter { transferable = [input]; } this.manager.timing.recordTime("chefWorkerTasked", nextInput.inputNum); - this.chefWorkers[workerIdx].worker.postMessage({ - action: "bake", - data: { - input: input, - recipeConfig: recipeConfig, - options: this.options, - inputNum: nextInput.inputNum, - bakeId: this.bakeId - } - }, transferable); + this.chefWorkers[workerIdx].worker.postMessage( + { + action: "bake", + data: { + input: input, + recipeConfig: recipeConfig, + options: this.options, + inputNum: nextInput.inputNum, + bakeId: this.bakeId + } + }, + transferable + ); if (this.inputNums.length > 0) { this.manager.input.inputWorker.postMessage({ @@ -556,7 +557,6 @@ class WorkerWaiter { } }); this.loadingOutputs++; - } } @@ -571,9 +571,9 @@ class WorkerWaiter { async bakeInputs(inputData) { log.debug(`Baking input list [${inputData.nums.join(",")}]`); - return await new Promise(resolve => { + return await new Promise((resolve) => { if (this.app.baking) return; - const inputNums = inputData.nums.filter(n => n > 0); + const inputNums = inputData.nums.filter((n) => n > 0); const step = inputData.step; // Use cancelBake to clear out the inputs @@ -597,7 +597,11 @@ class WorkerWaiter { this.app.bake(step); for (let i = 0; i < this.inputNums.length; i++) { - this.manager.output.updateOutputMessage(`Input ${inputNums[i]} has not been baked yet.`, inputNums[i], false); + this.manager.output.updateOutputMessage( + `Input ${inputNums[i]} has not been baked yet.`, + inputNums[i], + false + ); this.manager.output.updateOutputStatus("pending", inputNums[i]); } @@ -771,7 +775,7 @@ class WorkerWaiter { * Sets the console log level in the workers. */ setLogLevel() { - this.chefWorkers.forEach(cw => { + this.chefWorkers.forEach((cw) => { cw.worker.postMessage({ action: "setLogLevel", data: log.getLevel() @@ -830,11 +834,13 @@ class WorkerWaiter { } if (progress.total !== progress.baked) { - setTimeout(function() { - this.displayProgress(); - }.bind(this), 100); + setTimeout( + function () { + this.displayProgress(); + }.bind(this), + 100 + ); } - } /** diff --git a/src/web/workers/DishWorker.mjs b/src/web/workers/DishWorker.mjs index 4bfb701f..cb1ccde3 100644 --- a/src/web/workers/DishWorker.mjs +++ b/src/web/workers/DishWorker.mjs @@ -16,7 +16,7 @@ loglevelMessagePrefix(log, { staticPrefixes: ["DishWorker"] }); -self.addEventListener("message", function(e) { +self.addEventListener("message", function (e) { // Handle message from the main thread const r = e.data; log.debug(`Receiving command '${r.action}'`); @@ -50,15 +50,18 @@ self.addEventListener("message", function(e) { async function getDishAs(data) { const newDish = new Dish(data.dish), value = await newDish.get(data.type), - transferable = (data.type === "ArrayBuffer") ? [value] : undefined; + transferable = data.type === "ArrayBuffer" ? [value] : undefined; - self.postMessage({ - action: "dishReturned", - data: { - value: value, - id: data.id - } - }, transferable); + self.postMessage( + { + action: "dishReturned", + data: { + value: value, + id: data.id + } + }, + transferable + ); } /** diff --git a/src/web/workers/InputWorker.mjs b/src/web/workers/InputWorker.mjs index d687fc9f..0e5178f9 100644 --- a/src/web/workers/InputWorker.mjs +++ b/src/web/workers/InputWorker.mjs @@ -50,7 +50,7 @@ self.loadingInputs = 0; * * @param {MessageEvent} e */ -self.addEventListener("message", function(e) { +self.addEventListener("message", function (e) { const r = e.data; if (!("action" in r)) { log.error("No action"); @@ -140,7 +140,7 @@ self.addEventListener("message", function(e) { * * @param {number} inputNum - The input to get the file loading progress for */ -self.getLoadProgress = function(inputNum) { +self.getLoadProgress = function (inputNum) { const total = self.numInputs; const pending = self.pendingFiles.length; const loading = self.loadingInputs; @@ -170,7 +170,7 @@ self.getLoadProgress = function(inputNum) { * @param {boolean} [step=false] - Set to true if we should only execute one operation instead of the * whole recipe */ -self.autoBake = function(inputNum, progress, step=false) { +self.autoBake = function (inputNum, progress, step = false) { const input = self.inputs[inputNum]; if (input) { self.postMessage({ @@ -188,12 +188,10 @@ self.autoBake = function(inputNum, progress, step=false) { * Fired when we want to bake all inputs (bake button clicked) * Sends a list of inputNums to the workerwaiter */ -self.bakeAllInputs = function() { +self.bakeAllInputs = function () { const inputNums = Object.keys(self.inputs); - const nums = inputNums - .filter(n => self.inputs[n].status === "loaded") - .map(n => parseInt(n, 10)); + const nums = inputNums.filter((n) => self.inputs[n].status === "loaded").map((n) => parseInt(n, 10)); self.postMessage({ action: "bakeInputs", @@ -211,12 +209,9 @@ self.bakeAllInputs = function() { * @param {number} inputNum * @param {number} bakeId */ -self.bakeInput = function(inputNum, bakeId) { +self.bakeInput = function (inputNum, bakeId) { const inputObj = self.inputs[inputNum]; - if (inputObj === null || - inputObj === undefined || - inputObj.status !== "loaded") { - + if (inputObj === null || inputObj === undefined || inputObj.status !== "loaded") { self.postMessage({ action: "queueInputError", data: { @@ -245,7 +240,7 @@ self.bakeInput = function(inputNum, bakeId) { * @param {boolean} inputData.getObj - If true, returns the entire input object instead of just the value * @param {number} inputData.id - The callback ID for the callback to run when returned to the inputWaiter */ -self.getInput = function(inputData) { +self.getInput = function (inputData) { const input = self.inputs[inputData.inputNum]; self.postMessage({ action: "getInput", @@ -261,7 +256,7 @@ self.getInput = function(inputData) { * * @param {number} id - The callback ID to be executed when returned to the inputWaiter */ -self.getInputNums = function(id) { +self.getInputNums = function (id) { const inputNums = Object.keys(self.inputs), min = self.getSmallestInputNum(inputNums), max = self.getLargestInputNum(inputNums); @@ -283,7 +278,7 @@ self.getInputNums = function(id) { * @param {number} inputNum - The input we want to get the progress of * @returns {number | string} - Returns "error" if there was a load error */ -self.getInputProgress = function(inputNum) { +self.getInputProgress = function (inputNum) { const inputObj = self.inputs[inputNum]; if (!inputObj) return; if (inputObj.status === "error") { @@ -298,7 +293,7 @@ self.getInputProgress = function(inputNum) { * @param {string[]} inputNums - The numbers to find the largest of * @returns {number} */ -self.getLargestInputNum = function(inputNums) { +self.getLargestInputNum = function (inputNums) { return inputNums.reduce((acc, val) => { val = parseInt(val, 10); return val > acc ? val : acc; @@ -311,7 +306,7 @@ self.getLargestInputNum = function(inputNums) { * @param {string[]} inputNums - The numbers to find the smallest of * @returns {number} */ -self.getSmallestInputNum = function(inputNums) { +self.getSmallestInputNum = function (inputNums) { const min = inputNums.reduce((acc, val) => { val = parseInt(val, 10); return val < acc ? val : acc; @@ -329,13 +324,13 @@ self.getSmallestInputNum = function(inputNums) { * @param {number} inputNum - The current input number * @returns {number} */ -self.getPreviousInputNum = function(inputNum) { +self.getPreviousInputNum = function (inputNum) { const inputNums = Object.keys(self.inputs); if (inputNums.length === 0) return -1; return inputNums.reduce((acc, val) => { val = parseInt(val, 10); - return (val < inputNum && val > acc) ? val : acc; + return val < inputNum && val > acc ? val : acc; }, self.getSmallestInputNum(inputNums)); }; @@ -345,12 +340,12 @@ self.getPreviousInputNum = function(inputNum) { * @param {number} inputNum - The current input number * @returns {number} */ -self.getNextInputNum = function(inputNum) { +self.getNextInputNum = function (inputNum) { const inputNums = Object.keys(self.inputs); return inputNums.reduce((acc, val) => { val = parseInt(val, 10); - return (val > inputNum && val < acc) ? val : acc; + return val > inputNum && val < acc ? val : acc; }, self.getLargestInputNum(inputNums)); }; @@ -362,7 +357,7 @@ self.getNextInputNum = function(inputNum) { * @param {string} direction - Either "left" or "right". Determines which direction we search for nearby numbers in * @returns {number[]} */ -self.getNearbyNums = function(inputNum, direction) { +self.getNearbyNums = function (inputNum, direction) { const nums = []; for (let i = 0; i < self.maxTabs; i++) { let newNum; @@ -385,11 +380,11 @@ self.getNearbyNums = function(inputNum, direction) { } } } - if (!nums.includes(newNum) && (newNum > 0)) { + if (!nums.includes(newNum) && newNum > 0) { nums.push(newNum); } } - nums.sort(function(a, b) { + nums.sort(function (a, b) { return a - b; }); return nums; @@ -401,7 +396,7 @@ self.getNearbyNums = function(inputNum, direction) { * * @param {number} inputNum - The inputNum of the tab header */ -self.updateTabHeader = function(inputNum) { +self.updateTabHeader = function (inputNum) { const input = self.inputs[inputNum]; if (!input) return; @@ -425,8 +420,8 @@ self.updateTabHeader = function(inputNum) { * @param {number} inputData.inputNum - The input to get the data for * @param {boolean} inputData.silent - If false, the manager statechange event will be fired */ -self.setInput = function(inputData) { - const {inputNum, silent} = inputData; +self.setInput = function (inputData) { + const { inputNum, silent } = inputData; const input = self.inputs[inputNum]; if (!input) return; @@ -449,17 +444,17 @@ self.setInput = function(inputData) { * @param {number} inputNum - The inputNum to find the nearby numbers for * @param {string} direction - The direction to search for inputNums in. Either "left" or "right" */ -self.refreshTabs = function(inputNum, direction) { +self.refreshTabs = function (inputNum, direction) { const nums = self.getNearbyNums(inputNum, direction), inputNums = Object.keys(self.inputs), - tabsLeft = (self.getSmallestInputNum(inputNums) !== nums[0] && nums.length > 0), - tabsRight = (self.getLargestInputNum(inputNums) !== nums[nums.length - 1] && nums.length > 0); + tabsLeft = self.getSmallestInputNum(inputNums) !== nums[0] && nums.length > 0, + tabsRight = self.getLargestInputNum(inputNums) !== nums[nums.length - 1] && nums.length > 0; self.postMessage({ action: "refreshTabs", data: { nums: nums, - activeTab: (nums.includes(inputNum)) ? inputNum : self.getNextInputNum(inputNum), + activeTab: nums.includes(inputNum) ? inputNum : self.getNextInputNum(inputNum), tabsLeft: tabsLeft, tabsRight: tabsRight } @@ -477,7 +472,7 @@ self.refreshTabs = function(inputNum, direction) { * @param {number} inputNum - The input that's having its status changed * @param {string} status - The status of the input */ -self.updateInputStatus = function(inputNum, status) { +self.updateInputStatus = function (inputNum, status) { if (self.inputs[inputNum] !== undefined) { self.inputs[inputNum].status = status; } @@ -490,8 +485,8 @@ self.updateInputStatus = function(inputNum, status) { * @param {number} inputData.inputNum - The input that's having its progress updated * @param {number} inputData.progress - The load progress of the input */ -self.updateInputProgress = function(inputData) { - const {inputNum, progress} = inputData; +self.updateInputProgress = function (inputData) { + const { inputNum, progress } = inputData; if (self.inputs[inputNum] !== undefined) { self.inputs[inputNum].progress = progress; @@ -508,7 +503,7 @@ self.updateInputProgress = function(inputData) { * @param {string} [inputData.eolSequence] - The end of line sequence of the input data * @param {string} [inputData.stringSample] - A sample of the value as a string (truncated to 4096 chars) */ -self.updateInputValue = function(inputData) { +self.updateInputValue = function (inputData) { const inputNum = parseInt(inputData.inputNum, 10); if (inputNum < 1) return; @@ -537,7 +532,7 @@ self.updateInputValue = function(inputData) { * @param {number} workerId - The ID of the worker we're searching for * @returns {number} */ -self.getLoaderWorkerIdx = function(workerId) { +self.getLoaderWorkerIdx = function (workerId) { for (let i = 0; i < self.loaderWorkers.length; i++) { if (self.loaderWorkers[i].id === workerId) { return i; @@ -554,7 +549,7 @@ self.getLoaderWorkerIdx = function(workerId) { * @param {object} workerData * @param {number} workerData.id - The ID of the new loaderWorker */ -self.loaderWorkerReady = function(workerData) { +self.loaderWorkerReady = function (workerData) { const newWorkerObj = { id: workerData.id, inputNum: -1, @@ -573,7 +568,7 @@ self.loaderWorkerReady = function(workerData) { * @param {string} r.error - Present if an error is fired by the loaderWorker. Contains the error message string. * @param {ArrayBuffer} r.fileBuffer - Present if a file has finished loading. Contains the loaded file buffer. */ -self.handleLoaderMessage = function(r) { +self.handleLoaderMessage = function (r) { let inputNum = 0; if ("inputNum" in r) { @@ -590,7 +585,7 @@ self.handleLoaderMessage = function(r) { self.terminateLoaderWorker(r.id); self.activateLoaderWorker(); - self.setInput({inputNum: inputNum, silent: true}); + self.setInput({ inputNum: inputNum, silent: true }); return; } @@ -622,7 +617,7 @@ self.handleLoaderMessage = function(r) { * * @param {number} - The loaderWorker which will load the file */ -self.loadNextFile = function(workerIdx) { +self.loadNextFile = function (workerIdx) { if (workerIdx === -1) return; const id = self.loaderWorkers[workerIdx].id; if (self.pendingFiles.length === 0) { @@ -648,7 +643,7 @@ self.loadNextFile = function(workerIdx) { * Sends a message to the inputWaiter to create a new loaderWorker. * If there's an inactive loaderWorker that already exists, use that instead. */ -self.activateLoaderWorker = function() { +self.activateLoaderWorker = function () { for (let i = 0; i < self.loaderWorkers.length; i++) { if (!self.loaderWorkers[i].active) { self.loaderWorkers[i].active = true; @@ -666,7 +661,7 @@ self.activateLoaderWorker = function() { * * @param {number} id - The ID of the worker to be terminated */ -self.terminateLoaderWorker = function(id) { +self.terminateLoaderWorker = function (id) { self.postMessage({ action: "terminateLoaderWorker", data: id @@ -684,8 +679,8 @@ self.terminateLoaderWorker = function(id) { * @param {FileList} filesData.files - The list of files to be loaded * @param {number} filesData.activeTab - The active tab in the UI */ -self.loadFiles = function(filesData) { - const {files, activeTab} = filesData; +self.loadFiles = function (filesData) { + const { files, activeTab } = filesData; let lastInputNum = -1; const inputNums = []; for (let i = 0; i < files.length; i++) { @@ -696,11 +691,16 @@ self.loadFiles = function(filesData) { refreshTabs: false, removeChefWorker: false }); - lastInputNum = self.addInput(false, "file", { - name: files[i].name, - size: files[i].size.toLocaleString(), - type: files[i].type || "unknown" - }, activeTab); + lastInputNum = self.addInput( + false, + "file", + { + name: files[i].name, + size: files[i].size.toLocaleString(), + type: files[i].type || "unknown" + }, + activeTab + ); } else { lastInputNum = self.addInput(false, "file", { name: files[i].name, @@ -724,7 +724,7 @@ self.loadFiles = function(filesData) { } self.getLoadProgress(); - self.setInput({inputNum: lastInputNum, silent: true}); + self.setInput({ inputNum: lastInputNum, silent: true }); }; /** @@ -738,7 +738,7 @@ self.loadFiles = function(filesData) { * @param {string} fileData.type - The MIME type of the input being added * @param {number} inputNum - Defaults to auto-incrementing self.currentInputNum */ -self.addInput = function( +self.addInput = function ( changeTab = false, type, fileData = { @@ -802,7 +802,7 @@ self.addInput = function( * @param {boolean} removeInputData.refreshTabs - If true, refresh the tabs after removing the input * @param {boolean} removeInputData.removeChefWorker - If true, remove a chefWorker from the WorkerWaiter */ -self.removeInput = function(removeInputData) { +self.removeInput = function (removeInputData) { const inputNum = removeInputData.inputNum; const refreshTabs = removeInputData.refreshTabs; self.numInputs--; @@ -842,7 +842,7 @@ self.removeInput = function(removeInputData) { * * @param {number} inputNum - The inputNum of the tab to change to */ -self.changeTabRight = function(inputNum) { +self.changeTabRight = function (inputNum) { const newInput = self.getNextInputNum(inputNum); self.postMessage({ action: "changeTab", @@ -855,7 +855,7 @@ self.changeTabRight = function(inputNum) { * * @param {number} inputNum - The inputNum of the tab to change to */ -self.changeTabLeft = function(inputNum) { +self.changeTabLeft = function (inputNum) { const newInput = self.getPreviousInputNum(inputNum); self.postMessage({ action: "changeTab", @@ -869,7 +869,7 @@ self.changeTabLeft = function(inputNum) { * @param {number} maxTabs - The new max number of tabs * @param {number} activeTab - The currently selected tab */ -self.updateMaxTabs = function(maxTabs, activeTab) { +self.updateMaxTabs = function (maxTabs, activeTab) { if (self.maxTabs !== maxTabs) { self.maxTabs = maxTabs; self.refreshTabs(activeTab, "right"); @@ -888,7 +888,7 @@ self.updateMaxTabs = function(maxTabs, activeTab) { * @param {string} searchData.filterType - Either "CONTENT" or "FILENAME". Determines what should be matched with filter * @param {number} searchData.numResults - The maximum number of results to be returned */ -self.filterTabs = function(searchData) { +self.filterTabs = function (searchData) { const showPending = searchData.showPending, showLoading = searchData.showLoading, showLoaded = searchData.showLoaded, @@ -912,21 +912,22 @@ self.filterTabs = function(searchData) { const iNum = inputNums[i]; let textDisplay = ""; let addInput = false; - if (self.inputs[iNum].status === "pending" && showPending || - self.inputs[iNum].status === "loading" && showLoading || - self.inputs[iNum].status === "loaded" && showLoaded) { + if ( + (self.inputs[iNum].status === "pending" && showPending) + || (self.inputs[iNum].status === "loading" && showLoading) + || (self.inputs[iNum].status === "loaded" && showLoaded) + ) { try { if (self.inputs[iNum].type === "userinput") { - if (filterType.toLowerCase() === "content" && - filterExp.test(self.inputs[iNum].stringSample)) { + if (filterType.toLowerCase() === "content" && filterExp.test(self.inputs[iNum].stringSample)) { textDisplay = self.inputs[iNum].stringSample; addInput = true; } } else { - if ((filterType.toLowerCase() === "filename" && - filterExp.test(self.inputs[iNum].file.name)) || - (filterType.toLowerCase() === "content" && - filterExp.test(self.inputs[iNum].stringSample))) { + if ( + (filterType.toLowerCase() === "filename" && filterExp.test(self.inputs[iNum].file.name)) + || (filterType.toLowerCase() === "content" && filterExp.test(self.inputs[iNum].stringSample)) + ) { textDisplay = self.inputs[iNum].file.name; addInput = true; } diff --git a/src/web/workers/LoaderWorker.js b/src/web/workers/LoaderWorker.js index ef6280f0..9c594b5f 100755 --- a/src/web/workers/LoaderWorker.js +++ b/src/web/workers/LoaderWorker.js @@ -15,11 +15,10 @@ loglevelMessagePrefix(log, { self.id = null; - /** * Respond to message from parent thread. */ -self.addEventListener("message", function(e) { +self.addEventListener("message", function (e) { // Handle message const r = e.data; log.debug(`Receiving command '${r.action}'`); @@ -39,41 +38,40 @@ self.addEventListener("message", function(e) { } }); - /** * Loads a file object into an ArrayBuffer, then transfers it back to the parent thread. * * @param {File} file * @param {string} inputNum */ -self.loadFile = function(file, inputNum) { +self.loadFile = function (file, inputNum) { const reader = new FileReader(); - if (file.size >= 256*256*256*128) { - self.postMessage({"error": "File size too large.", "inputNum": inputNum, "id": self.id}); + if (file.size >= 256 * 256 * 256 * 128) { + self.postMessage({ "error": "File size too large.", "inputNum": inputNum, "id": self.id }); return; } const data = new Uint8Array(file.size); let offset = 0; const CHUNK_SIZE = 10485760; // 10MiB - const seek = function() { + const seek = function () { if (offset >= file.size) { - self.postMessage({"fileBuffer": data.buffer, "inputNum": inputNum, "id": self.id}, [data.buffer]); + self.postMessage({ "fileBuffer": data.buffer, "inputNum": inputNum, "id": self.id }, [data.buffer]); return; } - self.postMessage({"progress": Math.round(offset / file.size * 100), "inputNum": inputNum}); + self.postMessage({ "progress": Math.round((offset / file.size) * 100), "inputNum": inputNum }); const slice = file.slice(offset, offset + CHUNK_SIZE); reader.readAsArrayBuffer(slice); }; - reader.onload = function(e) { + reader.onload = function (e) { data.set(new Uint8Array(reader.result), offset); offset += CHUNK_SIZE; seek(); }; - reader.onerror = function(e) { - self.postMessage({"error": reader.error.message, "inputNum": inputNum, "id": self.id}); + reader.onerror = function (e) { + self.postMessage({ "error": reader.error.message, "inputNum": inputNum, "id": self.id }); }; seek(); diff --git a/src/web/workers/ZipWorker.mjs b/src/web/workers/ZipWorker.mjs index f81e2b2c..90cb1ccf 100644 --- a/src/web/workers/ZipWorker.mjs +++ b/src/web/workers/ZipWorker.mjs @@ -9,12 +9,12 @@ import zip from "zlibjs/bin/zip.min.js"; import Utils from "../../core/Utils.mjs"; import Dish from "../../core/Dish.mjs"; -import {detectFileType} from "../../core/lib/FileType.mjs"; +import { detectFileType } from "../../core/lib/FileType.mjs"; import loglevelMessagePrefix from "loglevel-message-prefix"; loglevelMessagePrefix(log, { prefixes: [], - staticPrefixes: ["ZipWorker"], + staticPrefixes: ["ZipWorker"] }); const Zlib = zip.Zlib; @@ -22,7 +22,7 @@ const Zlib = zip.Zlib; /** * Respond to message from parent thread. */ -self.addEventListener("message", function(e) { +self.addEventListener("message", function (e) { // Handle message from the main thread const r = e.data; log.debug(`Receiving command '${r.action}'`); @@ -39,7 +39,7 @@ self.addEventListener("message", function(e) { } }); -self.setOption = function(...args) {}; +self.setOption = function (...args) {}; /** * Compress the files into a zip file and send the zip back @@ -49,7 +49,7 @@ self.setOption = function(...args) {}; * @param {string} filename * @param {string} fileExtension */ -self.zipFiles = async function(outputs, filename, fileExtension) { +self.zipFiles = async function (outputs, filename, fileExtension) { const zip = new Zlib.Zip(); const inputNums = Object.keys(outputs); @@ -71,12 +71,15 @@ self.zipFiles = async function(outputs, filename, fileExtension) { } const name = Utils.strToByteArray(iNum + ext); - zip.addFile(output, {filename: name}); + zip.addFile(output, { filename: name }); } const zippedFile = zip.compress(); - self.postMessage({ - zippedFile: zippedFile.buffer, - filename: filename - }, [zippedFile.buffer]); + self.postMessage( + { + zippedFile: zippedFile.buffer, + filename: filename + }, + [zippedFile.buffer] + ); }; diff --git a/tests/browser/00_nightwatch.js b/tests/browser/00_nightwatch.js index 3ba2a865..69db84dc 100644 --- a/tests/browser/00_nightwatch.js +++ b/tests/browser/00_nightwatch.js @@ -9,20 +9,16 @@ const utils = require("./browserUtils.js"); module.exports = { - before: browser => { - browser - .resizeWindow(1280, 800) - .url(browser.launchUrl); + before: (browser) => { + browser.resizeWindow(1280, 800).url(browser.launchUrl); }, - "Loading screen": browser => { + "Loading screen": (browser) => { // Check that the loading screen appears and then disappears within a reasonable time - browser - .waitForElementVisible("#preloader", 300) - .waitForElementNotPresent("#preloader", 10000); + browser.waitForElementVisible("#preloader", 300).waitForElementNotPresent("#preloader", 10000); }, - "App loaded": browser => { + "App loaded": (browser) => { browser.useCss(); // Check that various important elements are loaded browser.expect.element("#operations").to.be.visible; @@ -36,7 +32,7 @@ module.exports = { browser.expect.element("#output-text").to.be.visible; }, - "Operations loaded": browser => { + "Operations loaded": (browser) => { browser.useXpath(); // Check that an operation in every category has been populated browser.expect.element("//li[contains(@class, 'operation') and text()='To Base64']").to.be.present; @@ -58,14 +54,12 @@ module.exports = { browser.expect.element("//li[contains(@class, 'operation') and text()='Register']").to.be.present; }, - "Recipe can be run": browser => { + "Recipe can be run": (browser) => { const toHex = "//li[contains(@class, 'operation') and text()='To Hex']"; const op = "#rec-list .operation .op-title"; // Check that operation is visible - browser - .useXpath() - .expect.element(toHex).to.be.visible; + browser.useXpath().expect.element(toHex).to.be.visible; // Add it to the recipe by double clicking browser @@ -76,23 +70,17 @@ module.exports = { .doubleClick("xpath", toHex); // Confirm that it has been added to the recipe - browser - .useCss() - .waitForElementVisible(op, 100) - .expect.element(op).text.to.contain("To Hex"); + browser.useCss().waitForElementVisible(op, 100).expect.element(op).text.to.contain("To Hex"); // Enter input - browser - .useCss() - .sendKeys("#input-text .cm-content", "Don't Panic.") - .pause(1000) - .click("#bake"); + browser.useCss().sendKeys("#input-text .cm-content", "Don't Panic.").pause(1000).click("#bake"); // Check output browser .useCss() .waitForElementNotVisible("#stale-indicator", 1000) - .expect.element("#output-text .cm-content").text.that.equals("44 6f 6e 27 74 20 50 61 6e 69 63 2e"); + .expect.element("#output-text .cm-content") + .text.that.equals("44 6f 6e 27 74 20 50 61 6e 69 63 2e"); // Clear recipe browser @@ -103,99 +91,77 @@ module.exports = { .waitForElementNotPresent(op); }, - "Test every module": browser => { + "Test every module": (browser) => { browser.useCss(); // BSON - loadOp("BSON deserialise", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("BSON deserialise", browser).waitForElementNotVisible("#output-loader", 5000); // Charts - loadOp("Entropy", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Entropy", browser).waitForElementNotVisible("#output-loader", 5000); // Ciphers - loadOp("AES Encrypt", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("AES Encrypt", browser).waitForElementNotVisible("#output-loader", 5000); // Code - loadOp("XPath expression", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("XPath expression", browser).waitForElementNotVisible("#output-loader", 5000); // Compression - loadOp("Gzip", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Gzip", browser).waitForElementNotVisible("#output-loader", 5000); // Crypto - loadOp("MD5", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("MD5", browser).waitForElementNotVisible("#output-loader", 5000); // Default - loadOp("Fork", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Fork", browser).waitForElementNotVisible("#output-loader", 5000); // Diff - loadOp("Diff", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Diff", browser).waitForElementNotVisible("#output-loader", 5000); // Encodings - loadOp("Encode text", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Encode text", browser).waitForElementNotVisible("#output-loader", 5000); // Hashing - loadOp("Streebog", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Streebog", browser).waitForElementNotVisible("#output-loader", 5000); // Image - loadOp("Extract EXIF", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Extract EXIF", browser).waitForElementNotVisible("#output-loader", 5000); // PGP - loadOp("PGP Encrypt", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("PGP Encrypt", browser).waitForElementNotVisible("#output-loader", 5000); // PublicKey - loadOp("Hex to PEM", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Hex to PEM", browser).waitForElementNotVisible("#output-loader", 5000); // Regex - loadOp("Strings", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Strings", browser).waitForElementNotVisible("#output-loader", 5000); // Shellcode - loadOp("Disassemble x86", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Disassemble x86", browser).waitForElementNotVisible("#output-loader", 5000); // URL - loadOp("URL Encode", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("URL Encode", browser).waitForElementNotVisible("#output-loader", 5000); // UserAgent - loadOp("Parse User Agent", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("Parse User Agent", browser).waitForElementNotVisible("#output-loader", 5000); // YARA - loadOp("YARA Rules", browser) - .waitForElementNotVisible("#output-loader", 5000); + loadOp("YARA Rules", browser).waitForElementNotVisible("#output-loader", 5000); browser.click("#clr-recipe"); }, - "Move around the UI": browser => { + "Move around the UI": (browser) => { const otherCat = "//a[contains(@class, 'category-title') and contains(@data-target, '#catOther')]", genUUID = "//li[contains(@class, 'operation') and text()='Generate UUID']"; browser.useXpath(); // Scroll to a lower category - browser - .getLocationInView(otherCat) - .expect.element(otherCat).to.be.visible; + browser.getLocationInView(otherCat).expect.element(otherCat).to.be.visible; // Open category - browser - .click(otherCat) - .expect.element(genUUID).to.be.visible; + browser.click(otherCat).expect.element(genUUID).to.be.visible; // Add op to recipe /* mouseButtonUp drops wherever the actual cursor is, not necessarily in the right place, @@ -208,12 +174,13 @@ module.exports = { .useCss() .waitForElementVisible(".operation .op-title", 1000) .waitForElementNotVisible("#stale-indicator", 1000) - .expect.element("#output-text .cm-content").text.which.matches(/[\da-f-]{36}/); + .expect.element("#output-text .cm-content") + .text.which.matches(/[\da-f-]{36}/); browser.click("#clr-recipe"); }, - "Search": browser => { + "Search": (browser) => { // Search for an op browser .useCss() @@ -223,7 +190,7 @@ module.exports = { .waitForElementVisible("//ul[@id='search-results']//b[text()='MD5']", 1000); }, - "Alert bar": browser => { + "Alert bar": (browser) => { // Bake nothing to create an empty output which can be copied utils.clear(browser); utils.bake(browser); @@ -233,7 +200,8 @@ module.exports = { .click("#copy-output") .waitForElementVisible("#snackbar-container") .waitForElementVisible("#snackbar-container .snackbar-content") - .expect.element("#snackbar-container .snackbar-content").text.to.equal("Copied raw output successfully."); + .expect.element("#snackbar-container .snackbar-content") + .text.to.equal("Copied raw output successfully."); // Alert bar disappears after the correct amount of time // Should disappear after 2000ms @@ -242,7 +210,7 @@ module.exports = { .waitForElementNotVisible("#snackbar-container"); }, - after: browser => { + after: (browser) => { browser.end(); } }; diff --git a/tests/browser/01_io.js b/tests/browser/01_io.js index 67d1fdff..81b6846a 100644 --- a/tests/browser/01_io.js +++ b/tests/browser/01_io.js @@ -48,12 +48,12 @@ const ALL_BYTES = [ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf", "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef", - "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", + "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" ].join(""); const PUA_CHARS = "\ue000\ue001\uf8fe\uf8ff"; -const MULTI_LINE_STRING =`"You know," said Arthur, "it's at times like this, when I'm trapped in a Vogon airlock with a man from Betelgeuse, and about to die of asphyxiation in deep space that I really wish I'd listened to what my mother told me when I was young." +const MULTI_LINE_STRING = `"You know," said Arthur, "it's at times like this, when I'm trapped in a Vogon airlock with a man from Betelgeuse, and about to die of asphyxiation in deep space that I really wish I'd listened to what my mother told me when I was young." "Why, what did she tell you?" "I don't know, I didn't listen."`; @@ -91,7 +91,7 @@ const CONTROL_CHAR_NAMES = { }; module.exports = { - before: browser => { + before: (browser) => { browser .resizeWindow(1280, 800) .url(browser.launchUrl) @@ -100,7 +100,7 @@ module.exports = { .click("#auto-bake-label"); }, - "CodeMirror has loaded correctly": browser => { + "CodeMirror has loaded correctly": (browser) => { /* Editor has initialised */ browser .useCss() @@ -121,29 +121,45 @@ module.exports = { browser // Input .waitForElementVisible("#input-text .cm-status-bar") .waitForElementVisible("#input-text .cm-status-bar .stats-length-value") - .expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("0"); - browser.waitForElementVisible("#input-text .cm-status-bar .stats-lines-value") - .expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("1"); - browser.waitForElementVisible("#input-text .cm-status-bar .chr-enc-value") - .expect.element("#input-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes"); - browser.waitForElementVisible("#input-text .cm-status-bar .eol-value") - .expect.element("#input-text .cm-status-bar .eol-value").text.to.equal("LF"); + .expect.element("#input-text .cm-status-bar .stats-length-value") + .text.to.equal("0"); + browser + .waitForElementVisible("#input-text .cm-status-bar .stats-lines-value") + .expect.element("#input-text .cm-status-bar .stats-lines-value") + .text.to.equal("1"); + browser + .waitForElementVisible("#input-text .cm-status-bar .chr-enc-value") + .expect.element("#input-text .cm-status-bar .chr-enc-value") + .text.to.equal("Raw Bytes"); + browser + .waitForElementVisible("#input-text .cm-status-bar .eol-value") + .expect.element("#input-text .cm-status-bar .eol-value") + .text.to.equal("LF"); browser // Output .waitForElementVisible("#output-text .cm-status-bar") .waitForElementVisible("#output-text .cm-status-bar .stats-length-value") - .expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("0"); - browser.waitForElementVisible("#output-text .cm-status-bar .stats-lines-value") - .expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1"); - browser.waitForElementVisible("#output-text .cm-status-bar .baking-time-info") - .expect.element("#output-text .cm-status-bar .baking-time-info").text.to.contain("ms"); - browser.waitForElementVisible("#output-text .cm-status-bar .chr-enc-value") - .expect.element("#output-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes"); - browser.waitForElementVisible("#output-text .cm-status-bar .eol-value") - .expect.element("#output-text .cm-status-bar .eol-value").text.to.equal("LF"); + .expect.element("#output-text .cm-status-bar .stats-length-value") + .text.to.equal("0"); + browser + .waitForElementVisible("#output-text .cm-status-bar .stats-lines-value") + .expect.element("#output-text .cm-status-bar .stats-lines-value") + .text.to.equal("1"); + browser + .waitForElementVisible("#output-text .cm-status-bar .baking-time-info") + .expect.element("#output-text .cm-status-bar .baking-time-info") + .text.to.contain("ms"); + browser + .waitForElementVisible("#output-text .cm-status-bar .chr-enc-value") + .expect.element("#output-text .cm-status-bar .chr-enc-value") + .text.to.equal("Raw Bytes"); + browser + .waitForElementVisible("#output-text .cm-status-bar .eol-value") + .expect.element("#output-text .cm-status-bar .eol-value") + .text.to.equal("LF"); }, - "Adding content": browser => { + "Adding content": (browser) => { /* Status bar updates correctly */ utils.setInput(browser, MULTI_LINE_STRING); @@ -167,23 +183,32 @@ module.exports = { browser.expect.element("#output-text .cm-status-bar .eol-value").text.to.equal("LF"); }, - "Special content": browser => { + "Special content": (browser) => { /* Special characters are rendered correctly */ utils.setInput(browser, SPECIAL_CHARS, false); // First line for (let i = 0x0; i <= 0x8; i++) { - browser.expect.element(`#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`) - .to.have.property("title").equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`); - browser.expect.element(`#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`) + browser.expect + .element(`#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i + 1})`) + .to.have.property("title") + .equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`); + browser.expect + .element(`#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i + 1})`) .text.to.equal(String.fromCharCode(0x2400 + i)); } // Tab \u0009 - browser.expect.element(`#input-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/\u0009$/); + browser.expect + .element(`#input-text .cm-line:nth-of-type(1)`) + .to.have.property("textContent") + .match(/\u0009$/); // Line feed \u000a - browser.expect.element(`#input-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/^.{10}$/); + browser.expect + .element(`#input-text .cm-line:nth-of-type(1)`) + .to.have.property("textContent") + .match(/^.{10}$/); browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2"); // Second line @@ -192,9 +217,12 @@ module.exports = { const name = CONTROL_CHAR_NAMES[index] || "0x" + index.toString(16); const value = index >= 32 ? "\u2022" : String.fromCharCode(0x2400 + index); - browser.expect.element(`#input-text .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`) - .to.have.property("title").equals(`Control character ${name}`); - browser.expect.element(`#input-text .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`) + browser.expect + .element(`#input-text .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i - 10})`) + .to.have.property("title") + .equals(`Control character ${name}`); + browser.expect + .element(`#input-text .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i - 10})`) .text.to.equal(value); } @@ -204,17 +232,26 @@ module.exports = { // First line for (let i = 0x0; i <= 0x8; i++) { - browser.expect.element(`#output-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`) - .to.have.property("title").equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`); - browser.expect.element(`#output-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`) + browser.expect + .element(`#output-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i + 1})`) + .to.have.property("title") + .equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`); + browser.expect + .element(`#output-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i + 1})`) .text.to.equal(String.fromCharCode(0x2400 + i)); } // Tab \u0009 - browser.expect.element(`#output-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/\u0009$/); + browser.expect + .element(`#output-text .cm-line:nth-of-type(1)`) + .to.have.property("textContent") + .match(/\u0009$/); // Line feed \u000a - browser.expect.element(`#output-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/^.{10}$/); + browser.expect + .element(`#output-text .cm-line:nth-of-type(1)`) + .to.have.property("textContent") + .match(/^.{10}$/); browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("2"); // Second line @@ -223,20 +260,25 @@ module.exports = { const name = CONTROL_CHAR_NAMES[index] || "0x" + index.toString(16); const value = index >= 32 ? "\u2022" : String.fromCharCode(0x2400 + index); - browser.expect.element(`#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`) - .to.have.property("title").equals(`Control character ${name}`); - browser.expect.element(`#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`) + browser.expect + .element(`#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i - 10})`) + .to.have.property("title") + .equals(`Control character ${name}`); + browser.expect + .element(`#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i - 10})`) .text.to.equal(value); } /* Bytes are rendered correctly */ utils.setInput(browser, ALL_BYTES, false); // Expect length to be 255, since one character is creating a newline - browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^.{255}$/); + browser.expect + .element(`#input-text .cm-content`) + .to.have.property("textContent") + .match(/^.{255}$/); browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("256"); browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2"); - /* PUA \ue000-\uf8ff */ utils.setInput(browser, PUA_CHARS, false); utils.setChrEnc(browser, "output", "UTF-8"); @@ -250,8 +292,14 @@ module.exports = { Therefore, PUA characters should be rendered normally in the Input but as control character pictures in the output. */ - browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^\ue000\ue001\uf8fe\uf8ff$/); - browser.expect.element(`#output-text .cm-content`).to.have.property("textContent").match(/^\u2400\u2401\u3cfe\u3cff$/); + browser.expect + .element(`#input-text .cm-content`) + .to.have.property("textContent") + .match(/^\ue000\ue001\uf8fe\uf8ff$/); + browser.expect + .element(`#output-text .cm-content`) + .to.have.property("textContent") + .match(/^\u2400\u2401\u3cfe\u3cff$/); /* Can be copied */ utils.setInput(browser, SPECIAL_CHARS, false); @@ -266,28 +314,28 @@ module.exports = { utils.paste(browser, "#search"); // Paste into search box as this won't mess with the values // Ensure that the values are as expected - browser.expect.element("#search").to.have.value.that.equals("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008"); + browser.expect + .element("#search") + .to.have.value.that.equals("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008"); browser.clearValue("#search"); // Raw copy - browser - .click("#copy-output") - .pause(100); + browser.click("#copy-output").pause(100); utils.paste(browser, "#search"); // Paste into search box as this won't mess with the values // Ensure that the values are as expected - browser.expect.element("#search").to.have.value.that.matches(/^\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009/); + browser.expect + .element("#search") + .to.have.value.that.matches(/^\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009/); browser.clearValue("#search"); }, - "HTML output": browser => { + "HTML output": (browser) => { /* Displays correctly */ utils.loadRecipe(browser, "Entropy", ALL_BYTES); utils.bake(browser); - browser - .waitForElementVisible("#output-html") - .waitForElementVisible("#output-html #chart-area"); + browser.waitForElementVisible("#output-html").waitForElementVisible("#output-html #chart-area"); /* Status bar widgets are disabled */ browser.expect.element("#output-text .cm-status-bar .disabled .stats-length-value").to.be.visible; @@ -300,17 +348,18 @@ module.exports = { utils.bake(browser); for (let i = 0x0; i <= 0x4; i++) { - browser.expect.element(`#output-html .cm-specialChar:nth-of-type(${i+1})`) - .to.have.property("title").equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`); - browser.expect.element(`#output-html .cm-specialChar:nth-of-type(${i+1})`) + browser.expect + .element(`#output-html .cm-specialChar:nth-of-type(${i + 1})`) + .to.have.property("title") + .equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`); + browser.expect + .element(`#output-html .cm-specialChar:nth-of-type(${i + 1})`) .text.to.equal(String.fromCharCode(0x2400 + i)); } /* Can be copied */ // Raw copy - browser - .click("#copy-output") - .pause(100); + browser.click("#copy-output").pause(100); utils.paste(browser, "#search"); // Paste into search box as this won't mess with the values // Ensure that the values are as expected @@ -318,7 +367,7 @@ module.exports = { browser.clearValue("#search"); }, - "Highlighting": browser => { + "Highlighting": (browser) => { utils.setInput(browser, SELECTABLE_STRING); utils.bake(browser); @@ -376,14 +425,17 @@ module.exports = { browser.click("#auto-bake-label"); }, - "Character encoding": browser => { + "Character encoding": (browser) => { const CHINESE_CHARS = "不要恐慌。"; /* Dropup works */ /* Selecting changes output correctly */ utils.setInput(browser, CHINESE_CHARS, false); utils.setChrEnc(browser, "input", "UTF-8"); utils.bake(browser); - utils.expectOutput(browser, "\u00E4\u00B8\u008D\u00E8\u00A6\u0081\u00E6\u0081\u0090\u00E6\u0085\u008C\u00E3\u0080\u0082"); + utils.expectOutput( + browser, + "\u00E4\u00B8\u008D\u00E8\u00A6\u0081\u00E6\u0081\u0090\u00E6\u0085\u008C\u00E3\u0080\u0082" + ); /* Changing output to match input works as expected */ utils.setChrEnc(browser, "output", "UTF-8"); @@ -395,9 +447,7 @@ module.exports = { browser.assert.urlContains("oenc=65001"); /* Preserved when changing tabs */ - browser - .click("#btn-new-tab") - .waitForElementVisible("#input-tabs li:nth-of-type(2).active-input-tab"); + browser.click("#btn-new-tab").waitForElementVisible("#input-tabs li:nth-of-type(2).active-input-tab"); browser.expect.element("#input-text .chr-enc-value").text.that.equals("Raw Bytes"); browser.expect.element("#output-text .chr-enc-value").text.that.equals("Raw Bytes"); @@ -435,7 +485,7 @@ module.exports = { utils.expectOutput(browser, "\u00A4\u0408\u00ADn\u00AE\u0408\u00B7W\u040EC"); }, - "Line endings": browser => { + "Line endings": (browser) => { /* Dropup works */ /* Selecting changes view in input */ utils.setInput(browser, MULTI_LINE_STRING); @@ -530,7 +580,9 @@ module.exports = { .waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(2)") .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(3)") .waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(3)"); - browser.expect.element("#input-text .cm-content .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(3)").text.to.equal("␋"); + browser.expect + .element("#input-text .cm-content .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(3)") + .text.to.equal("␋"); browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("304"); browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2"); @@ -549,9 +601,7 @@ module.exports = { browser.assert.urlContains("oeol=%0D"); /* Preserved when changing tabs */ - browser - .click("#btn-new-tab") - .waitForElementVisible("#input-tabs li:nth-of-type(2).active-input-tab"); + browser.click("#btn-new-tab").waitForElementVisible("#input-tabs li:nth-of-type(2).active-input-tab"); browser.expect.element("#input-text .eol-value").text.that.equals("LF"); browser.expect.element("#output-text .eol-value").text.that.equals("LF"); @@ -565,7 +615,7 @@ module.exports = { browser.expect.element("#output-text .eol-value").text.that.equals("CR"); }, - "File inputs": browser => { + "File inputs": (browser) => { utils.clear(browser); /* Side panel displays correct info */ @@ -589,16 +639,20 @@ module.exports = { .click("#input-text .cm-file-details .file-details-toggle-shown") .waitForElementNotPresent("#input-text .cm-file-details .file-details-toggle-shown") .waitForElementVisible("#input-text .cm-file-details .file-details-toggle-hidden") - .expect.element("#input-text .cm-file-details").to.have.css("width").which.equals("1px"); + .expect.element("#input-text .cm-file-details") + .to.have.css("width") + .which.equals("1px"); browser .click("#input-text .cm-file-details .file-details-toggle-hidden") .waitForElementNotPresent("#input-text .cm-file-details .file-details-toggle-hidden") .waitForElementVisible("#input-text .cm-file-details .file-details-toggle-shown") - .expect.element("#input-text .cm-file-details").to.have.css("width").which.equals("200px"); + .expect.element("#input-text .cm-file-details") + .to.have.css("width") + .which.equals("200px"); }, - "Folder inputs": browser => { + "Folder inputs": (browser) => { utils.clear(browser); /* Side panel displays correct info */ @@ -619,19 +673,35 @@ module.exports = { .waitForElementVisible("#input-text .cm-file-details .file-details-type") .waitForElementVisible("#input-text .cm-file-details .file-details-loaded"); - browser.getText("#input-text .cm-file-details .file-details-name", function(result) { + browser.getText("#input-text .cm-file-details .file-details-name", function (result) { switch (result.value) { case "TowelDay.jpeg": - browser.expect.element("#input-text .cm-file-details .file-details-name").text.that.equals("TowelDay.jpeg"); - browser.expect.element("#input-text .cm-file-details .file-details-size").text.that.equals("61,379 bytes"); - browser.expect.element("#input-text .cm-file-details .file-details-type").text.that.equals("image/jpeg"); - browser.expect.element("#input-text .cm-file-details .file-details-loaded").text.that.equals("100%"); + browser.expect + .element("#input-text .cm-file-details .file-details-name") + .text.that.equals("TowelDay.jpeg"); + browser.expect + .element("#input-text .cm-file-details .file-details-size") + .text.that.equals("61,379 bytes"); + browser.expect + .element("#input-text .cm-file-details .file-details-type") + .text.that.equals("image/jpeg"); + browser.expect + .element("#input-text .cm-file-details .file-details-loaded") + .text.that.equals("100%"); break; case "Hitchhikers_Guide.jpeg": - browser.expect.element("#input-text .cm-file-details .file-details-name").text.that.equals("Hitchhikers_Guide.jpeg"); - browser.expect.element("#input-text .cm-file-details .file-details-size").text.that.equals("36,595 bytes"); - browser.expect.element("#input-text .cm-file-details .file-details-type").text.that.equals("image/jpeg"); - browser.expect.element("#input-text .cm-file-details .file-details-loaded").text.that.equals("100%"); + browser.expect + .element("#input-text .cm-file-details .file-details-name") + .text.that.equals("Hitchhikers_Guide.jpeg"); + browser.expect + .element("#input-text .cm-file-details .file-details-size") + .text.that.equals("36,595 bytes"); + browser.expect + .element("#input-text .cm-file-details .file-details-type") + .text.that.equals("image/jpeg"); + browser.expect + .element("#input-text .cm-file-details .file-details-loaded") + .text.that.equals("100%"); break; default: break; @@ -640,13 +710,18 @@ module.exports = { } }, - "Loading from URL": browser => { + "Loading from URL": (browser) => { /* Complex deep link populates the input correctly (encoding, eol, input) */ browser - .urlHash("recipe=To_Base64('A-Za-z0-9%2B/%3D')&input=VGhlIHNoaXBzIGh1bmcgaW4gdGhlIHNreSBpbiBtdWNoIHRoZSBzYW1lIHdheSB0aGF0IGJyaWNrcyBkb24ndC4M&ienc=21866&oenc=1201&ieol=%0C&oeol=%E2%80%A9") + .urlHash( + "recipe=To_Base64('A-Za-z0-9%2B/%3D')&input=VGhlIHNoaXBzIGh1bmcgaW4gdGhlIHNreSBpbiBtdWNoIHRoZSBzYW1lIHdheSB0aGF0IGJyaWNrcyBkb24ndC4M&ienc=21866&oenc=1201&ieol=%0C&oeol=%E2%80%A9" + ) .waitForElementVisible("#rec-list li.operation"); - browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^.{65}$/); + browser.expect + .element(`#input-text .cm-content`) + .to.have.property("textContent") + .match(/^.{65}$/); browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("66"); browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2"); @@ -658,14 +733,21 @@ module.exports = { utils.bake(browser); - browser.expect.element(`#output-text .cm-content`).to.have.property("textContent").match(/^.{44}$/); + browser.expect + .element(`#output-text .cm-content`) + .to.have.property("textContent") + .match(/^.{44}$/); browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("44"); browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1"); }, - "Replace input with output": browser => { + "Replace input with output": (browser) => { /* Input is correctly populated */ - utils.loadRecipe(browser, "XOR", "The ships hung in the sky in much the same way that bricks don't.", [{ "option": "Hex", "string": "65" }, "Standard", false]); + utils.loadRecipe(browser, "XOR", "The ships hung in the sky in much the same way that bricks don't.", [ + { "option": "Hex", "string": "65" }, + "Standard", + false + ]); utils.setChrEnc(browser, "input", "UTF-32LE"); utils.setChrEnc(browser, "output", "UTF-7"); utils.setEOLSeq(browser, "input", "CRLF"); @@ -673,7 +755,8 @@ module.exports = { browser .sendKeys("#input-text .cm-content", browser.Keys.RETURN) - .expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2"); + .expect.element("#input-text .cm-status-bar .stats-lines-value") + .text.to.equal("2"); utils.bake(browser); browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("67"); @@ -682,9 +765,7 @@ module.exports = { browser.expect.element("#input-text .eol-value").text.that.equals("CRLF"); browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("268"); - browser - .click("#switch") - .waitForElementVisible("#stale-indicator"); + browser.click("#switch").waitForElementVisible("#stale-indicator"); browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("268"); @@ -693,12 +774,13 @@ module.exports = { browser.expect.element("#input-text .chr-enc-value").text.that.equals("UTF-7"); browser.expect.element("#input-text .eol-value").text.that.equals("LS"); browser.expect.element("#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(1)").text.to.equal("␍"); - browser.expect.element("#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(49)").text.to.equal("␑"); + browser.expect + .element("#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(49)") + .text.to.equal("␑"); browser.waitForElementNotPresent("#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(50)"); }, - - after: browser => { + after: (browser) => { browser.end(); } }; diff --git a/tests/browser/02_ops.js b/tests/browser/02_ops.js index 7cb0e941..8b6024e0 100644 --- a/tests/browser/02_ops.js +++ b/tests/browser/02_ops.js @@ -16,7 +16,7 @@ const utils = require("./browserUtils.js"); module.exports = { - before: browser => { + before: (browser) => { browser .resizeWindow(1280, 800) .url(browser.launchUrl) @@ -25,16 +25,33 @@ module.exports = { .click("#auto-bake-label"); }, - "Sanity check operations": async browser => { + "Sanity check operations": async (browser) => { const Images = await import("../samples/Images.mjs"); testOp(browser, "A1Z26 Cipher Decode", "20 5 19 20 15 21 20 16 21 20", "testoutput"); testOp(browser, "A1Z26 Cipher Encode", "test input", "20 5 19 20 9 14 16 21 20"); testOp(browser, "ADD", "test input", "Ê»ÉÊv¿ÄÆËÊ", [{ "option": "Hex", "string": "56" }]); - testOp(browser, "AES Decrypt", "b443f7f7c16ac5396a34273f6f639caa", "test output", [{ "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, { "option": "Hex", "string": "00000000000000000000000000000000" }, "CBC", "Hex", "Raw", { "option": "Hex", "string": "" }]); - testOp(browser, "AES Encrypt", "test input", "e42eb8fbfb7a98fff061cd2c1a794d92", [{"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, {"option": "Hex", "string": "00000000000000000000000000000000"}, "CBC", "Raw", "Hex"]); + testOp(browser, "AES Decrypt", "b443f7f7c16ac5396a34273f6f639caa", "test output", [ + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00000000000000000000000000000000" }, + "CBC", + "Hex", + "Raw", + { "option": "Hex", "string": "" } + ]); + testOp(browser, "AES Encrypt", "test input", "e42eb8fbfb7a98fff061cd2c1a794d92", [ + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00000000000000000000000000000000" }, + "CBC", + "Raw", + "Hex" + ]); testOp(browser, "AND", "test input", "4$04 $044", [{ "option": "Hex", "string": "34" }]); testOp(browser, "Add line numbers", "test input", "1 test input"); - testOp(browser, ["From Hex", "Add Text To Image", "To Base64"], Images.PNG_HEX, Images.PNG_CHEF_B64, [[], ["Chef", "Center", "Middle", 0, 0, 16], []]); + testOp(browser, ["From Hex", "Add Text To Image", "To Base64"], Images.PNG_HEX, Images.PNG_CHEF_B64, [ + [], + ["Chef", "Center", "Middle", 0, 0, 16], + [] + ]); testOp(browser, "Adler-32 Checksum", "test input", "16160411"); testOp(browser, "Affine Cipher Decode", "test input", "rcqr glnsr", [1, 2]); testOp(browser, "Affine Cipher Encode", "test input", "njln rbfpn", [2, 1]); @@ -43,35 +60,97 @@ module.exports = { testOp(browser, "Analyse hash", "0123456789abcdef", /CRC-64/); testOp(browser, "Atbash Cipher", "test input", "gvhg rmkfg"); // testOp(browser, "Avro to JSON", "test input", "test_output"); - testOp(browser, "BLAKE2b", "test input", "33ebdc8f38177f3f3f334eeb117a84e11f061bbca4db6b8923e5cec85103f59f415551a5d5a933fdb6305dc7bf84671c2540b463dbfa08ee1895cfaa5bd780b5", ["512", "Hex", { "option": "UTF8", "string": "pass" }]); - testOp(browser, "BLAKE2s", "test input", "defe73d61dfa6e5807e4f9643e159a09ccda6be3c26dcd65f8a9bb38bfc973a7", ["256", "Hex", { "option": "UTF8", "string": "pass" }]); - testOp(browser, "BSON deserialise", "\u0011\u0000\u0000\u0000\u0002a\u0000\u0005\u0000\u0000\u0000test\u0000\u0000", '{\u000A "a": "test"\u000A}'); - testOp(browser, "BSON serialise", '{"a":"test"}', "\u0011\u0000\u0000\u0000\u0002a\u0000\u0005\u0000\u0000\u0000test\u0000\u0000"); + testOp( + browser, + "BLAKE2b", + "test input", + "33ebdc8f38177f3f3f334eeb117a84e11f061bbca4db6b8923e5cec85103f59f415551a5d5a933fdb6305dc7bf84671c2540b463dbfa08ee1895cfaa5bd780b5", + ["512", "Hex", { "option": "UTF8", "string": "pass" }] + ); + testOp(browser, "BLAKE2s", "test input", "defe73d61dfa6e5807e4f9643e159a09ccda6be3c26dcd65f8a9bb38bfc973a7", [ + "256", + "Hex", + { "option": "UTF8", "string": "pass" } + ]); + testOp( + browser, + "BSON deserialise", + "\u0011\u0000\u0000\u0000\u0002a\u0000\u0005\u0000\u0000\u0000test\u0000\u0000", + '{\u000A "a": "test"\u000A}' + ); + testOp( + browser, + "BSON serialise", + '{"a":"test"}', + "\u0011\u0000\u0000\u0000\u0002a\u0000\u0005\u0000\u0000\u0000test\u0000\u0000" + ); // testOp(browser, "Bacon Cipher Decode", "test input", "test_output"); // testOp(browser, "Bacon Cipher Encode", "test input", "test_output"); testOp(browser, "Bcrypt", "test input", /^\$2a\$06\$.{53}$/, [6]); - testOp(browser, "Bcrypt compare", "test input", "Match: test input", ["$2a$05$FCfBSVX7OeRkK.9kQVFCiOYu9XtwtIbePqUiroD1lkASW9q5QClzG"]); + testOp(browser, "Bcrypt compare", "test input", "Match: test input", [ + "$2a$05$FCfBSVX7OeRkK.9kQVFCiOYu9XtwtIbePqUiroD1lkASW9q5QClzG" + ]); testOp(browser, "Bcrypt parse", "$2a$05$kXWtAIGB/R8VEzInoM5ocOTBtyc0m2YTIwFiBU/0XoW032f9QrkWW", /Rounds: 5/); testOp(browser, "Bifid Cipher Decode", "qblb tfovy", "test input", ["pass"]); testOp(browser, "Bifid Cipher Encode", "test input", "qblb tfovy", ["pass"]); testOp(browser, "Bit shift left", "test input", "\u00E8\u00CA\u00E6\u00E8@\u00D2\u00DC\u00E0\u00EA\u00E8"); testOp(browser, "Bit shift right", "test input", ":29:\u0010478::"); - testOp(browser, "Blowfish Decrypt", "10884e15427dd84ec35204e9c8e921ae", "test_output", [{"option": "Hex", "string": "1234567801234567"}, {"option": "Hex", "string": "0011223344556677"}, "CBC", "Hex", "Raw"]); - testOp(browser, "Blowfish Encrypt", "test input", "f0fadbd1d90d774f714248cf26b96410", [{"option": "Hex", "string": "1234567801234567"}, {"option": "Hex", "string": "0011223344556677"}, "CBC", "Raw", "Hex"]); + testOp(browser, "Blowfish Decrypt", "10884e15427dd84ec35204e9c8e921ae", "test_output", [ + { "option": "Hex", "string": "1234567801234567" }, + { "option": "Hex", "string": "0011223344556677" }, + "CBC", + "Hex", + "Raw" + ]); + testOp(browser, "Blowfish Encrypt", "test input", "f0fadbd1d90d774f714248cf26b96410", [ + { "option": "Hex", "string": "1234567801234567" }, + { "option": "Hex", "string": "0011223344556677" }, + "CBC", + "Raw", + "Hex" + ]); testOp(browser, ["From Hex", "Blur Image", "To Base64"], Images.PNG_HEX, Images.PNG_BLUR_B64); - testOpHtml(browser, "Bombe", "XTSYN WAEUG EZALY NRQIM AMLZX MFUOD AWXLY LZCUZ QOQBQ JLCPK NDDRW F", "table tr:last-child td:first-child", "ECG", ["3-rotor", "LEYJVCNIXWPBQMDRTAKZGFUHOS", "BDFHJLCPRTXVZNYEIWGAKMUSQO { + after: (browser) => { browser.end(); } }; - /** @function * Clears the current recipe and bakes a new operation. * @@ -410,8 +597,8 @@ module.exports = { * @param {string} input - input text for test * @param {Array|Array>} args - arguments, nested if multiple ops */ -function bakeOp(browser, opName, input, args=[]) { - browser.perform(function() { +function bakeOp(browser, opName, input, args = []) { + browser.perform(function () { console.log(`Current test: ${opName}`); }); utils.loadRecipe(browser, opName, input, args); @@ -428,7 +615,7 @@ function bakeOp(browser, opName, input, args=[]) { * @param {string} output - expected output * @param {Array|Array>} args - arguments, nested if multiple ops */ -function testOp(browser, opName, input, output, args=[]) { +function testOp(browser, opName, input, output, args = []) { bakeOp(browser, opName, input, args); utils.expectOutput(browser, output); } @@ -443,7 +630,7 @@ function testOp(browser, opName, input, output, args=[]) { * @param {string} output - expected output * @param {Array|Array>} args - arguments, nested if multiple ops */ -function testOpHtml(browser, opName, input, cssSelector, output, args=[]) { +function testOpHtml(browser, opName, input, cssSelector, output, args = []) { bakeOp(browser, opName, input, args); if (typeof output === "string") { @@ -462,7 +649,7 @@ function testOpHtml(browser, opName, input, cssSelector, output, args=[]) { * @param {Array|Array>} args - arguments, nested if multiple ops */ function testOpImage(browser, opName, filename, args) { - browser.perform(function() { + browser.perform(function () { console.log(`Current test: ${opName}`); }); utils.loadRecipe(browser, opName, "", args); @@ -472,7 +659,9 @@ function testOpImage(browser, opName, filename, args) { browser .waitForElementVisible("#output-html img") - .expect.element("#output-html img").to.have.css("width").which.matches(/^[^0]\d*px/); + .expect.element("#output-html img") + .to.have.css("width") + .which.matches(/^[^0]\d*px/); } /** @function @@ -486,7 +675,7 @@ function testOpImage(browser, opName, filename, args) { * @param {Array|Array>} args - arguments, nested if multiple ops */ function testOpFile(browser, opName, filename, cssSelector, output, args) { - browser.perform(function() { + browser.perform(function () { console.log(`Current test: ${opName}`); }); utils.loadRecipe(browser, opName, "", args); diff --git a/tests/browser/browserUtils.js b/tests/browser/browserUtils.js index b73dca91..246ecdb7 100644 --- a/tests/browser/browserUtils.js +++ b/tests/browser/browserUtils.js @@ -17,7 +17,8 @@ function clear(browser) { .click("#clr-recipe") .click("#clr-io") .waitForElementNotPresent("#rec-list li.operation") - .expect.element("#input-text .cm-content").text.that.equals(""); + .expect.element("#input-text .cm-content") + .text.that.equals(""); } /** @function @@ -28,17 +29,17 @@ function clear(browser) { * @param {boolean} [type=true] - Whether to type the characters in by using sendKeys, * or to set the value of the editor directly (useful for special characters) */ -function setInput(browser, input, type=true) { +function setInput(browser, input, type = true) { clear(browser); if (type) { - browser - .useCss() - .sendKeys("#input-text .cm-content", input) - .pause(100); + browser.useCss().sendKeys("#input-text .cm-content", input).pause(100); } else { - browser.execute(text => { - window.app.setInput(text); - }, [input]); + browser.execute( + (text) => { + window.app.setInput(text); + }, + [input] + ); } } @@ -69,7 +70,8 @@ function setChrEnc(browser, io, enc) { .waitForElementVisible(io + " .chr-enc-select .cm-status-bar-select-scroll") .click("link text", enc) .waitForElementNotVisible(io + " .chr-enc-select .cm-status-bar-select-scroll") - .expect.element(io + " .chr-enc-value").text.that.equals(enc); + .expect.element(io + " .chr-enc-value") + .text.that.equals(enc); } /** @function @@ -87,7 +89,8 @@ function setEOLSeq(browser, io, eol) { .waitForElementVisible(io + " .eol-select .cm-status-bar-select-content") .click(`${io} .cm-status-bar-select-content a[data-val=${eol}]`) .waitForElementNotVisible(io + " .eol-select .cm-status-bar-select-content") - .expect.element(io + " .eol-value").text.that.equals(eol); + .expect.element(io + " .eol-value") + .text.that.equals(eol); } /** @function @@ -96,8 +99,8 @@ function setEOLSeq(browser, io, eol) { * @param {Browser} browser - Nightwatch client */ function copy(browser) { - browser.perform(function() { - const actions = this.actions({async: true}); + browser.perform(function () { + const actions = this.actions({ async: true }); // Ctrl + Ins used as this works on Windows, Linux and Mac return actions @@ -117,8 +120,8 @@ function copy(browser) { function paste(browser, el) { browser .click(el) - .perform(function() { - const actions = this.actions({async: true}); + .perform(function () { + const actions = this.actions({ async: true }); // Shift + Ins used as this works on Windows, Linux and Mac return actions @@ -141,11 +144,13 @@ function paste(browser, el) { function loadRecipe(browser, opName, input, args) { let recipeConfig; - if (typeof(opName) === "string") { - recipeConfig = JSON.stringify([{ - "op": opName, - "args": args - }]); + if (typeof opName === "string") { + recipeConfig = JSON.stringify([ + { + "op": opName, + "args": args + } + ]); } else if (opName instanceof Array) { recipeConfig = JSON.stringify( opName.map((op, i) => { @@ -156,14 +161,12 @@ function loadRecipe(browser, opName, input, args) { }) ); } else { - throw new Error("Invalid operation type. Must be string or array of strings. Received: " + typeof(opName)); + throw new Error("Invalid operation type. Must be string or array of strings. Received: " + typeof opName); } clear(browser); setInput(browser, input, false); - browser - .urlHash("recipe=" + recipeConfig) - .waitForElementPresent("#rec-list li.operation"); + browser.urlHash("recipe=" + recipeConfig).waitForElementPresent("#rec-list li.operation"); } /** @function @@ -173,14 +176,17 @@ function loadRecipe(browser, opName, input, args) { * @param {string|RegExp} expected - The expected output value */ function expectOutput(browser, expected) { - browser.execute(expected => { - const output = window.app.manager.output.outputEditorView.state.doc.toString(); - if (expected instanceof RegExp) { - return expected.test(output); - } else { - return expected === output; - } - }, [expected]); + browser.execute( + (expected) => { + const output = window.app.manager.output.outputEditorView.state.doc.toString(); + if (expected instanceof RegExp) { + return expected.test(output); + } else { + return expected === output; + } + }, + [expected] + ); } /** @function @@ -197,10 +203,7 @@ function uploadFile(browser, filename) { browser.execute(() => { document.getElementById("open-file").style.display = "block"; }); - browser - .pause(100) - .setValue("#open-file", filepath) - .pause(100); + browser.pause(100).setValue("#open-file", filepath).pause(100); browser.execute(() => { document.getElementById("open-file").style.display = "none"; }); @@ -221,17 +224,13 @@ function uploadFolder(browser, foldername) { browser.execute(() => { document.getElementById("open-folder").style.display = "block"; }); - browser - .pause(100) - .setValue("#open-folder", folderpath) - .pause(500); + browser.pause(100).setValue("#open-folder", folderpath).pause(500); browser.execute(() => { document.getElementById("open-folder").style.display = "none"; }); browser.waitForElementVisible("#input-text .cm-file-details"); } - module.exports = { clear: clear, setInput: setInput, diff --git a/tests/lib/TestRegister.mjs b/tests/lib/TestRegister.mjs index ea7b934d..f25eda80 100644 --- a/tests/lib/TestRegister.mjs +++ b/tests/lib/TestRegister.mjs @@ -21,7 +21,6 @@ import log from "loglevel"; * @constructor */ class TestRegister { - /** * initialise with no tests */ @@ -50,14 +49,17 @@ class TestRegister { /** * Runs all the tests in the register. */ - async runTests () { + async runTests() { // Turn off logging to avoid messy errors log.setLevel("silent", false); - const progBar = new cliProgress.SingleBar({ - format: formatter, - stopOnComplete: true - }, cliProgress.Presets.shades_classic); + const progBar = new cliProgress.SingleBar( + { + format: formatter, + stopOnComplete: true + }, + cliProgress.Presets.shades_classic + ); const testResults = []; console.log("Running operation tests..."); @@ -71,11 +73,7 @@ class TestRegister { }); const chef = new Chef(); - const result = await chef.bake( - test.input, - test.recipeConfig, - { returnType: "string" } - ); + const result = await chef.bake(test.input, test.recipeConfig, { returnType: "string" }); const ret = { test: test, @@ -94,7 +92,7 @@ class TestRegister { "Expected", "\t" + test.expectedOutput.replace(/\n/g, "\n\t"), "Received", - "\t" + result.error.displayStr.replace(/\n/g, "\n\t"), + "\t" + result.error.displayStr.replace(/\n/g, "\n\t") ].join("\n"); } } else { @@ -113,15 +111,18 @@ class TestRegister { ret.status = "passing"; } else { ret.status = "failing"; - const expected = test.expectedOutput ? test.expectedOutput : - test.expectedMatch ? test.expectedMatch.toString() : - test.unexpectedMatch ? "to not find " + test.unexpectedMatch.toString() : - "unknown"; + const expected = test.expectedOutput + ? test.expectedOutput + : test.expectedMatch + ? test.expectedMatch.toString() + : test.unexpectedMatch + ? "to not find " + test.unexpectedMatch.toString() + : "unknown"; ret.output = [ "Expected", "\t" + expected.replace(/\n/g, "\n\t"), "Received", - "\t" + result.result.replace(/\n/g, "\n\t"), + "\t" + result.result.replace(/\n/g, "\n\t") ].join("\n"); } } @@ -140,10 +141,13 @@ class TestRegister { * Run all api related tests and wrap results in report format */ async runApiTests() { - const progBar = new cliProgress.SingleBar({ - format: formatter, - stopOnComplete: true - }, cliProgress.Presets.shades_classic); + const progBar = new cliProgress.SingleBar( + { + format: formatter, + stopOnComplete: true + }, + cliProgress.Presets.shades_classic + ); const testResults = []; console.log("Running Node API tests..."); @@ -178,7 +182,6 @@ class TestRegister { } } - /** * Formatter for the progress bar * @@ -188,8 +191,9 @@ class TestRegister { * @returns {string} */ function formatter(options, params, payload) { - const bar = options.barCompleteString.substr(0, Math.round(params.progress * options.barsize)) + - options.barIncompleteString.substr(0, Math.round((1-params.progress) * options.barsize)); + const bar + = options.barCompleteString.substr(0, Math.round(params.progress * options.barsize)) + + options.barIncompleteString.substr(0, Math.round((1 - params.progress) * options.barsize)); const percentage = Math.floor(params.progress * 100), duration = Math.floor((Date.now() - params.startTime) / 1000); diff --git a/tests/lib/utils.mjs b/tests/lib/utils.mjs index e29dbf90..4ccf5008 100644 --- a/tests/lib/utils.mjs +++ b/tests/lib/utils.mjs @@ -8,7 +8,6 @@ * @license Apache-2.0 */ - /** * Helper function to convert a status to an icon. * @@ -16,11 +15,13 @@ * @returns {string} */ function statusToIcon(status) { - return { - erroring: "🔥", - failing: "❌", - passing: "✔️️", - }[status] || "?"; + return ( + { + erroring: "🔥", + failing: "❌", + passing: "✔️️" + }[status] || "?" + ); } /** @@ -46,7 +47,7 @@ function handleTestResult(testStatus, testResult) { * @param {Object[]} results - results from TestRegister */ export function logTestReport(testStatus, results) { - results.forEach(r => handleTestResult(testStatus, r)); + results.forEach((r) => handleTestResult(testStatus, r)); console.log(); for (const testStatusCount in testStatus.counts) { @@ -58,21 +59,15 @@ export function logTestReport(testStatus, results) { console.log(); // Print error messages for tests that didn't pass - results.filter(res => res.status !== "passing").forEach(testResult => { - console.log([ - statusToIcon(testResult.status), - testResult.test.name - ].join(" ")); + results + .filter((res) => res.status !== "passing") + .forEach((testResult) => { + console.log([statusToIcon(testResult.status), testResult.test.name].join(" ")); - if (testResult.output) { - console.log( - testResult.output - .trim() - .replace(/^/, "\t") - .replace(/\n/g, "\n\t") - ); - } - }); + if (testResult.output) { + console.log(testResult.output.trim().replace(/^/, "\t").replace(/\n/g, "\n\t")); + } + }); console.log(); process.exit(testStatus.allTestsPassing ? 0 : 1); @@ -83,7 +78,7 @@ export function logTestReport(testStatus, results) { */ export function setLongTestFailure() { const timeLimit = 120; - setTimeout(function() { + setTimeout(function () { console.log(`Tests took longer than ${timeLimit} seconds to run, returning.`); process.exit(1); }, timeLimit * 1000); diff --git a/tests/node/assertionHandler.mjs b/tests/node/assertionHandler.mjs index 82d19a2e..0df82f32 100644 --- a/tests/node/assertionHandler.mjs +++ b/tests/node/assertionHandler.mjs @@ -11,7 +11,6 @@ /* eslint no-console: 0 */ - /** * Print useful stack on error */ @@ -24,7 +23,6 @@ const wrapRun = (run) => async () => { } }; - /** * it - wrapper for assertions to provide a helpful description * to the TestRegister @@ -53,7 +51,7 @@ const wrapRun = (run) => async () => { export function it(name, run) { return { name: `Node API: ${name}`, - run: wrapRun(run), + run: wrapRun(run) }; } diff --git a/tests/node/consumers/cjs-consumer.js b/tests/node/consumers/cjs-consumer.js index 3a759481..9f81090a 100644 --- a/tests/node/consumers/cjs-consumer.js +++ b/tests/node/consumers/cjs-consumer.js @@ -8,25 +8,23 @@ const assert = require("assert"); -require("cyberchef").then(chef => { - +require("cyberchef").then((chef) => { const d = chef.bake("Testing, 1 2 3", [ chef.toHex, chef.reverse, { op: chef.unique, args: { - delimiter: "Space", + delimiter: "Space" } }, { op: chef.multiply, args: { - delimiter: "Space", + delimiter: "Space" } } ]); assert.equal(d.value, "630957449041920"); - }); diff --git a/tests/node/consumers/esm-consumer.mjs b/tests/node/consumers/esm-consumer.mjs index 2919e533..1257e3b4 100644 --- a/tests/node/consumers/esm-consumer.mjs +++ b/tests/node/consumers/esm-consumer.mjs @@ -15,13 +15,13 @@ const a = bake("Testing, 1 2 3", [ { op: unique, args: { - delimiter: "Space", + delimiter: "Space" } }, { op: multiply, args: { - delimiter: "Space", + delimiter: "Space" } } ]); @@ -34,13 +34,13 @@ const b = chef.bake("Testing, 1 2 3", [ { op: chef.unique, args: { - delimiter: "Space", + delimiter: "Space" } }, { op: chef.multiply, args: { - delimiter: "Space", + delimiter: "Space" } } ]); diff --git a/tests/node/index.mjs b/tests/node/index.mjs index f6abba40..c2a7309f 100644 --- a/tests/node/index.mjs +++ b/tests/node/index.mjs @@ -10,10 +10,7 @@ * @license Apache-2.0 */ -import { - setLongTestFailure, - logTestReport, -} from "../lib/utils.mjs"; +import { setLongTestFailure, logTestReport } from "../lib/utils.mjs"; import TestRegister from "../lib/TestRegister.mjs"; import "./tests/nodeApi.mjs"; @@ -27,7 +24,7 @@ import "./tests/Categories.mjs"; const testStatus = { allTestsPassing: true, counts: { - total: 0, + total: 0 } }; @@ -35,7 +32,7 @@ setLongTestFailure(); const logOpsTestReport = logTestReport.bind(null, testStatus); -(async function() { +(async function () { const results = await TestRegister.runApiTests(); logOpsTestReport(results); })(); diff --git a/tests/node/tests/Categories.mjs b/tests/node/tests/Categories.mjs index e6f8bd72..86803fb8 100644 --- a/tests/node/tests/Categories.mjs +++ b/tests/node/tests/Categories.mjs @@ -1,19 +1,18 @@ import TestRegister from "../../lib/TestRegister.mjs"; -import Categories from "../../../src/core/config/Categories.json" assert {type: "json"}; -import OperationConfig from "../../../src/core/config/OperationConfig.json" assert {type: "json"}; +import Categories from "../../../src/core/config/Categories.json" assert { type: "json" }; +import OperationConfig from "../../../src/core/config/OperationConfig.json" assert { type: "json" }; import it from "../assertionHandler.mjs"; import assert from "assert"; TestRegister.addApiTests([ it("Categories: operations should be in a category", () => { const catOps = []; - Categories.forEach(cat => { + Categories.forEach((cat) => { catOps.push(...cat.ops); }); for (const op in OperationConfig) { assert(catOps.includes(op), `'${op}' operation is not present in any category`); } - }), - + }) ]); diff --git a/tests/node/tests/Dish.mjs b/tests/node/tests/Dish.mjs index 58da00bf..2a72c47a 100644 --- a/tests/node/tests/Dish.mjs +++ b/tests/node/tests/Dish.mjs @@ -7,6 +7,5 @@ TestRegister.addApiTests([ it("Dish - presentAs: should exist", () => { const dish = new Dish(); assert(dish.presentAs); - }), - + }) ]); diff --git a/tests/node/tests/File.mjs b/tests/node/tests/File.mjs index c6a1e60a..179dcbff 100644 --- a/tests/node/tests/File.mjs +++ b/tests/node/tests/File.mjs @@ -2,7 +2,7 @@ import assert from "assert"; import it from "../assertionHandler.mjs"; import TestRegister from "../../lib/TestRegister.mjs"; import File from "../../../src/node/File.mjs"; -import {zip, Dish} from "../../../src/node/index.mjs"; +import { zip, Dish } from "../../../src/node/index.mjs"; TestRegister.addApiTests([ it("File: should exist", () => { @@ -28,13 +28,13 @@ TestRegister.addApiTests([ it("File: unknown type should have a type of application/unknown", () => { const uint8Array = new Uint8Array(Buffer.from("hello")); - const file = new File([uint8Array], "sample.txt"); + const file = new File([uint8Array], "sample.txt"); assert.strictEqual(file.type, "application/unknown"); }), it("File: should be able to make a dish from it", () => { const uint8Array = new Uint8Array(Buffer.from("hello")); - const file = new File([uint8Array], "sample.txt"); + const file = new File([uint8Array], "sample.txt"); try { const dish = new Dish(file, 7); assert.ok(dish.valid()); @@ -45,7 +45,7 @@ TestRegister.addApiTests([ it("File: should allow dish to translate to ArrayBuffer", () => { const uint8Array = new Uint8Array(Buffer.from("hello")); - const file = new File([uint8Array], "sample.txt"); + const file = new File([uint8Array], "sample.txt"); try { const dish = new Dish(file, 7); assert.ok(dish.value); @@ -53,7 +53,6 @@ TestRegister.addApiTests([ dish.get(4); assert.strictEqual(dish.type, 4); assert.ok(dish.valid()); - } catch (e) { assert.fail(e.message); } @@ -61,7 +60,7 @@ TestRegister.addApiTests([ it("File: should allow dish to translate from ArrayBuffer to File", () => { const uint8Array = new Uint8Array(Buffer.from("hello")); - const file = new File([uint8Array], "sample.txt"); + const file = new File([uint8Array], "sample.txt"); try { const dish = new Dish(file, 7); assert.ok(dish.value); @@ -73,10 +72,8 @@ TestRegister.addApiTests([ // translate back to File dish.get(7); assert.ok(dish.valid()); - } catch (e) { assert.fail(e.message); } }) - ]); diff --git a/tests/node/tests/NodeDish.mjs b/tests/node/tests/NodeDish.mjs index 3ec8b7e2..3cd8ff58 100644 --- a/tests/node/tests/NodeDish.mjs +++ b/tests/node/tests/NodeDish.mjs @@ -30,7 +30,6 @@ TestRegister.addApiTests([ assert.ok(result instanceof Dish); }), - it("Composable dish: infers type from input if needed", () => { const dish = new Dish("string input"); assert.strictEqual(dish.type, 1); @@ -44,7 +43,7 @@ TestRegister.addApiTests([ const byteArrayDish = new Dish(Buffer.from("some buffer input")); assert.strictEqual(byteArrayDish.type, 0); - const JSONDish = new Dish({key: "value"}); + const JSONDish = new Dish({ key: "value" }); assert.strictEqual(JSONDish.type, 6); }), @@ -56,12 +55,12 @@ TestRegister.addApiTests([ }), it("Composable Dish: apply should allow set of arguments for operation", () => { - const result = new Dish("input").apply(SHA3, {size: "256"}); + const result = new Dish("input").apply(SHA3, { size: "256" }); assert.strictEqual(result.toString(), "7640cc9b7e3662b2250a43d1757e318bb29fb4860276ac4373b67b1650d6d3e3"); }), it("Composable Dish: apply functions can be chained", () => { - const result = new Dish("input").apply(toBase32).apply(SHA3, {size: "224"}); + const result = new Dish("input").apply(toBase32).apply(SHA3, { size: "224" }); assert.strictEqual(result.toString(), "493e8136b759370a415ef2cf2f7a69690441ff86592aba082bc2e2e0"); }), @@ -77,7 +76,10 @@ TestRegister.addApiTests([ dish.get("array buffer"); assert.strictEqual(dish.type, 4); - assert.deepStrictEqual(dish.value, new Uint8Array([0x73, 0x6f, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67]).buffer); + assert.deepStrictEqual( + dish.value, + new Uint8Array([0x73, 0x6f, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67]).buffer + ); assert.deepEqual(dish.value.byteLength, 11); dish.get("string"); @@ -144,14 +146,17 @@ TestRegister.addApiTests([ // Check the data in ArrayBuffer represents 4001 as a string. const view = new DataView(dish.value, 0); - assert.strictEqual(String.fromCharCode(view.getUint8(0), view.getUint8(1), view.getUint8(2), view.getUint8(3)), "4001"); + assert.strictEqual( + String.fromCharCode(view.getUint8(0), view.getUint8(1), view.getUint8(2), view.getUint8(3)), + "4001" + ); dish.get(5); assert.deepStrictEqual(dish.value, number); }), it("Dish translation: ArrayBuffer and JSON", () => { - const jsonString = "{\"a\": 123455, \"b\": { \"aa\": [1,2,3]}}"; + const jsonString = '{"a": 123455, "b": { "aa": [1,2,3]}}'; const dish = new Dish(JSON.parse(jsonString), Dish.JSON); dish.get(Dish.ARRAY_BUFFER); @@ -170,7 +175,10 @@ TestRegister.addApiTests([ // Check the data in ArrayBuffer represents "abcd" const view = new DataView(dish.value, 0); - assert.strictEqual(String.fromCharCode(view.getUint8(0), view.getUint8(1), view.getUint8(2), view.getUint8(3)), "abcd"); + assert.strictEqual( + String.fromCharCode(view.getUint8(0), view.getUint8(1), view.getUint8(2), view.getUint8(3)), + "abcd" + ); dish.get(Dish.FILE); @@ -187,13 +195,19 @@ TestRegister.addApiTests([ const dish = new Dish([file1, file2], Dish.LIST_FILE); dish.get(Dish.ARRAY_BUFFER); - assert.deepStrictEqual(dish.value, [new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]), new Uint8Array([0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b])]); + assert.deepStrictEqual(dish.value, [ + new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]), + new Uint8Array([0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b]) + ]); assert.strictEqual(dish.value.length, 2); dish.get(Dish.LIST_FILE); const dataArray = new Uint8Array(dish.value[0].data); // cant store chars in a Uint8Array, so make it a normal one. - const actual = Array.prototype.slice.call(dataArray).map(c => String.fromCharCode(c)).join(""); + const actual = Array.prototype.slice + .call(dataArray) + .map((c) => String.fromCharCode(c)) + .join(""); assert.strictEqual(actual, "abcdefghijk"); - }), + }) ]); diff --git a/tests/node/tests/Utils.mjs b/tests/node/tests/Utils.mjs index 8dbf37ae..d326d836 100644 --- a/tests/node/tests/Utils.mjs +++ b/tests/node/tests/Utils.mjs @@ -18,6 +18,5 @@ TestRegister.addApiTests([ it("Utils: should parse escaped quotes and escaped backslashes correctly", () => { assert.equal(Utils.parseEscapedChars("\\\\\\'"), "\\'"); - }), - + }) ]); diff --git a/tests/node/tests/nodeApi.mjs b/tests/node/tests/nodeApi.mjs index 8992ed36..efcf47c8 100644 --- a/tests/node/tests/nodeApi.mjs +++ b/tests/node/tests/nodeApi.mjs @@ -16,7 +16,7 @@ import chef from "../../../src/node/index.mjs"; import { OperationError, ExcludedOperationError } from "../../../src/core/errors/index.mjs"; import NodeDish from "../../../src/node/NodeDish.mjs"; -import { toBase32, magic} from "../../../src/node/index.mjs"; +import { toBase32, magic } from "../../../src/node/index.mjs"; import TestRegister from "../../lib/TestRegister.mjs"; TestRegister.addApiTests([ @@ -69,7 +69,7 @@ TestRegister.addApiTests([ it("should accept just some of the optional arguments being overriden", () => { const result = chef.setIntersection("1 2 3 4 5\\n\\n3 4 5", { - itemDelimiter: " ", + itemDelimiter: " " }); assert.equal(result.value, "3 4 5"); @@ -101,7 +101,7 @@ TestRegister.addApiTests([ const result = chef.fromBase32(chef.toBase32("something")); assert.equal(String(result), "something"); // This kind of coercion uses toValue - assert.equal(""+result, "NaN"); + assert.equal("" + result, "NaN"); }), it("should coerce to a number as you expect", () => { @@ -119,7 +119,10 @@ TestRegister.addApiTests([ assert.strictEqual(result[0].module, "Ciphers"); assert.strictEqual(result[0].inputType, "string"); assert.strictEqual(result[0].outputType, "string"); - assert.strictEqual(result[0].description, "Triple DES applies DES three times to each block to increase key size.

    Key: Triple DES uses a key length of 24 bytes (192 bits).
    DES uses a key length of 8 bytes (64 bits).

    IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

    Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default."); + assert.strictEqual( + result[0].description, + "Triple DES applies DES three times to each block to increase key size.

    Key: Triple DES uses a key length of 24 bytes (192 bits).
    DES uses a key length of 8 bytes (64 bits).

    IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

    Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default." + ); assert.strictEqual(result[0].args.length, 5); }), @@ -196,7 +199,10 @@ TestRegister.addApiTests([ it("chef.bake: Should take an input and an operation and perform it", () => { const result = chef.bake("https://google.com/search?q=help", chef.parseURI); - assert.strictEqual(result.toString(), "Protocol:\thttps:\nHostname:\tgoogle.com\nPath name:\t/search\nArguments:\n\tq = help\n"); + assert.strictEqual( + result.toString(), + "Protocol:\thttps:\nHostname:\tgoogle.com\nPath name:\t/search\nArguments:\n\tq = help\n" + ); }), it("chef.bake: Should complain if an invalid operation is inputted", () => { @@ -207,16 +213,30 @@ TestRegister.addApiTests([ }), it("chef.bake: accepts an array of operation names and performs them all in order", () => { - const result = chef.bake("https://google.com/search?q=that's a complicated question", ["URL encode", "URL decode", "Parse URI"]); - assert.strictEqual(result.toString(), "Protocol:\thttps:\nHostname:\tgoogle.com\nPath name:\t/search\nArguments:\n\tq = that's a complicated question\n"); + const result = chef.bake("https://google.com/search?q=that's a complicated question", [ + "URL encode", + "URL decode", + "Parse URI" + ]); + assert.strictEqual( + result.toString(), + "Protocol:\thttps:\nHostname:\tgoogle.com\nPath name:\t/search\nArguments:\n\tq = that's a complicated question\n" + ); }), - it("chef.bake: forgiving with operation names", () =>{ - const result = chef.bake("https://google.com/search?q=that's a complicated question", ["urlencode", "url decode", "parseURI"]); - assert.strictEqual(result.toString(), "Protocol:\thttps:\nHostname:\tgoogle.com\nPath name:\t/search\nArguments:\n\tq = that's a complicated question\n"); + it("chef.bake: forgiving with operation names", () => { + const result = chef.bake("https://google.com/search?q=that's a complicated question", [ + "urlencode", + "url decode", + "parseURI" + ]); + assert.strictEqual( + result.toString(), + "Protocol:\thttps:\nHostname:\tgoogle.com\nPath name:\t/search\nArguments:\n\tq = that's a complicated question\n" + ); }), - it("chef.bake: forgiving with operation names", () =>{ + it("chef.bake: forgiving with operation names", () => { const result = chef.bake("hello", ["to base 64"]); assert.strictEqual(result.toString(), "aGVsbG8="); }), @@ -228,8 +248,15 @@ TestRegister.addApiTests([ }), it("chef.bake: accepts an array of operations as recipe", () => { - const result = chef.bake("https://google.com/search?q=that's a complicated question", [chef.URLEncode, chef.URLDecode, chef.parseURI]); - assert.strictEqual(result.toString(), "Protocol:\thttps:\nHostname:\tgoogle.com\nPath name:\t/search\nArguments:\n\tq = that's a complicated question\n"); + const result = chef.bake("https://google.com/search?q=that's a complicated question", [ + chef.URLEncode, + chef.URLDecode, + chef.parseURI + ]); + assert.strictEqual( + result.toString(), + "Protocol:\thttps:\nHostname:\tgoogle.com\nPath name:\t/search\nArguments:\n\tq = that's a complicated question\n" + ); }), it("should complain if an invalid operation is inputted as part of array", () => { @@ -251,7 +278,7 @@ TestRegister.addApiTests([ it("chef.bake: should take single JSON object desribing op with optional args", () => { const result = chef.bake("some input", { - op: chef.toHex, + op: chef.toHex }); assert.strictEqual(result.toString(), "73 6f 6d 65 20 69 6e 70 75 74"); }), @@ -265,13 +292,17 @@ TestRegister.addApiTests([ }), it("chef.bake: should error if op in JSON is not chef op", () => { - assert.throws(() => chef.bake("some input", { - op: () => {}, - args: ["Colon"], - }), { - name: "TypeError", - message: "Inputted function not a Chef operation." - }); + assert.throws( + () => + chef.bake("some input", { + op: () => {}, + args: ["Colon"] + }), + { + name: "TypeError", + message: "Inputted function not a Chef operation." + } + ); }), it("chef.bake: should take multiple ops in JSON object form, some ops by string", () => { @@ -283,26 +314,32 @@ TestRegister.addApiTests([ { op: "to octal", args: { - delimiter: "Semi-colon", + delimiter: "Semi-colon" } } ]); - assert.strictEqual(result.toString(), "67;63;72;66;146;72;66;144;72;66;65;72;62;60;72;66;71;72;66;145;72;67;60;72;67;65;72;67;64"); + assert.strictEqual( + result.toString(), + "67;63;72;66;146;72;66;144;72;66;65;72;62;60;72;66;71;72;66;145;72;67;60;72;67;65;72;67;64" + ); }), it("chef.bake: should take multiple ops in JSON object form, some without args", () => { const result = chef.bake("some input", [ { - op: chef.toHex, + op: chef.toHex }, { op: "to octal", args: { - delimiter: "Semi-colon", + delimiter: "Semi-colon" } } ]); - assert.strictEqual(result.toString(), "67;63;40;66;146;40;66;144;40;66;65;40;62;60;40;66;71;40;66;145;40;67;60;40;67;65;40;67;64"); + assert.strictEqual( + result.toString(), + "67;63;40;66;146;40;66;144;40;66;65;40;62;60;40;66;71;40;66;145;40;67;60;40;67;65;40;67;64" + ); }), it("chef.bake: should handle op with multiple args", () => { @@ -311,36 +348,44 @@ TestRegister.addApiTests([ args: { formatOptions: "Dash/Dot", wordDelimiter: "Comma", - letterDelimiter: "Backslash", + letterDelimiter: "Backslash" } }); - assert.strictEqual(result.toString(), "DotDotDot\\DashDashDash\\DashDash\\Dot,DotDot\\DashDot\\DotDashDashDot\\DotDotDash\\Dash"); + assert.strictEqual( + result.toString(), + "DotDotDot\\DashDashDash\\DashDash\\Dot,DotDot\\DashDot\\DotDashDashDot\\DotDotDash\\Dash" + ); }), it("chef.bake: should take compact JSON format from Chef Website as recipe", () => { - const result = chef.bake("some input", [{"op": "To Morse Code", "args": ["Dash/Dot", "Backslash", "Comma"]}, {"op": "Hex to PEM", "args": ["SOMETHING"]}, {"op": "To Snake case", "args": [false]}]); - assert.strictEqual(result.toString(), "begin_something_anananaaaaak_da_aaak_da_aaaaananaaaaaaan_da_aaaaaaanan_da_aaak_end_something"); + const result = chef.bake("some input", [ + { "op": "To Morse Code", "args": ["Dash/Dot", "Backslash", "Comma"] }, + { "op": "Hex to PEM", "args": ["SOMETHING"] }, + { "op": "To Snake case", "args": [false] } + ]); + assert.strictEqual( + result.toString(), + "begin_something_anananaaaaak_da_aaak_da_aaaaananaaaaaaan_da_aaaaaaanan_da_aaak_end_something" + ); }), it("chef.bake: should accept Clean JSON format from Chef website as recipe", () => { const result = chef.bake("some input", [ - { "op": "To Morse Code", - "args": ["Dash/Dot", "Backslash", "Comma"] }, - { "op": "Hex to PEM", - "args": ["SOMETHING"] }, - { "op": "To Snake case", - "args": [false] } + { "op": "To Morse Code", "args": ["Dash/Dot", "Backslash", "Comma"] }, + { "op": "Hex to PEM", "args": ["SOMETHING"] }, + { "op": "To Snake case", "args": [false] } ]); - assert.strictEqual(result.toString(), "begin_something_anananaaaaak_da_aaak_da_aaaaananaaaaaaan_da_aaaaaaanan_da_aaak_end_something"); + assert.strictEqual( + result.toString(), + "begin_something_anananaaaaak_da_aaak_da_aaaaananaaaaaaan_da_aaaaaaanan_da_aaak_end_something" + ); }), it("chef.bake: should accept Clean JSON format from Chef website - args optional", () => { const result = chef.bake("some input", [ { "op": "To Morse Code" }, - { "op": "Hex to PEM", - "args": ["SOMETHING"] }, - { "op": "To Snake case", - "args": [false] } + { "op": "Hex to PEM", "args": ["SOMETHING"] }, + { "op": "To Snake case", "args": [false] } ]); assert.strictEqual(result.toString(), "begin_something_aaaaaaaaaaaaaa_end_something"); }), @@ -348,31 +393,42 @@ TestRegister.addApiTests([ it("chef.bake: cannot accept flowControl operations in recipe", () => { assert.throws(() => chef.bake("some input", "magic"), { name: "TypeError", - message: "flowControl operations like Magic are not currently allowed in recipes for chef.bake in the Node API" + message: + "flowControl operations like Magic are not currently allowed in recipes for chef.bake in the Node API" }); assert.throws(() => chef.bake("some input", magic), { name: "TypeError", - message: "flowControl operations like Magic are not currently allowed in recipes for chef.bake in the Node API" + message: + "flowControl operations like Magic are not currently allowed in recipes for chef.bake in the Node API" }); assert.throws(() => chef.bake("some input", ["to base 64", "magic"]), { name: "TypeError", - message: "flowControl operations like Magic are not currently allowed in recipes for chef.bake in the Node API" + message: + "flowControl operations like Magic are not currently allowed in recipes for chef.bake in the Node API" }); }), it("Excluded operations: throw a sensible error when you try and call one", () => { - assert.throws(chef.fork, + assert.throws( + chef.fork, (err) => { assert(err instanceof ExcludedOperationError); - assert.deepEqual(err.message, "Sorry, the Fork operation is not available in the Node.js version of CyberChef."); + assert.deepEqual( + err.message, + "Sorry, the Fork operation is not available in the Node.js version of CyberChef." + ); return true; }, "Unexpected error type" ); - assert.throws(chef.javaScriptBeautify, + assert.throws( + chef.javaScriptBeautify, (err) => { assert(err instanceof ExcludedOperationError); - assert.deepEqual(err.message, "Sorry, the JavaScriptBeautify operation is not available in the Node.js version of CyberChef."); + assert.deepEqual( + err.message, + "Sorry, the JavaScriptBeautify operation is not available in the Node.js version of CyberChef." + ); return true; }, "Unexpected error type" @@ -384,11 +440,11 @@ TestRegister.addApiTests([ assert.deepEqual(chef.unzip.args, { password: { type: "binaryString", - value: "", + value: "" }, verifyResult: { type: "boolean", - value: false, + value: false } }); }), @@ -401,13 +457,11 @@ TestRegister.addApiTests([ assert.strictEqual(chef.bitShiftRight.args.amount.value, 1); assert.strictEqual(chef.bitShiftRight.args.type.type, "option"); assert.ok(Array.isArray(chef.bitShiftRight.args.type.options)); - }), it("Operation arguments: should list all options excluding subheadings", () => { // First element (subheading) removed assert.equal(chef.convertDistance.args.inputUnits.options[0], "Nanometres (nm)"); assert.equal(chef.defangURL.args.process.options[1], "Only full URLs"); - }), - + }) ]); diff --git a/tests/node/tests/operations.mjs b/tests/node/tests/operations.mjs index 86dbee50..8e1b3f80 100644 --- a/tests/node/tests/operations.mjs +++ b/tests/node/tests/operations.mjs @@ -40,7 +40,6 @@ import File from "../../../src/node/File.mjs"; global.File = File; TestRegister.addApiTests([ - it("ADD: toggleString argument", () => { const result = chef.ADD("sample input", { key: { @@ -51,10 +50,9 @@ TestRegister.addApiTests([ assert.equal(result.toString(), "\xe6\xd0\xda\xd5\x8c\xd0\x85\xe2\xe1\xdf\xe2\xd9"); }), - it("ADD: default option toggleString argument", () => { const result = chef.ADD(3, { - key: "4", + key: "4" }); assert.strictEqual(result.toString(), "7"); }), @@ -73,13 +71,13 @@ TestRegister.addApiTests([ const result = AESDecrypt("4a123af235a507bbc9d5871721d61b98504d569a9a5a7847e2d78315fec7", { key: { string: "some longer key1", - option: "utf8", + option: "utf8" }, iv: { string: "some iv some iv1", - option: "utf8", + option: "utf8" }, - mode: "OFB", + mode: "OFB" }); assert.equal(result.toString(), "a slightly longer sampleinput?"); }), @@ -121,7 +119,7 @@ Tiger-128`; const result = chef.AND("Scot-free", { key: { string: "Raining Cats and Dogs", - option: "utf8", + option: "utf8" } }); assert.strictEqual(result.toString(), "Raid)fb A"); @@ -130,7 +128,6 @@ Tiger-128`; it("atBash Cipher", () => { const result = chef.atbashCipher("Happy as a Clam"); assert.strictEqual(result.toString(), "Szkkb zh z Xozn"); - }), it("Bcrypt", async () => { @@ -140,9 +137,9 @@ Tiger-128`; assert.equal(strResult.slice(0, 7), "$2a$10$"); }), - it("bcryptCompare", async() => { + it("bcryptCompare", async () => { const result = await chef.bcryptCompare("Put a Sock In It", { - hash: "$2a$10$2rT4a3XnIecBsd1H33dMTuyYE1HJ1n9F.V2rjQtAH73rh1qvOf/ae", + hash: "$2a$10$2rT4a3XnIecBsd1H33dMTuyYE1HJ1n9F.V2rjQtAH73rh1qvOf/ae" }); assert.strictEqual(result.toString(), "Match: Put a Sock In It"); }), @@ -158,14 +155,14 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; it("bifid cipher decode", () => { const result = chef.bifidCipherDecode("Vhef Qnte Ke Xfhz Mxon Bmgf", { - keyword: "Alpha", + keyword: "Alpha" }); assert.strictEqual(result.toString(), "What Goes Up Must Come Down"); }), it("bifid cipher encode: string option", () => { const result = bifidCipherEncode("some input", { - keyword: "mykeyword", + keyword: "mykeyword" }); assert.strictEqual(result.toString(), "nmhs zmsdo"); }), @@ -178,7 +175,7 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; it("bitShiftRight: number and option", () => { const result = bitShiftRight("some bits to shift", { type: "Arithmetic shift", - amount: 1, + amount: 1 }); assert.strictEqual(result.toString(), "9762\u001014:9\u0010:7\u00109443:"); }), @@ -187,7 +184,7 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; const result = chef.blowfishEncrypt("Fool's Gold", { key: { string: "0011223344556677", - option: "hex", + option: "hex" }, iv: { string: "exparrot", @@ -202,11 +199,11 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; const result = chef.blowfishDecrypt("55a2838980078ffe1722b08d5fa1d481", { key: { string: "0011223344556677", - option: "hex", + option: "hex" }, iv: { string: "exparrot", - option: "utf8", + option: "utf8" }, mode: "CBC" }); @@ -214,20 +211,25 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; }), it("BSON Serialise / Deserialise", () => { - const result = chef.BSONDeserialise(chef.BSONSerialise("{\"phrase\": \"Mouth-watering\"}")); - assert.strictEqual(result.toString(), `{ + const result = chef.BSONDeserialise(chef.BSONSerialise('{"phrase": "Mouth-watering"}')); + assert.strictEqual( + result.toString(), + `{ "phrase": "Mouth-watering" -}`); +}` + ); }), it("Bzip2 Decompress", async () => { - const result = await chef.bzip2Decompress(chef.fromBase64("QlpoOTFBWSZTWUdQlt0AAAIVgEAAAQAmJAwAIAAxBkxA0A2pTL6U2CozxdyRThQkEdQlt0A=")); + const result = await chef.bzip2Decompress( + chef.fromBase64("QlpoOTFBWSZTWUdQlt0AAAIVgEAAAQAmJAwAIAAxBkxA0A2pTL6U2CozxdyRThQkEdQlt0A=") + ); assert.strictEqual(result.toString(), "Fit as a Fiddle"); }), it("cartesianProduct: binary string", () => { const result = cartesianProduct("1:2\\n\\n3:4", { - itemDelimiter: ":", + itemDelimiter: ":" }); assert.strictEqual(result.toString(), "(1,3):(1,4):(2,3):(2,4)"); }), @@ -235,7 +237,7 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; it("Change IP format", () => { const result = chef.changeIPFormat("172.20.23.54", { inputFormat: "Dotted Decimal", - outputFormat: "Hex", + outputFormat: "Hex" }); assert.strictEqual(result.toString(), "ac141736"); }), @@ -266,7 +268,7 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; it("Convert data units", () => { const result = chef.convertDataUnits("12345", { inputUnits: "Bits (b)", - outputUnits: "Kilobytes (KB)", + outputUnits: "Kilobytes (KB)" }); assert.strictEqual(result.toString(), "1.543125"); }), @@ -274,7 +276,7 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; it("Convert distance", () => { const result = chef.convertDistance("1234567", { inputUnits: "Nanometres (nm)", - outputUnits: "Furlongs (fur)", + outputUnits: "Furlongs (fur)" }); assert.strictEqual(result.toString(), "0.00000613699494949495"); }), @@ -282,7 +284,7 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; it("Convert mass", () => { const result = chef.convertMass("123", { inputUnits: "Earth mass (M⊕)", - outputUnits: "Great Pyramid of Giza (6,000,000 tonnes)", + outputUnits: "Great Pyramid of Giza (6,000,000 tonnes)" }); assert.strictEqual(result.toString(), "122429895000000000"); }), @@ -290,7 +292,7 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; it("Convert speed", () => { const result = chef.convertSpeed("123", { inputUnits: "Lunar escape velocity", - outputUnits: "Jet airliner cruising speed", + outputUnits: "Jet airliner cruising speed" }); assert.strictEqual(result.toString(), "1168.5"); }), @@ -299,7 +301,7 @@ Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; const result = chef.countOccurrences("Talk the Talk", { searchString: { string: "Tal", - option: "Simple string", + option: "Simple string" } }); assert.strictEqual(result.toString(), "2"); @@ -332,14 +334,14 @@ width: 100%; color: white; }`; const result = CSSMinify(input, { - preserveComments: true, + preserveComments: true }); assert.strictEqual(result.toString(), "header {// comment width: 100%;color: white;}"); }), it("CSS Selector", () => { const result = chef.CSSSelector("

    Hello

    ", { - cssSelector: "h1", + cssSelector: "h1" }); assert.strictEqual(result.toString(), "

    Hello

    "); }), @@ -355,10 +357,10 @@ color: white; it("Decode text", () => { const encoded = chef.encodeText("Ugly Duckling", { - encoding: "UTF-16LE (1200)", + encoding: "UTF-16LE (1200)" }); const result = chef.decodeText(encoded, { - encoding: "UTF-16LE (1200)", + encoding: "UTF-16LE (1200)" }); assert.strictEqual(result.toString(), "Ugly Duckling"); }), @@ -367,12 +369,12 @@ color: white; const result = chef.deriveEVPKey("", { passphrase: { string: "46 6c 65 61 20 4d 61 72 6b 65 74", - option: "Hex", + option: "Hex" }, salt: { string: "Market", - option: "utf8", - }, + option: "utf8" + } }); assert.strictEqual(result.toString(), "4930d5d200e80f18c96b5550d13c6af8"); }), @@ -381,7 +383,7 @@ color: white; const result = chef.derivePBKDF2Key("", { passphrase: { string: "Jack of All Trades Master of None", - option: "utf8", + option: "utf8" }, keySize: 256, iterations: 2, @@ -398,13 +400,13 @@ color: white; const result = chef.DESDecrypt("713081c66db781c323965ba8f166fd8c230c3bb48504a913", { key: { string: "onetwoth", - option: "utf8", + option: "utf8" }, iv: { string: "threetwo", - option: "utf8", + option: "utf8" }, - mode: "ECB", + mode: "ECB" }); assert.strictEqual(result.toString(), "Put a Sock In It"); }), @@ -413,13 +415,13 @@ color: white; const result = chef.DESEncrypt("Put a Sock In It", { key: { string: "onetwoth", - option: "utf8", + option: "utf8" }, iv: { string: "threetwo", - option: "utf8", + option: "utf8" }, - mode: "ECB", + mode: "ECB" }); assert.strictEqual(result.toString(), "713081c66db781c323965ba8f166fd8c230c3bb48504a913"); }), @@ -455,7 +457,7 @@ color: white; escapeLevel: "Everything", JSONCompatible: false, ES6Compatible: true, - uppercaseHex: true, + uppercaseHex: true }); assert.strictEqual(result.toString(), "\\x4B\\x6E\\x6F\\x77\\x20\\x74\\x68\\x65\\x20\\x52\\x6F\\x70\\x65\\x73"); }), @@ -466,37 +468,44 @@ color: white; it("Expand alphabet range", () => { assert.strictEqual( - chef.expandAlphabetRange("Fight Fire With Fire", {delimiter: "t"}).toString(), - "Ftitgthttt tFtitrtet tWtitttht tFtitrte"); + chef.expandAlphabetRange("Fight Fire With Fire", { delimiter: "t" }).toString(), + "Ftitgthttt tFtitrtet tWtitttht tFtitrte" + ); }), it("Extract dates", () => { - assert.strictEqual(chef.extractDates("Don't Look a Gift Horse In The Mouth 01/02/1992").toString(), "01/02/1992"); + assert.strictEqual( + chef.extractDates("Don't Look a Gift Horse In The Mouth 01/02/1992").toString(), + "01/02/1992" + ); }), it("Filter", () => { const result = chef.filter( `I Smell a Rat Every Cloud Has a Silver Lining -Top Drawer`, { - regex: "Every", - }); +Top Drawer`, + { + regex: "Every" + } + ); const expected = "Every Cloud Has a Silver Lining"; assert.strictEqual(result.toString(), expected); }), it("Find / Replace", () => { assert.strictEqual( - chef.findReplace( - "Curiosity Killed The Cat", - { + chef + .findReplace("Curiosity Killed The Cat", { find: { string: "l", - option: "Regex", + option: "Regex" }, - replace: "s", - }).toString(), - "Curiosity Kissed The Cat"); + replace: "s" + }) + .toString(), + "Curiosity Kissed The Cat" + ); }), it("Fletcher8 Checksum", () => { @@ -517,17 +526,18 @@ Top Drawer`, { it("Frequency distribution", () => { const result = chef.frequencyDistribution("Don't Count Your Chickens Before They Hatch"); - const expected = "{\"dataLength\":43,\"percentages\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13.953488372093023,0,0,0,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.3255813953488373,4.651162790697675,2.3255813953488373,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,0,0,0,0,2.3255813953488373,0,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,2.3255813953488373,0,4.651162790697675,0,9.30232558139535,2.3255813953488373,0,6.976744186046512,2.3255813953488373,0,2.3255813953488373,0,0,6.976744186046512,9.30232558139535,0,0,4.651162790697675,2.3255813953488373,6.976744186046512,4.651162790697675,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"distribution\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,4,1,0,3,1,0,1,0,0,3,4,0,0,2,1,3,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"bytesRepresented\":22}"; + const expected + = '{"dataLength":43,"percentages":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13.953488372093023,0,0,0,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.3255813953488373,4.651162790697675,2.3255813953488373,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,0,0,0,0,2.3255813953488373,0,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,2.3255813953488373,0,4.651162790697675,0,9.30232558139535,2.3255813953488373,0,6.976744186046512,2.3255813953488373,0,2.3255813953488373,0,0,6.976744186046512,9.30232558139535,0,0,4.651162790697675,2.3255813953488373,6.976744186046512,4.651162790697675,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"distribution":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,4,1,0,3,1,0,1,0,0,3,4,0,0,2,1,3,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"bytesRepresented":22}'; // Whacky formatting, but the data is all there assert.strictEqual(result.toString().replace(/\r?\n|\r|\s/g, ""), expected); }), it("From base", () => { - assert.strictEqual(chef.fromBase("11", {radix: 13}).toString(), "14"); + assert.strictEqual(chef.fromBase("11", { radix: 13 }).toString(), "14"); }), it("From BCD", () => { - assert.strictEqual(chef.fromBCD("1143", { inputFormat: "Raw", scheme: "7 4 2 1"}).toString(), "31313433"); + assert.strictEqual(chef.fromBCD("1143", { inputFormat: "Raw", scheme: "7 4 2 1" }).toString(), "31313433"); }), it("From binary", () => { @@ -535,7 +545,10 @@ Top Drawer`, { }), it("From Charcode", () => { - assert.strictEqual(chef.fromCharcode("4c 6f 6e 67 20 49 6e 20 54 68 65 20 54 6f 6f 74 68 0a").toString(), "Long In The Tooth\n"); + assert.strictEqual( + chef.fromCharcode("4c 6f 6e 67 20 49 6e 20 54 68 65 20 54 6f 6f 74 68 0a").toString(), + "Long In The Tooth\n" + ); }), it("From decimal", () => { @@ -563,7 +576,10 @@ Top Drawer`, { }), it("From octal", () => { - assert.strictEqual(chef.fromOctal("113 156 157 167 40 164 150 145 40 122 157 160 145 163").toString(), "Know the Ropes"); + assert.strictEqual( + chef.fromOctal("113 156 157 167 40 164 150 145 40 122 157 160 145 163").toString(), + "Know the Ropes" + ); }), it("To, From punycode", () => { @@ -576,7 +592,7 @@ Top Drawer`, { it("Generate HOTP", () => { const result = chef.generateHOTP("Cut The Mustard", { - name: "colonel", + name: "colonel" }); const expected = `URI: otpauth://hotp/colonel?secret=IN2XIICUNBSSATLVON2GC4TE @@ -586,7 +602,7 @@ Password: 034148`; it("Generate PGP Key Pair", async () => { const result = await chef.generatePGPKeyPair("Back To the Drawing Board", { - keyType: "ECC-256", + keyType: "ECC-256" }); assert.strictEqual(result.toString().substr(0, 37), "-----BEGIN PGP PRIVATE KEY BLOCK-----"); }), @@ -604,7 +620,8 @@ Password: 034148`; it("Hex to Object Identifier", () => { assert.strictEqual( chef.hexToObjectIdentifier(chef.toHex("You Can't Teach an Old Dog New Tricks")).toString(), - "2.9.111.117.32.67.97.110.39.116.32.84.101.97.99.104.32.97.110.32.79.108.100.32.68.111.103.32.78.101.119.32.84.114.105.99.107.115"); + "2.9.111.117.32.67.97.110.39.116.32.84.101.97.99.104.32.97.110.32.79.108.100.32.68.111.103.32.78.101.119.32.84.114.105.99.107.115" + ); }), it("Hex to PEM", () => { @@ -616,35 +633,48 @@ WWFkYSBZYWRh\r }), it("HMAC", () => { - assert.strictEqual(chef.HMAC("On Cloud Nine", {key: "idea"}).toString(), "e15c268b4ee755c9e52db094ed50add7"); + assert.strictEqual(chef.HMAC("On Cloud Nine", { key: "idea" }).toString(), "e15c268b4ee755c9e52db094ed50add7"); }), it("JPathExpression", () => { - assert.strictEqual(chef.JPathExpression("{\"key\" : \"value\"}", {query: "$.key"}).toString(), "\"value\""); + assert.strictEqual(chef.JPathExpression('{"key" : "value"}', { query: "$.key" }).toString(), '"value"'); }), it("JSON Beautify", () => { assert.strictEqual( - chef.JSONBeautify("{\"key\" : \"value\"}").toString(), + chef.JSONBeautify('{"key" : "value"}').toString(), `{ "key": "value" -}`); +}` + ); }), it("Keccak", () => { - assert.strictEqual(chef.keccak("Flea Market").toString(), "c2a06880b19e453ee5440e8bd4c2024bedc15a6630096aa3f609acfd2b8f15f27cd293e1cc73933e81432269129ce954a6138889ce87831179d55dcff1cc7587"); + assert.strictEqual( + chef.keccak("Flea Market").toString(), + "c2a06880b19e453ee5440e8bd4c2024bedc15a6630096aa3f609acfd2b8f15f27cd293e1cc73933e81432269129ce954a6138889ce87831179d55dcff1cc7587" + ); }), it("LZNT1 Decompress", () => { - assert.strictEqual(chef.LZNT1Decompress("\x1a\xb0\x00compress\x00edtestda\x04ta\x07\x88alot").toString(), "compressedtestdatacompressedalot"); + assert.strictEqual( + chef.LZNT1Decompress("\x1a\xb0\x00compress\x00edtestda\x04ta\x07\x88alot").toString(), + "compressedtestdatacompressedalot" + ); }), it("MD6", () => { - assert.strictEqual(chef.MD6("Head Over Heels", {key: "arty"}).toString(), "d8f7fe4931fbaa37316f76283d5f615f50ddd54afdc794b61da522556aee99ad"); + assert.strictEqual( + chef.MD6("Head Over Heels", { key: "arty" }).toString(), + "d8f7fe4931fbaa37316f76283d5f615f50ddd54afdc794b61da522556aee99ad" + ); }), it("Parse ASN.1 Hex string", () => { - assert.strictEqual(chef.parseASN1HexString(chef.toHex("Mouth-watering")).toString(), "UNKNOWN(77) 7574682d7761746572696e67\n"); + assert.strictEqual( + chef.parseASN1HexString(chef.toHex("Mouth-watering")).toString(), + "UNKNOWN(77) 7574682d7761746572696e67\n" + ); }), it("Parse DateTime", () => { @@ -687,7 +717,9 @@ Arguments: }), it("Parse user agent", () => { - const result = chef.parseUserAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0 "); + const result = chef.parseUserAgent( + "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0 " + ); const expected = `Browser Name: Firefox Version: 47.0 @@ -798,33 +830,55 @@ pCGTErs= const message = "A Fool and His Money are Soon Parted"; const encrypted = await chef.PGPEncrypt(message, { - publicKeyOfRecipient: pbkey, + publicKeyOfRecipient: pbkey }); const result = await chef.PGPDecrypt(encrypted, { - privateKeyOfRecipient: privateKey, + privateKeyOfRecipient: privateKey }); assert.strictEqual(result.toString(), message); }), it("Raw deflate", () => { - assert.strictEqual(chef.rawInflate(chef.rawDeflate("Like Father Like Son", { compressionType: "Fixed Huffman Coding"})).toString(), "Like Father Like Son"); + assert.strictEqual( + chef + .rawInflate(chef.rawDeflate("Like Father Like Son", { compressionType: "Fixed Huffman Coding" })) + .toString(), + "Like Father Like Son" + ); }), it("RC4", () => { assert.strictEqual( - chef.RC4("Go Out On a Limb", {passphrase: {string: "Under Your Nose", option: "UTF8"}, inputFormat: "UTF8", outputFormat: "Hex"}).toString(), - "7d17e60d9bc94b7f4095851c729e69a2"); + chef + .RC4("Go Out On a Limb", { + passphrase: { string: "Under Your Nose", option: "UTF8" }, + inputFormat: "UTF8", + outputFormat: "Hex" + }) + .toString(), + "7d17e60d9bc94b7f4095851c729e69a2" + ); }), it("RC4 Drop", () => { assert.strictEqual( - chef.RC4Drop("Go Out On a Limb", {passphrase: {string: "Under Your Nose", option: "UTF8"}, inputFormat: "UTF8", outputFormat: "Hex"}).toString(), - "b85cb1c4ed6bed8f260ab92829bba942"); + chef + .RC4Drop("Go Out On a Limb", { + passphrase: { string: "Under Your Nose", option: "UTF8" }, + inputFormat: "UTF8", + outputFormat: "Hex" + }) + .toString(), + "b85cb1c4ed6bed8f260ab92829bba942" + ); }), it("Regular Expression", () => { - assert.strictEqual(chef.regularExpression("Wouldn't Harm a Fly", {regex: "\\'[a-z]"}).toString(), "Wouldn't Harm a Fly"); + assert.strictEqual( + chef.regularExpression("Wouldn't Harm a Fly", { regex: "\\'[a-z]" }).toString(), + "Wouldn't Harm a Fly" + ); }), it("Remove EXIF", () => { @@ -840,26 +894,30 @@ pCGTErs= it("Scrypt", () => { assert.strictEqual( - chef.scrypt("Playing For Keeps", {salt: {string: "salty", option: "Hex"}}).toString(), - "5446b6d86d88515894a163201765bceed0bc39610b1506cdc4d939ffc638bc46e051bce756e2865165d89d955a43a7eb5504502567dea8bfc9e7d49aaa894c07"); + chef.scrypt("Playing For Keeps", { salt: { string: "salty", option: "Hex" } }).toString(), + "5446b6d86d88515894a163201765bceed0bc39610b1506cdc4d939ffc638bc46e051bce756e2865165d89d955a43a7eb5504502567dea8bfc9e7d49aaa894c07" + ); }), it("SHA3", () => { assert.strictEqual( chef.SHA3("benign gravel").toString(), - "2b1e36e0dbe151a89887be08da3bad141908cce62327f678161bcf058627e87abe57e3c5fce6581678714e6705a207acbd5c1f37f7a812280bc2cc558f00bed9"); + "2b1e36e0dbe151a89887be08da3bad141908cce62327f678161bcf058627e87abe57e3c5fce6581678714e6705a207acbd5c1f37f7a812280bc2cc558f00bed9" + ); }), it("Shake", () => { assert.strictEqual( chef.shake("murderous bloodshed").toString(), - "b79b3bb88099330bc6a15122f8dfaededf57a33b51c748d5a94e8122ff18d21e12f83412926b7e4a77a85ba6f36aa4841685e78296036337175e40096b5ac000"); + "b79b3bb88099330bc6a15122f8dfaededf57a33b51c748d5a94e8122ff18d21e12f83412926b7e4a77a85ba6f36aa4841685e78296036337175e40096b5ac000" + ); }), it("Snefru", () => { assert.strictEqual( - chef.snefru("demeaning milestone", {size: 256, rounds: 8}).toString(), - "a671b48770fe073ce49e9259cc2f47d345a53712639f8ae23c5ad3fec19540a5"); + chef.snefru("demeaning milestone", { size: 256, rounds: 8 }).toString(), + "a671b48770fe073ce49e9259cc2f47d345a53712639f8ae23c5ad3fec19540a5" + ); }), it("SQL Beautify", () => { @@ -874,13 +932,11 @@ FROM STATS;`; }), it("SSDEEP", () => { - assert.strictEqual( - chef.SSDEEP("shotgun tyranny snugly").toString(), - "3:DLIXzMQCJc:XERKc"); + assert.strictEqual(chef.SSDEEP("shotgun tyranny snugly").toString(), "3:DLIXzMQCJc:XERKc"); }), it("strings", () => { - const result = chef.strings("smothering ampersand abreast", {displayTotal: true}); + const result = chef.strings("smothering ampersand abreast", { displayTotal: true }); const expected = `Total found: 1 smothering ampersand abreast`; @@ -891,14 +947,14 @@ smothering ampersand abreast`; const result = toBase64("some input", { alphabet: { value: "0-9A-W+/a-zXYZ=" - }, + } }); assert.strictEqual(result.toString(), "StXkPI1gRe1sT0=="); }), it("toBase64: editableOptions key is value", () => { const result = toBase64("some input", { - alphabet: "0-9A-W+/a-zXYZ=", + alphabet: "0-9A-W+/a-zXYZ=" }); assert.strictEqual(result.toString(), "StXkPI1gRe1sT0=="); }), @@ -918,7 +974,7 @@ smothering ampersand abreast`; it("toHex: accepts args", () => { const result = toHex("some input", { - delimiter: "Colon", + delimiter: "Colon" }); assert.strictEqual(result.toString(), "73:6f:6d:65:20:69:6e:70:75:74"); }), @@ -940,20 +996,34 @@ smothering ampersand abreast`; }), it("Translate DateTime format", () => { - assert.strictEqual(chef.translateDateTimeFormat("01/04/1999 22:33:01").toString(), "Thursday 1st April 1999 22:33:01 +00:00 UTC"); + assert.strictEqual( + chef.translateDateTimeFormat("01/04/1999 22:33:01").toString(), + "Thursday 1st April 1999 22:33:01 +00:00 UTC" + ); }), it("Triple DES encrypt / decrypt", () => { assert.strictEqual( - chef.tripleDESDecrypt( - chef.tripleDESEncrypt("Destroy Money", { - key: {string: "30 31 2f 30 34 2f 31 39 39 39 20 32 32 3a 33 33 3a 30 3130 31 2f 30 34", option: "Hex"}, - iv: {string: "00 00 00 00 00 00 00 00", option: "Hex"}}), - { - key: {string: "30 31 2f 30 34 2f 31 39 39 39 20 32 32 3a 33 33 3a 30 3130 31 2f 30 34", option: "Hex"}, - iv: {string: "00 00 00 00 00 00 00 00", option: "Hex"} - }).toString(), - "Destroy Money"); + chef + .tripleDESDecrypt( + chef.tripleDESEncrypt("Destroy Money", { + key: { + string: "30 31 2f 30 34 2f 31 39 39 39 20 32 32 3a 33 33 3a 30 3130 31 2f 30 34", + option: "Hex" + }, + iv: { string: "00 00 00 00 00 00 00 00", option: "Hex" } + }), + { + key: { + string: "30 31 2f 30 34 2f 31 39 39 39 20 32 32 3a 33 33 3a 30 3130 31 2f 30 34", + option: "Hex" + }, + iv: { string: "00 00 00 00 00 00 00 00", option: "Hex" } + } + ) + .toString(), + "Destroy Money" + ); }), it("UNIX Timestamp to Windows Filetime", () => { @@ -965,34 +1035,51 @@ smothering ampersand abreast`; chef.XMLBeautify("abc").toString(), ` \\tabc -`); +` + ); }), it("XOR: toggleString with default option", () => { - assert.strictEqual(chef.XOR("fe023da5", { - key: "73 6f 6d 65" - }).toString(), - "\u0015\n]W@\u000b\fP"); + assert.strictEqual( + chef + .XOR("fe023da5", { + key: "73 6f 6d 65" + }) + .toString(), + "\u0015\n]W@\u000b\fP" + ); }), it("XOR: toggleString with custom option", () => { - assert.strictEqual(chef.XOR("fe023da5", { - key: { - string: "73 6f 6d 65", - option: "utf8", - } - }).toString(), - "QV\u0010\u0004UDWQ"); + assert.strictEqual( + chef + .XOR("fe023da5", { + key: { + string: "73 6f 6d 65", + option: "utf8" + } + }) + .toString(), + "QV\u0010\u0004UDWQ" + ); }), it("XPath expression", () => { assert.strictEqual( - chef.XPathExpression("abc", {xPath: "contact-info/company"}).toString(), - "abc"); + chef + .XPathExpression("abc", { + xPath: "contact-info/company" + }) + .toString(), + "abc" + ); }), it("Zlib deflate / inflate", () => { - assert.strictEqual(chef.zlibInflate(chef.zlibDeflate("cut homer wile rooky grits dizen")).toString(), "cut homer wile rooky grits dizen"); + assert.strictEqual( + chef.zlibInflate(chef.zlibDeflate("cut homer wile rooky grits dizen")).toString(), + "cut homer wile rooky grits dizen" + ); }), it("extract EXIF", () => { @@ -1006,7 +1093,8 @@ YResolution: 72 ResolutionUnit: 2 ColorSpace: 1 ExifImageWidth: 57 -ExifImageHeight: 57`); +ExifImageHeight: 57` + ); }), it("Tar", () => { @@ -1020,7 +1108,7 @@ ExifImageHeight: 57`); it("Untar", () => { const tarred = chef.tar("some file content", { - filename: "filename.txt", + filename: "filename.txt" }); const untarred = chef.untar(tarred); assert.strictEqual(untarred.type, 8); @@ -1033,7 +1121,7 @@ ExifImageHeight: 57`); const zipped = chef.zip("some file content", { filename: "sample.zip", comment: "added", - operatingSystem: "Unix", + operatingSystem: "Unix" }); assert.strictEqual(zipped.type, 7); @@ -1044,7 +1132,7 @@ ExifImageHeight: 57`); it("Unzip", () => { const zipped = chef.zip("some file content", { filename: "zipped.zip", - comment: "zippy", + comment: "zippy" }); const unzipped = chef.unzip(zipped); @@ -1055,10 +1143,10 @@ ExifImageHeight: 57`); it("Unzip with password", () => { const zipped = chef.zip("some content", { - password: "abcd", + password: "abcd" }); const unzipped = chef.unzip(zipped, { - password: "abcd", + password: "abcd" }); assert.equal(unzipped.value[0].data, "some content"); @@ -1066,7 +1154,8 @@ ExifImageHeight: 57`); it("YARA Rule Matching", async () => { const input = "foobar foobar bar foo foobar"; - const output = "Rule \"foo\" matches (4 times):\nPos 0, length 3, identifier $re1, data: \"foo\"\nPos 7, length 3, identifier $re1, data: \"foo\"\nPos 18, length 3, identifier $re1, data: \"foo\"\nPos 22, length 3, identifier $re1, data: \"foo\"\nRule \"bar\" matches (4 times):\nPos 3, length 3, identifier $re1, data: \"bar\"\nPos 10, length 3, identifier $re1, data: \"bar\"\nPos 14, length 3, identifier $re1, data: \"bar\"\nPos 25, length 3, identifier $re1, data: \"bar\"\n"; + const output + = 'Rule "foo" matches (4 times):\nPos 0, length 3, identifier $re1, data: "foo"\nPos 7, length 3, identifier $re1, data: "foo"\nPos 18, length 3, identifier $re1, data: "foo"\nPos 22, length 3, identifier $re1, data: "foo"\nRule "bar" matches (4 times):\nPos 3, length 3, identifier $re1, data: "bar"\nPos 10, length 3, identifier $re1, data: "bar"\nPos 14, length 3, identifier $re1, data: "bar"\nPos 25, length 3, identifier $re1, data: "bar"\n'; const res = await chef.YARARules(input, { rules: "rule foo {strings: $re1 = /foo/ condition: $re1} rule bar {strings: $re1 = /bar/ condition: $re1}", @@ -1079,16 +1168,17 @@ ExifImageHeight: 57`); }), it("performs MAGIC", async () => { - const input = "WUagwsiae6mP8gNtCCLUFpCpCB26RmBDoDD8PacdAmzAzBVjkK2QstFXaKhpC6iUS7RHqXrJtFisoRSgoJ4whjm1arm864qaNq4RcfUmLHrcsAaZc5TXCYifNdgS83gDeejGX46gaiMyuBV6EskHt1scgJ88x2tNSotQDwbGY1mmCob2ARGFvCKYNqiN9ipMq1ZU1mgkdbNuGcb76aRtYWhCGUc8g93UJudhb8htsheZnwTpgqhx83SVJSZXMXUjJT2zmpC7uXWtumqokbdSi88YtkWDAc1Toouh2oH4D4ddmNKJWUDpMwmngUmK14xwmomccPQE9hM172APnSqwxdKQ172RkcAsysnmj5gGtRmVNNh2s359wr6mS2QRP"; + const input + = "WUagwsiae6mP8gNtCCLUFpCpCB26RmBDoDD8PacdAmzAzBVjkK2QstFXaKhpC6iUS7RHqXrJtFisoRSgoJ4whjm1arm864qaNq4RcfUmLHrcsAaZc5TXCYifNdgS83gDeejGX46gaiMyuBV6EskHt1scgJ88x2tNSotQDwbGY1mmCob2ARGFvCKYNqiN9ipMq1ZU1mgkdbNuGcb76aRtYWhCGUc8g93UJudhb8htsheZnwTpgqhx83SVJSZXMXUjJT2zmpC7uXWtumqokbdSi88YtkWDAc1Toouh2oH4D4ddmNKJWUDpMwmngUmK14xwmomccPQE9hM172APnSqwxdKQ172RkcAsysnmj5gGtRmVNNh2s359wr6mS2QRP"; const depth = 1; const res = await chef.magic(input, { - depth, + depth }); // assert against the structure of the output, rather than the values. assert.strictEqual(res.value.length, depth + 1); - res.value.forEach(row => { + res.value.forEach((row) => { assert.ok(row.recipe); assert.ok(row.data); assert.ok(row.languageScores); @@ -1098,40 +1188,63 @@ ExifImageHeight: 57`); assert.ok(Object.prototype.hasOwnProperty.call(row, "useful")); assert.ok(Object.prototype.hasOwnProperty.call(row, "matchesCrib")); - row.recipe.forEach(item => { - assert.ok(Object.prototype.hasOwnProperty.call(item, "op"), `No 'op' property in item ${item}`); + row.recipe.forEach((item) => { + assert.ok(Object.prototype.hasOwnProperty.call(item, "op"), `No 'op' property in item ${item}`); assert.strictEqual(typeof item.op, "string"); - assert.ok(Object.prototype.hasOwnProperty.call(item, "args"), `No 'args' property in item ${item}`); + assert.ok(Object.prototype.hasOwnProperty.call(item, "args"), `No 'args' property in item ${item}`); assert.ok(Array.isArray(item.args)); }); - row.languageScores.forEach(score => { - assert.ok(Object.prototype.hasOwnProperty.call(score, "lang"), `No 'lang' property in languageScore ${score}`); + row.languageScores.forEach((score) => { + assert.ok( + Object.prototype.hasOwnProperty.call(score, "lang"), + `No 'lang' property in languageScore ${score}` + ); assert.strictEqual(typeof score.lang, "string"); - assert.ok(Object.prototype.hasOwnProperty.call(score, "score"), `No 'score' property in languageScore ${score}`); + assert.ok( + Object.prototype.hasOwnProperty.call(score, "score"), + `No 'score' property in languageScore ${score}` + ); assert.strictEqual(typeof score.score, "number"); - assert.ok(Object.prototype.hasOwnProperty.call(score, "probability"), `No 'probability' property in languageScore ${score}`); + assert.ok( + Object.prototype.hasOwnProperty.call(score, "probability"), + `No 'probability' property in languageScore ${score}` + ); assert.strictEqual(typeof score.probability, "number"); }); - row.matchingOps.forEach(op => { - assert.ok(Object.prototype.hasOwnProperty.call(op, "op"), `No 'op' property in matchingOp ${JSON.stringify(op)}`); + row.matchingOps.forEach((op) => { + assert.ok( + Object.prototype.hasOwnProperty.call(op, "op"), + `No 'op' property in matchingOp ${JSON.stringify(op)}` + ); assert.strictEqual(typeof op.op, "string"); - assert.ok(Object.prototype.hasOwnProperty.call(op, "pattern"), `No 'pattern' property in matchingOp ${JSON.stringify(op)}`); + assert.ok( + Object.prototype.hasOwnProperty.call(op, "pattern"), + `No 'pattern' property in matchingOp ${JSON.stringify(op)}` + ); assert.ok(op.pattern instanceof RegExp); - assert.ok(Object.prototype.hasOwnProperty.call(op, "args"), `No 'args' property in matchingOp ${JSON.stringify(op)}`); + assert.ok( + Object.prototype.hasOwnProperty.call(op, "args"), + `No 'args' property in matchingOp ${JSON.stringify(op)}` + ); assert.ok(Array.isArray(op.args)); - assert.ok(Object.prototype.hasOwnProperty.call(op, "useful"), `No 'useful' property in matchingOp ${JSON.stringify(op)}`); + assert.ok( + Object.prototype.hasOwnProperty.call(op, "useful"), + `No 'useful' property in matchingOp ${JSON.stringify(op)}` + ); assert.ifError(op.useful); // Expect this to be undefined - assert.ok(Object.prototype.hasOwnProperty.call(op, "entropyRange"), `No 'entropyRange' property in matchingOp ${JSON.stringify(op)}`); + assert.ok( + Object.prototype.hasOwnProperty.call(op, "entropyRange"), + `No 'entropyRange' property in matchingOp ${JSON.stringify(op)}` + ); assert.ifError(op.entropyRange); // Expect this to be undefined - assert.ok(Object.prototype.hasOwnProperty.call(op, "output"), `No 'output' property in matchingOp ${JSON.stringify(op)}`); + assert.ok( + Object.prototype.hasOwnProperty.call(op, "output"), + `No 'output' property in matchingOp ${JSON.stringify(op)}` + ); assert.ifError(op.output); // Expect this to be undefined }); }); - - }), - - + }) ]); - diff --git a/tests/operations/index.mjs b/tests/operations/index.mjs index e85b6ad3..93f28d9f 100644 --- a/tests/operations/index.mjs +++ b/tests/operations/index.mjs @@ -11,10 +11,7 @@ * @license Apache-2.0 */ -import { - setLongTestFailure, - logTestReport, -} from "../lib/utils.mjs"; +import { setLongTestFailure, logTestReport } from "../lib/utils.mjs"; import TestRegister from "../lib/TestRegister.mjs"; import "./tests/AESKeyWrap.mjs"; @@ -147,7 +144,7 @@ import "./tests/YARA.mjs"; const testStatus = { allTestsPassing: true, counts: { - total: 0, + total: 0 } }; @@ -155,7 +152,7 @@ setLongTestFailure(); const logOpsTestReport = logTestReport.bind(null, testStatus); -(async function() { +(async function () { const results = await TestRegister.runTests(); logOpsTestReport(results); })(); diff --git a/tests/operations/tests/AESKeyWrap.mjs b/tests/operations/tests/AESKeyWrap.mjs index bca36a40..24a16618 100644 --- a/tests/operations/tests/AESKeyWrap.mjs +++ b/tests/operations/tests/AESKeyWrap.mjs @@ -14,12 +14,13 @@ TestRegister.addTests([ { "op": "AES Key Wrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Wrap: RFC Test Vector, 128-bit data, 192-bit KEK", @@ -29,12 +30,13 @@ TestRegister.addTests([ { "op": "AES Key Wrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f1011121314151617"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f1011121314151617" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Wrap: RFC Test Vector, 128-bit data, 256-bit KEK", @@ -44,12 +46,13 @@ TestRegister.addTests([ { "op": "AES Key Wrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Wrap: RFC Test Vector, 192-bit data, 192-bit KEK", @@ -59,12 +62,13 @@ TestRegister.addTests([ { "op": "AES Key Wrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f1011121314151617"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f1011121314151617" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Wrap: RFC Test Vector, 192-bit data, 256-bit KEK", @@ -74,12 +78,13 @@ TestRegister.addTests([ { "op": "AES Key Wrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Wrap: RFC Test Vector, 256-bit data, 256-bit KEK", @@ -89,12 +94,13 @@ TestRegister.addTests([ { "op": "AES Key Wrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: RFC Test Vector, 128-bit data, 128-bit KEK", @@ -104,12 +110,13 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: RFC Test Vector, 128-bit data, 192-bit KEK", @@ -119,12 +126,13 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f1011121314151617"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f1011121314151617" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: RFC Test Vector, 128-bit data, 256-bit KEK", @@ -134,12 +142,13 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: RFC Test Vector, 192-bit data, 192-bit KEK", @@ -149,12 +158,13 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f1011121314151617"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f1011121314151617" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: RFC Test Vector, 192-bit data, 256-bit KEK", @@ -164,12 +174,13 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: RFC Test Vector, 256-bit data, 256-bit KEK", @@ -179,12 +190,13 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Wrap: invalid KEK length", @@ -194,12 +206,13 @@ TestRegister.addTests([ { "op": "AES Key Wrap", "args": [ - {"option": "Hex", "string": "00010203040506070809"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "00010203040506070809" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Wrap: invalid IV length", @@ -209,12 +222,13 @@ TestRegister.addTests([ { "op": "AES Key Wrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Wrap: input length not multiple of 8", @@ -224,12 +238,13 @@ TestRegister.addTests([ { "op": "AES Key Wrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Wrap: input too short", @@ -239,12 +254,13 @@ TestRegister.addTests([ { "op": "AES Key Wrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: invalid KEK length", @@ -254,12 +270,13 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "00010203040506070809"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "00010203040506070809" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: invalid IV length", @@ -269,12 +286,13 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: input length not multiple of 8", @@ -284,12 +302,13 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: input too short", @@ -299,12 +318,13 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] }, { "name": "AES Key Unwrap: corrupted input", @@ -314,11 +334,12 @@ TestRegister.addTests([ { "op": "AES Key Unwrap", "args": [ - {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"}, - {"option": "Hex", "string": "a6a6a6a6a6a6a6a6"}, - "Hex", "Hex" - ], - }, - ], - }, + { "option": "Hex", "string": "000102030405060708090a0b0c0d0e0f" }, + { "option": "Hex", "string": "a6a6a6a6a6a6a6a6" }, + "Hex", + "Hex" + ] + } + ] + } ]); diff --git a/tests/operations/tests/AvroToJSON.mjs b/tests/operations/tests/AvroToJSON.mjs index b823cbfc..908a7929 100644 --- a/tests/operations/tests/AvroToJSON.mjs +++ b/tests/operations/tests/AvroToJSON.mjs @@ -18,7 +18,7 @@ TestRegister.addTests([ op: "Avro to JSON", args: [true] } - ], + ] }, { name: "Avro to JSON: no input (force JSON false)", @@ -29,38 +29,40 @@ TestRegister.addTests([ op: "Avro to JSON", args: [false] } - ], + ] }, { name: "Avro to JSON: small (force JSON true)", - input: "\x4f\x62\x6a\x01\x04\x16\x61\x76\x72\x6f\x2e\x73\x63\x68\x65\x6d\x61\x96\x01\x7b\x22\x74\x79\x70\x65\x22\x3a\x22\x72\x65" + - "\x63\x6f\x72\x64\x22\x2c\x22\x6e\x61\x6d\x65\x22\x3a\x22\x73\x6d\x61\x6c\x6c\x22\x2c\x22\x66\x69\x65\x6c\x64\x73\x22\x3a" + - "\x5b\x7b\x22\x6e\x61\x6d\x65\x22\x3a\x22\x6e\x61\x6d\x65\x22\x2c\x22\x74\x79\x70\x65\x22\x3a\x22\x73\x74\x72\x69\x6e\x67" + - "\x22\x7d\x5d\x7d\x14\x61\x76\x72\x6f\x2e\x63\x6f\x64\x65\x63\x08\x6e\x75\x6c\x6c\x00\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7" + - "\x5c\xda\xb9\xa6\x2f\x15\x41\x02\x0e\x0c\x6d\x79\x6e\x61\x6d\x65\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7\x5c\xda\xb9\xa6\x2f" + - "\x15\x41", - expectedOutput: "{\n \"name\": \"myname\"\n}", + input: + "\x4f\x62\x6a\x01\x04\x16\x61\x76\x72\x6f\x2e\x73\x63\x68\x65\x6d\x61\x96\x01\x7b\x22\x74\x79\x70\x65\x22\x3a\x22\x72\x65" + + "\x63\x6f\x72\x64\x22\x2c\x22\x6e\x61\x6d\x65\x22\x3a\x22\x73\x6d\x61\x6c\x6c\x22\x2c\x22\x66\x69\x65\x6c\x64\x73\x22\x3a" + + "\x5b\x7b\x22\x6e\x61\x6d\x65\x22\x3a\x22\x6e\x61\x6d\x65\x22\x2c\x22\x74\x79\x70\x65\x22\x3a\x22\x73\x74\x72\x69\x6e\x67" + + "\x22\x7d\x5d\x7d\x14\x61\x76\x72\x6f\x2e\x63\x6f\x64\x65\x63\x08\x6e\x75\x6c\x6c\x00\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7" + + "\x5c\xda\xb9\xa6\x2f\x15\x41\x02\x0e\x0c\x6d\x79\x6e\x61\x6d\x65\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7\x5c\xda\xb9\xa6\x2f" + + "\x15\x41", + expectedOutput: '{\n "name": "myname"\n}', recipeConfig: [ { op: "Avro to JSON", args: [true] } - ], + ] }, { name: "Avro to JSON: small (force JSON false)", - input: "\x4f\x62\x6a\x01\x04\x16\x61\x76\x72\x6f\x2e\x73\x63\x68\x65\x6d\x61\x96\x01\x7b\x22\x74\x79\x70\x65\x22\x3a\x22\x72\x65" + - "\x63\x6f\x72\x64\x22\x2c\x22\x6e\x61\x6d\x65\x22\x3a\x22\x73\x6d\x61\x6c\x6c\x22\x2c\x22\x66\x69\x65\x6c\x64\x73\x22\x3a" + - "\x5b\x7b\x22\x6e\x61\x6d\x65\x22\x3a\x22\x6e\x61\x6d\x65\x22\x2c\x22\x74\x79\x70\x65\x22\x3a\x22\x73\x74\x72\x69\x6e\x67" + - "\x22\x7d\x5d\x7d\x14\x61\x76\x72\x6f\x2e\x63\x6f\x64\x65\x63\x08\x6e\x75\x6c\x6c\x00\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7" + - "\x5c\xda\xb9\xa6\x2f\x15\x41\x02\x0e\x0c\x6d\x79\x6e\x61\x6d\x65\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7\x5c\xda\xb9\xa6\x2f" + - "\x15\x41", - expectedOutput: "{\"name\":\"myname\"}\n", + input: + "\x4f\x62\x6a\x01\x04\x16\x61\x76\x72\x6f\x2e\x73\x63\x68\x65\x6d\x61\x96\x01\x7b\x22\x74\x79\x70\x65\x22\x3a\x22\x72\x65" + + "\x63\x6f\x72\x64\x22\x2c\x22\x6e\x61\x6d\x65\x22\x3a\x22\x73\x6d\x61\x6c\x6c\x22\x2c\x22\x66\x69\x65\x6c\x64\x73\x22\x3a" + + "\x5b\x7b\x22\x6e\x61\x6d\x65\x22\x3a\x22\x6e\x61\x6d\x65\x22\x2c\x22\x74\x79\x70\x65\x22\x3a\x22\x73\x74\x72\x69\x6e\x67" + + "\x22\x7d\x5d\x7d\x14\x61\x76\x72\x6f\x2e\x63\x6f\x64\x65\x63\x08\x6e\x75\x6c\x6c\x00\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7" + + "\x5c\xda\xb9\xa6\x2f\x15\x41\x02\x0e\x0c\x6d\x79\x6e\x61\x6d\x65\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7\x5c\xda\xb9\xa6\x2f" + + "\x15\x41", + expectedOutput: '{"name":"myname"}\n', recipeConfig: [ { op: "Avro to JSON", args: [false] } - ], + ] } ]); diff --git a/tests/operations/tests/BCD.mjs b/tests/operations/tests/BCD.mjs index c6715e56..38a38f17 100644 --- a/tests/operations/tests/BCD.mjs +++ b/tests/operations/tests/BCD.mjs @@ -22,7 +22,8 @@ TestRegister.addTests([ { name: "To BCD: unpacked nibbles", input: "1234567890", - expectedOutput: "0000 0001 0000 0010 0000 0011 0000 0100 0000 0101 0000 0110 0000 0111 0000 1000 0000 1001 0000 0000", + expectedOutput: + "0000 0001 0000 0010 0000 0011 0000 0100 0000 0101 0000 0110 0000 0111 0000 1000 0000 1001 0000 0000", recipeConfig: [ { "op": "To BCD", @@ -99,5 +100,5 @@ TestRegister.addTests([ "args": ["4 2 2 1", true, true, "Raw"] } ] - }, + } ]); diff --git a/tests/operations/tests/BLAKE2b.mjs b/tests/operations/tests/BLAKE2b.mjs index 088b1078..5e10f913 100644 --- a/tests/operations/tests/BLAKE2b.mjs +++ b/tests/operations/tests/BLAKE2b.mjs @@ -11,46 +11,33 @@ TestRegister.addTests([ { name: "BLAKE2b: 512 - Hello World", input: "Hello World", - expectedOutput: "4386a08a265111c9896f56456e2cb61a64239115c4784cf438e36cc851221972da3fb0115f73cd02486254001f878ab1fd126aac69844ef1c1ca152379d0a9bd", - recipeConfig: [ - { "op": "BLAKE2b", - "args": ["512", "Hex", {string: "", option: "UTF8"}] } - ] + expectedOutput: + "4386a08a265111c9896f56456e2cb61a64239115c4784cf438e36cc851221972da3fb0115f73cd02486254001f878ab1fd126aac69844ef1c1ca152379d0a9bd", + recipeConfig: [{ "op": "BLAKE2b", "args": ["512", "Hex", { string: "", option: "UTF8" }] }] }, { name: "BLAKE2b: 384 - Hello World", input: "Hello World", - expectedOutput: "4d388e82ca8f866e606b6f6f0be910abd62ad6e98c0adfc27cf35acf948986d5c5b9c18b6f47261e1e679eb98edf8e2d", - recipeConfig: [ - { "op": "BLAKE2b", - "args": ["384", "Hex", {string: "", option: "UTF8"}] } - ] + expectedOutput: + "4d388e82ca8f866e606b6f6f0be910abd62ad6e98c0adfc27cf35acf948986d5c5b9c18b6f47261e1e679eb98edf8e2d", + recipeConfig: [{ "op": "BLAKE2b", "args": ["384", "Hex", { string: "", option: "UTF8" }] }] }, { name: "BLAKE2b: 256 - Hello World", input: "Hello World", expectedOutput: "1dc01772ee0171f5f614c673e3c7fa1107a8cf727bdf5a6dadb379e93c0d1d00", - recipeConfig: [ - { "op": "BLAKE2b", - "args": ["256", "Hex", {string: "", option: "UTF8"}] } - ] + recipeConfig: [{ "op": "BLAKE2b", "args": ["256", "Hex", { string: "", option: "UTF8" }] }] }, { name: "BLAKE2b: 160 - Hello World", input: "Hello World", expectedOutput: "6a8489e6fd6e51fae12ab271ec7fc8134dd5d737", - recipeConfig: [ - { "op": "BLAKE2b", - "args": ["160", "Hex", {string: "", option: "UTF8"}] } - ] + recipeConfig: [{ "op": "BLAKE2b", "args": ["160", "Hex", { string: "", option: "UTF8" }] }] }, { name: "BLAKE2b: Key Test", input: "message data", expectedOutput: "3d363ff7401e02026f4a4687d4863ced", - recipeConfig: [ - { "op": "BLAKE2b", - "args": ["128", "Hex", {string: "pseudorandom key", option: "UTF8"}] } - ] + recipeConfig: [{ "op": "BLAKE2b", "args": ["128", "Hex", { string: "pseudorandom key", option: "UTF8" }] }] } ]); diff --git a/tests/operations/tests/BLAKE2s.mjs b/tests/operations/tests/BLAKE2s.mjs index fe978d24..7108d33a 100755 --- a/tests/operations/tests/BLAKE2s.mjs +++ b/tests/operations/tests/BLAKE2s.mjs @@ -12,36 +12,24 @@ TestRegister.addTests([ name: "BLAKE2s: 256 - Hello World", input: "Hello World", expectedOutput: "7706af019148849e516f95ba630307a2018bb7bf03803eca5ed7ed2c3c013513", - recipeConfig: [ - { "op": "BLAKE2s", - "args": ["256", "Hex", {string: "", option: "UTF8"}] } - ] + recipeConfig: [{ "op": "BLAKE2s", "args": ["256", "Hex", { string: "", option: "UTF8" }] }] }, { name: "BLAKE2s: 160 - Hello World", input: "Hello World", expectedOutput: "0e4fcfc2ee0097ac1d72d70b595a39e09a3c7c7e", - recipeConfig: [ - { "op": "BLAKE2s", - "args": ["160", "Hex", {string: "", option: "UTF8"}] } - ] + recipeConfig: [{ "op": "BLAKE2s", "args": ["160", "Hex", { string: "", option: "UTF8" }] }] }, { name: "BLAKE2s: 128 - Hello World", input: "Hello World", expectedOutput: "9964ee6f36126626bf864363edfa96f6", - recipeConfig: [ - { "op": "BLAKE2s", - "args": ["128", "Hex", {string: "", option: "UTF8"}] } - ] + recipeConfig: [{ "op": "BLAKE2s", "args": ["128", "Hex", { string: "", option: "UTF8" }] }] }, { name: "BLAKE2s: Key Test", input: "Hello World", expectedOutput: "9964ee6f36126626bf864363edfa96f6", - recipeConfig: [ - { "op": "BLAKE2s", - "args": ["128", "Hex", {string: "", option: "UTF8"}] } - ] + recipeConfig: [{ "op": "BLAKE2s", "args": ["128", "Hex", { string: "", option: "UTF8" }] }] } ]); diff --git a/tests/operations/tests/BSON.mjs b/tests/operations/tests/BSON.mjs index 83ef7caa..d2abee92 100644 --- a/tests/operations/tests/BSON.mjs +++ b/tests/operations/tests/BSON.mjs @@ -16,20 +16,20 @@ TestRegister.addTests([ recipeConfig: [ { op: "BSON serialise", - args: [], - }, - ], + args: [] + } + ] }, { name: "BSON serialise: basic", - input: "{\"hello\":\"world\"}", + input: '{"hello":"world"}', expectedOutput: "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00", recipeConfig: [ { op: "BSON serialise", - args: [], - }, - ], + args: [] + } + ] }, { name: "BSON deserialise: nothing", @@ -38,19 +38,19 @@ TestRegister.addTests([ recipeConfig: [ { op: "BSON deserialise", - args: [], - }, - ], + args: [] + } + ] }, { name: "BSON deserialise: basic", input: "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00", - expectedOutput: "{\n \"hello\": \"world\"\n}", + expectedOutput: '{\n "hello": "world"\n}', recipeConfig: [ { op: "BSON deserialise", - args: [], - }, - ], - }, + args: [] + } + ] + } ]); diff --git a/tests/operations/tests/BaconCipher.mjs b/tests/operations/tests/BaconCipher.mjs index 90e5ee64..23b3f755 100644 --- a/tests/operations/tests/BaconCipher.mjs +++ b/tests/operations/tests/BaconCipher.mjs @@ -21,7 +21,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[0], false] } - ], + ] }, { name: "Bacon Decode: reduced alphabet 0/1", @@ -32,7 +32,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[0], false] } - ], + ] }, { name: "Bacon Decode: reduced alphabet 0/1 inverse", @@ -43,7 +43,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[0], true] } - ], + ] }, { name: "Bacon Decode: reduced alphabet A/B lower case", @@ -54,7 +54,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[1], false] } - ], + ] }, { name: "Bacon Decode: reduced alphabet A/B lower case inverse", @@ -65,7 +65,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[1], true] } - ], + ] }, { name: "Bacon Decode: reduced alphabet A/B upper case", @@ -76,7 +76,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[1], false] } - ], + ] }, { name: "Bacon Decode: reduced alphabet A/B upper case inverse", @@ -87,7 +87,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[1], true] } - ], + ] }, { name: "Bacon Decode: reduced alphabet case code", @@ -98,7 +98,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[2], false] } - ], + ] }, { name: "Bacon Decode: reduced alphabet case code inverse", @@ -109,7 +109,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[2], true] } - ], + ] }, { name: "Bacon Decode: reduced alphabet case code", @@ -120,7 +120,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[3], false] } - ], + ] }, { name: "Bacon Decode: reduced alphabet case code inverse", @@ -131,7 +131,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[0], translations[3], true] } - ], + ] }, { name: "Bacon Decode: complete alphabet 0/1", @@ -142,7 +142,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[1], translations[0], false] } - ], + ] }, { name: "Bacon Decode: complete alphabet 0/1 inverse", @@ -153,7 +153,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[1], translations[0], true] } - ], + ] }, { name: "Bacon Decode: complete alphabet A/B lower case", @@ -164,7 +164,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[1], translations[1], false] } - ], + ] }, { name: "Bacon Decode: complete alphabet A/B lower case inverse", @@ -175,7 +175,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[1], translations[1], true] } - ], + ] }, { name: "Bacon Decode: complete alphabet A/B upper case", @@ -186,7 +186,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[1], translations[1], false] } - ], + ] }, { name: "Bacon Decode: complete alphabet A/B upper case inverse", @@ -197,7 +197,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[1], translations[1], true] } - ], + ] }, { name: "Bacon Decode: complete alphabet case code", @@ -208,7 +208,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[1], translations[2], false] } - ], + ] }, { name: "Bacon Decode: complete alphabet case code inverse", @@ -219,7 +219,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[1], translations[2], true] } - ], + ] }, { name: "Bacon Decode: complete alphabet case code", @@ -230,7 +230,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[1], translations[3], false] } - ], + ] }, { name: "Bacon Decode: complete alphabet case code inverse", @@ -241,7 +241,7 @@ TestRegister.addTests([ op: "Bacon Cipher Decode", args: [alphabets[1], translations[3], true] } - ], + ] }, { name: "Bacon Encode: no input", @@ -252,182 +252,198 @@ TestRegister.addTests([ op: "Bacon Cipher Encode", args: [alphabets[0], translations[0], false, false] } - ], + ] }, { name: "Bacon Encode: reduced alphabet 0/1", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "10010 00111 00100 10000 00100 10001 00000 00101 01101 10101 00000 01100 00011 01000 10010 01000 10011 01011 01110 10001 01101 10011 00100 10000 10010 00111 00100 00101 00100 01100 00010 00100", + expectedOutput: + "10010 00111 00100 10000 00100 10001 00000 00101 01101 10101 00000 01100 00011 01000 10010 01000 10011 01011 01110 10001 01101 10011 00100 10000 10010 00111 00100 00101 00100 01100 00010 00100", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[0], translations[0], false, false] } - ], + ] }, { name: "Bacon Encode: reduced alphabet 0/1 inverse", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "01101 11000 11011 01111 11011 01110 11111 11010 10010 01010 11111 10011 11100 10111 01101 10111 01100 10100 10001 01110 10010 01100 11011 01111 01101 11000 11011 11010 11011 10011 11101 11011", + expectedOutput: + "01101 11000 11011 01111 11011 01110 11111 11010 10010 01010 11111 10011 11100 10111 01101 10111 01100 10100 10001 01110 10010 01100 11011 01111 01101 11000 11011 11010 11011 10011 11101 11011", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[0], translations[0], false, true] } - ], + ] }, { name: "Bacon Encode: reduced alphabet 0/1, keeping extra characters", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "1001000111001001000000100'10001 00000 001010110110101, 000000110000011 0100010010 0100010011010110111010001 01101100110010010000 100100011100100 0010100100011000001000100.", + expectedOutput: + "1001000111001001000000100'10001 00000 001010110110101, 000000110000011 0100010010 0100010011010110111010001 01101100110010010000 100100011100100 0010100100011000001000100.", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[0], translations[0], true, false] } - ], + ] }, { name: "Bacon Encode: reduced alphabet 0/1 inverse, keeping extra characters", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "0110111000110110111111011'01110 11111 110101001001010, 111111001111100 1011101101 1011101100101001000101110 10010011001101101111 011011100011011 1101011011100111110111011.", + expectedOutput: + "0110111000110110111111011'01110 11111 110101001001010, 111111001111100 1011101101 1011101100101001000101110 10010011001101101111 011011100011011 1101011011100111110111011.", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[0], translations[0], true, true] } - ], + ] }, { name: "Bacon Encode: reduced alphabet A/B", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "BAABA AABBB AABAA BAAAA AABAA BAAAB AAAAA AABAB ABBAB BABAB AAAAA ABBAA AAABB ABAAA BAABA ABAAA BAABB ABABB ABBBA BAAAB ABBAB BAABB AABAA BAAAA BAABA AABBB AABAA AABAB AABAA ABBAA AAABA AABAA", + expectedOutput: + "BAABA AABBB AABAA BAAAA AABAA BAAAB AAAAA AABAB ABBAB BABAB AAAAA ABBAA AAABB ABAAA BAABA ABAAA BAABB ABABB ABBBA BAAAB ABBAB BAABB AABAA BAAAA BAABA AABBB AABAA AABAB AABAA ABBAA AAABA AABAA", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[0], translations[1], false, false] } - ], + ] }, { name: "Bacon Encode: reduced alphabet A/B inverse", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "ABBAB BBAAA BBABB ABBBB BBABB ABBBA BBBBB BBABA BAABA ABABA BBBBB BAABB BBBAA BABBB ABBAB BABBB ABBAA BABAA BAAAB ABBBA BAABA ABBAA BBABB ABBBB ABBAB BBAAA BBABB BBABA BBABB BAABB BBBAB BBABB", + expectedOutput: + "ABBAB BBAAA BBABB ABBBB BBABB ABBBA BBBBB BBABA BAABA ABABA BBBBB BAABB BBBAA BABBB ABBAB BABBB ABBAA BABAA BAAAB ABBBA BAABA ABBAA BBABB ABBBB ABBAB BBAAA BBABB BBABA BBABB BAABB BBBAB BBABB", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[0], translations[1], false, true] } - ], + ] }, { name: "Bacon Encode: reduced alphabet A/B, keeping extra characters", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "BAABAAABBBAABAABAAAAAABAA'BAAAB AAAAA AABABABBABBABAB, AAAAAABBAAAAABB ABAAABAABA ABAAABAABBABABBABBBABAAAB ABBABBAABBAABAABAAAA BAABAAABBBAABAA AABABAABAAABBAAAAABAAABAA.", + expectedOutput: + "BAABAAABBBAABAABAAAAAABAA'BAAAB AAAAA AABABABBABBABAB, AAAAAABBAAAAABB ABAAABAABA ABAAABAABBABABBABBBABAAAB ABBABBAABBAABAABAAAA BAABAAABBBAABAA AABABAABAAABBAAAAABAAABAA.", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[0], translations[1], true, false] } - ], + ] }, { name: "Bacon Encode: reduced alphabet A/B inverse, keeping extra characters", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "ABBABBBAAABBABBABBBBBBABB'ABBBA BBBBB BBABABAABAABABA, BBBBBBAABBBBBAA BABBBABBAB BABBBABBAABABAABAAABABBBA BAABAABBAABBABBABBBB ABBABBBAAABBABB BBABABBABBBAABBBBBABBBABB.", + expectedOutput: + "ABBABBBAAABBABBABBBBBBABB'ABBBA BBBBB BBABABAABAABABA, BBBBBBAABBBBBAA BABBBABBAB BABBBABBAABABAABAAABABBBA BAABAABBAABBABBABBBB ABBABBBAAABBABB BBABABBABBBAABBBBBABBBABB.", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[0], translations[1], true, true] } - ], + ] }, { name: "Bacon Encode: complete alphabet 0/1", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "10011 00111 00100 10001 00100 10010 00000 00101 01110 10111 00000 01101 00011 01000 10011 01001 10100 01100 01111 10010 01110 10101 00100 10001 10011 00111 00100 00101 00100 01101 00010 00100", + expectedOutput: + "10011 00111 00100 10001 00100 10010 00000 00101 01110 10111 00000 01101 00011 01000 10011 01001 10100 01100 01111 10010 01110 10101 00100 10001 10011 00111 00100 00101 00100 01101 00010 00100", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[1], translations[0], false, false] } - ], + ] }, { name: "Bacon Encode: complete alphabet 0/1 inverse", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "01100 11000 11011 01110 11011 01101 11111 11010 10001 01000 11111 10010 11100 10111 01100 10110 01011 10011 10000 01101 10001 01010 11011 01110 01100 11000 11011 11010 11011 10010 11101 11011", + expectedOutput: + "01100 11000 11011 01110 11011 01101 11111 11010 10001 01000 11111 10010 11100 10111 01100 10110 01011 10011 10000 01101 10001 01010 11011 01110 01100 11000 11011 11010 11011 10010 11101 11011", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[1], translations[0], false, true] } - ], + ] }, { name: "Bacon Encode: complete alphabet 0/1, keeping extra characters", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "1001100111001001000100100'10010 00000 001010111010111, 000000110100011 0100010011 0100110100011000111110010 01110101010010010001 100110011100100 0010100100011010001000100.", + expectedOutput: + "1001100111001001000100100'10010 00000 001010111010111, 000000110100011 0100010011 0100110100011000111110010 01110101010010010001 100110011100100 0010100100011010001000100.", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[1], translations[0], true, false] } - ], + ] }, { name: "Bacon Encode: complete alphabet 0/1 inverse, keeping extra characters", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "0110011000110110111011011'01101 11111 110101000101000, 111111001011100 1011101100 1011001011100111000001101 10001010101101101110 011001100011011 1101011011100101110111011.", + expectedOutput: + "0110011000110110111011011'01101 11111 110101000101000, 111111001011100 1011101100 1011001011100111000001101 10001010101101101110 011001100011011 1101011011100101110111011.", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[1], translations[0], true, true] } - ], + ] }, { name: "Bacon Encode: complete alphabet A/B", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "BAABB AABBB AABAA BAAAB AABAA BAABA AAAAA AABAB ABBBA BABBB AAAAA ABBAB AAABB ABAAA BAABB ABAAB BABAA ABBAA ABBBB BAABA ABBBA BABAB AABAA BAAAB BAABB AABBB AABAA AABAB AABAA ABBAB AAABA AABAA", + expectedOutput: + "BAABB AABBB AABAA BAAAB AABAA BAABA AAAAA AABAB ABBBA BABBB AAAAA ABBAB AAABB ABAAA BAABB ABAAB BABAA ABBAA ABBBB BAABA ABBBA BABAB AABAA BAAAB BAABB AABBB AABAA AABAB AABAA ABBAB AAABA AABAA", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[1], translations[1], false, false] } - ], + ] }, { name: "Bacon Encode: complete alphabet A/B inverse", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "ABBAA BBAAA BBABB ABBBA BBABB ABBAB BBBBB BBABA BAAAB ABAAA BBBBB BAABA BBBAA BABBB ABBAA BABBA ABABB BAABB BAAAA ABBAB BAAAB ABABA BBABB ABBBA ABBAA BBAAA BBABB BBABA BBABB BAABA BBBAB BBABB", + expectedOutput: + "ABBAA BBAAA BBABB ABBBA BBABB ABBAB BBBBB BBABA BAAAB ABAAA BBBBB BAABA BBBAA BABBB ABBAA BABBA ABABB BAABB BAAAA ABBAB BAAAB ABABA BBABB ABBBA ABBAA BBAAA BBABB BBABA BBABB BAABA BBBAB BBABB", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[1], translations[1], false, true] } - ], + ] }, { name: "Bacon Encode: complete alphabet A/B, keeping extra characters", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "BAABBAABBBAABAABAAABAABAA'BAABA AAAAA AABABABBBABABBB, AAAAAABBABAAABB ABAAABAABB ABAABBABAAABBAAABBBBBAABA ABBBABABABAABAABAAAB BAABBAABBBAABAA AABABAABAAABBABAAABAAABAA.", + expectedOutput: + "BAABBAABBBAABAABAAABAABAA'BAABA AAAAA AABABABBBABABBB, AAAAAABBABAAABB ABAAABAABB ABAABBABAAABBAAABBBBBAABA ABBBABABABAABAABAAAB BAABBAABBBAABAA AABABAABAAABBABAAABAAABAA.", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[1], translations[1], true, false] } - ], + ] }, { name: "Bacon Encode: complete alphabet A/B inverse, keeping extra characters", input: "There's a fox, and it jumps over the fence.", - expectedOutput: "ABBAABBAAABBABBABBBABBABB'ABBAB BBBBB BBABABAAABABAAA, BBBBBBAABABBBAA BABBBABBAA BABBAABABBBAABBBAAAAABBAB BAAABABABABBABBABBBA ABBAABBAAABBABB BBABABBABBBAABABBBABBBABB.", + expectedOutput: + "ABBAABBAAABBABBABBBABBABB'ABBAB BBBBB BBABABAAABABAAA, BBBBBBAABABBBAA BABBBABBAA BABBAABABBBAABBBAAAAABBAB BAAABABABABBABBABBBA ABBAABBAAABBABB BBABABBABBBAABABBBABBBABB.", recipeConfig: [ { op: "Bacon Cipher Encode", args: [alphabets[1], translations[1], true, true] } - ], - }, + ] + } ]); diff --git a/tests/operations/tests/Base45.mjs b/tests/operations/tests/Base45.mjs index d1c17ea3..3d4d722b 100644 --- a/tests/operations/tests/Base45.mjs +++ b/tests/operations/tests/Base45.mjs @@ -19,9 +19,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base45", - args: [defaultB45Alph], - }, - ], + args: [defaultB45Alph] + } + ] }, { name: "To Base45: Spec encoding example 1", @@ -30,9 +30,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base45", - args: [defaultB45Alph], - }, - ], + args: [defaultB45Alph] + } + ] }, { name: "To Base45: Spec encoding example 2", @@ -41,9 +41,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base45", - args: [defaultB45Alph], - }, - ], + args: [defaultB45Alph] + } + ] }, { name: "To Base45: Spec encoding example 3", @@ -52,9 +52,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base45", - args: [defaultB45Alph], - }, - ], + args: [defaultB45Alph] + } + ] }, { name: "From Base45: nothing", @@ -63,9 +63,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base45", - args: [defaultB45Alph], - }, - ], + args: [defaultB45Alph] + } + ] }, { name: "From Base45: Spec decoding example 1", @@ -74,9 +74,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base45", - args: [defaultB45Alph], - }, - ], + args: [defaultB45Alph] + } + ] }, { name: "From Base45: Invalid character", @@ -85,9 +85,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base45", - args: [defaultB45Alph], - }, - ], + args: [defaultB45Alph] + } + ] }, { name: "From Base45: Invalid triplet value", @@ -96,8 +96,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base45", - args: [defaultB45Alph], - }, - ], - }, + args: [defaultB45Alph] + } + ] + } ]); diff --git a/tests/operations/tests/Base58.mjs b/tests/operations/tests/Base58.mjs index c23ba9ab..27459425 100644 --- a/tests/operations/tests/Base58.mjs +++ b/tests/operations/tests/Base58.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base58", - args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"], - }, - ], + args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"] + } + ] }, { name: "To Base58 (Ripple): nothing", @@ -27,9 +27,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base58", - args: ["rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"], - }, - ], + args: ["rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"] + } + ] }, { name: "To Base58 (Bitcoin): 'hello world'", @@ -38,9 +38,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base58", - args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"], - }, - ], + args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"] + } + ] }, { name: "To Base58 (Ripple): 'hello world'", @@ -49,9 +49,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base58", - args: ["rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"], - }, - ], + args: ["rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"] + } + ] }, { name: "To Base58 with null prefix and suffix", @@ -60,9 +60,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base58", - args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"], - }, - ], + args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"] + } + ] }, { name: "From Base58 with null prefix and suffix", @@ -71,9 +71,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base58", - args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"], - }, - ], + args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"] + } + ] }, { name: "From Base58 (Bitcoin): 'StV1DL6CwTryKyV'", @@ -82,9 +82,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base58", - args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"], - }, - ], + args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"] + } + ] }, { name: "From Base58 (Ripple): 'StVrDLaUATiyKyV'", @@ -93,8 +93,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base58", - args: ["rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"], - }, - ], - }, + args: ["rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"] + } + ] + } ]); diff --git a/tests/operations/tests/Base62.mjs b/tests/operations/tests/Base62.mjs index defe5fa5..2ca5a046 100644 --- a/tests/operations/tests/Base62.mjs +++ b/tests/operations/tests/Base62.mjs @@ -17,9 +17,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base62", - args: ["0-9A-Za-z"], - }, - ], + args: ["0-9A-Za-z"] + } + ] }, { name: "To Base62: Hello, World!", @@ -28,9 +28,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base62", - args: ["0-9A-Za-z"], - }, - ], + args: ["0-9A-Za-z"] + } + ] }, { name: "To Base62: UTF-8", @@ -39,9 +39,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base62", - args: ["0-9A-Za-z"], - }, - ], + args: ["0-9A-Za-z"] + } + ] }, { name: "From Base62: nothing", @@ -50,9 +50,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base62", - args: ["0-9A-Za-z"], - }, - ], + args: ["0-9A-Za-z"] + } + ] }, { name: "From Base62: Hello, World!", @@ -61,9 +61,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base62", - args: ["0-9A-Za-z"], - }, - ], + args: ["0-9A-Za-z"] + } + ] }, { name: "From Base62: UTF-8", @@ -72,8 +72,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base62", - args: ["0-9A-Za-z"], - }, - ], + args: ["0-9A-Za-z"] + } + ] } ]); diff --git a/tests/operations/tests/Base64.mjs b/tests/operations/tests/Base64.mjs index 6e6fa703..e1d96e67 100644 --- a/tests/operations/tests/Base64.mjs +++ b/tests/operations/tests/Base64.mjs @@ -24,7 +24,7 @@ const ALL_BYTES = [ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf", "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef", - "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", + "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" ].join(""); TestRegister.addTests([ @@ -35,9 +35,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base64", - args: ["A-Za-z0-9+/="], - }, - ], + args: ["A-Za-z0-9+/="] + } + ] }, { name: "To Base64: Hello, World!", @@ -46,9 +46,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base64", - args: ["A-Za-z0-9+/="], - }, - ], + args: ["A-Za-z0-9+/="] + } + ] }, { name: "To Base64: UTF-8", @@ -57,20 +57,21 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base64", - args: ["A-Za-z0-9+/="], - }, - ], + args: ["A-Za-z0-9+/="] + } + ] }, { name: "To Base64: All bytes", input: ALL_BYTES, - expectedOutput: "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==", + expectedOutput: + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==", recipeConfig: [ { op: "To Base64", - args: ["A-Za-z0-9+/="], - }, - ], + args: ["A-Za-z0-9+/="] + } + ] }, { name: "From Base64: nothing", @@ -79,9 +80,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base64", - args: ["A-Za-z0-9+/=", true], - }, - ], + args: ["A-Za-z0-9+/=", true] + } + ] }, { name: "From Base64: Hello, World!", @@ -90,9 +91,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base64", - args: ["A-Za-z0-9+/=", true], - }, - ], + args: ["A-Za-z0-9+/=", true] + } + ] }, { name: "From Base64: UTF-8", @@ -101,9 +102,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base64", - args: ["A-Za-z0-9+/=", true], - }, - ], + args: ["A-Za-z0-9+/=", true] + } + ] }, { name: "From Base64: All bytes", @@ -112,8 +113,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base64", - args: ["A-Za-z0-9+/=", true], - }, - ], - }, + args: ["A-Za-z0-9+/=", true] + } + ] + } ]); diff --git a/tests/operations/tests/Base85.mjs b/tests/operations/tests/Base85.mjs index 44e12ee2..d3c8cda4 100644 --- a/tests/operations/tests/Base85.mjs +++ b/tests/operations/tests/Base85.mjs @@ -8,63 +8,52 @@ import TestRegister from "../../lib/TestRegister.mjs"; // Example from Wikipedia -const wpExample = "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure."; +const wpExample + = "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure."; // Escape newline, quote & backslash -const wpOutput = "9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKFCj@.4Gp$d7F!,L7@<6@)/0JDEF@3BB/F*&OCAfu2/AKYi(\ DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF-FD5W8ARlolDIal(\ DIdu\ D.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c"; -const allZeroExample = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"; +const allZeroExample + = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"; -const allZeroOutput = "zz!!*-'\"9eu7#RLhG$k3[W&.oNg'GVB\"(`=52*$$(B+<_pR,UFcb-n-Vr/1iJ-0JP==1c70M3&s#]4?Ykm5X@_(6q'R884cEH9MJ8X:f1+h<)lt#=BSg3>[:ZC?t!MSA7]@cBPD3sCi+'.E,fo>FEMbNG^4U^I!pHnJ:W<)KS>/9Ll%\"IN/`jYOHG]iPa.Q$R$jD4S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?O\\@K2_]Y2%o^qmn*`5Ta:aN;TJbg\"GZd*^:jeCE.%f\\,!5gtgiEi8N\\UjQ5OekiqBum-X60nF?)@o_%qPq\"ad`r;HWp"; +const allZeroOutput + = "zz!!*-'\"9eu7#RLhG$k3[W&.oNg'GVB\"(`=52*$$(B+<_pR,UFcb-n-Vr/1iJ-0JP==1c70M3&s#]4?Ykm5X@_(6q'R884cEH9MJ8X:f1+h<)lt#=BSg3>[:ZC?t!MSA7]@cBPD3sCi+'.E,fo>FEMbNG^4U^I!pHnJ:W<)KS>/9Ll%\"IN/`jYOHG]iPa.Q$R$jD4S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?O\\@K2_]Y2%o^qmn*`5Ta:aN;TJbg\"GZd*^:jeCE.%f\\,!5gtgiEi8N\\UjQ5OekiqBum-X60nF?)@o_%qPq\"ad`r;HWp"; TestRegister.addTests([ { name: "To Base85", input: wpExample, expectedOutput: wpOutput, - recipeConfig: [ - { "op": "To Base85", - "args": ["!-u"] } - ] + recipeConfig: [{ "op": "To Base85", "args": ["!-u"] }] }, { name: "From Base85", input: wpOutput + "\n", expectedOutput: wpExample, - recipeConfig: [ - { "op": "From Base85", - "args": ["!-u", true] } - ] + recipeConfig: [{ "op": "From Base85", "args": ["!-u", true] }] }, { name: "From Base85", input: wpOutput + "v", expectedError: true, expectedOutput: "From Base85 - Invalid character 'v' at index 337", - recipeConfig: [ - { "op": "From Base85", - "args": ["!-u", false] } - ] + recipeConfig: [{ "op": "From Base85", "args": ["!-u", false] }] }, { name: "To Base85", input: allZeroExample, expectedOutput: allZeroOutput, - recipeConfig: [ - { "op": "To Base85", - "args": ["!-u"] } - ] + recipeConfig: [{ "op": "To Base85", "args": ["!-u"] }] }, { name: "From Base85", input: allZeroOutput, expectedOutput: allZeroExample, - recipeConfig: [ - { "op": "From Base85", - "args": ["!-u", true, "z"] } - ] - }, + recipeConfig: [{ "op": "From Base85", "args": ["!-u", true, "z"] }] + } ]); diff --git a/tests/operations/tests/Base92.mjs b/tests/operations/tests/Base92.mjs index 2811182d..d2377a82 100644 --- a/tests/operations/tests/Base92.mjs +++ b/tests/operations/tests/Base92.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base92", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Base92: Spec encoding example 1", @@ -27,9 +27,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base92", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Base92: Spec encoding example 2", @@ -38,9 +38,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base92", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Base92: Spec encoding example 3", @@ -49,9 +49,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Base92", - args: [], - }, - ], + args: [] + } + ] }, { name: "From Base92: nothing", @@ -60,9 +60,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base92", - args: [], - }, - ], + args: [] + } + ] }, { name: "From Base92: Spec decoding example 1", @@ -71,9 +71,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base92", - args: [], - }, - ], + args: [] + } + ] }, { name: "From Base92: Invalid character", @@ -82,8 +82,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Base92", - args: [], - }, - ], - }, + args: [] + } + ] + } ]); diff --git a/tests/operations/tests/BitwiseOp.mjs b/tests/operations/tests/BitwiseOp.mjs index 50303677..dc43f56e 100644 --- a/tests/operations/tests/BitwiseOp.mjs +++ b/tests/operations/tests/BitwiseOp.mjs @@ -13,12 +13,9 @@ TestRegister.addTests([ input: "01010101 10101010 11111111 00000000 11110000 00001111 00110011 11001100", expectedOutput: "10101010 01010100 11111110 00000000 11100000 00011110 01100110 10011000", recipeConfig: [ - { "op": "From Binary", - "args": ["Space"] }, - { "op": "Bit shift left", - "args": [1] }, - { "op": "To Binary", - "args": ["Space"] } + { "op": "From Binary", "args": ["Space"] }, + { "op": "Bit shift left", "args": [1] }, + { "op": "To Binary", "args": ["Space"] } ] }, { @@ -26,12 +23,9 @@ TestRegister.addTests([ input: "01010101 10101010 11111111 00000000 11110000 00001111 00110011 11001100", expectedOutput: "00101010 01010101 01111111 00000000 01111000 00000111 00011001 01100110", recipeConfig: [ - { "op": "From Binary", - "args": ["Space"] }, - { "op": "Bit shift right", - "args": [1, "Logical shift"] }, - { "op": "To Binary", - "args": ["Space"] } + { "op": "From Binary", "args": ["Space"] }, + { "op": "Bit shift right", "args": [1, "Logical shift"] }, + { "op": "To Binary", "args": ["Space"] } ] }, { @@ -39,12 +33,9 @@ TestRegister.addTests([ input: "01010101 10101010 11111111 00000000 11110000 00001111 00110011 11001100", expectedOutput: "00101010 11010101 11111111 00000000 11111000 00000111 00011001 11100110", recipeConfig: [ - { "op": "From Binary", - "args": ["Space"] }, - { "op": "Bit shift right", - "args": [1, "Arithmetic shift"] }, - { "op": "To Binary", - "args": ["Space"] } + { "op": "From Binary", "args": ["Space"] }, + { "op": "Bit shift right", "args": [1, "Arithmetic shift"] }, + { "op": "To Binary", "args": ["Space"] } ] - }, + } ]); diff --git a/tests/operations/tests/Bombe.mjs b/tests/operations/tests/Bombe.mjs index 70df5bea..39cea4ae 100644 --- a/tests/operations/tests/Bombe.mjs +++ b/tests/operations/tests/Bombe.mjs @@ -22,7 +22,9 @@ TestRegister.addTests([ "AJDKSIRUXBLHWTMCQGZNPYFVOE?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~^?M-^@M-^AM-^BM-^CM-^DM-^EM-^FM-^GM-^HM-^IM-^JM-^KM-^LM-^MM-^NM-^OM-^PM-^QM-^RM-^SM-^TM-^UM-^VM-^WM-^XM-^YM-^ZM-^[M-^\\M-^]M-^^M-^_M- M-!M-\"M-#M-$M-%M-&M-'M-(M-)M-*M-+M-,M--M-.M-/M-0M-1M-2M-3M-4M-5M-6M-7M-8M-9M-:M-;M-M-?M-@M-AM-BM-CM-DM-EM-FM-GM-HM-IM-JM-KM-LM-MM-NM-OM-PM-QM-RM-SM-TM-UM-VM-WM-XM-YM-ZM-[M-\\M-]M-^M-_M-`M-aM-bM-cM-dM-eM-fM-gM-hM-iM-jM-kM-lM-mM-nM-oM-pM-qM-rM-sM-tM-uM-vM-wM-xM-yM-zM-{M-|M-}M-~M-^?", - expectedOutput: "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x1f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\x8d\x2d\x5f\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", + expectedOutput: + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x1f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\x8d\x2d\x5f\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", recipeConfig: [ { op: "Caret/M-decode", - args: [], - }, - ], - }, + args: [] + } + ] + } ]); - diff --git a/tests/operations/tests/CartesianProduct.mjs b/tests/operations/tests/CartesianProduct.mjs index 597a8450..f956338d 100644 --- a/tests/operations/tests/CartesianProduct.mjs +++ b/tests/operations/tests/CartesianProduct.mjs @@ -12,56 +12,61 @@ TestRegister.addTests([ { name: "Cartesian Product", input: "1 2 3 4 5\n\na b c d e", - expectedOutput: "(1,a) (1,b) (1,c) (1,d) (1,e) (2,a) (2,b) (2,c) (2,d) (2,e) (3,a) (3,b) (3,c) (3,d) (3,e) (4,a) (4,b) (4,c) (4,d) (4,e) (5,a) (5,b) (5,c) (5,d) (5,e)", + expectedOutput: + "(1,a) (1,b) (1,c) (1,d) (1,e) (2,a) (2,b) (2,c) (2,d) (2,e) (3,a) (3,b) (3,c) (3,d) (3,e) (4,a) (4,b) (4,c) (4,d) (4,e) (5,a) (5,b) (5,c) (5,d) (5,e)", recipeConfig: [ { op: "Cartesian Product", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Cartesian Product: too many on left", input: "1 2 3 4 5 6\n\na b c d e", - expectedOutput: "(1,a) (1,b) (1,c) (1,d) (1,e) (2,a) (2,b) (2,c) (2,d) (2,e) (3,a) (3,b) (3,c) (3,d) (3,e) (4,a) (4,b) (4,c) (4,d) (4,e) (5,a) (5,b) (5,c) (5,d) (5,e) (6,a) (6,b) (6,c) (6,d) (6,e)", + expectedOutput: + "(1,a) (1,b) (1,c) (1,d) (1,e) (2,a) (2,b) (2,c) (2,d) (2,e) (3,a) (3,b) (3,c) (3,d) (3,e) (4,a) (4,b) (4,c) (4,d) (4,e) (5,a) (5,b) (5,c) (5,d) (5,e) (6,a) (6,b) (6,c) (6,d) (6,e)", recipeConfig: [ { op: "Cartesian Product", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Cartesian Product: too many on right", input: "1 2 3 4 5\n\na b c d e f", - expectedOutput: "(1,a) (1,b) (1,c) (1,d) (1,e) (1,f) (2,a) (2,b) (2,c) (2,d) (2,e) (2,f) (3,a) (3,b) (3,c) (3,d) (3,e) (3,f) (4,a) (4,b) (4,c) (4,d) (4,e) (4,f) (5,a) (5,b) (5,c) (5,d) (5,e) (5,f)", + expectedOutput: + "(1,a) (1,b) (1,c) (1,d) (1,e) (1,f) (2,a) (2,b) (2,c) (2,d) (2,e) (2,f) (3,a) (3,b) (3,c) (3,d) (3,e) (3,f) (4,a) (4,b) (4,c) (4,d) (4,e) (4,f) (5,a) (5,b) (5,c) (5,d) (5,e) (5,f)", recipeConfig: [ { op: "Cartesian Product", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Cartesian Product: item delimiter", input: "1-2-3-4-5\n\na-b-c-d-e", - expectedOutput: "(1,a)-(1,b)-(1,c)-(1,d)-(1,e)-(2,a)-(2,b)-(2,c)-(2,d)-(2,e)-(3,a)-(3,b)-(3,c)-(3,d)-(3,e)-(4,a)-(4,b)-(4,c)-(4,d)-(4,e)-(5,a)-(5,b)-(5,c)-(5,d)-(5,e)", + expectedOutput: + "(1,a)-(1,b)-(1,c)-(1,d)-(1,e)-(2,a)-(2,b)-(2,c)-(2,d)-(2,e)-(3,a)-(3,b)-(3,c)-(3,d)-(3,e)-(4,a)-(4,b)-(4,c)-(4,d)-(4,e)-(5,a)-(5,b)-(5,c)-(5,d)-(5,e)", recipeConfig: [ { op: "Cartesian Product", - args: ["\n\n", "-"], - }, - ], + args: ["\n\n", "-"] + } + ] }, { name: "Cartesian Product: sample delimiter", input: "1 2 3 4 5_a b c d e", - expectedOutput: "(1,a) (1,b) (1,c) (1,d) (1,e) (2,a) (2,b) (2,c) (2,d) (2,e) (3,a) (3,b) (3,c) (3,d) (3,e) (4,a) (4,b) (4,c) (4,d) (4,e) (5,a) (5,b) (5,c) (5,d) (5,e)", + expectedOutput: + "(1,a) (1,b) (1,c) (1,d) (1,e) (2,a) (2,b) (2,c) (2,d) (2,e) (3,a) (3,b) (3,c) (3,d) (3,e) (4,a) (4,b) (4,c) (4,d) (4,e) (5,a) (5,b) (5,c) (5,d) (5,e)", recipeConfig: [ { op: "Cartesian Product", - args: ["_", " "], - }, - ], - }, + args: ["_", " "] + } + ] + } ]); diff --git a/tests/operations/tests/CetaceanCipherDecode.mjs b/tests/operations/tests/CetaceanCipherDecode.mjs index e834dc1e..f3146de4 100644 --- a/tests/operations/tests/CetaceanCipherDecode.mjs +++ b/tests/operations/tests/CetaceanCipherDecode.mjs @@ -16,7 +16,7 @@ TestRegister.addTests([ { op: "Cetacean Cipher Decode", args: [] - }, - ], + } + ] } ]); diff --git a/tests/operations/tests/CetaceanCipherEncode.mjs b/tests/operations/tests/CetaceanCipherEncode.mjs index bef76388..f6763ae4 100644 --- a/tests/operations/tests/CetaceanCipherEncode.mjs +++ b/tests/operations/tests/CetaceanCipherEncode.mjs @@ -16,7 +16,7 @@ TestRegister.addTests([ { op: "Cetacean Cipher Encode", args: [] - }, - ], + } + ] } ]); diff --git a/tests/operations/tests/ChaCha.mjs b/tests/operations/tests/ChaCha.mjs index 44b39a67..f5c16036 100644 --- a/tests/operations/tests/ChaCha.mjs +++ b/tests/operations/tests/ChaCha.mjs @@ -18,13 +18,9 @@ ChaCha uses a key of 16 or 32 bytes (128 or 256 bits).`, recipeConfig: [ { "op": "ChaCha", - "args": [ - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""}, - 0, "20", "Hex", "Hex", - ] + "args": [{ "option": "Hex", "string": "" }, { "option": "Hex", "string": "" }, 0, "20", "Hex", "Hex"] } - ], + ] }, { name: "ChaCha: no nonce", @@ -36,116 +32,163 @@ ChaCha uses a nonce of 8 or 12 bytes (64 or 96 bits).`, { "op": "ChaCha", "args": [ - {"option": "Hex", "string": "00000000000000000000000000000000"}, - {"option": "Hex", "string": ""}, - 0, "20", "Hex", "Hex", + { "option": "Hex", "string": "00000000000000000000000000000000" }, + { "option": "Hex", "string": "" }, + 0, + "20", + "Hex", + "Hex" ] } - ], + ] }, { name: "ChaCha: RFC8439", input: "Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, sunscreen would be it.", - expectedOutput: "6e 2e 35 9a 25 68 f9 80 41 ba 07 28 dd 0d 69 81 e9 7e 7a ec 1d 43 60 c2 0a 27 af cc fd 9f ae 0b f9 1b 65 c5 52 47 33 ab 8f 59 3d ab cd 62 b3 57 16 39 d6 24 e6 51 52 ab 8f 53 0c 35 9f 08 61 d8 07 ca 0d bf 50 0d 6a 61 56 a3 8e 08 8a 22 b6 5e 52 bc 51 4d 16 cc f8 06 81 8c e9 1a b7 79 37 36 5a f9 0b bf 74 a3 5b e6 b4 0b 8e ed f2 78 5e 42 87 4d", + expectedOutput: + "6e 2e 35 9a 25 68 f9 80 41 ba 07 28 dd 0d 69 81 e9 7e 7a ec 1d 43 60 c2 0a 27 af cc fd 9f ae 0b f9 1b 65 c5 52 47 33 ab 8f 59 3d ab cd 62 b3 57 16 39 d6 24 e6 51 52 ab 8f 53 0c 35 9f 08 61 d8 07 ca 0d bf 50 0d 6a 61 56 a3 8e 08 8a 22 b6 5e 52 bc 51 4d 16 cc f8 06 81 8c e9 1a b7 79 37 36 5a f9 0b bf 74 a3 5b e6 b4 0b 8e ed f2 78 5e 42 87 4d", recipeConfig: [ { "op": "ChaCha", "args": [ - {"option": "Hex", "string": "00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:14:15:16:17:18:19:1a:1b:1c:1d:1e:1f"}, - {"option": "Hex", "string": "00:00:00:00:00:00:00:4a:00:00:00:00"}, - 1, "20", "Raw", "Hex", + { + "option": "Hex", + "string": + "00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:14:15:16:17:18:19:1a:1b:1c:1d:1e:1f" + }, + { "option": "Hex", "string": "00:00:00:00:00:00:00:4a:00:00:00:00" }, + 1, + "20", + "Raw", + "Hex" ] } - ], + ] }, { name: "ChaCha: draft-strombergson-chacha-test-vectors-01 TC7.1", input: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", - expectedOutput: "29 56 0d 28 0b 45 28 40 0a 8f 4b 79 53 69 fb 3a 01 10 55 99 e9 f1 ed 58 27 9c fc 9e ce 2d c5 f9 9f 1c 2e 52 c9 82 38 f5 42 a5 c0 a8 81 d8 50 b6 15 d3 ac d9 fb db 02 6e 93 68 56 5d a5 0e 0d 49 dd 5b e8 ef 74 24 8b 3e 25 1d 96 5d 8f cb 21 e7 cf e2 04 d4 00 78 06 fb ee 3c e9 4c 74 bf ba d2 c1 1c 62 1b a0 48 14 7c 5c aa 94 d1 82 cc ff 6f d5 cf 44 ad f9 6e 3d 68 28 1b b4 96 76 af 87 e7", + expectedOutput: + "29 56 0d 28 0b 45 28 40 0a 8f 4b 79 53 69 fb 3a 01 10 55 99 e9 f1 ed 58 27 9c fc 9e ce 2d c5 f9 9f 1c 2e 52 c9 82 38 f5 42 a5 c0 a8 81 d8 50 b6 15 d3 ac d9 fb db 02 6e 93 68 56 5d a5 0e 0d 49 dd 5b e8 ef 74 24 8b 3e 25 1d 96 5d 8f cb 21 e7 cf e2 04 d4 00 78 06 fb ee 3c e9 4c 74 bf ba d2 c1 1c 62 1b a0 48 14 7c 5c aa 94 d1 82 cc ff 6f d5 cf 44 ad f9 6e 3d 68 28 1b b4 96 76 af 87 e7", recipeConfig: [ { "op": "ChaCha", "args": [ - {"option": "Hex", "string": "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff"}, - {"option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78"}, - 0, "8", "Hex", "Hex", + { "option": "Hex", "string": "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff" }, + { "option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78" }, + 0, + "8", + "Hex", + "Hex" ] } - ], + ] }, { name: "ChaCha: draft-strombergson-chacha-test-vectors-01 TC7.2", input: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", - expectedOutput: "5e dd c2 d9 42 8f ce ee c5 0a 52 a9 64 ea e0 ff b0 4b 2d e0 06 a9 b0 4c ff 36 8f fa 92 11 16 b2 e8 e2 64 ba bd 2e fa 0d e4 3e f2 e3 b6 d0 65 e8 f7 c0 a1 78 37 b0 a4 0e b0 e2 c7 a3 74 2c 87 53 ed e5 f3 f6 d1 9b e5 54 67 5e 50 6a 77 5c 63 f0 94 d4 96 5c 31 93 19 dc d7 50 6f 45 7b 11 7b 84 b1 0b 24 6e 95 6c 2d a8 89 8a 65 6c ee f3 f7 b7 16 45 b1 9f 70 1d b8 44 85 ce 51 21 f0 f6 17 ef", + expectedOutput: + "5e dd c2 d9 42 8f ce ee c5 0a 52 a9 64 ea e0 ff b0 4b 2d e0 06 a9 b0 4c ff 36 8f fa 92 11 16 b2 e8 e2 64 ba bd 2e fa 0d e4 3e f2 e3 b6 d0 65 e8 f7 c0 a1 78 37 b0 a4 0e b0 e2 c7 a3 74 2c 87 53 ed e5 f3 f6 d1 9b e5 54 67 5e 50 6a 77 5c 63 f0 94 d4 96 5c 31 93 19 dc d7 50 6f 45 7b 11 7b 84 b1 0b 24 6e 95 6c 2d a8 89 8a 65 6c ee f3 f7 b7 16 45 b1 9f 70 1d b8 44 85 ce 51 21 f0 f6 17 ef", recipeConfig: [ { "op": "ChaCha", "args": [ - {"option": "Hex", "string": "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff"}, - {"option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78"}, - 0, "12", "Hex", "Hex", + { "option": "Hex", "string": "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff" }, + { "option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78" }, + 0, + "12", + "Hex", + "Hex" ] } - ], + ] }, { name: "ChaCha: draft-strombergson-chacha-test-vectors-01 TC7.3", input: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", - expectedOutput: "d1 ab f6 30 46 7e b4 f6 7f 1c fb 47 cd 62 6a ae 8a fe db be 4f f8 fc 5f e9 cf ae 30 7e 74 ed 45 1f 14 04 42 5a d2 b5 45 69 d5 f1 81 48 93 99 71 ab b8 fa fc 88 ce 4a c7 fe 1c 3d 1f 7a 1e b7 ca e7 6c a8 7b 61 a9 71 35 41 49 77 60 dd 9a e0 59 35 0c ad 0d ce df aa 80 a8 83 11 9a 1a 6f 98 7f d1 ce 91 fd 8e e0 82 80 34 b4 11 20 0a 97 45 a2 85 55 44 75 d1 2a fc 04 88 7f ef 35 16 d1 2a 2c", + expectedOutput: + "d1 ab f6 30 46 7e b4 f6 7f 1c fb 47 cd 62 6a ae 8a fe db be 4f f8 fc 5f e9 cf ae 30 7e 74 ed 45 1f 14 04 42 5a d2 b5 45 69 d5 f1 81 48 93 99 71 ab b8 fa fc 88 ce 4a c7 fe 1c 3d 1f 7a 1e b7 ca e7 6c a8 7b 61 a9 71 35 41 49 77 60 dd 9a e0 59 35 0c ad 0d ce df aa 80 a8 83 11 9a 1a 6f 98 7f d1 ce 91 fd 8e e0 82 80 34 b4 11 20 0a 97 45 a2 85 55 44 75 d1 2a fc 04 88 7f ef 35 16 d1 2a 2c", recipeConfig: [ { "op": "ChaCha", "args": [ - {"option": "Hex", "string": "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff"}, - {"option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78"}, - 0, "20", "Hex", "Hex", + { "option": "Hex", "string": "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff" }, + { "option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78" }, + 0, + "20", + "Hex", + "Hex" ] } - ], + ] }, { name: "ChaCha: draft-strombergson-chacha-test-vectors-01 TC7.4", input: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", - expectedOutput: "db 43 ad 9d 1e 84 2d 12 72 e4 53 0e 27 6b 3f 56 8f 88 59 b3 f7 cf 6d 9d 2c 74 fa 53 80 8c b5 15 7a 8e bf 46 ad 3d cc 4b 6c 7d ad de 13 17 84 b0 12 0e 0e 22 f6 d5 f9 ff a7 40 7d 4a 21 b6 95 d9 c5 dd 30 bf 55 61 2f ab 9b dd 11 89 20 c1 98 16 47 0c 7f 5d cd 42 32 5d bb ed 8c 57 a5 62 81 c1 44 cb 0f 03 e8 1b 30 04 62 4e 06 50 a1 ce 5a fa f9 a7 cd 81 63 f6 db d7 26 02 25 7d d9 6e 47 1e", + expectedOutput: + "db 43 ad 9d 1e 84 2d 12 72 e4 53 0e 27 6b 3f 56 8f 88 59 b3 f7 cf 6d 9d 2c 74 fa 53 80 8c b5 15 7a 8e bf 46 ad 3d cc 4b 6c 7d ad de 13 17 84 b0 12 0e 0e 22 f6 d5 f9 ff a7 40 7d 4a 21 b6 95 d9 c5 dd 30 bf 55 61 2f ab 9b dd 11 89 20 c1 98 16 47 0c 7f 5d cd 42 32 5d bb ed 8c 57 a5 62 81 c1 44 cb 0f 03 e8 1b 30 04 62 4e 06 50 a1 ce 5a fa f9 a7 cd 81 63 f6 db d7 26 02 25 7d d9 6e 47 1e", recipeConfig: [ { "op": "ChaCha", "args": [ - {"option": "Hex", "string": "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff ff ee dd cc bb aa 99 88 77 66 55 44 33 22 11 00"}, - {"option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78"}, - 0, "8", "Hex", "Hex", + { + "option": "Hex", + "string": + "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff ff ee dd cc bb aa 99 88 77 66 55 44 33 22 11 00" + }, + { "option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78" }, + 0, + "8", + "Hex", + "Hex" ] } - ], + ] }, { name: "ChaCha: draft-strombergson-chacha-test-vectors-01 TC7.5", input: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", - expectedOutput: "7e d1 2a 3a 63 91 2a e9 41 ba 6d 4c 0d 5e 86 2e 56 8b 0e 55 89 34 69 35 50 5f 06 4b 8c 26 98 db f7 d8 50 66 7d 8e 67 be 63 9f 3b 4f 6a 16 f9 2e 65 ea 80 f6 c7 42 94 45 da 1f c2 c1 b9 36 50 40 e3 2e 50 c4 10 6f 3b 3d a1 ce 7c cb 1e 71 40 b1 53 49 3c 0f 3a d9 a9 bc ff 07 7e c4 59 6f 1d 0f 29 bf 9c ba a5 02 82 0f 73 2a f5 a9 3c 49 ee e3 3d 1c 4f 12 af 3b 42 97 af 91 fe 41 ea 9e 94 a2", + expectedOutput: + "7e d1 2a 3a 63 91 2a e9 41 ba 6d 4c 0d 5e 86 2e 56 8b 0e 55 89 34 69 35 50 5f 06 4b 8c 26 98 db f7 d8 50 66 7d 8e 67 be 63 9f 3b 4f 6a 16 f9 2e 65 ea 80 f6 c7 42 94 45 da 1f c2 c1 b9 36 50 40 e3 2e 50 c4 10 6f 3b 3d a1 ce 7c cb 1e 71 40 b1 53 49 3c 0f 3a d9 a9 bc ff 07 7e c4 59 6f 1d 0f 29 bf 9c ba a5 02 82 0f 73 2a f5 a9 3c 49 ee e3 3d 1c 4f 12 af 3b 42 97 af 91 fe 41 ea 9e 94 a2", recipeConfig: [ { "op": "ChaCha", "args": [ - {"option": "Hex", "string": "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff ff ee dd cc bb aa 99 88 77 66 55 44 33 22 11 00"}, - {"option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78"}, - 0, "12", "Hex", "Hex", + { + "option": "Hex", + "string": + "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff ff ee dd cc bb aa 99 88 77 66 55 44 33 22 11 00" + }, + { "option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78" }, + 0, + "12", + "Hex", + "Hex" ] } - ], + ] }, { name: "ChaCha: draft-strombergson-chacha-test-vectors-01 TC7.6", input: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", - expectedOutput: "9f ad f4 09 c0 08 11 d0 04 31 d6 7e fb d8 8f ba 59 21 8d 5d 67 08 b1 d6 85 86 3f ab bb 0e 96 1e ea 48 0f d6 fb 53 2b fd 49 4b 21 51 01 50 57 42 3a b6 0a 63 fe 4f 55 f7 a2 12 e2 16 7c ca b9 31 fb fd 29 cf 7b c1 d2 79 ed df 25 dd 31 6b b8 84 3d 6e de e0 bd 1e f1 21 d1 2f a1 7c bc 2c 57 4c cc ab 5e 27 51 67 b0 8b d6 86 f8 a0 9d f8 7e c3 ff b3 53 61 b9 4e bf a1 3f ec 0e 48 89 d1 8d a5", + expectedOutput: + "9f ad f4 09 c0 08 11 d0 04 31 d6 7e fb d8 8f ba 59 21 8d 5d 67 08 b1 d6 85 86 3f ab bb 0e 96 1e ea 48 0f d6 fb 53 2b fd 49 4b 21 51 01 50 57 42 3a b6 0a 63 fe 4f 55 f7 a2 12 e2 16 7c ca b9 31 fb fd 29 cf 7b c1 d2 79 ed df 25 dd 31 6b b8 84 3d 6e de e0 bd 1e f1 21 d1 2f a1 7c bc 2c 57 4c cc ab 5e 27 51 67 b0 8b d6 86 f8 a0 9d f8 7e c3 ff b3 53 61 b9 4e bf a1 3f ec 0e 48 89 d1 8d a5", recipeConfig: [ { "op": "ChaCha", "args": [ - {"option": "Hex", "string": "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff ff ee dd cc bb aa 99 88 77 66 55 44 33 22 11 00"}, - {"option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78"}, - 0, "20", "Hex", "Hex", + { + "option": "Hex", + "string": + "00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff ff ee dd cc bb aa 99 88 77 66 55 44 33 22 11 00" + }, + { "option": "Hex", "string": "0f 1e 2d 3c 4b 5a 69 78" }, + 0, + "20", + "Hex", + "Hex" ] } - ], - }, + ] + } ]); diff --git a/tests/operations/tests/ChangeIPFormat.mjs b/tests/operations/tests/ChangeIPFormat.mjs index d92ffb79..eb98f888 100644 --- a/tests/operations/tests/ChangeIPFormat.mjs +++ b/tests/operations/tests/ChangeIPFormat.mjs @@ -15,38 +15,41 @@ TestRegister.addTests([ recipeConfig: [ { op: "Change IP format", - args: ["Dotted Decimal", "Hex"], - }, - ], - }, { + args: ["Dotted Decimal", "Hex"] + } + ] + }, + { name: "Change IP format: Decimal to Dotted Decimal", input: "3232235777", expectedOutput: "192.168.1.1", recipeConfig: [ { op: "Change IP format", - args: ["Decimal", "Dotted Decimal"], - }, - ], - }, { + args: ["Decimal", "Dotted Decimal"] + } + ] + }, + { name: "Change IP format: Hex to Octal", input: "c0a80101", expectedOutput: "030052000401", recipeConfig: [ { op: "Change IP format", - args: ["Hex", "Octal"], - }, - ], - }, { + args: ["Hex", "Octal"] + } + ] + }, + { name: "Change IP format: Octal to Decimal", input: "030052000401", expectedOutput: "3232235777", recipeConfig: [ { op: "Change IP format", - args: ["Octal", "Decimal"], - }, - ], - }, + args: ["Octal", "Decimal"] + } + ] + } ]); diff --git a/tests/operations/tests/CharEnc.mjs b/tests/operations/tests/CharEnc.mjs index eecfaab6..9b9de24c 100644 --- a/tests/operations/tests/CharEnc.mjs +++ b/tests/operations/tests/CharEnc.mjs @@ -20,8 +20,8 @@ TestRegister.addTests([ { "op": "Decode text", "args": ["UTF-8 (65001)"] - }, - ], + } + ] }, { name: "Encode text, Decode text: hello", @@ -35,8 +35,8 @@ TestRegister.addTests([ { "op": "Decode text", "args": ["UTF-8 (65001)"] - }, - ], + } + ] }, { name: "Encode text (EBCDIC): hello", @@ -50,8 +50,8 @@ TestRegister.addTests([ { "op": "To Hex", "args": ["Space"] - }, - ], + } + ] }, { name: "Decode text (EBCDIC): 88 85 93 93 96", @@ -65,13 +65,13 @@ TestRegister.addTests([ { "op": "Decode text", "args": ["IBM EBCDIC International (500)"] - }, - ], + } + ] }, { name: "Generate Base64 Windows PowerShell", input: "ZABpAHIAIAAiAGMAOgBcAHAAcgBvAGcAcgBhAG0AIABmAGkAbABlAHMAIgAgAA==", - expectedOutput: "dir \"c:\\program files\" ", + expectedOutput: 'dir "c:\\program files" ', recipeConfig: [ { "op": "From Base64", @@ -84,7 +84,7 @@ TestRegister.addTests([ { "op": "Encode text", "args": ["UTF-8 (65001)"] - }, - ], - }, + } + ] + } ]); diff --git a/tests/operations/tests/Charts.mjs b/tests/operations/tests/Charts.mjs index a62b5741..3a59e08d 100644 --- a/tests/operations/tests/Charts.mjs +++ b/tests/operations/tests/Charts.mjs @@ -17,7 +17,7 @@ TestRegister.addTests([ "op": "Scatter chart", "args": ["Line feed", "Space", false, "time", "stress", "black", 5, false] } - ], + ] }, { name: "Hex density chart", @@ -28,7 +28,7 @@ TestRegister.addTests([ "op": "Hex Density chart", "args": ["Line feed", "Space", 25, 15, true, "", "", true, "white", "black", true] } - ], + ] }, { name: "Series chart", @@ -39,7 +39,7 @@ TestRegister.addTests([ "op": "Series chart", "args": ["Line feed", "Space", "", 1, "mediumseagreen, dodgerblue, tomato"] } - ], + ] }, { name: "Heatmap chart", @@ -50,6 +50,6 @@ TestRegister.addTests([ "op": "Heatmap chart", "args": ["Line feed", "Space", 25, 25, true, "", "", false, "white", "black"] } - ], - }, + ] + } ]); diff --git a/tests/operations/tests/Checksum.mjs b/tests/operations/tests/Checksum.mjs index 142ee267..3107a654 100644 --- a/tests/operations/tests/Checksum.mjs +++ b/tests/operations/tests/Checksum.mjs @@ -25,7 +25,7 @@ const ALL_BYTES = [ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf", "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef", - "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", + "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" ].join(""); TestRegister.addTests([ diff --git a/tests/operations/tests/CipherSaber2.mjs b/tests/operations/tests/CipherSaber2.mjs index dd675d45..f59315de 100644 --- a/tests/operations/tests/CipherSaber2.mjs +++ b/tests/operations/tests/CipherSaber2.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "CipherSaber2 Encrypt", - args: [{ "option": "Latin1", "string": "test" }, 20], - }, - ], + args: [{ "option": "Latin1", "string": "test" }, 20] + } + ] }, { name: "CipherSaber2 Decrypt", @@ -27,9 +27,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "CipherSaber2 Decrypt", - args: [{ "option": "Latin1", "string": "test" }, 20], - }, - ], + args: [{ "option": "Latin1", "string": "test" }, 20] + } + ] }, { name: "CipherSaber2 Encrypt", @@ -38,8 +38,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "CipherSaber2 Encrypt", - args: [{ "option": "Latin1", "string": "" }, 20], - }, - ], - }, + args: [{ "option": "Latin1", "string": "" }, 20] + } + ] + } ]); diff --git a/tests/operations/tests/Ciphers.mjs b/tests/operations/tests/Ciphers.mjs index 47453cf7..c762eef2 100644 --- a/tests/operations/tests/Ciphers.mjs +++ b/tests/operations/tests/Ciphers.mjs @@ -9,7 +9,6 @@ */ import TestRegister from "../../lib/TestRegister.mjs"; - TestRegister.addTests([ { name: "Affine Encode: no input", @@ -20,7 +19,7 @@ TestRegister.addTests([ op: "Affine Cipher Encode", args: [1, 0] } - ], + ] }, { name: "Affine Encode: invalid a & b (non-integer)", @@ -31,7 +30,7 @@ TestRegister.addTests([ op: "Affine Cipher Encode", args: [0.1, 0.00001] } - ], + ] }, { name: "Affine Encode: no effect", @@ -42,7 +41,7 @@ TestRegister.addTests([ op: "Affine Cipher Encode", args: [1, 0] } - ], + ] }, { name: "Affine Encode: normal", @@ -53,7 +52,7 @@ TestRegister.addTests([ op: "Affine Cipher Encode", args: [23, 23] } - ], + ] }, { name: "Affine Decode: no input", @@ -64,7 +63,7 @@ TestRegister.addTests([ op: "Affine Cipher Decode", args: [1, 0] } - ], + ] }, { name: "Affine Decode: invalid a & b (non-integer)", @@ -75,7 +74,7 @@ TestRegister.addTests([ op: "Affine Cipher Decode", args: [0.1, 0.00001] } - ], + ] }, { name: "Affine Decode: invalid a (coprime)", @@ -86,7 +85,7 @@ TestRegister.addTests([ op: "Affine Cipher Decode", args: [8, 23] } - ], + ] }, { name: "Affine Decode: no effect", @@ -97,7 +96,7 @@ TestRegister.addTests([ op: "Affine Cipher Decode", args: [1, 0] } - ], + ] }, { name: "Affine Decode: normal", @@ -108,7 +107,7 @@ TestRegister.addTests([ op: "Affine Cipher Decode", args: [23, 23] } - ], + ] }, { name: "A1Z26 Encode: normal", @@ -119,7 +118,7 @@ TestRegister.addTests([ op: "A1Z26 Cipher Encode", args: ["Space"] } - ], + ] }, { name: "A1Z26 Decode: normal", @@ -130,7 +129,7 @@ TestRegister.addTests([ op: "A1Z26 Cipher Decode", args: ["Space"] } - ], + ] }, { name: "A1Z26 Decode: error", @@ -141,7 +140,7 @@ TestRegister.addTests([ op: "A1Z26 Cipher Decode", args: ["Space"] } - ], + ] }, { name: "Atbash: no input", @@ -152,7 +151,7 @@ TestRegister.addTests([ op: "Atbash Cipher", args: [] } - ], + ] }, { name: "Atbash: normal", @@ -163,7 +162,7 @@ TestRegister.addTests([ op: "Atbash Cipher", args: [] } - ], + ] }, { name: "Bifid Cipher Encode: no input", @@ -174,7 +173,7 @@ TestRegister.addTests([ "op": "Bifid Cipher Encode", "args": ["nothing"] } - ], + ] }, { name: "Bifid Cipher Encode: no key", @@ -185,7 +184,7 @@ TestRegister.addTests([ "op": "Bifid Cipher Encode", "args": [""] } - ], + ] }, { name: "Bifid Cipher Encode: invalid key (non-alphabetic)", @@ -196,7 +195,7 @@ TestRegister.addTests([ "op": "Bifid Cipher Encode", "args": ["abc123"] } - ], + ] }, { name: "Bifid Cipher Encode: normal", @@ -207,7 +206,7 @@ TestRegister.addTests([ "op": "Bifid Cipher Encode", "args": ["Schrodinger"] } - ], + ] }, { name: "Bifid Cipher Decode: no input", @@ -218,7 +217,7 @@ TestRegister.addTests([ "op": "Bifid Cipher Decode", "args": ["nothing"] } - ], + ] }, { name: "Bifid Cipher Decode: no key", @@ -229,7 +228,7 @@ TestRegister.addTests([ "op": "Bifid Cipher Decode", "args": [""] } - ], + ] }, { name: "Bifid Cipher Decode: invalid key (non-alphabetic)", @@ -240,7 +239,7 @@ TestRegister.addTests([ "op": "Bifid Cipher Decode", "args": ["abc123"] } - ], + ] }, { name: "Bifid Cipher Decode: normal", @@ -251,7 +250,7 @@ TestRegister.addTests([ "op": "Bifid Cipher Decode", "args": ["Schrodinger"] } - ], + ] }, { name: "Citrix CTX1 Encode", @@ -262,7 +261,7 @@ TestRegister.addTests([ "op": "Citrix CTX1 Encode", "args": [] } - ], + ] }, { name: "Citrix CTX1 Decode: normal", @@ -273,7 +272,7 @@ TestRegister.addTests([ "op": "Citrix CTX1 Decode", "args": [] } - ], + ] }, { name: "Citrix CTX1 Decode: invalid length", @@ -284,7 +283,7 @@ TestRegister.addTests([ "op": "Citrix CTX1 Decode", "args": [] } - ], + ] }, { name: "Vigenère Encode: no input", @@ -295,7 +294,7 @@ TestRegister.addTests([ "op": "Vigenère Encode", "args": ["nothing"] } - ], + ] }, { name: "Vigenère Encode: no key", @@ -306,7 +305,7 @@ TestRegister.addTests([ "op": "Vigenère Encode", "args": [""] } - ], + ] }, { name: "Vigenère Encode: invalid key", @@ -317,7 +316,7 @@ TestRegister.addTests([ "op": "Vigenère Encode", "args": ["abc123"] } - ], + ] }, { name: "Vigenère Encode: normal", @@ -328,7 +327,7 @@ TestRegister.addTests([ "op": "Vigenère Encode", "args": ["Edward"] } - ], + ] }, { name: "Vigenère Decode: no input", @@ -339,7 +338,7 @@ TestRegister.addTests([ "op": "Vigenère Decode", "args": ["nothing"] } - ], + ] }, { name: "Vigenère Decode: no key", @@ -350,7 +349,7 @@ TestRegister.addTests([ "op": "Vigenère Decode", "args": [""] } - ], + ] }, { name: "Vigenère Decode: invalid key", @@ -361,7 +360,7 @@ TestRegister.addTests([ "op": "Vigenère Decode", "args": ["abc123"] } - ], + ] }, { name: "Vigenère Decode: normal", @@ -372,7 +371,7 @@ TestRegister.addTests([ "op": "Vigenère Decode", "args": ["Edward"] } - ], + ] }, { name: "Substitute: no pt/ct", @@ -383,7 +382,7 @@ TestRegister.addTests([ "op": "Substitute", "args": ["", ""] } - ], + ] }, { name: "Substitute: no input", @@ -394,7 +393,7 @@ TestRegister.addTests([ "op": "Substitute", "args": ["abcdefghijklmnopqrstuvwxyz", "zebrascdfghijklmnopqtuvwxy"] } - ], + ] }, { name: "Substitute: uneven pt/ct", @@ -405,7 +404,7 @@ TestRegister.addTests([ "op": "Substitute", "args": ["abcdefghijklmnopqrstuvwxyz", "zebrascdfghijklmnopqtuvwx"] } - ], + ] }, { name: "Substitute: normal", @@ -416,7 +415,7 @@ TestRegister.addTests([ "op": "Substitute", "args": ["abcdefghijklmnopqrstuvwxyz", "zebrascdfghijklmnopqtuvwxy"] } - ], + ] }, { name: "Rail Fence Cipher Decode: normal", @@ -427,7 +426,7 @@ TestRegister.addTests([ "op": "Rail Fence Cipher Decode", "args": [2, 0] } - ], + ] }, { name: "Rail Fence Cipher Decode: key has to be bigger than 2", @@ -438,7 +437,7 @@ TestRegister.addTests([ "op": "Rail Fence Cipher Decode", "args": [1, 0] } - ], + ] }, { name: "Rail Fence Cipher Decode: key has to be smaller than input's length", @@ -449,7 +448,7 @@ TestRegister.addTests([ "op": "Rail Fence Cipher Decode", "args": [22, 0] } - ], + ] }, { name: "Rail Fence Cipher Decode: offset should be positive", @@ -460,7 +459,7 @@ TestRegister.addTests([ "op": "Rail Fence Cipher Decode", "args": [2, -1] } - ], + ] }, { name: "Rail Fence Cipher Decode: Normal with Offset non-null", @@ -471,7 +470,7 @@ TestRegister.addTests([ "op": "Rail Fence Cipher Decode", "args": [4, 2] } - ], + ] }, { name: "Rail Fence Cipher Encode: normal", @@ -482,7 +481,7 @@ TestRegister.addTests([ "op": "Rail Fence Cipher Encode", "args": [2, 0] } - ], + ] }, { name: "Rail Fence Cipher Encode: key has to be bigger than 2", @@ -493,7 +492,7 @@ TestRegister.addTests([ "op": "Rail Fence Cipher Encode", "args": [1, 0] } - ], + ] }, { name: "Rail Fence Cipher Encode: key has to be smaller than input's length", @@ -504,7 +503,7 @@ TestRegister.addTests([ "op": "Rail Fence Cipher Encode", "args": [22, 0] } - ], + ] }, { name: "Rail Fence Cipher Encode: offset should be positive", @@ -515,7 +514,7 @@ TestRegister.addTests([ "op": "Rail Fence Cipher Encode", "args": [2, -1] } - ], + ] }, { name: "Rail Fence Cipher Encode: Normal with Offset non-null", @@ -526,6 +525,6 @@ TestRegister.addTests([ "op": "Rail Fence Cipher Encode", "args": [4, 2] } - ], - }, + ] + } ]); diff --git a/tests/operations/tests/Code.mjs b/tests/operations/tests/Code.mjs index 6ff1d97c..a895ed82 100644 --- a/tests/operations/tests/Code.mjs +++ b/tests/operations/tests/Code.mjs @@ -11,42 +11,50 @@ import TestRegister from "../../lib/TestRegister.mjs"; const JSON_TEST_DATA = { "store": { - "book": [{ - "category": "reference", - "author": "Nigel Rees", - "title": "Sayings of the Century", - "price": 8.95 - }, { - "category": "fiction", - "author": "Evelyn Waugh", - "title": "Sword of Honour", - "price": 12.99 - }, { - "category": "fiction", - "author": "Herman Melville", - "title": "Moby Dick", - "isbn": "0-553-21311-3", - "price": 8.99 - }, { - "category": "fiction", - "author": "J. R. R. Tolkien", - "title": "The Lord of the Rings", - "isbn": "0-395-19395-8", - "price": 22.99 - }], + "book": [ + { + "category": "reference", + "author": "Nigel Rees", + "title": "Sayings of the Century", + "price": 8.95 + }, + { + "category": "fiction", + "author": "Evelyn Waugh", + "title": "Sword of Honour", + "price": 12.99 + }, + { + "category": "fiction", + "author": "Herman Melville", + "title": "Moby Dick", + "isbn": "0-553-21311-3", + "price": 8.99 + }, + { + "category": "fiction", + "author": "J. R. R. Tolkien", + "title": "The Lord of the Rings", + "isbn": "0-395-19395-8", + "price": 22.99 + } + ], "bicycle": { "color": "red", "price": 19.95 }, - "newspaper": [{ - "format": "broadsheet", - "title": "Financial Times", - "price": 2.75 - }, { - "format": "tabloid", - "title": "The Guardian", - "price": 2.00 - }] + "newspaper": [ + { + "format": "broadsheet", + "title": "Financial Times", + "price": 2.75 + }, + { + "format": "tabloid", + "title": "The Guardian", + "price": 2.0 + } + ] } }; @@ -60,7 +68,7 @@ TestRegister.addTests([ "op": "To Camel case", "args": [false] } - ], + ] }, { name: "To Snake case (dumb)", @@ -71,7 +79,7 @@ TestRegister.addTests([ "op": "To Snake case", "args": [false] } - ], + ] }, { name: "To Kebab case (dumb)", @@ -82,7 +90,7 @@ TestRegister.addTests([ "op": "To Kebab case", "args": [false] } - ], + ] }, { name: "To Camel case (smart)", @@ -93,8 +101,8 @@ TestRegister.addTests([ "$a_camel_case_variable;", "function function_name() {", " console.log('things inside quotes do not get broken');", - " console.log(\"things inside quotes do not get broken\");", - "}", + ' console.log("things inside quotes do not get broken");', + "}" ].join("\n"), expectedOutput: [ "test='hello'", @@ -103,15 +111,15 @@ TestRegister.addTests([ "$aCamelCaseVariable;", "function functionName() {", " console.log('things inside quotes do not get broken');", - " console.log(\"things inside quotes do not get broken\");", - "}", + ' console.log("things inside quotes do not get broken");', + "}" ].join("\n"), recipeConfig: [ { "op": "To Camel case", "args": [true] } - ], + ] }, { name: "To Snake case (smart)", @@ -122,8 +130,8 @@ TestRegister.addTests([ "$aSnakeCaseVariable;", "function functionName() {", " console.log('things inside quotes do not get broken');", - " console.log(\"things inside quotes do not get broken\");", - "}", + ' console.log("things inside quotes do not get broken");', + "}" ].join("\n"), expectedOutput: [ "test='hello'", @@ -132,15 +140,15 @@ TestRegister.addTests([ "$a_snake_case_variable;", "function function_name() {", " console.log('things inside quotes do not get broken');", - " console.log(\"things inside quotes do not get broken\");", - "}", + ' console.log("things inside quotes do not get broken");', + "}" ].join("\n"), recipeConfig: [ { "op": "To Snake case", "args": [true] } - ], + ] }, { name: "To Kebab case (smart)", @@ -151,8 +159,8 @@ TestRegister.addTests([ "$aKebabCaseVariable;", "function functionName() {", " console.log('things inside quotes do not get broken');", - " console.log(\"things inside quotes do not get broken\");", - "}", + ' console.log("things inside quotes do not get broken");', + "}" ].join("\n"), expectedOutput: [ "test='hello'", @@ -161,15 +169,15 @@ TestRegister.addTests([ "$a-kebab-case-variable;", "function function-name() {", " console.log('things inside quotes do not get broken');", - " console.log(\"things inside quotes do not get broken\");", - "}", + ' console.log("things inside quotes do not get broken");', + "}" ].join("\n"), recipeConfig: [ { "op": "To Kebab case", "args": [true] } - ], + ] }, { name: "JPath Expression: Empty JSON", @@ -180,7 +188,7 @@ TestRegister.addTests([ "op": "JPath expression", "args": ["", "\n"] } - ], + ] }, { name: "JPath Expression: Empty expression", @@ -191,124 +199,120 @@ TestRegister.addTests([ "op": "JPath expression", "args": ["", "\n", true] } - ], + ] }, { name: "JPath Expression: Fetch of values from specific object", input: JSON.stringify(JSON_TEST_DATA), - expectedOutput: [ - "\"Nigel Rees\"", - "\"Evelyn Waugh\"", - "\"Herman Melville\"", - "\"J. R. R. Tolkien\"" - ].join("\n"), + expectedOutput: ['"Nigel Rees"', '"Evelyn Waugh"', '"Herman Melville"', '"J. R. R. Tolkien"'].join("\n"), recipeConfig: [ { "op": "JPath expression", "args": ["$.store.book[*].author", "\n", true] } - ], + ] }, { name: "JPath Expression: Fetch of all values with matching key", input: JSON.stringify(JSON_TEST_DATA), expectedOutput: [ - "\"Sayings of the Century\"", - "\"Sword of Honour\"", - "\"Moby Dick\"", - "\"The Lord of the Rings\"", - "\"Financial Times\"", - "\"The Guardian\"" + '"Sayings of the Century"', + '"Sword of Honour"', + '"Moby Dick"', + '"The Lord of the Rings"', + '"Financial Times"', + '"The Guardian"' ].join("\n"), recipeConfig: [ { "op": "JPath expression", "args": ["$..title", "\n", true] } - ], + ] }, { name: "JPath Expression: All data in object", input: JSON.stringify(JSON_TEST_DATA), expectedOutput: [ - "[{\"category\":\"reference\",\"author\":\"Nigel Rees\",\"title\":\"Sayings of the Century\",\"price\":8.95},{\"category\":\"fiction\",\"author\":\"Evelyn Waugh\",\"title\":\"Sword of Honour\",\"price\":12.99},{\"category\":\"fiction\",\"author\":\"Herman Melville\",\"title\":\"Moby Dick\",\"isbn\":\"0-553-21311-3\",\"price\":8.99},{\"category\":\"fiction\",\"author\":\"J. R. R. Tolkien\",\"title\":\"The Lord of the Rings\",\"isbn\":\"0-395-19395-8\",\"price\":22.99}]", - "{\"color\":\"red\",\"price\":19.95}", - "[{\"format\":\"broadsheet\",\"title\":\"Financial Times\",\"price\":2.75},{\"format\":\"tabloid\",\"title\":\"The Guardian\",\"price\":2}]" + '[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]', + '{"color":"red","price":19.95}', + '[{"format":"broadsheet","title":"Financial Times","price":2.75},{"format":"tabloid","title":"The Guardian","price":2}]' ].join("\n"), recipeConfig: [ { "op": "JPath expression", "args": ["$.store.*", "\n", true] } - ], + ] }, { name: "JPath Expression: Last element in array", input: JSON.stringify(JSON_TEST_DATA), - expectedOutput: "{\"category\":\"fiction\",\"author\":\"J. R. R. Tolkien\",\"title\":\"The Lord of the Rings\",\"isbn\":\"0-395-19395-8\",\"price\":22.99}", + expectedOutput: + '{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}', recipeConfig: [ { "op": "JPath expression", "args": ["$..book[-1:]", "\n", true] } - ], + ] }, { name: "JPath Expression: First 2 elements in array", input: JSON.stringify(JSON_TEST_DATA), expectedOutput: [ - "{\"category\":\"reference\",\"author\":\"Nigel Rees\",\"title\":\"Sayings of the Century\",\"price\":8.95}", - "{\"category\":\"fiction\",\"author\":\"Evelyn Waugh\",\"title\":\"Sword of Honour\",\"price\":12.99}" + '{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95}', + '{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}' ].join("\n"), recipeConfig: [ { "op": "JPath expression", "args": ["$..book[:2]", "\n", true] } - ], + ] }, { name: "JPath Expression: All elements in array with property", input: JSON.stringify(JSON_TEST_DATA), expectedOutput: [ - "{\"category\":\"fiction\",\"author\":\"Herman Melville\",\"title\":\"Moby Dick\",\"isbn\":\"0-553-21311-3\",\"price\":8.99}", - "{\"category\":\"fiction\",\"author\":\"J. R. R. Tolkien\",\"title\":\"The Lord of the Rings\",\"isbn\":\"0-395-19395-8\",\"price\":22.99}" + '{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}', + '{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}' ].join("\n"), recipeConfig: [ { "op": "JPath expression", "args": ["$..book[?(@.isbn)]", "\n", false] } - ], + ] }, { name: "JPath Expression: All elements in array which meet condition", input: JSON.stringify(JSON_TEST_DATA), expectedOutput: [ - "{\"category\":\"fiction\",\"author\":\"Evelyn Waugh\",\"title\":\"Sword of Honour\",\"price\":12.99}", - "{\"category\":\"fiction\",\"author\":\"Herman Melville\",\"title\":\"Moby Dick\",\"isbn\":\"0-553-21311-3\",\"price\":8.99}", - "{\"category\":\"fiction\",\"author\":\"J. R. R. Tolkien\",\"title\":\"The Lord of the Rings\",\"isbn\":\"0-395-19395-8\",\"price\":22.99}" + '{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}', + '{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}', + '{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}' ].join("\n"), recipeConfig: [ { "op": "JPath expression", - "args": ["$..book[?(@.price<30 && @.category==\"fiction\")]", "\n", false] + "args": ['$..book[?(@.price<30 && @.category=="fiction")]', "\n", false] } - ], + ] }, { name: "JPath Expression: All elements in object", input: JSON.stringify(JSON_TEST_DATA), expectedOutput: [ - "{\"category\":\"reference\",\"author\":\"Nigel Rees\",\"title\":\"Sayings of the Century\",\"price\":8.95}", - "{\"category\":\"fiction\",\"author\":\"Herman Melville\",\"title\":\"Moby Dick\",\"isbn\":\"0-553-21311-3\",\"price\":8.99}" + '{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95}', + '{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}' ].join("\n"), recipeConfig: [ { "op": "JPath expression", "args": ["$..book[?(@.price<10)]", "\n", false] } - ], + ] }, { name: "JPath Expression: Script-based expression", @@ -343,7 +347,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "XPath expression", - "args": ["/div/p[@class=\"a\"]", "\\n"] + "args": ['/div/p[@class="a"]', "\\n"] } ] }, @@ -376,7 +380,8 @@ TestRegister.addTests([ { name: "To MessagePack: valid json", input: JSON.stringify(JSON_TEST_DATA), - expectedOutput: "81 a5 73 74 6f 72 65 83 a4 62 6f 6f 6b 94 84 a8 63 61 74 65 67 6f 72 79 a9 72 65 66 65 72 65 6e 63 65 a6 61 75 74 68 6f 72 aa 4e 69 67 65 6c 20 52 65 65 73 a5 74 69 74 6c 65 b6 53 61 79 69 6e 67 73 20 6f 66 20 74 68 65 20 43 65 6e 74 75 72 79 a5 70 72 69 63 65 cb 40 21 e6 66 66 66 66 66 84 a8 63 61 74 65 67 6f 72 79 a7 66 69 63 74 69 6f 6e a6 61 75 74 68 6f 72 ac 45 76 65 6c 79 6e 20 57 61 75 67 68 a5 74 69 74 6c 65 af 53 77 6f 72 64 20 6f 66 20 48 6f 6e 6f 75 72 a5 70 72 69 63 65 cb 40 29 fa e1 47 ae 14 7b 85 a8 63 61 74 65 67 6f 72 79 a7 66 69 63 74 69 6f 6e a6 61 75 74 68 6f 72 af 48 65 72 6d 61 6e 20 4d 65 6c 76 69 6c 6c 65 a5 74 69 74 6c 65 a9 4d 6f 62 79 20 44 69 63 6b a4 69 73 62 6e ad 30 2d 35 35 33 2d 32 31 33 31 31 2d 33 a5 70 72 69 63 65 cb 40 21 fa e1 47 ae 14 7b 85 a8 63 61 74 65 67 6f 72 79 a7 66 69 63 74 69 6f 6e a6 61 75 74 68 6f 72 b0 4a 2e 20 52 2e 20 52 2e 20 54 6f 6c 6b 69 65 6e a5 74 69 74 6c 65 b5 54 68 65 20 4c 6f 72 64 20 6f 66 20 74 68 65 20 52 69 6e 67 73 a4 69 73 62 6e ad 30 2d 33 39 35 2d 31 39 33 39 35 2d 38 a5 70 72 69 63 65 cb 40 36 fd 70 a3 d7 0a 3d a7 62 69 63 79 63 6c 65 82 a5 63 6f 6c 6f 72 a3 72 65 64 a5 70 72 69 63 65 cb 40 33 f3 33 33 33 33 33 a9 6e 65 77 73 70 61 70 65 72 92 83 a6 66 6f 72 6d 61 74 aa 62 72 6f 61 64 73 68 65 65 74 a5 74 69 74 6c 65 af 46 69 6e 61 6e 63 69 61 6c 20 54 69 6d 65 73 a5 70 72 69 63 65 cb 40 06 00 00 00 00 00 00 83 a6 66 6f 72 6d 61 74 a7 74 61 62 6c 6f 69 64 a5 74 69 74 6c 65 ac 54 68 65 20 47 75 61 72 64 69 61 6e a5 70 72 69 63 65 02", + expectedOutput: + "81 a5 73 74 6f 72 65 83 a4 62 6f 6f 6b 94 84 a8 63 61 74 65 67 6f 72 79 a9 72 65 66 65 72 65 6e 63 65 a6 61 75 74 68 6f 72 aa 4e 69 67 65 6c 20 52 65 65 73 a5 74 69 74 6c 65 b6 53 61 79 69 6e 67 73 20 6f 66 20 74 68 65 20 43 65 6e 74 75 72 79 a5 70 72 69 63 65 cb 40 21 e6 66 66 66 66 66 84 a8 63 61 74 65 67 6f 72 79 a7 66 69 63 74 69 6f 6e a6 61 75 74 68 6f 72 ac 45 76 65 6c 79 6e 20 57 61 75 67 68 a5 74 69 74 6c 65 af 53 77 6f 72 64 20 6f 66 20 48 6f 6e 6f 75 72 a5 70 72 69 63 65 cb 40 29 fa e1 47 ae 14 7b 85 a8 63 61 74 65 67 6f 72 79 a7 66 69 63 74 69 6f 6e a6 61 75 74 68 6f 72 af 48 65 72 6d 61 6e 20 4d 65 6c 76 69 6c 6c 65 a5 74 69 74 6c 65 a9 4d 6f 62 79 20 44 69 63 6b a4 69 73 62 6e ad 30 2d 35 35 33 2d 32 31 33 31 31 2d 33 a5 70 72 69 63 65 cb 40 21 fa e1 47 ae 14 7b 85 a8 63 61 74 65 67 6f 72 79 a7 66 69 63 74 69 6f 6e a6 61 75 74 68 6f 72 b0 4a 2e 20 52 2e 20 52 2e 20 54 6f 6c 6b 69 65 6e a5 74 69 74 6c 65 b5 54 68 65 20 4c 6f 72 64 20 6f 66 20 74 68 65 20 52 69 6e 67 73 a4 69 73 62 6e ad 30 2d 33 39 35 2d 31 39 33 39 35 2d 38 a5 70 72 69 63 65 cb 40 36 fd 70 a3 d7 0a 3d a7 62 69 63 79 63 6c 65 82 a5 63 6f 6c 6f 72 a3 72 65 64 a5 70 72 69 63 65 cb 40 33 f3 33 33 33 33 33 a9 6e 65 77 73 70 61 70 65 72 92 83 a6 66 6f 72 6d 61 74 aa 62 72 6f 61 64 73 68 65 65 74 a5 74 69 74 6c 65 af 46 69 6e 61 6e 63 69 61 6c 20 54 69 6d 65 73 a5 70 72 69 63 65 cb 40 06 00 00 00 00 00 00 83 a6 66 6f 72 6d 61 74 a7 74 61 62 6c 6f 69 64 a5 74 69 74 6c 65 ac 54 68 65 20 47 75 61 72 64 69 61 6e a5 70 72 69 63 65 02", recipeConfig: [ { "op": "To MessagePack", diff --git a/tests/operations/tests/Colossus.mjs b/tests/operations/tests/Colossus.mjs index 67464c9e..140fb023 100644 --- a/tests/operations/tests/Colossus.mjs +++ b/tests/operations/tests/Colossus.mjs @@ -17,23 +17,65 @@ TestRegister.addTests([ "args": [ "", "KH Pattern", - "Z", "", "", - "None", "Select Program", "Letter Count", + "Z", + "", + "", + "None", + "Select Program", + "Letter Count", + "", + "", + "", + "", + "", "", - "", "", "", "", "", false, "", - "", "", "", "", "", false, "", - "", "", "", "", "", false, "", false, "", - false, false, false, false, false, - "", false, false, "", "", - 0, "", "", - "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" + "", + "", + "", + "", + false, + "", + "", + "", + "", + "", + "", + false, + "", + false, + "", + false, + false, + false, + false, + false, + "", + false, + false, + "", + "", + 0, + "", + "", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1" ] } ] - }, + } // Takes a while to run, so disabling for general purpose testing. Re-enable if modifying this operation. // { // name: "Colossus 1+2=.", diff --git a/tests/operations/tests/Comment.mjs b/tests/operations/tests/Comment.mjs index 06bf58f2..7dd51c2b 100644 --- a/tests/operations/tests/Comment.mjs +++ b/tests/operations/tests/Comment.mjs @@ -24,7 +24,7 @@ const ALL_BYTES = [ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf", "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef", - "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", + "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" ].join(""); TestRegister.addTests([ diff --git a/tests/operations/tests/Compress.mjs b/tests/operations/tests/Compress.mjs index 60117c67..8f55cc9d 100644 --- a/tests/operations/tests/Compress.mjs +++ b/tests/operations/tests/Compress.mjs @@ -21,7 +21,7 @@ TestRegister.addTests([ "op": "Bzip2 Decompress", "args": [] } - ], + ] }, { name: "LZMA compress & decompress", @@ -36,8 +36,8 @@ TestRegister.addTests([ { "op": "LZMA Decompress", "args": [] - }, - ], + } + ] }, { name: "LZMA decompress: binary", @@ -57,7 +57,7 @@ TestRegister.addTests([ "op": "To Hex", "args": ["Space", 0] } - ], + ] }, { name: "LZMA decompress: string", @@ -73,7 +73,7 @@ TestRegister.addTests([ "op": "LZMA Decompress", "args": [] } - ], + ] }, { name: "LZ4 Compress", @@ -88,7 +88,7 @@ TestRegister.addTests([ "op": "To Hex", "args": ["None", 0] } - ], + ] }, { name: "LZ4 Decompress", @@ -103,6 +103,6 @@ TestRegister.addTests([ "op": "LZ4 Decompress", "args": [] } - ], - }, + ] + } ]); diff --git a/tests/operations/tests/ConditionalJump.mjs b/tests/operations/tests/ConditionalJump.mjs index 6275f590..143923b1 100644 --- a/tests/operations/tests/ConditionalJump.mjs +++ b/tests/operations/tests/ConditionalJump.mjs @@ -11,83 +11,72 @@ import TestRegister from "../../lib/TestRegister.mjs"; TestRegister.addTests([ { name: "Conditional Jump: Skips 0", - input: [ - "should be changed", - ].join("\n"), - expectedOutput: [ - "YzJodmRXeGtJR0psSUdOb1lXNW5aV1E9" - ].join("\n"), + input: ["should be changed"].join("\n"), + expectedOutput: ["YzJodmRXeGtJR0psSUdOb1lXNW5aV1E9"].join("\n"), recipeConfig: [ { op: "Conditional Jump", - args: ["match", false, "", 0], + args: ["match", false, "", 0] }, { op: "To Base64", - args: ["A-Za-z0-9+/="], + args: ["A-Za-z0-9+/="] }, { op: "To Base64", - args: ["A-Za-z0-9+/="], - }, - ], + args: ["A-Za-z0-9+/="] + } + ] }, { name: "Conditional Jump: Skips 1", - input: [ - "should be changed", - ].join("\n"), + input: ["should be changed"].join("\n"), // Expecting base32, not base64 output - expectedOutput: [ - "ONUG65LMMQQGEZJAMNUGC3THMVSA====", - ].join("\n"), + expectedOutput: ["ONUG65LMMQQGEZJAMNUGC3THMVSA===="].join("\n"), recipeConfig: [ { op: "Conditional Jump", - args: ["should", false, "skip match", 10], + args: ["should", false, "skip match", 10] }, { op: "To Base64", - args: ["A-Za-z0-9+/="], + args: ["A-Za-z0-9+/="] }, { - op: "Label", args: ["skip match"], + op: "Label", + args: ["skip match"] }, { op: "To Base32", - args: ["A-Z2-7="], - }, - ], + args: ["A-Z2-7="] + } + ] }, { name: "Conditional Jump: Skips backwards", - input: [ - "match", - ].join("\n"), - expectedOutput: [ - "f7cf556f7f4fc6635db8c314f7a81f2a", - ].join("\n"), + input: ["match"].join("\n"), + expectedOutput: ["f7cf556f7f4fc6635db8c314f7a81f2a"].join("\n"), recipeConfig: [ { op: "Label", - args: ["back to the beginning"], + args: ["back to the beginning"] }, { op: "Jump", - args: ["skip replace"], + args: ["skip replace"] }, { op: "MD2", - args: [], + args: [] }, { op: "Label", - args: ["skip replace"], + args: ["skip replace"] }, { op: "Conditional Jump", - args: ["match", false, "back to the beginning", 10], - }, - ], + args: ["match", false, "back to the beginning", 10] + } + ] } ]); diff --git a/tests/operations/tests/ConvertCoordinateFormat.mjs b/tests/operations/tests/ConvertCoordinateFormat.mjs index afe35d87..8f7cdb27 100644 --- a/tests/operations/tests/ConvertCoordinateFormat.mjs +++ b/tests/operations/tests/ConvertCoordinateFormat.mjs @@ -29,8 +29,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Decimal Degrees", "Comma", "Degrees Minutes Seconds", "Comma", "None", 1] - }, - ], + } + ] }, { name: "Co-ordinates: From Degrees Minutes Seconds to Decimal Degrees", @@ -40,8 +40,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Degrees Minutes Seconds", "Comma", "Decimal Degrees", "Comma", "None", 3] - }, - ], + } + ] }, { name: "Co-ordinates: From Decimal Degrees to Degrees Decimal Minutes", @@ -84,8 +84,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Decimal Degrees", "Comma", "Geohash", "Comma", "None", 9] - }, - ], + } + ] }, { name: "Co-ordinates: From Geohash to Decimal Degrees", @@ -95,8 +95,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Geohash", "Comma", "Decimal Degrees", "Comma", "None", 3] - }, - ], + } + ] }, { name: "Co-ordinates: From Decimal Degrees to MGRS", @@ -106,8 +106,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Decimal Degrees", "Comma", "Military Grid Reference System", "Comma", "None", 10] - }, - ], + } + ] }, { name: "Co-ordinates: From MGRS to Decimal Degrees", @@ -128,8 +128,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Decimal Degrees", "Comma", "Ordnance Survey National Grid", "Comma", "None", 10] - }, - ], + } + ] }, { name: "Co-ordinates: From OSNG to Decimal Degrees", @@ -139,8 +139,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Ordnance Survey National Grid", "Comma", "Decimal Degrees", "Comma", "None", 3] - }, - ], + } + ] }, { name: "Co-ordinates: From Decimal Degrees to UTM", @@ -150,8 +150,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Decimal Degrees", "Comma", "Universal Transverse Mercator", "Comma", "None", 0] - }, - ], + } + ] }, { name: "Co-ordinates: From UTM to Decimal Degrees", @@ -161,8 +161,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Universal Transverse Mercator", "Comma", "Decimal Degrees", "Comma", "None", 3] - }, - ], + } + ] }, { name: "Co-ordinates: Directions in input, not output", @@ -172,8 +172,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Decimal Degrees", "Comma", "Decimal Degrees", "Comma", "None", 3] - }, - ], + } + ] }, { name: "Co-ordinates: Directions in input and output", @@ -183,8 +183,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Decimal Degrees", "Comma", "Decimal Degrees", "Comma", "Before", 3] - }, - ], + } + ] }, { name: "Co-ordinates: Directions not in input, in output", @@ -194,8 +194,8 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Decimal Degrees", "Comma", "Decimal Degrees", "Comma", "Before", 3] - }, - ], + } + ] }, { name: "Co-ordinates: Directions not in input, in converted output", @@ -205,7 +205,7 @@ TestRegister.addTests([ { op: "Convert co-ordinate format", args: ["Decimal Degrees", "Comma", "Degrees Minutes Seconds", "Comma", "Before", 3] - }, - ], + } + ] } ]); diff --git a/tests/operations/tests/ConvertToNATOAlphabet.mjs b/tests/operations/tests/ConvertToNATOAlphabet.mjs index 6005b887..55226bf6 100644 --- a/tests/operations/tests/ConvertToNATOAlphabet.mjs +++ b/tests/operations/tests/ConvertToNATOAlphabet.mjs @@ -21,7 +21,8 @@ TestRegister.addTests([ { name: "Convert to NATO alphabet: full alphabet with numbers", input: "abcdefghijklmnopqrstuvwxyz0123456789,/.", - expectedOutput: "Alfa Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliett Kilo Lima Mike November Oscar Papa Quebec Romeo Sierra Tango Uniform Victor Whiskey X-ray Yankee Zulu Zero One Two Three Four Five Six Seven Eight Nine Comma Fraction bar Full stop ", + expectedOutput: + "Alfa Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliett Kilo Lima Mike November Oscar Papa Quebec Romeo Sierra Tango Uniform Victor Whiskey X-ray Yankee Zulu Zero One Two Three Four Five Six Seven Eight Nine Comma Fraction bar Full stop ", recipeConfig: [ { op: "Convert to NATO alphabet", diff --git a/tests/operations/tests/Crypt.mjs b/tests/operations/tests/Crypt.mjs index 0c424050..3210388c 100644 --- a/tests/operations/tests/Crypt.mjs +++ b/tests/operations/tests/Crypt.mjs @@ -71,29 +71,34 @@ The following algorithms will be used based on the size of the key: { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""}, - "CBC", "Raw", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" }, + "CBC", + "Raw", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-CBC with IV0, ASCII", input: "The quick brown fox jumps over the lazy dog.", - expectedOutput: "2ef6c3fdb1314b5c2c326a2087fe1a82d5e73bf605ec8431d73e847187fc1c8fbbe969c177df1ecdf8c13f2f505f9498", + expectedOutput: + "2ef6c3fdb1314b5c2c326a2087fe1a82d5e73bf605ec8431d73e847187fc1c8fbbe969c177df1ecdf8c13f2f505f9498", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00000000000000000000000000000000"}, - "CBC", "Raw", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00000000000000000000000000000000" }, + "CBC", + "Raw", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-CTR with IV0, ASCII", @@ -103,29 +108,34 @@ The following algorithms will be used based on the size of the key: { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00000000000000000000000000000000"}, - "CTR", "Raw", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00000000000000000000000000000000" }, + "CTR", + "Raw", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-CBC with IV1, ASCII", input: "The quick brown fox jumps over the lazy dog.", - expectedOutput: "4fa077d50cc71a57393e7b542c4e3aea0fb75383b97083f2f568ffc13c0e7a47502ec6d9f25744a061a3a5e55fe95e8d", + expectedOutput: + "4fa077d50cc71a57393e7b542c4e3aea0fb75383b97083f2f568ffc13c0e7a47502ec6d9f25744a061a3a5e55fe95e8d", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - "CBC", "Raw", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + "CBC", + "Raw", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-CFB, ASCII", @@ -135,13 +145,15 @@ The following algorithms will be used based on the size of the key: { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - "CFB", "Raw", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + "CFB", + "Raw", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-OFB, ASCII", @@ -151,13 +163,15 @@ The following algorithms will be used based on the size of the key: { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - "OFB", "Raw", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + "OFB", + "Raw", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-CTR, ASCII", @@ -167,29 +181,34 @@ The following algorithms will be used based on the size of the key: { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - "CTR", "Raw", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + "CTR", + "Raw", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-ECB, ASCII", input: "The quick brown fox jumps over the lazy dog.", - expectedOutput: "2ef6c3fdb1314b5c2c326a2087fe1a8238c5a5db7dff38f6f4eb75b2e55cab3d8d6113eb8d3517223b4545fcdb4c5a48", + expectedOutput: + "2ef6c3fdb1314b5c2c326a2087fe1a8238c5a5db7dff38f6f4eb75b2e55cab3d8d6113eb8d3517223b4545fcdb4c5a48", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": ""}, - "ECB", "Raw", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "" }, + "ECB", + "Raw", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-GCM, ASCII", @@ -201,13 +220,15 @@ Tag: 16a3e732a605cc9ca29108f742ca0743`, { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": ""}, - "GCM", "Raw", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "" }, + "GCM", + "Raw", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-GCM, ASCII, AAD", @@ -219,77 +240,91 @@ Tag: 3b5378917f67b0aade9891fc6c291646`, { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "ffeeddccbbaa99887766554433221100"}, - "GCM", "Raw", "Hex", - {"option": "UTF8", "string": "additional data"} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "ffeeddccbbaa99887766554433221100" }, + "GCM", + "Raw", + "Hex", + { "option": "UTF8", "string": "additional data" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-CBC, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "bf2ccb148e5df181a46f39764047e24fc94cc46bbe6c8d160fc25a977e4b630883e9e04d3eeae3ccbb2d57a4c22e61909f2b6d7b24940abe95d356ce986294270d0513e0ffe7a9928fa6669e1aaae4379310281dc27c0bb9e254684b2ecd7f5f944c8218f3bc680570399a508dfe4b65", + expectedOutput: + "bf2ccb148e5df181a46f39764047e24fc94cc46bbe6c8d160fc25a977e4b630883e9e04d3eeae3ccbb2d57a4c22e61909f2b6d7b24940abe95d356ce986294270d0513e0ffe7a9928fa6669e1aaae4379310281dc27c0bb9e254684b2ecd7f5f944c8218f3bc680570399a508dfe4b65", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CBC", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CBC", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-CFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "17211941bb2fa43d54d9fa59072436422a55be7a2be164cf5ec4e50e7a0035094ab684dab8d45a4515ae95c4136ded98898f74d4ecc4ac57ae682a985031ecb7518ddea6c8d816349801aa22ff0b6ac1784d169060efcd9fb77d564477038eb09bb4e1ce", + expectedOutput: + "17211941bb2fa43d54d9fa59072436422a55be7a2be164cf5ec4e50e7a0035094ab684dab8d45a4515ae95c4136ded98898f74d4ecc4ac57ae682a985031ecb7518ddea6c8d816349801aa22ff0b6ac1784d169060efcd9fb77d564477038eb09bb4e1ce", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CFB", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-OFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "17211941bb2fa43d54d9fa5907243642bfd805201c130c8600566720cf87562011f0872598f1e69cfe541bb864de7ed68201e0a34284157b581984dab3fe2cb0f20cb80d0046740df3e149ec4c92c0e81f2dc439a6f3a05c5ef505eae6308b301c673cfa", + expectedOutput: + "17211941bb2fa43d54d9fa5907243642bfd805201c130c8600566720cf87562011f0872598f1e69cfe541bb864de7ed68201e0a34284157b581984dab3fe2cb0f20cb80d0046740df3e149ec4c92c0e81f2dc439a6f3a05c5ef505eae6308b301c673cfa", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "OFB", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "OFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-CTR, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "17211941bb2fa43d54d9fa5907243642baf08c837003bf24d7b81a911ce41bd31de8a92f6dc6d11135b70c73ea167c3fc4ea78234f58652d25e23245dbcb895bf4165092d0515ae8f14230f8a34b06957f24ba4b24db741490e7edcd6e5310945cc159fc", + expectedOutput: + "17211941bb2fa43d54d9fa5907243642baf08c837003bf24d7b81a911ce41bd31de8a92f6dc6d11135b70c73ea167c3fc4ea78234f58652d25e23245dbcb895bf4165092d0515ae8f14230f8a34b06957f24ba4b24db741490e7edcd6e5310945cc159fc", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CTR", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CTR", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-GCM, Binary", @@ -301,13 +336,15 @@ Tag: 70fad2ca19412c20f40fd06918736e56`, { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-GCM, Binary, AAD", @@ -319,93 +356,110 @@ Tag: 61cc4b70809452b0b3e38f913fa0a109`, { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "UTF8", "string": "additional data"} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "UTF8", "string": "additional data" } ] } - ], + ] }, { name: "AES Encrypt: AES-128-ECB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "869c057637a58cc3363bcc4bcfa62702abf85dff44300eb9fdcfb9d845772c8acb557c8d540baae2489c6758abef83d81b74239bef87c6c944c1b00ca160882bc15be9a6a3de4e6a50a2eab8b635c634027ed7eae4c1d2f08477c38b7dc24f6915da235bc3051f3a50736b14db8863e4", + expectedOutput: + "869c057637a58cc3363bcc4bcfa62702abf85dff44300eb9fdcfb9d845772c8acb557c8d540baae2489c6758abef83d81b74239bef87c6c944c1b00ca160882bc15be9a6a3de4e6a50a2eab8b635c634027ed7eae4c1d2f08477c38b7dc24f6915da235bc3051f3a50736b14db8863e4", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "ECB", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "ECB", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-192-CBC, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "1aec90cd7f629ef68243881f3e2b793a548cbcdad69631995a6bd0c8aea1e948d8a5f3f2b7e7f9b77da77434c92a6257a9f57e937b883f4400511b990888a0b1d27c0a4b7f298e6f50b563135edc9fa7d8eceb6bc8163e6153a20cf07aa1e705bc5cb3a37b0452b4019cef8000d7c1b7", + expectedOutput: + "1aec90cd7f629ef68243881f3e2b793a548cbcdad69631995a6bd0c8aea1e948d8a5f3f2b7e7f9b77da77434c92a6257a9f57e937b883f4400511b990888a0b1d27c0a4b7f298e6f50b563135edc9fa7d8eceb6bc8163e6153a20cf07aa1e705bc5cb3a37b0452b4019cef8000d7c1b7", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CBC", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CBC", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-192-CFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "fc370a6c013b3c05430fbce810cb97d39cb0a587320a4c1b57d0c0d08e93cb0d1221abba9df09b4b1332ce923b289f92000e6b4f7fbc55dfdab9179081d8c36ef4a0e3d3a49f1564715c5d3e88f8bf6d3dd77944f22f99a03b5535a3cd47bc44d4a9665c", + expectedOutput: + "fc370a6c013b3c05430fbce810cb97d39cb0a587320a4c1b57d0c0d08e93cb0d1221abba9df09b4b1332ce923b289f92000e6b4f7fbc55dfdab9179081d8c36ef4a0e3d3a49f1564715c5d3e88f8bf6d3dd77944f22f99a03b5535a3cd47bc44d4a9665c", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CFB", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-192-OFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "fc370a6c013b3c05430fbce810cb97d33605d11b2531c8833bc3e818003bbd7dd58b2a38d10d44d25d11bd96228b264a4d2aad1d0a7af2cfad0e70c1ade305433e95cb0ee693447f6877a59a4be5c070d19afba23ff10caf5ecfa7a9c2877b8df23d61f2", + expectedOutput: + "fc370a6c013b3c05430fbce810cb97d33605d11b2531c8833bc3e818003bbd7dd58b2a38d10d44d25d11bd96228b264a4d2aad1d0a7af2cfad0e70c1ade305433e95cb0ee693447f6877a59a4be5c070d19afba23ff10caf5ecfa7a9c2877b8df23d61f2", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "OFB", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "OFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-192-CTR, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "fc370a6c013b3c05430fbce810cb97d340525303ae59c5e9b73ad5ff3e65ce3abf00431e0a292d990f732a397de589420827beb1c28623c56972eb2ddf0cf3f82e3c30e155df7f64a530419c28fc51a9091c73df78e73958bee1d1acd8676c9c0f1915ca", + expectedOutput: + "fc370a6c013b3c05430fbce810cb97d340525303ae59c5e9b73ad5ff3e65ce3abf00431e0a292d990f732a397de589420827beb1c28623c56972eb2ddf0cf3f82e3c30e155df7f64a530419c28fc51a9091c73df78e73958bee1d1acd8676c9c0f1915ca", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CTR", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CTR", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-192-GCM, Binary", @@ -417,13 +471,15 @@ Tag: 86db597d5302595223cadbd990f1309b`, { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-192-GCM, Binary, AAD", @@ -435,93 +491,110 @@ Tag: aeedf3e6ca4201577c0cf3e9ce58159d`, { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "UTF8", "string": "additional data"} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "UTF8", "string": "additional data" } ] } - ], + ] }, { name: "AES Encrypt: AES-192-ECB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "56ef533db50a3b33951a76acede52b7d54fbae7fb07da20daa3e2731e5721ee4c13ab15ac80748c14dece982310530ad65480512a4cf70201473fb7bc3480446bc86b1ff9b4517c4c1f656bc236fab1aca276ae5af25f5871b671823f3cb3e426da059dd83a13f125bd6cfe600c331b0", + expectedOutput: + "56ef533db50a3b33951a76acede52b7d54fbae7fb07da20daa3e2731e5721ee4c13ab15ac80748c14dece982310530ad65480512a4cf70201473fb7bc3480446bc86b1ff9b4517c4c1f656bc236fab1aca276ae5af25f5871b671823f3cb3e426da059dd83a13f125bd6cfe600c331b0", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "ECB", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "ECB", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-256-CBC, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "bc60a7613559e23e8a7be8e98a1459003fdb036f33368d8a30156c51464b49472705a4ddae05da96956ce058bb180dd301c5fd58bf6a2ded0d7dd4da85fd5ba43a4297691532bf7f4cd92bfcfd3704faf2f9bd5425049b34433ba90fb85c80646e6cb09ee4e4059e7cd753a2fef8bbad", + expectedOutput: + "bc60a7613559e23e8a7be8e98a1459003fdb036f33368d8a30156c51464b49472705a4ddae05da96956ce058bb180dd301c5fd58bf6a2ded0d7dd4da85fd5ba43a4297691532bf7f4cd92bfcfd3704faf2f9bd5425049b34433ba90fb85c80646e6cb09ee4e4059e7cd753a2fef8bbad", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CBC", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CBC", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-256-CFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "5dc73709da5cb0ac914ae4bcb621fd75169eac5ff13a2dde573f6380ff812e8ddb58f0e9afaec1ff0d6d2af0659e10c05b714ec97481a15f4a7aeb4c6ea84112ce897459b54ed9e77a794f023f2bef1901f013cf435432fca5fb59e2be781916247d2334", + expectedOutput: + "5dc73709da5cb0ac914ae4bcb621fd75169eac5ff13a2dde573f6380ff812e8ddb58f0e9afaec1ff0d6d2af0659e10c05b714ec97481a15f4a7aeb4c6ea84112ce897459b54ed9e77a794f023f2bef1901f013cf435432fca5fb59e2be781916247d2334", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CFB", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-256-OFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "5dc73709da5cb0ac914ae4bcb621fd75b6e1f909b88733f784b1df8a52dc200440a1076415d009a7c12cac1e8ab76bdc290e6634cd5bf8a416fda8dcfd7910e55fe9d1148cd85d7a59adad39ab089e111d8f8da246e2e874cf5d9ab7552af6308320a5ab", + expectedOutput: + "5dc73709da5cb0ac914ae4bcb621fd75b6e1f909b88733f784b1df8a52dc200440a1076415d009a7c12cac1e8ab76bdc290e6634cd5bf8a416fda8dcfd7910e55fe9d1148cd85d7a59adad39ab089e111d8f8da246e2e874cf5d9ab7552af6308320a5ab", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "OFB", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "OFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-256-CTR, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "5dc73709da5cb0ac914ae4bcb621fd7591356d4169898c986a90b193f4d1f0d5cba1d10b2bfc5aee8a48dce9dba174cecf56f92dddf7eb306d78360000eea7bcb50f696d84a3757a822800ed68f9edf118dc61406bacf64f022717d8cb6010049bf75d7e", + expectedOutput: + "5dc73709da5cb0ac914ae4bcb621fd7591356d4169898c986a90b193f4d1f0d5cba1d10b2bfc5aee8a48dce9dba174cecf56f92dddf7eb306d78360000eea7bcb50f696d84a3757a822800ed68f9edf118dc61406bacf64f022717d8cb6010049bf75d7e", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CTR", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CTR", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-256-GCM, Binary", @@ -533,13 +606,15 @@ Tag: 821b1e5f32dad052e502775a523d957a`, { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Encrypt: AES-256-GCM, Binary, AAD", @@ -551,29 +626,34 @@ Tag: a8f04c4d93bbef82bef61a103371aef9`, { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "UTF8", "string": "additional data"} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "UTF8", "string": "additional data" } ] } - ], + ] }, { name: "AES Encrypt: AES-256-ECB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "7e8521ba3f356ef692a51841807e141464aadc07bbc0ef2b628b8745bae356d245682a220688afca7be987b60cb120681ed42680ee93a67065619a3beaac11111a6cd88a6afa9e367722cb57df343f8548f2d691b295184da4ed5f3b763aaa8558502cb348ab58e81986337096e90caa", + expectedOutput: + "7e8521ba3f356ef692a51841807e141464aadc07bbc0ef2b628b8745bae356d245682a220688afca7be987b60cb120681ed42680ee93a67065619a3beaac11111a6cd88a6afa9e367722cb57df343f8548f2d691b295184da4ed5f3b763aaa8558502cb348ab58e81986337096e90caa", recipeConfig: [ { "op": "AES Encrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "ECB", "Hex", "Hex", - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "ECB", + "Hex", + "Hex", + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "DES Encrypt: no key", @@ -585,89 +665,100 @@ Triple DES uses a key length of 24 bytes (192 bits).`, recipeConfig: [ { "op": "DES Encrypt", - "args": [ - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""}, - "CBC", "Hex", "Hex" - ] + "args": [{ "option": "Hex", "string": "" }, { "option": "Hex", "string": "" }, "CBC", "Hex", "Hex"] } - ], + ] }, { name: "DES Encrypt: DES-CBC, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "6500defb824b0eb8ccbf1fa9689c6f5bcc65247d93ecb0e573232824bca82dd41e2361f8fd82ef187de9f3b74f7ba3ca2b4e735f3ca6304fb8dd1675933c576424b1ea72b3219bdab62fce56d49c820d5ac02a4702a6d688e90b0933de97da21e4829e5cf85caae8", + expectedOutput: + "6500defb824b0eb8ccbf1fa9689c6f5bcc65247d93ecb0e573232824bca82dd41e2361f8fd82ef187de9f3b74f7ba3ca2b4e735f3ca6304fb8dd1675933c576424b1ea72b3219bdab62fce56d49c820d5ac02a4702a6d688e90b0933de97da21e4829e5cf85caae8", recipeConfig: [ { "op": "DES Encrypt", "args": [ - {"option": "Hex", "string": "58345efb0a64e87e"}, - {"option": "Hex", "string": "533ed1378bfd929e"}, - "CBC", "Hex", "Hex" + { "option": "Hex", "string": "58345efb0a64e87e" }, + { "option": "Hex", "string": "533ed1378bfd929e" }, + "CBC", + "Hex", + "Hex" ] } - ], + ] }, { name: "DES Encrypt: DES-CFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "09015087e15b09374bc9edba80ce41e6809e332fc1e988858749fb2f4ebbd6483a6fce01a43271280c07c90e13d517729acac45beef7d088339eb7e084bbbb7459fc8bb592d2ca76b90066dc79b1fbc5e016208e1d02c6e48ab675530f8040e53e1a138b", + expectedOutput: + "09015087e15b09374bc9edba80ce41e6809e332fc1e988858749fb2f4ebbd6483a6fce01a43271280c07c90e13d517729acac45beef7d088339eb7e084bbbb7459fc8bb592d2ca76b90066dc79b1fbc5e016208e1d02c6e48ab675530f8040e53e1a138b", recipeConfig: [ { "op": "DES Encrypt", "args": [ - {"option": "Hex", "string": "58345efb0a64e87e"}, - {"option": "Hex", "string": "533ed1378bfd929e"}, - "CFB", "Hex", "Hex" + { "option": "Hex", "string": "58345efb0a64e87e" }, + { "option": "Hex", "string": "533ed1378bfd929e" }, + "CFB", + "Hex", + "Hex" ] } - ], + ] }, { name: "DES Encrypt: DES-OFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "09015087e15b09374d8879bac14dbad851dd08fb131353a8c510acc4570e97720dd159465f1c7da3cac4a50521e1c1ab87e8cf5b0aa0c1d2eaa8a1ed914a26c13b2b0a76a368f08812fc7fa4b7c047f27df0c35e5f53b8a20e2ffc10e55d388cae8070db", + expectedOutput: + "09015087e15b09374d8879bac14dbad851dd08fb131353a8c510acc4570e97720dd159465f1c7da3cac4a50521e1c1ab87e8cf5b0aa0c1d2eaa8a1ed914a26c13b2b0a76a368f08812fc7fa4b7c047f27df0c35e5f53b8a20e2ffc10e55d388cae8070db", recipeConfig: [ { "op": "DES Encrypt", "args": [ - {"option": "Hex", "string": "58345efb0a64e87e"}, - {"option": "Hex", "string": "533ed1378bfd929e"}, - "OFB", "Hex", "Hex" + { "option": "Hex", "string": "58345efb0a64e87e" }, + { "option": "Hex", "string": "533ed1378bfd929e" }, + "OFB", + "Hex", + "Hex" ] } - ], + ] }, { // play.golang.org/p/4Qm2hfLGsqc name: "DES Encrypt: DES-CTR, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "09015087e15b0937c462fd5974af0c4b5880de136a5680453c99f4500628cbeca769623515d836985110b93eacfea7fa4a7b2b3cb4f67acbb5f7e8ddb5a5d445da74bf6572b0a874befa3888c81110776388e400afd8dc908dcc0c018c7753355f8a1c9f", + expectedOutput: + "09015087e15b0937c462fd5974af0c4b5880de136a5680453c99f4500628cbeca769623515d836985110b93eacfea7fa4a7b2b3cb4f67acbb5f7e8ddb5a5d445da74bf6572b0a874befa3888c81110776388e400afd8dc908dcc0c018c7753355f8a1c9f", recipeConfig: [ { "op": "DES Encrypt", "args": [ - {"option": "Hex", "string": "58345efb0a64e87e"}, - {"option": "Hex", "string": "533ed1378bfd929e"}, - "CTR", "Hex", "Hex" + { "option": "Hex", "string": "58345efb0a64e87e" }, + { "option": "Hex", "string": "533ed1378bfd929e" }, + "CTR", + "Hex", + "Hex" ] } - ], + ] }, { name: "DES Encrypt: DES-ECB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "8dea4c6a35d5f6a419232159a0b039798d0a0b20fd1e559b1d04f8eb1120e8bca6ed5b3a4bc2b23d3b62312e6085d9e837677569fe79a65eba7cb4a2969e099fc1bd649e9c8aeb2c4c519e085db6974819257c20fde70acabc976308cc41635038c91acf5eefff1e", + expectedOutput: + "8dea4c6a35d5f6a419232159a0b039798d0a0b20fd1e559b1d04f8eb1120e8bca6ed5b3a4bc2b23d3b62312e6085d9e837677569fe79a65eba7cb4a2969e099fc1bd649e9c8aeb2c4c519e085db6974819257c20fde70acabc976308cc41635038c91acf5eefff1e", recipeConfig: [ { "op": "DES Encrypt", "args": [ - {"option": "Hex", "string": "58345efb0a64e87e"}, - {"option": "Hex", "string": "533ed1378bfd929e"}, - "ECB", "Hex", "Hex" + { "option": "Hex", "string": "58345efb0a64e87e" }, + { "option": "Hex", "string": "533ed1378bfd929e" }, + "ECB", + "Hex", + "Hex" ] } - ], + ] }, { name: "Triple DES Encrypt: no key", @@ -679,89 +770,100 @@ DES uses a key length of 8 bytes (64 bits).`, recipeConfig: [ { "op": "Triple DES Encrypt", - "args": [ - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""}, - "CBC", "Hex", "Hex" - ] + "args": [{ "option": "Hex", "string": "" }, { "option": "Hex", "string": "" }, "CBC", "Hex", "Hex"] } - ], + ] }, { name: "Triple DES Encrypt: DES-EDE3-CBC, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "f826c9116ea932eb7027a810b5ce21109c4ef2563c9f3ba5e2518f72484e88f8d3f6ff3f334f64bb6bb9ff91b70f6f29c037b10dee5fe16d7f0f41c9a7ecdd83f113a1dd66ab70783ee458c2366bf5fbc016f7c168c43c11d607692a3280e3750a6154a86b62c48d", + expectedOutput: + "f826c9116ea932eb7027a810b5ce21109c4ef2563c9f3ba5e2518f72484e88f8d3f6ff3f334f64bb6bb9ff91b70f6f29c037b10dee5fe16d7f0f41c9a7ecdd83f113a1dd66ab70783ee458c2366bf5fbc016f7c168c43c11d607692a3280e3750a6154a86b62c48d", recipeConfig: [ { "op": "Triple DES Encrypt", "args": [ - {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, - {"option": "Hex", "string": "14f67ac044a84da6"}, - "CBC", "Hex", "Hex" + { "option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23" }, + { "option": "Hex", "string": "14f67ac044a84da6" }, + "CBC", + "Hex", + "Hex" ] } - ], + ] }, { name: "Triple DES Encrypt: DES-EDE3-CFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "874d32cd7bdae52c3690875e265a2fac7ced685e5ec4436a6bb5a5c18be185f4526683a5bc7ae86f00523034fb725ab4c8285a6967ccca1b76f6331718c26e12ea67fc924071f81ce0035a9dd31705bcd6467991cae5504d70424e6339459db5b33cbc8a", + expectedOutput: + "874d32cd7bdae52c3690875e265a2fac7ced685e5ec4436a6bb5a5c18be185f4526683a5bc7ae86f00523034fb725ab4c8285a6967ccca1b76f6331718c26e12ea67fc924071f81ce0035a9dd31705bcd6467991cae5504d70424e6339459db5b33cbc8a", recipeConfig: [ { "op": "Triple DES Encrypt", "args": [ - {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, - {"option": "Hex", "string": "14f67ac044a84da6"}, - "CFB", "Hex", "Hex" + { "option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23" }, + { "option": "Hex", "string": "14f67ac044a84da6" }, + "CFB", + "Hex", + "Hex" ] } - ], + ] }, { name: "Triple DES Encrypt: DES-EDE3-OFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "874d32cd7bdae52c8f61672860f715d14819c0270320a8ad71083b38bd8954bbada3c77af641590b00a678524d748668fe3dfa83f71835c411cdbdd8e73a70656324b7faaba16e1d8dba260d8f965fe7a91110134c19076f1eeb46393038c22c559fe490", + expectedOutput: + "874d32cd7bdae52c8f61672860f715d14819c0270320a8ad71083b38bd8954bbada3c77af641590b00a678524d748668fe3dfa83f71835c411cdbdd8e73a70656324b7faaba16e1d8dba260d8f965fe7a91110134c19076f1eeb46393038c22c559fe490", recipeConfig: [ { "op": "Triple DES Encrypt", "args": [ - {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, - {"option": "Hex", "string": "14f67ac044a84da6"}, - "OFB", "Hex", "Hex" + { "option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23" }, + { "option": "Hex", "string": "14f67ac044a84da6" }, + "OFB", + "Hex", + "Hex" ] } - ], + ] }, { // play.golang.org/p/RElT6pVeNz2 name: "Triple DES Encrypt: DES-EDE3-CTR, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "874d32cd7bdae52cd8630d3ab2bf373e7110e13713caa6a8bfed9d9dd802d0ebe93128ac0d0f05abcc56237b75fb69207dba11e68ddc4b0118a4c75e7248bbd80aaba4dd4436642546ec6ca7fa7526f3b0018ed5194c409dc2c1484530b968af554984f3", + expectedOutput: + "874d32cd7bdae52cd8630d3ab2bf373e7110e13713caa6a8bfed9d9dd802d0ebe93128ac0d0f05abcc56237b75fb69207dba11e68ddc4b0118a4c75e7248bbd80aaba4dd4436642546ec6ca7fa7526f3b0018ed5194c409dc2c1484530b968af554984f3", recipeConfig: [ { "op": "Triple DES Encrypt", "args": [ - {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, - {"option": "Hex", "string": "14f67ac044a84da6"}, - "CTR", "Hex", "Hex" + { "option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23" }, + { "option": "Hex", "string": "14f67ac044a84da6" }, + "CTR", + "Hex", + "Hex" ] } - ], + ] }, { name: "Triple DES Encrypt: DES-EDE3-ECB Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "aa81f23d1b3abebd68ac560e051a711c2923843beecddb0f7fe4113bd1874e73cccf3a2a494bb011e154ca2737b4d0eb5978a10316361074ed368d85d5aff5c8555ea101b0a468e58780a74c7830c561674c183c972a2b48931adf789cb16df304e169500f8c95ad", + expectedOutput: + "aa81f23d1b3abebd68ac560e051a711c2923843beecddb0f7fe4113bd1874e73cccf3a2a494bb011e154ca2737b4d0eb5978a10316361074ed368d85d5aff5c8555ea101b0a468e58780a74c7830c561674c183c972a2b48931adf789cb16df304e169500f8c95ad", recipeConfig: [ { "op": "Triple DES Encrypt", "args": [ - {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, - {"option": "Hex", "string": "14f67ac044a84da6"}, - "ECB", "Hex", "Hex" + { "option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23" }, + { "option": "Hex", "string": "14f67ac044a84da6" }, + "ECB", + "Hex", + "Hex" ] } - ], + ] }, { name: "AES Decrypt: no key", @@ -776,14 +878,16 @@ The following algorithms will be used based on the size of the key: { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""}, - "CBC", "Hex", "Raw", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" }, + "CBC", + "Hex", + "Raw", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-CBC with IV0, ASCII", @@ -793,14 +897,16 @@ The following algorithms will be used based on the size of the key: { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00000000000000000000000000000000"}, - "CBC", "Hex", "Raw", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00000000000000000000000000000000" }, + "CBC", + "Hex", + "Raw", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-CTR with IV0, ASCII", @@ -810,14 +916,16 @@ The following algorithms will be used based on the size of the key: { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00000000000000000000000000000000"}, - "CTR", "Hex", "Raw", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00000000000000000000000000000000" }, + "CTR", + "Hex", + "Raw", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-CBC with IV, ASCII", @@ -827,14 +935,16 @@ The following algorithms will be used based on the size of the key: { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - "CBC", "Hex", "Raw", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + "CBC", + "Hex", + "Raw", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-CFB, ASCII", @@ -844,14 +954,16 @@ The following algorithms will be used based on the size of the key: { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - "CFB", "Hex", "Raw", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + "CFB", + "Hex", + "Raw", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-OFB, ASCII", @@ -861,14 +973,16 @@ The following algorithms will be used based on the size of the key: { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - "OFB", "Hex", "Raw", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + "OFB", + "Hex", + "Raw", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-CTR, ASCII", @@ -878,14 +992,16 @@ The following algorithms will be used based on the size of the key: { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - "CTR", "Hex", "Raw", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + "CTR", + "Hex", + "Raw", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-ECB, ASCII", @@ -895,14 +1011,16 @@ The following algorithms will be used based on the size of the key: { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": ""}, - "ECB", "Hex", "Raw", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "" }, + "ECB", + "Hex", + "Raw", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-GCM, ASCII", @@ -912,14 +1030,16 @@ The following algorithms will be used based on the size of the key: { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": ""}, - "GCM", "Hex", "Raw", - {"option": "Hex", "string": "16a3e732a605cc9ca29108f742ca0743"}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "" }, + "GCM", + "Hex", + "Raw", + { "option": "Hex", "string": "16a3e732a605cc9ca29108f742ca0743" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-GCM, ASCII, AAD", @@ -929,371 +1049,436 @@ The following algorithms will be used based on the size of the key: { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, - {"option": "Hex", "string": "ffeeddccbbaa99887766554433221100"}, - "GCM", "Hex", "Raw", - {"option": "Hex", "string": "3b5378917f67b0aade9891fc6c291646"}, - {"option": "UTF8", "string": "additional data"} + { "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, + { "option": "Hex", "string": "ffeeddccbbaa99887766554433221100" }, + "GCM", + "Hex", + "Raw", + { "option": "Hex", "string": "3b5378917f67b0aade9891fc6c291646" }, + { "option": "UTF8", "string": "additional data" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-CBC, Binary", input: "bf2ccb148e5df181a46f39764047e24fc94cc46bbe6c8d160fc25a977e4b630883e9e04d3eeae3ccbb2d57a4c22e61909f2b6d7b24940abe95d356ce986294270d0513e0ffe7a9928fa6669e1aaae4379310281dc27c0bb9e254684b2ecd7f5f944c8218f3bc680570399a508dfe4b65", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CBC", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CBC", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-CFB, Binary", input: "17211941bb2fa43d54d9fa59072436422a55be7a2be164cf5ec4e50e7a0035094ab684dab8d45a4515ae95c4136ded98898f74d4ecc4ac57ae682a985031ecb7518ddea6c8d816349801aa22ff0b6ac1784d169060efcd9fb77d564477038eb09bb4e1ce", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CFB", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-OFB, Binary", input: "17211941bb2fa43d54d9fa5907243642bfd805201c130c8600566720cf87562011f0872598f1e69cfe541bb864de7ed68201e0a34284157b581984dab3fe2cb0f20cb80d0046740df3e149ec4c92c0e81f2dc439a6f3a05c5ef505eae6308b301c673cfa", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "OFB", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "OFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-CTR, Binary", input: "17211941bb2fa43d54d9fa5907243642baf08c837003bf24d7b81a911ce41bd31de8a92f6dc6d11135b70c73ea167c3fc4ea78234f58652d25e23245dbcb895bf4165092d0515ae8f14230f8a34b06957f24ba4b24db741490e7edcd6e5310945cc159fc", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CTR", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CTR", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-GCM, Binary", input: "5a29debb5c5f38cdf8aee421bd94dbbf3399947faddf205f88b3ad8ecb0c51214ec0e28bf78942dfa212d7eb15259bbdcac677b4c05f473eeb9331d74f31d441d97d56eb5c73b586342d72128ca528813543dc0fc7eddb7477172cc9194c18b2e1383e4e", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "Hex", "string": "70fad2ca19412c20f40fd06918736e56"}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "Hex", "string": "70fad2ca19412c20f40fd06918736e56" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-GCM, Binary, AAD", input: "5a29debb5c5f38cdf8aee421bd94dbbf3399947faddf205f88b3ad8ecb0c51214ec0e28bf78942dfa212d7eb15259bbdcac677b4c05f473eeb9331d74f31d441d97d56eb5c73b586342d72128ca528813543dc0fc7eddb7477172cc9194c18b2e1383e4e", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "Hex", "string": "61cc4b70809452b0b3e38f913fa0a109"}, - {"option": "UTF8", "string": "additional data"} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "Hex", "string": "61cc4b70809452b0b3e38f913fa0a109" }, + { "option": "UTF8", "string": "additional data" } ] } - ], + ] }, { name: "AES Decrypt: AES-128-ECB, Binary", input: "869c057637a58cc3363bcc4bcfa62702abf85dff44300eb9fdcfb9d845772c8acb557c8d540baae2489c6758abef83d81b74239bef87c6c944c1b00ca160882bc15be9a6a3de4e6a50a2eab8b635c634027ed7eae4c1d2f08477c38b7dc24f6915da235bc3051f3a50736b14db8863e4", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "ECB", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "ECB", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-192-CBC, Binary", input: "1aec90cd7f629ef68243881f3e2b793a548cbcdad69631995a6bd0c8aea1e948d8a5f3f2b7e7f9b77da77434c92a6257a9f57e937b883f4400511b990888a0b1d27c0a4b7f298e6f50b563135edc9fa7d8eceb6bc8163e6153a20cf07aa1e705bc5cb3a37b0452b4019cef8000d7c1b7", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CBC", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CBC", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-192-CFB, Binary", input: "fc370a6c013b3c05430fbce810cb97d39cb0a587320a4c1b57d0c0d08e93cb0d1221abba9df09b4b1332ce923b289f92000e6b4f7fbc55dfdab9179081d8c36ef4a0e3d3a49f1564715c5d3e88f8bf6d3dd77944f22f99a03b5535a3cd47bc44d4a9665c", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CFB", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-192-OFB, Binary", input: "fc370a6c013b3c05430fbce810cb97d33605d11b2531c8833bc3e818003bbd7dd58b2a38d10d44d25d11bd96228b264a4d2aad1d0a7af2cfad0e70c1ade305433e95cb0ee693447f6877a59a4be5c070d19afba23ff10caf5ecfa7a9c2877b8df23d61f2", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "OFB", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "OFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-192-CTR, Binary", input: "fc370a6c013b3c05430fbce810cb97d340525303ae59c5e9b73ad5ff3e65ce3abf00431e0a292d990f732a397de589420827beb1c28623c56972eb2ddf0cf3f82e3c30e155df7f64a530419c28fc51a9091c73df78e73958bee1d1acd8676c9c0f1915ca", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CTR", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CTR", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-192-GCM, Binary", input: "318b479d919d506f0cd904f2676fab263a7921b6d7e0514f36e03ae2333b77fa66ef5600babcb2ee9718aeb71fc357412343c1f2cb351d8715bb0aedae4a6468124f9c4aaf6a721b306beddbe63a978bec8baeeba4b663be33ee5bc982746bd4aed1c38b", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "Hex", "string": "86db597d5302595223cadbd990f1309b"}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "Hex", "string": "86db597d5302595223cadbd990f1309b" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-192-GCM, Binary, AAD", input: "318b479d919d506f0cd904f2676fab263a7921b6d7e0514f36e03ae2333b77fa66ef5600babcb2ee9718aeb71fc357412343c1f2cb351d8715bb0aedae4a6468124f9c4aaf6a721b306beddbe63a978bec8baeeba4b663be33ee5bc982746bd4aed1c38b", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "Hex", "string": "aeedf3e6ca4201577c0cf3e9ce58159d"}, - {"option": "UTF8", "string": "additional data"} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "Hex", "string": "aeedf3e6ca4201577c0cf3e9ce58159d" }, + { "option": "UTF8", "string": "additional data" } ] } - ], + ] }, { name: "AES Decrypt: AES-192-ECB, Binary", input: "56ef533db50a3b33951a76acede52b7d54fbae7fb07da20daa3e2731e5721ee4c13ab15ac80748c14dece982310530ad65480512a4cf70201473fb7bc3480446bc86b1ff9b4517c4c1f656bc236fab1aca276ae5af25f5871b671823f3cb3e426da059dd83a13f125bd6cfe600c331b0", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "ECB", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "ECB", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-256-CBC, Binary", input: "bc60a7613559e23e8a7be8e98a1459003fdb036f33368d8a30156c51464b49472705a4ddae05da96956ce058bb180dd301c5fd58bf6a2ded0d7dd4da85fd5ba43a4297691532bf7f4cd92bfcfd3704faf2f9bd5425049b34433ba90fb85c80646e6cb09ee4e4059e7cd753a2fef8bbad", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CBC", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CBC", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-256-CFB, Binary", input: "5dc73709da5cb0ac914ae4bcb621fd75169eac5ff13a2dde573f6380ff812e8ddb58f0e9afaec1ff0d6d2af0659e10c05b714ec97481a15f4a7aeb4c6ea84112ce897459b54ed9e77a794f023f2bef1901f013cf435432fca5fb59e2be781916247d2334", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CFB", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-256-OFB, Binary", input: "5dc73709da5cb0ac914ae4bcb621fd75b6e1f909b88733f784b1df8a52dc200440a1076415d009a7c12cac1e8ab76bdc290e6634cd5bf8a416fda8dcfd7910e55fe9d1148cd85d7a59adad39ab089e111d8f8da246e2e874cf5d9ab7552af6308320a5ab", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "OFB", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "OFB", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-256-CTR, Binary", input: "5dc73709da5cb0ac914ae4bcb621fd7591356d4169898c986a90b193f4d1f0d5cba1d10b2bfc5aee8a48dce9dba174cecf56f92dddf7eb306d78360000eea7bcb50f696d84a3757a822800ed68f9edf118dc61406bacf64f022717d8cb6010049bf75d7e", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "CTR", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "CTR", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-256-GCM, Binary", input: "1287f188ad4d7ab0d9ff69b3c29cb11f861389532d8cb9337181da2e8cfc74a84927e8c0dd7a28a32fd485afe694259a63c199b199b95edd87c7aa95329feac340f2b78b72956a85f367044d821766b1b7135815571df44900695f1518cf3ae38ecb650f", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "Hex", "string": "821b1e5f32dad052e502775a523d957a"}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "Hex", "string": "821b1e5f32dad052e502775a523d957a" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "AES Decrypt: AES-256-GCM, Binary, AAD", input: "1287f188ad4d7ab0d9ff69b3c29cb11f861389532d8cb9337181da2e8cfc74a84927e8c0dd7a28a32fd485afe694259a63c199b199b95edd87c7aa95329feac340f2b78b72956a85f367044d821766b1b7135815571df44900695f1518cf3ae38ecb650f", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "GCM", "Hex", "Hex", - {"option": "Hex", "string": "a8f04c4d93bbef82bef61a103371aef9"}, - {"option": "UTF8", "string": "additional data"} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "GCM", + "Hex", + "Hex", + { "option": "Hex", "string": "a8f04c4d93bbef82bef61a103371aef9" }, + { "option": "UTF8", "string": "additional data" } ] } - ], + ] }, { name: "AES Decrypt: AES-256-ECB, Binary", input: "7e8521ba3f356ef692a51841807e141464aadc07bbc0ef2b628b8745bae356d245682a220688afca7be987b60cb120681ed42680ee93a67065619a3beaac11111a6cd88a6afa9e367722cb57df343f8548f2d691b295184da4ed5f3b763aaa8558502cb348ab58e81986337096e90caa", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "AES Decrypt", "args": [ - {"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"}, - {"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"}, - "ECB", "Hex", "Hex", - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""} + { "option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1" }, + { "option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5" }, + "ECB", + "Hex", + "Hex", + { "option": "Hex", "string": "" }, + { "option": "Hex", "string": "" } ] } - ], + ] }, { name: "DES Decrypt: no key", @@ -1305,89 +1490,100 @@ Triple DES uses a key length of 24 bytes (192 bits).`, recipeConfig: [ { "op": "DES Decrypt", - "args": [ - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""}, - "CBC", "Hex", "Hex" - ] + "args": [{ "option": "Hex", "string": "" }, { "option": "Hex", "string": "" }, "CBC", "Hex", "Hex"] } - ], + ] }, { name: "DES Decrypt: DES-CBC, Binary", input: "6500defb824b0eb8ccbf1fa9689c6f5bcc65247d93ecb0e573232824bca82dd41e2361f8fd82ef187de9f3b74f7ba3ca2b4e735f3ca6304fb8dd1675933c576424b1ea72b3219bdab62fce56d49c820d5ac02a4702a6d688e90b0933de97da21e4829e5cf85caae8", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "DES Decrypt", "args": [ - {"option": "Hex", "string": "58345efb0a64e87e"}, - {"option": "Hex", "string": "533ed1378bfd929e"}, - "CBC", "Hex", "Hex" + { "option": "Hex", "string": "58345efb0a64e87e" }, + { "option": "Hex", "string": "533ed1378bfd929e" }, + "CBC", + "Hex", + "Hex" ] } - ], + ] }, { name: "DES Decrypt: DES-CFB, Binary", input: "09015087e15b09374bc9edba80ce41e6809e332fc1e988858749fb2f4ebbd6483a6fce01a43271280c07c90e13d517729acac45beef7d088339eb7e084bbbb7459fc8bb592d2ca76b90066dc79b1fbc5e016208e1d02c6e48ab675530f8040e53e1a138b", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "DES Decrypt", "args": [ - {"option": "Hex", "string": "58345efb0a64e87e"}, - {"option": "Hex", "string": "533ed1378bfd929e"}, - "CFB", "Hex", "Hex" + { "option": "Hex", "string": "58345efb0a64e87e" }, + { "option": "Hex", "string": "533ed1378bfd929e" }, + "CFB", + "Hex", + "Hex" ] } - ], + ] }, { name: "DES Decrypt: DES-OFB, Binary", input: "09015087e15b09374d8879bac14dbad851dd08fb131353a8c510acc4570e97720dd159465f1c7da3cac4a50521e1c1ab87e8cf5b0aa0c1d2eaa8a1ed914a26c13b2b0a76a368f08812fc7fa4b7c047f27df0c35e5f53b8a20e2ffc10e55d388cae8070db", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "DES Decrypt", "args": [ - {"option": "Hex", "string": "58345efb0a64e87e"}, - {"option": "Hex", "string": "533ed1378bfd929e"}, - "OFB", "Hex", "Hex" + { "option": "Hex", "string": "58345efb0a64e87e" }, + { "option": "Hex", "string": "533ed1378bfd929e" }, + "OFB", + "Hex", + "Hex" ] } - ], + ] }, { // play.golang.org/p/FpvqncmPk7R name: "DES Decrypt: DES-CTR, Binary", input: "09015087e15b0937ab0ae5a84d66e520893690a6ea066382bf1330e8876cb3aa82ccc634f8f0d458bbe0257df6f4637cdac89f311168ba91208a21ba4bdd13c4b1a92cb93b33364b5b94a5d3d7fba68f6eed5807d9f5afeb7fbffcd94792131d264004ae", - expectedOutput: "7a0e643132750e96b76dc9efa7810bea2b8feaa5b97887e44f96c0e6d506cc4dd4665683c6f63139221f8d887fd0a05b39741f8a67d87d6ac6f8dc6b668bd3e4a97b8bd3a19eafd5cdf50c3e1b3f17d61087d0b67cf6db31fec338b75f5954942c852829", + expectedOutput: + "7a0e643132750e96b76dc9efa7810bea2b8feaa5b97887e44f96c0e6d506cc4dd4665683c6f63139221f8d887fd0a05b39741f8a67d87d6ac6f8dc6b668bd3e4a97b8bd3a19eafd5cdf50c3e1b3f17d61087d0b67cf6db31fec338b75f5954942c852829", recipeConfig: [ { "op": "DES Decrypt", "args": [ - {"option": "Hex", "string": "58345efb0a64e87e"}, - {"option": "Hex", "string": "533ed1378bfd929e"}, - "CTR", "Hex", "Hex" + { "option": "Hex", "string": "58345efb0a64e87e" }, + { "option": "Hex", "string": "533ed1378bfd929e" }, + "CTR", + "Hex", + "Hex" ] } - ], + ] }, { name: "DES Decrypt: DES-ECB, Binary", input: "8dea4c6a35d5f6a419232159a0b039798d0a0b20fd1e559b1d04f8eb1120e8bca6ed5b3a4bc2b23d3b62312e6085d9e837677569fe79a65eba7cb4a2969e099fc1bd649e9c8aeb2c4c519e085db6974819257c20fde70acabc976308cc41635038c91acf5eefff1e", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "DES Decrypt", "args": [ - {"option": "Hex", "string": "58345efb0a64e87e"}, - {"option": "Hex", "string": "533ed1378bfd929e"}, - "ECB", "Hex", "Hex" + { "option": "Hex", "string": "58345efb0a64e87e" }, + { "option": "Hex", "string": "533ed1378bfd929e" }, + "ECB", + "Hex", + "Hex" ] } - ], + ] }, { name: "Triple DES Decrypt: no key", @@ -1399,179 +1595,192 @@ DES uses a key length of 8 bytes (64 bits).`, recipeConfig: [ { "op": "Triple DES Decrypt", - "args": [ - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""}, - "CBC", "Hex", "Hex" - ] + "args": [{ "option": "Hex", "string": "" }, { "option": "Hex", "string": "" }, "CBC", "Hex", "Hex"] } - ], + ] }, { name: "Triple DES Decrypt: DES-EDE3-CBC, Binary", input: "f826c9116ea932eb7027a810b5ce21109c4ef2563c9f3ba5e2518f72484e88f8d3f6ff3f334f64bb6bb9ff91b70f6f29c037b10dee5fe16d7f0f41c9a7ecdd83f113a1dd66ab70783ee458c2366bf5fbc016f7c168c43c11d607692a3280e3750a6154a86b62c48d", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "Triple DES Decrypt", "args": [ - {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, - {"option": "Hex", "string": "14f67ac044a84da6"}, - "CBC", "Hex", "Hex" + { "option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23" }, + { "option": "Hex", "string": "14f67ac044a84da6" }, + "CBC", + "Hex", + "Hex" ] } - ], + ] }, { name: "Triple DES Decrypt: DES-EDE3-CFB, Binary", input: "874d32cd7bdae52c3690875e265a2fac7ced685e5ec4436a6bb5a5c18be185f4526683a5bc7ae86f00523034fb725ab4c8285a6967ccca1b76f6331718c26e12ea67fc924071f81ce0035a9dd31705bcd6467991cae5504d70424e6339459db5b33cbc8a", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "Triple DES Decrypt", "args": [ - {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, - {"option": "Hex", "string": "14f67ac044a84da6"}, - "CFB", "Hex", "Hex" + { "option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23" }, + { "option": "Hex", "string": "14f67ac044a84da6" }, + "CFB", + "Hex", + "Hex" ] } - ], + ] }, { name: "Triple DES Decrypt: DES-EDE3-OFB, Binary", input: "874d32cd7bdae52c8f61672860f715d14819c0270320a8ad71083b38bd8954bbada3c77af641590b00a678524d748668fe3dfa83f71835c411cdbdd8e73a70656324b7faaba16e1d8dba260d8f965fe7a91110134c19076f1eeb46393038c22c559fe490", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "Triple DES Decrypt", "args": [ - {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, - {"option": "Hex", "string": "14f67ac044a84da6"}, - "OFB", "Hex", "Hex" + { "option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23" }, + { "option": "Hex", "string": "14f67ac044a84da6" }, + "OFB", + "Hex", + "Hex" ] } - ], + ] }, { // play.golang.org/p/iBacN9kX_RO name: "Triple DES Decrypt: DES-EDE3-CTR, Binary", input: "874d32cd7bdae52c254687e2d7e7093b077af2ec70878f99315f52a21ded5fb10c80a47e6271384335ac47376c758f675484fd7b8be9568aaec643f0d15cffdf3fe54ef3a1b2da50d5d8c7994d7a4a94e0a13a4d437443f0f1f39e93dd13ff06a80c66e4", - expectedOutput: "7a0e643132750e9625205bc6fb10dc848c53b7cb5a654d1242aecb6191ad3b5114727e5044a0ee11311575873c54829a80f9471ac473a0bbe5e791a23be75062f7e8f2210d998f9fbbaf3a5bb3dacd494d42d82950e3ab273f821eb979168315a80ad20f", + expectedOutput: + "7a0e643132750e9625205bc6fb10dc848c53b7cb5a654d1242aecb6191ad3b5114727e5044a0ee11311575873c54829a80f9471ac473a0bbe5e791a23be75062f7e8f2210d998f9fbbaf3a5bb3dacd494d42d82950e3ab273f821eb979168315a80ad20f", recipeConfig: [ { "op": "Triple DES Decrypt", "args": [ - {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, - {"option": "Hex", "string": "14f67ac044a84da6"}, - "CTR", "Hex", "Hex" + { "option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23" }, + { "option": "Hex", "string": "14f67ac044a84da6" }, + "CTR", + "Hex", + "Hex" ] } - ], + ] }, { name: "Triple DES Decrypt: DES-EDE3-ECB, Binary", input: "aa81f23d1b3abebd68ac560e051a711c2923843beecddb0f7fe4113bd1874e73cccf3a2a494bb011e154ca2737b4d0eb5978a10316361074ed368d85d5aff5c8555ea101b0a468e58780a74c7830c561674c183c972a2b48931adf789cb16df304e169500f8c95ad", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "Triple DES Decrypt", "args": [ - {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, - {"option": "Hex", "string": "14f67ac044a84da6"}, - "ECB", "Hex", "Hex" + { "option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23" }, + { "option": "Hex", "string": "14f67ac044a84da6" }, + "ECB", + "Hex", + "Hex" ] } - ], + ] }, { name: "RC2 Encrypt: no key", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "d3644d898b51a544f690b506c3fd0caeb7a1e6097f7ea28f69b909a4d8805c9a05f4cade8b281d3f044fa069374efb90e94723622c86afc17caee394ffbee0abe627de299208460eb981c9d56f9df885091c6c89e2ee173264b2820b8e67675214e6545a05dc0d3f", + expectedOutput: + "d3644d898b51a544f690b506c3fd0caeb7a1e6097f7ea28f69b909a4d8805c9a05f4cade8b281d3f044fa069374efb90e94723622c86afc17caee394ffbee0abe627de299208460eb981c9d56f9df885091c6c89e2ee173264b2820b8e67675214e6545a05dc0d3f", recipeConfig: [ { "op": "RC2 Encrypt", - "args": [ - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""}, - "Hex", "Hex" - ] + "args": [{ "option": "Hex", "string": "" }, { "option": "Hex", "string": "" }, "Hex", "Hex"] } - ], + ] }, { name: "RC2 Encrypt: RC2-CBC, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "d25e5bc6c9311ef196d6f21cc4b0274b29fcca366aba5256406e02bf4ae628398f84e7d72ad92025ede76df4752d1510fe9c3492efb1dcf0be2cd41d619e10b9dd5a2304c2efbd3598d3b87f1a21f326d45e65537563436cfb6e4a41ec3733182ddc058f96f74a6c", + expectedOutput: + "d25e5bc6c9311ef196d6f21cc4b0274b29fcca366aba5256406e02bf4ae628398f84e7d72ad92025ede76df4752d1510fe9c3492efb1dcf0be2cd41d619e10b9dd5a2304c2efbd3598d3b87f1a21f326d45e65537563436cfb6e4a41ec3733182ddc058f96f74a6c", recipeConfig: [ { "op": "RC2 Encrypt", "args": [ - {"option": "Hex", "string": "eb970554bb213430f4bb4e5988a6a218"}, - {"option": "Hex", "string": "ae817c784a097e0c"}, - "Hex", "Hex" + { "option": "Hex", "string": "eb970554bb213430f4bb4e5988a6a218" }, + { "option": "Hex", "string": "ae817c784a097e0c" }, + "Hex", + "Hex" ] } - ], + ] }, { name: "RC2 Encrypt: RC2-ECB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "a160bf23b2a85eaa43d26753e51aaa899f162ec0da7280fffd41b705c5309c7fef2bbb56bf261cab4eadd3a5c69e0a67d45e426d1097187cc9a959b4d979a9d40df26f3dc8d030453fe27701438b78d3ce044330b4b5dca7832537ecf40b914f1b1dc16d4e6d7229", + expectedOutput: + "a160bf23b2a85eaa43d26753e51aaa899f162ec0da7280fffd41b705c5309c7fef2bbb56bf261cab4eadd3a5c69e0a67d45e426d1097187cc9a959b4d979a9d40df26f3dc8d030453fe27701438b78d3ce044330b4b5dca7832537ecf40b914f1b1dc16d4e6d7229", recipeConfig: [ { "op": "RC2 Encrypt", "args": [ - {"option": "Hex", "string": "eb970554bb213430f4bb4e5988a6a218"}, - {"option": "Hex", "string": ""}, - "Hex", "Hex" + { "option": "Hex", "string": "eb970554bb213430f4bb4e5988a6a218" }, + { "option": "Hex", "string": "" }, + "Hex", + "Hex" ] } - ], + ] }, { name: "RC2 Decrypt: no key", input: "d3644d898b51a544f690b506c3fd0caeb7a1e6097f7ea28f69b909a4d8805c9a05f4cade8b281d3f044fa069374efb90e94723622c86afc17caee394ffbee0abe627de299208460eb981c9d56f9df885091c6c89e2ee173264b2820b8e67675214e6545a05dc0d3f", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "RC2 Decrypt", - "args": [ - {"option": "Hex", "string": ""}, - {"option": "Hex", "string": ""}, - "Hex", "Hex" - ] + "args": [{ "option": "Hex", "string": "" }, { "option": "Hex", "string": "" }, "Hex", "Hex"] } - ], + ] }, { name: "RC2 Decrypt: RC2-CBC, Binary", input: "d25e5bc6c9311ef196d6f21cc4b0274b29fcca366aba5256406e02bf4ae628398f84e7d72ad92025ede76df4752d1510fe9c3492efb1dcf0be2cd41d619e10b9dd5a2304c2efbd3598d3b87f1a21f326d45e65537563436cfb6e4a41ec3733182ddc058f96f74a6c", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "RC2 Decrypt", "args": [ - {"option": "Hex", "string": "eb970554bb213430f4bb4e5988a6a218"}, - {"option": "Hex", "string": "ae817c784a097e0c"}, - "Hex", "Hex" + { "option": "Hex", "string": "eb970554bb213430f4bb4e5988a6a218" }, + { "option": "Hex", "string": "ae817c784a097e0c" }, + "Hex", + "Hex" ] } - ], + ] }, { name: "RC2 Decrypt: RC2-ECB, Binary", input: "a160bf23b2a85eaa43d26753e51aaa899f162ec0da7280fffd41b705c5309c7fef2bbb56bf261cab4eadd3a5c69e0a67d45e426d1097187cc9a959b4d979a9d40df26f3dc8d030453fe27701438b78d3ce044330b4b5dca7832537ecf40b914f1b1dc16d4e6d7229", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "RC2 Decrypt", "args": [ - {"option": "Hex", "string": "eb970554bb213430f4bb4e5988a6a218"}, - {"option": "Hex", "string": ""}, - "Hex", "Hex" + { "option": "Hex", "string": "eb970554bb213430f4bb4e5988a6a218" }, + { "option": "Hex", "string": "" }, + "Hex", + "Hex" ] } - ], + ] }, /* The following expectedOutputs are generated with this Python script with pyCryptoDome @@ -1599,36 +1808,38 @@ DES uses a key length of 8 bytes (64 bits).`, { name: "Blowfish Encrypt: ECB, ASCII", input: "The quick brown fox jumps over the lazy dog.", - expectedOutput: "f7784137ab1bf51546c0b120bdb7fed4509116e49283b35fab0e4292ac86251a9bf908330e3393815e3356bb26524027", + expectedOutput: + "f7784137ab1bf51546c0b120bdb7fed4509116e49283b35fab0e4292ac86251a9bf908330e3393815e3356bb26524027", recipeConfig: [ { "op": "Blowfish Encrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "0000000000000000"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "0000000000000000" }, // IV "ECB", // Mode "Raw", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Encrypt: ECB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "3d1bf0e87d83782d435a0ca58179ca290184867f52295af5c0fb4dcac7c6c68942906bb421d05925cc7d9cd21532376a0f6ae4c3f008b250381ffa9624f5eb697dbd44de48cf5593ea7dbf5842238474b546ceeb29f6cf327a7d13698786b8d14451f52fb0f5760a", + expectedOutput: + "3d1bf0e87d83782d435a0ca58179ca290184867f52295af5c0fb4dcac7c6c68942906bb421d05925cc7d9cd21532376a0f6ae4c3f008b250381ffa9624f5eb697dbd44de48cf5593ea7dbf5842238474b546ceeb29f6cf327a7d13698786b8d14451f52fb0f5760a", recipeConfig: [ { "op": "Blowfish Encrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "0000000000000000"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "0000000000000000" }, // IV "ECB", // Mode "Hex", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Decrypt: ECB, ASCII", @@ -1638,65 +1849,68 @@ DES uses a key length of 8 bytes (64 bits).`, { "op": "Blowfish Decrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "0000000000000000"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "0000000000000000" }, // IV "ECB", // Mode "Hex", // Input "Raw" // Output ] } - ], + ] }, { name: "Blowfish Decrypt: ECB, Binary", input: "3d1bf0e87d83782d435a0ca58179ca290184867f52295af5c0fb4dcac7c6c68942906bb421d05925cc7d9cd21532376a0f6ae4c3f008b250381ffa9624f5eb697dbd44de48cf5593ea7dbf5842238474b546ceeb29f6cf327a7d13698786b8d14451f52fb0f5760a", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "Blowfish Decrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "0000000000000000"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "0000000000000000" }, // IV "ECB", // Mode "Hex", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Encrypt: CBC, ASCII", input: "The quick brown fox jumps over the lazy dog.", - expectedOutput: "398433f39e938286a35fc240521435b6972f3fe96846b54ab9351aa5fa9e10a6a94074e883d1cb36cb9657c817274b60", + expectedOutput: + "398433f39e938286a35fc240521435b6972f3fe96846b54ab9351aa5fa9e10a6a94074e883d1cb36cb9657c817274b60", recipeConfig: [ { "op": "Blowfish Encrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "CBC", // Mode "Raw", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Encrypt: CBC, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "3b42c51465896524e66c2fd2404c8c2b4eb26c760671f131c3372d374f48283ca9a5404d3d8aabd2a886c6551393ca41c682580f1c81f16046e3bec7b59247bdfca1d40bf2ad8ede9de99cb44b36658f775999d37776b3b1a085b9530e54ece69e1875e1bdc8cdcf", + expectedOutput: + "3b42c51465896524e66c2fd2404c8c2b4eb26c760671f131c3372d374f48283ca9a5404d3d8aabd2a886c6551393ca41c682580f1c81f16046e3bec7b59247bdfca1d40bf2ad8ede9de99cb44b36658f775999d37776b3b1a085b9530e54ece69e1875e1bdc8cdcf", recipeConfig: [ { "op": "Blowfish Encrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "CBC", // Mode "Hex", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Decrypt: CBC, ASCII", @@ -1706,31 +1920,32 @@ DES uses a key length of 8 bytes (64 bits).`, { "op": "Blowfish Decrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "CBC", // Mode "Hex", // Input "Raw" // Output ] } - ], + ] }, { name: "Blowfish Decrypt: CBC, Binary", input: "3b42c51465896524e66c2fd2404c8c2b4eb26c760671f131c3372d374f48283ca9a5404d3d8aabd2a886c6551393ca41c682580f1c81f16046e3bec7b59247bdfca1d40bf2ad8ede9de99cb44b36658f775999d37776b3b1a085b9530e54ece69e1875e1bdc8cdcf", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "Blowfish Decrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "CBC", // Mode "Hex", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Encrypt: CFB, ASCII", @@ -1742,32 +1957,33 @@ DES uses a key length of 8 bytes (64 bits).`, { "op": "Blowfish Encrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "CFB", // Mode "Raw", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Encrypt: CFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", // see above. pyCryptoDome produces a different value with its default settings - expectedOutput: "e6ac1324d1576beab00e855de3f4ac1f5e3cbf89f4c2a743a5737895067ac5012e5bdb92477e256cc07bf691b58e721179b550e694abb0be7cbdc42586db755bf795f4338f47d356c57453afa6277e46aaeb3405f9744654a477f06c2ad92ede90555759", + expectedOutput: + "e6ac1324d1576beab00e855de3f4ac1f5e3cbf89f4c2a743a5737895067ac5012e5bdb92477e256cc07bf691b58e721179b550e694abb0be7cbdc42586db755bf795f4338f47d356c57453afa6277e46aaeb3405f9744654a477f06c2ad92ede90555759", recipeConfig: [ { "op": "Blowfish Encrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "CFB", // Mode "Hex", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Decrypt: CFB, ASCII", @@ -1778,32 +1994,33 @@ DES uses a key length of 8 bytes (64 bits).`, { "op": "Blowfish Decrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "CFB", // Mode "Hex", // Input "Raw" // Output ] } - ], + ] }, { name: "Blowfish Decrypt: CFB, Binary", input: "e6ac1324d1576beab00e855de3f4ac1f5e3cbf89f4c2a743a5737895067ac5012e5bdb92477e256cc07bf691b58e721179b550e694abb0be7cbdc42586db755bf795f4338f47d356c57453afa6277e46aaeb3405f9744654a477f06c2ad92ede90555759", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", // see above. pyCryptoDome produces a different value with its default settings recipeConfig: [ { "op": "Blowfish Decrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "CFB", // Mode "Hex", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Encrypt: OFB, ASCII", @@ -1813,31 +2030,32 @@ DES uses a key length of 8 bytes (64 bits).`, { "op": "Blowfish Encrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "OFB", // Mode "Raw", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Encrypt: OFB, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "e6ac1324d1576bea4ceb5be7691c35e4919f18be06cc2a926025ef0973222e987de7c63cd71ed3b19190ba006931d9cbdf412f5b1ac7155904ca591f693fe11aa996e17866e0de4b2eb7ff5effabf94b0f49ed159202caf72745ac2f024d86f942d83767", + expectedOutput: + "e6ac1324d1576bea4ceb5be7691c35e4919f18be06cc2a926025ef0973222e987de7c63cd71ed3b19190ba006931d9cbdf412f5b1ac7155904ca591f693fe11aa996e17866e0de4b2eb7ff5effabf94b0f49ed159202caf72745ac2f024d86f942d83767", recipeConfig: [ { "op": "Blowfish Encrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "OFB", // Mode "Hex", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Decrypt: OFB, ASCII", @@ -1847,31 +2065,32 @@ DES uses a key length of 8 bytes (64 bits).`, { "op": "Blowfish Decrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "OFB", // Mode "Hex", // Input "Raw" // Output ] } - ], + ] }, { name: "Blowfish Decrypt: OFB, Binary", input: "e6ac1324d1576bea4ceb5be7691c35e4919f18be06cc2a926025ef0973222e987de7c63cd71ed3b19190ba006931d9cbdf412f5b1ac7155904ca591f693fe11aa996e17866e0de4b2eb7ff5effabf94b0f49ed159202caf72745ac2f024d86f942d83767", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "Blowfish Decrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key - {"option": "Hex", "string": "ffeeddccbbaa9988"}, // IV + { "option": "Hex", "string": "0011223344556677" }, // Key + { "option": "Hex", "string": "ffeeddccbbaa9988" }, // IV "OFB", // Mode "Hex", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Encrypt: CTR, ASCII", @@ -1881,36 +2100,37 @@ DES uses a key length of 8 bytes (64 bits).`, { "op": "Blowfish Encrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key + { "option": "Hex", "string": "0011223344556677" }, // Key // pyCryptoDome only allows the size of the nonce to be [0,7] bytes. // Internally, it right-pads the nonce to 7 bytes long if it wasn't already 7 bytes, // and the last (8th) byte is used for counter. // Therefore a pyCryptoDome nonce of "aabbccdd" is equivalent to an IV of "aabbccdd00000000" here. - {"option": "Hex", "string": "0000000000000000"}, // IV (nonce) + { "option": "Hex", "string": "0000000000000000" }, // IV (nonce) "CTR", // Mode "Raw", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Encrypt: CTR, Binary", input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", - expectedOutput: "ccc3e1e179d4e084b2e27cef77255595ebfb694a9999b7ef8e661086058472dad7f3e0350fde9be87059ab43d5b800aa08be4c00f3f2e99402fe2702c39e8663dbcbb146700d63432227f1045f116bfd4b65022ca20b70427ddcfd7441cb3c75f4d3fff0", + expectedOutput: + "ccc3e1e179d4e084b2e27cef77255595ebfb694a9999b7ef8e661086058472dad7f3e0350fde9be87059ab43d5b800aa08be4c00f3f2e99402fe2702c39e8663dbcbb146700d63432227f1045f116bfd4b65022ca20b70427ddcfd7441cb3c75f4d3fff0", recipeConfig: [ { "op": "Blowfish Encrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key + { "option": "Hex", "string": "0011223344556677" }, // Key // See notes above - {"option": "Hex", "string": "0000000000000000"}, // IV (nonce) + { "option": "Hex", "string": "0000000000000000" }, // IV (nonce) "CTR", // Mode "Hex", // Input "Hex" // Output ] } - ], + ] }, { name: "Blowfish Decrypt: CTR, ASCII", @@ -1920,32 +2140,33 @@ DES uses a key length of 8 bytes (64 bits).`, { "op": "Blowfish Decrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key + { "option": "Hex", "string": "0011223344556677" }, // Key // See notes above - {"option": "Hex", "string": "0000000000000000"}, // IV (nonce) + { "option": "Hex", "string": "0000000000000000" }, // IV (nonce) "CTR", // Mode "Hex", // Input "Raw" // Output ] } - ], + ] }, { name: "Blowfish Decrypt: CTR, Binary", input: "ccc3e1e179d4e084b2e27cef77255595ebfb694a9999b7ef8e661086058472dad7f3e0350fde9be87059ab43d5b800aa08be4c00f3f2e99402fe2702c39e8663dbcbb146700d63432227f1045f116bfd4b65022ca20b70427ddcfd7441cb3c75f4d3fff0", - expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: + "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", recipeConfig: [ { "op": "Blowfish Decrypt", "args": [ - {"option": "Hex", "string": "0011223344556677"}, // Key + { "option": "Hex", "string": "0011223344556677" }, // Key // See notes above - {"option": "Hex", "string": "0000000000000000"}, // IV (nonce) + { "option": "Hex", "string": "0000000000000000" }, // IV (nonce) "CTR", // Mode "Hex", // Input "Hex" // Output ] } - ], - }, + ] + } ]); diff --git a/tests/operations/tests/DateTime.mjs b/tests/operations/tests/DateTime.mjs index 6276890d..01915194 100644 --- a/tests/operations/tests/DateTime.mjs +++ b/tests/operations/tests/DateTime.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Windows Filetime to UNIX Timestamp", - args: ["Nanoseconds (ns)", "Decimal"], - }, - ], + args: ["Nanoseconds (ns)", "Decimal"] + } + ] }, { name: "Unix to Filetime", @@ -27,8 +27,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "UNIX Timestamp to Windows Filetime", - args: ["Nanoseconds (ns)", "Decimal"], - }, - ], - }, + args: ["Nanoseconds (ns)", "Decimal"] + } + ] + } ]); diff --git a/tests/operations/tests/DefangIP.mjs b/tests/operations/tests/DefangIP.mjs index 60005c54..b94beeec 100644 --- a/tests/operations/tests/DefangIP.mjs +++ b/tests/operations/tests/DefangIP.mjs @@ -16,28 +16,30 @@ TestRegister.addTests([ recipeConfig: [ { op: "Defang IP Addresses", - args: [], - }, - ], - }, { + args: [] + } + ] + }, + { name: "Defang IP: Valid IPV6", input: "2001:0db8:85a3:0000:0000:8a2e:0370:7343", expectedOutput: "2001[:]0db8[:]85a3[:]0000[:]0000[:]8a2e[:]0370[:]7343", recipeConfig: [ { op: "Defang IP Addresses", - args: [], - }, - ], - }, { + args: [] + } + ] + }, + { name: "Defang IP: Valid IPV6 Shorthand", input: "2001:db8:3c4d:15::1a2f:1a2b", expectedOutput: "2001[:]db8[:]3c4d[:]15[:][:]1a2f[:]1a2b", recipeConfig: [ { op: "Defang IP Addresses", - args: [], - }, - ], - }, + args: [] + } + ] + } ]); diff --git a/tests/operations/tests/ELFInfo.mjs b/tests/operations/tests/ELFInfo.mjs index fad9a05c..3de14299 100644 --- a/tests/operations/tests/ELFInfo.mjs +++ b/tests/operations/tests/ELFInfo.mjs @@ -4,12 +4,16 @@ * @license Apache-2.0 */ import TestRegister from "../../lib/TestRegister.mjs"; -import {ELF32_LE, ELF32_BE, ELF64_LE, ELF64_BE} from "../../samples/Executables.mjs"; +import { ELF32_LE, ELF32_BE, ELF64_LE, ELF64_BE } from "../../samples/Executables.mjs"; -const ELF32_LE_OUTPUT = "============================== ELF Header ==============================\nMagic: \x7fELF\nFormat: 32-bit\nEndianness: Little\nVersion: 1\nABI: System V\nABI Version: 0\nType: Executable File\nInstruction Set Architecture: x86\nELF Version: 1\nEntry Point: 0x8062150\nEntry PHOFF: 0x34\nEntry SHOFF: 0x54\nFlags: 00000000\nELF Header Size: 52 bytes\nProgram Header Size: 32 bytes\nProgram Header Entries: 1\nSection Header Size: 40 bytes\nSection Header Entries: 3\nSection Header Names: 0\n\n============================== Program Header ==============================\nProgram Header Type: Program Header Table\nOffset Of Segment: 52\nVirtual Address of Segment: 134512692\nPhysical Address of Segment: 134512692\nSize of Segment: 256 bytes\nSize of Segment in Memory: 256 bytes\nFlags: Execute,Read\n\n============================== Section Header ==============================\nType: String Table\nSection Name: .shstrab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 204\nSection Size: 28\nAssociated Section: 0\nSection Extra Information: 0\n\nType: Symbol Table\nSection Name: .symtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 230\nSection Size: 16\nAssociated Section: 0\nSection Extra Information: 0\n\nType: String Table\nSection Name: .strtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 245\nSection Size: 4\nAssociated Section: 0\nSection Extra Information: 0\n\n============================== Symbol Table ==============================\nSymbol Name: test"; -const ELF32_BE_OUTPUT = "============================== ELF Header ==============================\nMagic: \x7fELF\nFormat: 32-bit\nEndianness: Big\nVersion: 1\nABI: System V\nABI Version: 0\nType: Executable File\nInstruction Set Architecture: x86\nELF Version: 1\nEntry Point: 0x8062150\nEntry PHOFF: 0x34\nEntry SHOFF: 0x54\nFlags: 00000000\nELF Header Size: 52 bytes\nProgram Header Size: 32 bytes\nProgram Header Entries: 1\nSection Header Size: 40 bytes\nSection Header Entries: 3\nSection Header Names: 0\n\n============================== Program Header ==============================\nProgram Header Type: Program Header Table\nOffset Of Segment: 52\nVirtual Address of Segment: 134512692\nPhysical Address of Segment: 134512692\nSize of Segment: 256 bytes\nSize of Segment in Memory: 256 bytes\nFlags: Execute,Read\n\n============================== Section Header ==============================\nType: String Table\nSection Name: .shstrab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 204\nSection Size: 28\nAssociated Section: 0\nSection Extra Information: 0\n\nType: Symbol Table\nSection Name: .symtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 230\nSection Size: 16\nAssociated Section: 0\nSection Extra Information: 0\n\nType: String Table\nSection Name: .strtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 245\nSection Size: 4\nAssociated Section: 0\nSection Extra Information: 0\n\n============================== Symbol Table ==============================\nSymbol Name: test"; -const ELF64_LE_OUTPUT = "============================== ELF Header ==============================\nMagic: \x7fELF\nFormat: 64-bit\nEndianness: Little\nVersion: 1\nABI: System V\nABI Version: 0\nType: Executable File\nInstruction Set Architecture: AMD x86-64\nELF Version: 1\nEntry Point: 0x8062150\nEntry PHOFF: 0x40\nEntry SHOFF: 0x78\nFlags: 00000000\nELF Header Size: 64 bytes\nProgram Header Size: 56 bytes\nProgram Header Entries: 1\nSection Header Size: 64 bytes\nSection Header Entries: 3\nSection Header Names: 0\n\n============================== Program Header ==============================\nProgram Header Type: Program Header Table\nFlags: Execute,Read\nOffset Of Segment: 52\nVirtual Address of Segment: 134512692\nPhysical Address of Segment: 134512692\nSize of Segment: 256 bytes\nSize of Segment in Memory: 256 bytes\n\n============================== Section Header ==============================\nType: String Table\nSection Name: .shstrab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 312\nSection Size: 28\nAssociated Section: 0\nSection Extra Information: 0\n\nType: Symbol Table\nSection Name: .symtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 336\nSection Size: 16\nAssociated Section: 0\nSection Extra Information: 0\n\nType: String Table\nSection Name: .strtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 361\nSection Size: 4\nAssociated Section: 0\nSection Extra Information: 0\n\n============================== Symbol Table ==============================\nSymbol Name: test"; -const ELF64_BE_OUTPUT = "============================== ELF Header ==============================\nMagic: \x7fELF\nFormat: 64-bit\nEndianness: Big\nVersion: 1\nABI: System V\nABI Version: 0\nType: Executable File\nInstruction Set Architecture: AMD x86-64\nELF Version: 1\nEntry Point: 0x8062150\nEntry PHOFF: 0x40\nEntry SHOFF: 0x78\nFlags: 00000000\nELF Header Size: 64 bytes\nProgram Header Size: 56 bytes\nProgram Header Entries: 1\nSection Header Size: 64 bytes\nSection Header Entries: 3\nSection Header Names: 0\n\n============================== Program Header ==============================\nProgram Header Type: Program Header Table\nFlags: Execute,Read\nOffset Of Segment: 52\nVirtual Address of Segment: 134512692\nPhysical Address of Segment: 134512692\nSize of Segment: 256 bytes\nSize of Segment in Memory: 256 bytes\n\n============================== Section Header ==============================\nType: String Table\nSection Name: .shstrab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 312\nSection Size: 28\nAssociated Section: 0\nSection Extra Information: 0\n\nType: Symbol Table\nSection Name: .symtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 336\nSection Size: 16\nAssociated Section: 0\nSection Extra Information: 0\n\nType: String Table\nSection Name: .strtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 361\nSection Size: 4\nAssociated Section: 0\nSection Extra Information: 0\n\n============================== Symbol Table ==============================\nSymbol Name: test"; +const ELF32_LE_OUTPUT + = "============================== ELF Header ==============================\nMagic: \x7fELF\nFormat: 32-bit\nEndianness: Little\nVersion: 1\nABI: System V\nABI Version: 0\nType: Executable File\nInstruction Set Architecture: x86\nELF Version: 1\nEntry Point: 0x8062150\nEntry PHOFF: 0x34\nEntry SHOFF: 0x54\nFlags: 00000000\nELF Header Size: 52 bytes\nProgram Header Size: 32 bytes\nProgram Header Entries: 1\nSection Header Size: 40 bytes\nSection Header Entries: 3\nSection Header Names: 0\n\n============================== Program Header ==============================\nProgram Header Type: Program Header Table\nOffset Of Segment: 52\nVirtual Address of Segment: 134512692\nPhysical Address of Segment: 134512692\nSize of Segment: 256 bytes\nSize of Segment in Memory: 256 bytes\nFlags: Execute,Read\n\n============================== Section Header ==============================\nType: String Table\nSection Name: .shstrab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 204\nSection Size: 28\nAssociated Section: 0\nSection Extra Information: 0\n\nType: Symbol Table\nSection Name: .symtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 230\nSection Size: 16\nAssociated Section: 0\nSection Extra Information: 0\n\nType: String Table\nSection Name: .strtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 245\nSection Size: 4\nAssociated Section: 0\nSection Extra Information: 0\n\n============================== Symbol Table ==============================\nSymbol Name: test"; +const ELF32_BE_OUTPUT + = "============================== ELF Header ==============================\nMagic: \x7fELF\nFormat: 32-bit\nEndianness: Big\nVersion: 1\nABI: System V\nABI Version: 0\nType: Executable File\nInstruction Set Architecture: x86\nELF Version: 1\nEntry Point: 0x8062150\nEntry PHOFF: 0x34\nEntry SHOFF: 0x54\nFlags: 00000000\nELF Header Size: 52 bytes\nProgram Header Size: 32 bytes\nProgram Header Entries: 1\nSection Header Size: 40 bytes\nSection Header Entries: 3\nSection Header Names: 0\n\n============================== Program Header ==============================\nProgram Header Type: Program Header Table\nOffset Of Segment: 52\nVirtual Address of Segment: 134512692\nPhysical Address of Segment: 134512692\nSize of Segment: 256 bytes\nSize of Segment in Memory: 256 bytes\nFlags: Execute,Read\n\n============================== Section Header ==============================\nType: String Table\nSection Name: .shstrab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 204\nSection Size: 28\nAssociated Section: 0\nSection Extra Information: 0\n\nType: Symbol Table\nSection Name: .symtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 230\nSection Size: 16\nAssociated Section: 0\nSection Extra Information: 0\n\nType: String Table\nSection Name: .strtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 245\nSection Size: 4\nAssociated Section: 0\nSection Extra Information: 0\n\n============================== Symbol Table ==============================\nSymbol Name: test"; +const ELF64_LE_OUTPUT + = "============================== ELF Header ==============================\nMagic: \x7fELF\nFormat: 64-bit\nEndianness: Little\nVersion: 1\nABI: System V\nABI Version: 0\nType: Executable File\nInstruction Set Architecture: AMD x86-64\nELF Version: 1\nEntry Point: 0x8062150\nEntry PHOFF: 0x40\nEntry SHOFF: 0x78\nFlags: 00000000\nELF Header Size: 64 bytes\nProgram Header Size: 56 bytes\nProgram Header Entries: 1\nSection Header Size: 64 bytes\nSection Header Entries: 3\nSection Header Names: 0\n\n============================== Program Header ==============================\nProgram Header Type: Program Header Table\nFlags: Execute,Read\nOffset Of Segment: 52\nVirtual Address of Segment: 134512692\nPhysical Address of Segment: 134512692\nSize of Segment: 256 bytes\nSize of Segment in Memory: 256 bytes\n\n============================== Section Header ==============================\nType: String Table\nSection Name: .shstrab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 312\nSection Size: 28\nAssociated Section: 0\nSection Extra Information: 0\n\nType: Symbol Table\nSection Name: .symtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 336\nSection Size: 16\nAssociated Section: 0\nSection Extra Information: 0\n\nType: String Table\nSection Name: .strtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 361\nSection Size: 4\nAssociated Section: 0\nSection Extra Information: 0\n\n============================== Symbol Table ==============================\nSymbol Name: test"; +const ELF64_BE_OUTPUT + = "============================== ELF Header ==============================\nMagic: \x7fELF\nFormat: 64-bit\nEndianness: Big\nVersion: 1\nABI: System V\nABI Version: 0\nType: Executable File\nInstruction Set Architecture: AMD x86-64\nELF Version: 1\nEntry Point: 0x8062150\nEntry PHOFF: 0x40\nEntry SHOFF: 0x78\nFlags: 00000000\nELF Header Size: 64 bytes\nProgram Header Size: 56 bytes\nProgram Header Entries: 1\nSection Header Size: 64 bytes\nSection Header Entries: 3\nSection Header Names: 0\n\n============================== Program Header ==============================\nProgram Header Type: Program Header Table\nFlags: Execute,Read\nOffset Of Segment: 52\nVirtual Address of Segment: 134512692\nPhysical Address of Segment: 134512692\nSize of Segment: 256 bytes\nSize of Segment in Memory: 256 bytes\n\n============================== Section Header ==============================\nType: String Table\nSection Name: .shstrab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 312\nSection Size: 28\nAssociated Section: 0\nSection Extra Information: 0\n\nType: Symbol Table\nSection Name: .symtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 336\nSection Size: 16\nAssociated Section: 0\nSection Extra Information: 0\n\nType: String Table\nSection Name: .strtab\nFlags: \nSection Vaddr in memory: 0\nOffset of the section: 361\nSection Size: 4\nAssociated Section: 0\nSection Extra Information: 0\n\n============================== Symbol Table ==============================\nSymbol Name: test"; TestRegister.addTests([ { @@ -19,9 +23,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "ELF Info", - args: [], - }, - ], + args: [] + } + ] }, { name: "ELF Info 32-bit ELF Little Endian.", @@ -30,13 +34,13 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Hex", - args: ["None"], + args: ["None"] }, { op: "ELF Info", - args: [], - }, - ], + args: [] + } + ] }, { name: "ELF Info 32-bit ELF Big Endian.", @@ -45,13 +49,13 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Hex", - args: ["None"], + args: ["None"] }, { op: "ELF Info", - args: [], - }, - ], + args: [] + } + ] }, { name: "ELF Info 64-bit ELF Little Endian.", @@ -60,13 +64,13 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Hex", - args: ["None"], + args: ["None"] }, { op: "ELF Info", - args: [], - }, - ], + args: [] + } + ] }, { name: "ELF Info 64-bit ELF Big Endian.", @@ -75,12 +79,12 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Hex", - args: ["None"], + args: ["None"] }, { op: "ELF Info", - args: [], - }, - ], - }, + args: [] + } + ] + } ]); diff --git a/tests/operations/tests/Enigma.mjs b/tests/operations/tests/Enigma.mjs index 090ecc35..af0ff975 100644 --- a/tests/operations/tests/Enigma.mjs +++ b/tests/operations/tests/Enigma.mjs @@ -18,11 +18,19 @@ TestRegister.addTests([ "op": "Enigma", "args": [ "3-rotor", - "", "A", "A", + "", + "A", + "A", // Note: start on Z because it steps when the key is pressed - "EKMFLGDQVZNTOWYHXUSPAIBRCJ", + expectedOutput: + "", recipeConfig: [ { op: "From Hex", args: ["Space"] }, { op: "Render Image", args: ["Raw"] } @@ -32,18 +31,16 @@ TestRegister.addTests([ { name: "Render Image: hex png", input: PNG_HEX, - expectedOutput: "", - recipeConfig: [ - { op: "Render Image", args: ["Hex"] } - ] + expectedOutput: + "", + recipeConfig: [{ op: "Render Image", args: ["Hex"] }] }, { name: "Render Image: base64 jpg", input: JPG_B64, - expectedOutput: "", - recipeConfig: [ - { op: "Render Image", args: ["Base64"] } - ] + expectedOutput: + "", + recipeConfig: [{ op: "Render Image", args: ["Base64"] }] }, { name: "Extract EXIF: nothing", @@ -52,9 +49,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Extract EXIF", - args: [], - }, - ], + args: [] + } + ] }, { name: "Extract EXIF: hello world text (error)", @@ -63,9 +60,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Extract EXIF", - args: [], - }, - ], + args: [] + } + ] }, { name: "Extract EXIF: meerkat jpeg", @@ -100,7 +97,7 @@ TestRegister.addTests([ "SceneCaptureType: 0", "Contrast: 0", "Saturation: 0", - "Sharpness: 0", + "Sharpness: 0" ].join("\n"), recipeConfig: [ { @@ -109,9 +106,9 @@ TestRegister.addTests([ }, { op: "Extract EXIF", - args: [], - }, - ], + args: [] + } + ] }, { name: "Extract EXIF: avatar jpeg", @@ -124,9 +121,9 @@ TestRegister.addTests([ }, { op: "Extract EXIF", - args: [], - }, - ], + args: [] + } + ] }, { name: "Remove EXIF: hello world text (error)", @@ -135,9 +132,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Remove EXIF", - args: [], - }, - ], + args: [] + } + ] }, { name: "Remove EXIF: meerkat jpeg (has EXIF)", @@ -150,13 +147,13 @@ TestRegister.addTests([ }, { op: "Remove EXIF", - args: [], + args: [] }, { op: "Extract EXIF", - args: [], - }, - ], + args: [] + } + ] }, { name: "Extract EXIF: avatar jpeg (has no EXIF)", @@ -169,18 +166,19 @@ TestRegister.addTests([ }, { op: "Remove EXIF", - args: [], + args: [] }, { op: "Extract EXIF", - args: [], - }, - ], + args: [] + } + ] }, { name: "Extract RGBA", input: "424d460400000000000036040000280000000400000004000000010008000000000010000000120b0000120b0000000100000001000000c8000000cf000000d7000000df000000e7000000ef000000f7000000ff000083000000ac000000d5000000ff000000000083000000ac000000d5000000ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f070d05030b01090c040e060008020a", - expectedOutput: "0 200 0 0 0 131 0 215 0 0 0 213 131 0 0 0 231 0 213 0 0 0 247 0 0 223 0 0 0 255 0 207 0 0 0 172 255 0 0 0 255 0 172 0 0 0 239 0", + expectedOutput: + "0 200 0 0 0 131 0 215 0 0 0 213 131 0 0 0 231 0 213 0 0 0 247 0 0 223 0 0 0 255 0 207 0 0 0 172 255 0 0 0 255 0 172 0 0 0 239 0", recipeConfig: [ { op: "From Hex", @@ -195,7 +193,8 @@ TestRegister.addTests([ { name: "Extract LSB", input: PNG_HEX, - expectedOutput: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000208000000000000000000008000000000000000000000000248000000200240000000208908000000200240000000200821000000200240000000061249000000240000000000209b69000001a49b00000000a204a1200001a49b00000009800414000001a49b0000000035db6c00000094924000000086dffc20000df6dec8000001e10014a0000df6dec800002564924b00000df6dec80000009a6db20000007edb4124804177fffba0002fffff69249044e0924bc4002fffff6924905fb2db6d04002fffff692490416d2490040001bfffcc92030dbffffdc00037fffffdb6d302c6db6d700037fffffdb6d327eb6db6148037fffffdb6d30db4000014800dffffeb6d9aefffffff640", + expectedOutput: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000208000000000000000000008000000000000000000000000248000000200240000000208908000000200240000000200821000000200240000000061249000000240000000000209b69000001a49b00000000a204a1200001a49b00000009800414000001a49b0000000035db6c00000094924000000086dffc20000df6dec8000001e10014a0000df6dec800002564924b00000df6dec80000009a6db20000007edb4124804177fffba0002fffff69249044e0924bc4002fffff6924905fb2db6d04002fffff692490416d2490040001bfffcc92030dbffffdc00037fffffdb6d302c6db6d700037fffffdb6d327eb6db6148037fffffdb6d30db4000014800dffffeb6d9aefffffff640", recipeConfig: [ { op: "From Hex", @@ -214,7 +213,8 @@ TestRegister.addTests([ { name: "View Bit Plane", input: PNG_HEX, - expectedOutput: "89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af400000140494441547801c5c1416ea3400000c1ee11ffff726fe6808410186ce26c95fde0432a154f0cdea4b2aa505151519954ee1a5c50995454aea8ac54ae2c5ca8982a3ea132551c199c507942e58ec1898adf50f1cae084ca15952b2a152a47067f40a5e2c8e00f54a81c199ca8b85271a542a5e2c8e005159527542ace0c5ea8a8f844c54ae5ccc217555c197c41c55d83ff6cf0052a772ddca052b1a752b1a772d7c2432a4f2c3c50f1d4c20b2a1593ca918a4965afe2cac29b2a562a93ca56c55d0b2754b62a269555c554b15251a9b8637040e5884ac54a654ba5a2624be5cce040c5918a55c55ec5a4a232a9549c197c48655239523155bc3278a862af624be5ccc2072aaea854a8549c5978834a85ca5ec5918a57ec076f50a958a9546ca94c1557ec071754a68a2d958a270637544c2a2abf69e1a68a95ca54b152a978d73f2e08bd57b6f839a00000000049454e44ae426082", + expectedOutput: + "89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af400000140494441547801c5c1416ea3400000c1ee11ffff726fe6808410186ce26c95fde0432a154f0cdea4b2aa505151519954ee1a5c50995454aea8ac54ae2c5ca8982a3ea132551c199c507942e58ec1898adf50f1cae084ca15952b2a152a47067f40a5e2c8e00f54a81c199ca8b85271a542a5e2c8e005159527542ace0c5ea8a8f844c54ae5ccc217555c197c41c55d83ff6cf0052a772ddca052b1a752b1a772d7c2432a4f2c3c50f1d4c20b2a1593ca918a4965afe2cac29b2a562a93ca56c55d0b2754b62a269555c554b15251a9b8637040e5884ac54a654ba5a2624be5cce040c5918a55c55ec5a4a232a9549c197c48655239523155bc3278a862af624be5ccc2072aaea854a8549c5978834a85ca5ec5918a57ec076f50a958a9546ca94c1557ec071754a68a2d958a270637544c2a2abf69e1a68a95ca54b152a978d73f2e08bd57b6f839a00000000049454e44ae426082", recipeConfig: [ { op: "From Hex", @@ -233,7 +233,8 @@ TestRegister.addTests([ { name: "Randomize Colour Palette", "input": PNG_HEX, - expectedOutput: "89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af4000004f3494441547801c5c10b50cf0700c0f16fbfff8f0ae5f157ed9f1e446358ab28b3913f29b3f89f65deab9859c624cafbf557b6eb3662799c8a285c541479ed3c125d2d2cba52e45d4da8bc66b99d1ebbff6ddd75ddeff7efef75fb7c8c5cb5b10dbc869ccbd1ac4f0c67dfc55cba1f9ec32dd303bc0e854aadd1f20ace5f29e1c9346b4c3982aada03b3285b540f4b099f664ca5720321a34c582466b2f38f3e1842a1526bb4e811efe64a56403a465dc270a998cb517b47e62f7842870b6aaabc5b519627a253784e606a8e25470fbbe358a0c2fd692f9c9668b8bda084e77d5f2247448f790f42a9b9da915d415a6020508a3e49e207e8ec7961cb9594545657e5e26e0fdaf9df5014998a141119f16eae24b4db84f7d775bc8e3e3e9e24f12fabaccf282210292232ce6a5e12dab58e37656be7cf8893916498d72345404681d7365ae217b18b969495261019998f8569145204e47c3e99b7a58f8f278fa76e478a808c522f23de165b3b7f3aee9c8e14011956e9b6841c29419f5d8bfd6889ad9d3fc1c9c654be08428a808cfc9a0c02e7d711973a823751569ac0c79dd72347408fb9ee3d102f4c616d9c82579596dd8df1b5c58caf2d26625d2fe488b420b16c129e3d7825534ccbb01a3881f0803354adba49c5853ce488bc037ba66b48c93586e20298885e02ff338177c0a1ed600c256200973699b0f130cd9dafcd20c87a3bcd9d29d90b1462081103c4d444d1bee2139aab9b7c87ec50479adbd47f13a0c610227a94af8a6565ce118ce72dc1618d3b4ded6f678465840dd905bd519f3e455305e67eb4f1db8ed94fdeb444448f0dbb94740bcec029db9fa636fc99cbf176a708b9e44198af3573469b323cb992469694b031bd133b2a955cb2a8461f0119a3b6f810fcac81619ea1c42cbf43a3711393d8727b1ee37ad6a263b1388cc8a872264cc8a7d1c97116d407ede1ab9c44ac3de610e5f32372142ab5468b84d091d984d79a90147e8dfb8322e8bcf71cdf370ce07ae6158606ee479c164c8794ddf88f76664c5d3d96579ee171db85d9917524b996102e2e65d882753c4c28e690714f9e3ffa1b2902122a0e6571a3c8864657b304ee2e4d6579e1038e0879cc0c716765c67ec2ee1d63cbaa9154db0760ffcc8e0fd7f643d3ba9c31ce69fc3c68124507bae060eb8379dc45e4884850aa4730ca2e97e68a572ca178055c7ff411cb56c4002bf86ef6717c53f94f3c3a4ff72590d6fa09ef134ae0a983ec1efc2b720424fc55b8107dbea8fe81134ecee8687c4d68ae62de45bc636ad099782b126b8f39c81190b0f292127d5295cb98f2b415aa2a055dcb2fb035b081a686f48ee5f4d37ee80c9d91498855007204240cc9ea89efeabec871ec5443c381b1980c9a4f456d1233a38d68ce667c2ee7c2927019e1ce8bb84ce48848f832d10bb1f50dd6540d03d268d4677d39ed1d52514407d3b6d8830327dc49b0984574507b3a3b0573fb5806f762afa37379790e7783ab0849ee0f66fd91a350a9355a24d4bb754239ca02df597598d52dc5c2bb339503cde95213cff3a089240d7f48fd522f9c943eec1db088e53b0412631ea193dec188e4b3a7d9d6eb535a62e4aa8d6da005bfe4d9125de082dbcd6f69ca6ecc66c2166ca329eb198ee4bf5780a5ba3b861030c05cd732eea4acc3c42106671f0d52ac6738727064325b8ff5c752dd1d4329546a8d1603bc2c51f2bbf3356eae2c64b379374c964561b5f53c36d65e14fd3683c7f7179232d686bdf9777915ff00ec08ae8ecb66a3370000000049454e44ae426082", + expectedOutput: + "89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af4000004f3494441547801c5c10b50cf0700c0f16fbfff8f0ae5f157ed9f1e446358ab28b3913f29b3f89f65deab9859c624cafbf557b6eb3662799c8a285c541479ed3c125d2d2cba52e45d4da8bc66b99d1ebbff6ddd75ddeff7efef75fb7c8c5cb5b10dbc869ccbd1ac4f0c67dfc55cba1f9ec32dd303bc0e854aadd1f20ace5f29e1c9346b4c3982aada03b3285b540f4b099f664ca5720321a34c582466b2f38f3e1842a1526bb4e811efe64a56403a465dc270a998cb517b47e62f7842870b6aaabc5b519627a253784e606a8e25470fbbe358a0c2fd692f9c9668b8bda084e77d5f2247448f790f42a9b9da915d415a6020508a3e49e207e8ec7961cb9594545657e5e26e0fdaf9df5014998a141119f16eae24b4db84f7d775bc8e3e3e9e24f12fabaccf282210292232ce6a5e12dab58e37656be7cf8893916498d72345404681d7365ae217b18b969495261019998f8569145204e47c3e99b7a58f8f278fa76e478a808c522f23de165b3b7f3aee9c8e14011956e9b6841c29419f5d8bfd6889ad9d3fc1c9c654be08428a808cfc9a0c02e7d711973a823751569ac0c79dd72347408fb9ee3d102f4c616d9c82579596dd8df1b5c58caf2d26625d2fe488b420b16c129e3d7825534ccbb01a3881f0803354adba49c5853ce488bc037ba66b48c93586e20298885e02ff338177c0a1ed600c256200973699b0f130cd9dafcd20c87a3bcd9d29d90b1462081103c4d444d1bee2139aab9b7c87ec50479adbd47f13a0c610227a94af8a6565ce118ce72dc1618d3b4ded6f678465840dd905bd519f3e455305e67eb4f1db8ed94fdeb444448f0dbb94740bcec029db9fa636fc99cbf176a708b9e44198af3573469b323cb992469694b031bd133b2a955cb2a8461f0119a3b6f810fcac81619ea1c42cbf43a3711393d8727b1ee37ad6a263b1388cc8a872264cc8a7d1c97116d407ede1ab9c44ac3de610e5f32372142ab5468b84d091d984d79a90147e8dfb8322e8bcf71cdf370ce07ae6158606ee479c164c8794ddf88f76664c5d3d96579ee171db85d9917524b996102e2e65d882753c4c28e690714f9e3ffa1b2902122a0e6571a3c8864657b304ee2e4d6579e1038e0879cc0c716765c67ec2ee1d63cbaa9154db0760ffcc8e0fd7f643d3ba9c31ce69fc3c68124507bae060eb8379dc45e4884850aa4730ca2e97e68a572ca178055c7ff411cb56c4002bf86ef6717c53f94f3c3a4ff72590d6fa09ef134ae0a983ec1efc2b720424fc55b8107dbea8fe81134ecee8687c4d68ae62de45bc636ad099782b126b8f39c81190b0f292127d5295cb98f2b415aa2a055dcb2fb035b081a686f48ee5f4d37ee80c9d91498855007204240cc9ea89efeabec871ec5443c381b1980c9a4f456d1233a38d68ce667c2ee7c2927019e1ce8bb84ce48848f832d10bb1f50dd6540d03d268d4677d39ed1d52514407d3b6d8830327dc49b0984574507b3a3b0573fb5806f762afa37379790e7783ab0849ee0f66fd91a350a9355a24d4bb754239ca02df597598d52dc5c2bb339503cde95213cff3a089240d7f48fd522f9c943eec1db088e53b0412631ea193dec188e4b3a7d9d6eb535a62e4aa8d6da005bfe4d9125de082dbcd6f69ca6ecc66c2166ca329eb198ee4bf5780a5ba3b861030c05cd732eea4acc3c42106671f0d52ac6738727064325b8ff5c752dd1d4329546a8d1603bc2c51f2bbf3356eae2c64b379374c964561b5f53c36d65e14fd3683c7f7179232d686bdf9777915ff00ec08ae8ecb66a3370000000049454e44ae426082", recipeConfig: [ { op: "From Hex", @@ -248,7 +249,7 @@ TestRegister.addTests([ args: ["None"] } ] - }, + } /* { This operation only works in a browser name: "Optical Character Recognition", input: "iVBORw0KGgoAAAANSUhEUgAAAUAAAAC0CAIAAABqhmJGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAASuSURBVHhe7dftVdswAIbRzsVAzMM0XabDUCOUxLYsWW4Jp+/pvf9w9GH76CHw4x2IJWAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAI9p8G/PbyY8rL2686g8t+vnqHTyfgIYfvz/26veTXn/UKX8+f0EU9bHrtu/6KfAN/AwEXAj7lFf2TBFw4nae8on+SgIvJ01n/KLzpDK+L3bT/Ap4O+HC+V12mTH+M3gzcLbIY/EO6HfxYp13k09nb6r3UqcdnjoCL3ll72J26h+35Oxy2XvZ0wOLaXq9v2+F1UC+7RZtMZ/DnfX1lwDOPzwUCLo7O2trtDK8H3M/iqoc6bj1subT68XTA/F7bGJooyzKbhTvLPHY8eJLHlbNX1DqYUVfdXbqwJjsCLsans37aNNJM6w68OR0wv9f9ymKw3k67yn2ZZpHlg3a3zis60s6oV+ZvlzMCLoanc3Dsdt9TdWT/lM8OmNjr5KY72jmzq1zfrbvXtVtmRMDF8HTWcgaaqIrD1U4G/MFewxrW262s5jS/Fzpmdts6mnHy+Fwl4GJ0OjsNrG1P/y7CNo3+gEt7jW56MVprNed7A/5w+n6YJ+BieDpnj/jO6pweTz0acGWvmZveL9XOmd3x6wKuTt8PEwRczLRw4eje1XX7c/cDruw1uuneOu2c4aOvzI57mJhRh1xZlQ0BF+Oz9vcF96fuB1zYa7R2b5mD6/XSwdfg8snj4q21+W/L02dfzIxhQMDFyTm6Hd7m+JYP7rPKT5sRuzhOBywm91rUkYc3fV9ltchtr8VmzuGOdfDB9N1tFYefNfdXLmyGjNZkhoCLUQufVqd/7z7rUcLW/XieDvg0s9difNOdRV5ePibt5vTuazusWbF9rs2E5v4mH58LBFyMW7g5OID7s9cMuTygmt9rcNPb5MrAz0lHc3Z9Ht7XZsxqxO36ZtLR/c0+PpMEzLOc/4LhrwmYZ6lfywJ+JgHzJPr9DgLmi23/zdXvcwmYL7YKWL1PJ2AIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmCI9f7+G6yFxVg/GyYwAAAAAElFTkSuQmCC", diff --git a/tests/operations/tests/IndexOfCoincidence.mjs b/tests/operations/tests/IndexOfCoincidence.mjs index 647725fd..816d2987 100644 --- a/tests/operations/tests/IndexOfCoincidence.mjs +++ b/tests/operations/tests/IndexOfCoincidence.mjs @@ -16,7 +16,7 @@ TestRegister.addTests([ { "op": "Index of Coincidence", "args": [] - }, - ], - }, + } + ] + } ]); diff --git a/tests/operations/tests/JA3Fingerprint.mjs b/tests/operations/tests/JA3Fingerprint.mjs index 618dc73d..d8311ac0 100644 --- a/tests/operations/tests/JA3Fingerprint.mjs +++ b/tests/operations/tests/JA3Fingerprint.mjs @@ -17,7 +17,7 @@ TestRegister.addTests([ "op": "JA3 Fingerprint", "args": ["Hex", "Hash digest"] } - ], + ] }, { name: "JA3 Fingerprint: TLS 1.1", @@ -28,7 +28,7 @@ TestRegister.addTests([ "op": "JA3 Fingerprint", "args": ["Hex", "Hash digest"] } - ], + ] }, { name: "JA3 Fingerprint: TLS 1.2", @@ -39,7 +39,7 @@ TestRegister.addTests([ "op": "JA3 Fingerprint", "args": ["Hex", "Hash digest"] } - ], + ] }, { name: "JA3 Fingerprint: TLS 1.3", @@ -50,6 +50,6 @@ TestRegister.addTests([ "op": "JA3 Fingerprint", "args": ["Hex", "Hash digest"] } - ], - }, + ] + } ]); diff --git a/tests/operations/tests/JA3SFingerprint.mjs b/tests/operations/tests/JA3SFingerprint.mjs index 462d68e9..d572b242 100644 --- a/tests/operations/tests/JA3SFingerprint.mjs +++ b/tests/operations/tests/JA3SFingerprint.mjs @@ -17,7 +17,7 @@ TestRegister.addTests([ "op": "JA3S Fingerprint", "args": ["Hex", "Hash digest"] } - ], + ] }, { name: "JA3S Fingerprint: TLS 1.1", @@ -28,7 +28,7 @@ TestRegister.addTests([ "op": "JA3S Fingerprint", "args": ["Hex", "Hash digest"] } - ], + ] }, { name: "JA3S Fingerprint: TLS 1.2", @@ -39,8 +39,8 @@ TestRegister.addTests([ "op": "JA3S Fingerprint", "args": ["Hex", "Hash digest"] } - ], - }, + ] + } // This Server Hello was based on draft 18 of the TLS1.3 spec which does not include a Session ID field, leading it to fail. // The published version of TLS1.3 does require a legacy Session ID field (even if it is empty). // { diff --git a/tests/operations/tests/JSONBeautify.mjs b/tests/operations/tests/JSONBeautify.mjs index 211f96bb..727e2275 100644 --- a/tests/operations/tests/JSONBeautify.mjs +++ b/tests/operations/tests/JSONBeautify.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Beautify", - args: [" ", false, false], - }, - ], + args: [" ", false, false] + } + ] }, { name: "JSON Beautify: space, number", @@ -27,24 +27,24 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Beautify", - args: [" ", false, false], - }, - ], + args: [" ", false, false] + } + ] }, { name: "JSON Beautify: space, string", - input: "\"string\"", - expectedOutput: "\"string\"", + input: '"string"', + expectedOutput: '"string"', recipeConfig: [ { op: "JSON Beautify", - args: [" ", false, false], + args: [" ", false, false] }, { op: "HTML To Text", args: [] } - ], + ] }, { name: "JSON Beautify: space, boolean", @@ -53,9 +53,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Beautify", - args: [" ", false, false], - }, - ], + args: [" ", false, false] + } + ] }, { name: "JSON Beautify: space, emptyList", @@ -64,9 +64,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Beautify", - args: [" ", false, false], - }, - ], + args: [" ", false, false] + } + ] }, { name: "JSON Beautify: space, list", @@ -75,9 +75,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Beautify", - args: [" ", false, false], - }, - ], + args: [" ", false, false] + } + ] }, { name: "JSON Beautify: tab, list", @@ -86,53 +86,55 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Beautify", - args: ["\t", false, false], - }, - ], + args: ["\t", false, false] + } + ] }, { name: "JSON Beautify: space, object", - input: "{\"second\":2,\"first\":3}", - expectedOutput: "{\n \"second\": 2,\n \"first\": 3\n}", + input: '{"second":2,"first":3}', + expectedOutput: '{\n "second": 2,\n "first": 3\n}', recipeConfig: [ { op: "JSON Beautify", - args: [" ", false, false], + args: [" ", false, false] }, { op: "HTML To Text", args: [] } - ], + ] }, { name: "JSON Beautify: tab, nested", - input: "[2,{\"second\":2,\"first\":3,\"beginning\":{\"j\":\"3\",\"i\":[2,3,false]}},1,2,3]", - expectedOutput: "[\n\t2,\n\t{\n\t\t\"second\": 2,\n\t\t\"first\": 3,\n\t\t\"beginning\": {\n\t\t\t\"j\": \"3\",\n\t\t\t\"i\": [\n\t\t\t\t2,\n\t\t\t\t3,\n\t\t\t\tfalse\n\t\t\t]\n\t\t}\n\t},\n\t1,\n\t2,\n\t3\n]", + input: '[2,{"second":2,"first":3,"beginning":{"j":"3","i":[2,3,false]}},1,2,3]', + expectedOutput: + '[\n\t2,\n\t{\n\t\t"second": 2,\n\t\t"first": 3,\n\t\t"beginning": {\n\t\t\t"j": "3",\n\t\t\t"i": [\n\t\t\t\t2,\n\t\t\t\t3,\n\t\t\t\tfalse\n\t\t\t]\n\t\t}\n\t},\n\t1,\n\t2,\n\t3\n]', recipeConfig: [ { op: "JSON Beautify", - args: ["\t", false, false], + args: ["\t", false, false] }, { op: "HTML To Text", args: [] } - ], + ] }, { name: "JSON Beautify: tab, nested, sorted", - input: "[2,{\"second\":2,\"first\":3,\"beginning\":{\"j\":\"3\",\"i\":[2,3,false]}},1,2,3]", - expectedOutput: "[\n\t2,\n\t{\n\t\t\"beginning\": {\n\t\t\t\"i\": [\n\t\t\t\t2,\n\t\t\t\t3,\n\t\t\t\tfalse\n\t\t\t],\n\t\t\t\"j\": \"3\"\n\t\t},\n\t\t\"first\": 3,\n\t\t\"second\": 2\n\t},\n\t1,\n\t2,\n\t3\n]", + input: '[2,{"second":2,"first":3,"beginning":{"j":"3","i":[2,3,false]}},1,2,3]', + expectedOutput: + '[\n\t2,\n\t{\n\t\t"beginning": {\n\t\t\t"i": [\n\t\t\t\t2,\n\t\t\t\t3,\n\t\t\t\tfalse\n\t\t\t],\n\t\t\t"j": "3"\n\t\t},\n\t\t"first": 3,\n\t\t"second": 2\n\t},\n\t1,\n\t2,\n\t3\n]', recipeConfig: [ { op: "JSON Beautify", - args: ["\t", true, false], + args: ["\t", true, false] }, { op: "HTML To Text", args: [] } - ], - }, + ] + } ]); diff --git a/tests/operations/tests/JSONMinify.mjs b/tests/operations/tests/JSONMinify.mjs index 93ab8123..f25e808a 100644 --- a/tests/operations/tests/JSONMinify.mjs +++ b/tests/operations/tests/JSONMinify.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Minify", - args: [], - }, - ], + args: [] + } + ] }, { name: "JSON Minify: number", @@ -27,9 +27,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Minify", - args: [], - }, - ], + args: [] + } + ] }, { name: "JSON Minify: number", @@ -38,20 +38,20 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Minify", - args: [], - }, - ], + args: [] + } + ] }, { name: "JSON Minify: string", - input: "\"string\"", - expectedOutput: "\"string\"", + input: '"string"', + expectedOutput: '"string"', recipeConfig: [ { op: "JSON Minify", - args: [], - }, - ], + args: [] + } + ] }, { name: "JSON Minify: boolean", @@ -60,9 +60,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Minify", - args: [], - }, - ], + args: [] + } + ] }, { name: "JSON Minify: emptyList", @@ -71,9 +71,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Minify", - args: [], - }, - ], + args: [] + } + ] }, { name: "JSON Minify: list", @@ -82,30 +82,30 @@ TestRegister.addTests([ recipeConfig: [ { op: "JSON Minify", - args: [], - }, - ], + args: [] + } + ] }, { name: "JSON Minify: object", - input: "{\n \"second\": 2,\n \"first\": 3\n}", - expectedOutput: "{\"second\":2,\"first\":3}", + input: '{\n "second": 2,\n "first": 3\n}', + expectedOutput: '{"second":2,"first":3}', recipeConfig: [ { op: "JSON Minify", - args: [], - }, - ], + args: [] + } + ] }, { name: "JSON Minify: tab, nested", - input: "[\n\t2,\n\t{\n\t\t\"second\": 2,\n\t\t\"first\": 3,\n\t\t\"beginning\": {\n\t\t\t\"j\": \"3\",\n\t\t\t\"i\": [\n\t\t\t\t2,\n\t\t\t\t3,\n\t\t\t\tfalse\n\t\t\t]\n\t\t}\n\t},\n\t1,\n\t2,\n\t3\n]", - expectedOutput: "[2,{\"second\":2,\"first\":3,\"beginning\":{\"j\":\"3\",\"i\":[2,3,false]}},1,2,3]", + input: '[\n\t2,\n\t{\n\t\t"second": 2,\n\t\t"first": 3,\n\t\t"beginning": {\n\t\t\t"j": "3",\n\t\t\t"i": [\n\t\t\t\t2,\n\t\t\t\t3,\n\t\t\t\tfalse\n\t\t\t]\n\t\t}\n\t},\n\t1,\n\t2,\n\t3\n]', + expectedOutput: '[2,{"second":2,"first":3,"beginning":{"j":"3","i":[2,3,false]}},1,2,3]', recipeConfig: [ { op: "JSON Minify", - args: [], - }, - ], - }, + args: [] + } + ] + } ]); diff --git a/tests/operations/tests/JSONtoCSV.mjs b/tests/operations/tests/JSONtoCSV.mjs index faf373d1..8539d2aa 100644 --- a/tests/operations/tests/JSONtoCSV.mjs +++ b/tests/operations/tests/JSONtoCSV.mjs @@ -15,69 +15,72 @@ const EXPECTED_CSV_EMPTY = "\r\n\r\n"; TestRegister.addTests([ { name: "JSON to CSV: strings as values", - input: JSON.stringify({a: "1", b: "2", c: "3"}), + input: JSON.stringify({ a: "1", b: "2", c: "3" }), expectedOutput: EXPECTED_CSV_SINGLE, recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: numbers as values", - input: JSON.stringify({a: 1, b: 2, c: 3}), + input: JSON.stringify({ a: 1, b: 2, c: 3 }), expectedOutput: EXPECTED_CSV_SINGLE, recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: numbers and strings as values", - input: JSON.stringify({a: 1, b: "2", c: 3}), + input: JSON.stringify({ a: 1, b: "2", c: 3 }), expectedOutput: EXPECTED_CSV_SINGLE, recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: boolean and null as values", - input: JSON.stringify({a: false, b: null, c: 3}), + input: JSON.stringify({ a: false, b: null, c: 3 }), expectedOutput: "a,b,c\r\nfalse,null,3\r\n", recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: JSON as an array", - input: JSON.stringify([{a: 1, b: "2", c: 3}]), + input: JSON.stringify([{ a: 1, b: "2", c: 3 }]), expectedOutput: EXPECTED_CSV_SINGLE, recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: multiple JSON values in an array", - input: JSON.stringify([{a: 1, b: "2", c: 3}, {a: 1, b: "2", c: 3}]), + input: JSON.stringify([ + { a: 1, b: "2", c: 3 }, + { a: 1, b: "2", c: 3 } + ]), expectedOutput: EXPECTED_CSV_MULTIPLE, recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: empty JSON", @@ -87,8 +90,8 @@ TestRegister.addTests([ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: empty JSON in array", @@ -98,73 +101,73 @@ TestRegister.addTests([ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: nested JSON", - input: JSON.stringify({a: 1, b: {c: 2, d: 3}}), + input: JSON.stringify({ a: 1, b: { c: 2, d: 3 } }), expectedOutput: "a,b.c,b.d\r\n1,2,3\r\n", recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: nested array", - input: JSON.stringify({a: 1, b: [2, 3]}), + input: JSON.stringify({ a: 1, b: [2, 3] }), expectedOutput: "a,b.0,b.1\r\n1,2,3\r\n", recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: nested JSON, nested array", - input: JSON.stringify({a: 1, b: {c: [2, 3], d: 4}}), + input: JSON.stringify({ a: 1, b: { c: [2, 3], d: 4 } }), expectedOutput: "a,b.c.0,b.c.1,b.d\r\n1,2,3,4\r\n", recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: nested array, nested JSON", - input: JSON.stringify({a: 1, b: [{c: 3, d: 4}]}), + input: JSON.stringify({ a: 1, b: [{ c: 3, d: 4 }] }), expectedOutput: "a,b.0.c,b.0.d\r\n1,3,4\r\n", recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: nested array, nested array", - input: JSON.stringify({a: 1, b: [[2, 3]]}), + input: JSON.stringify({ a: 1, b: [[2, 3]] }), expectedOutput: "a,b.0.0,b.0.1\r\n1,2,3\r\n", recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] }, { name: "JSON to CSV: nested JSON, nested JSON", - input: JSON.stringify({a: 1, b: { c: { d: 2, e: 3}}}), + input: JSON.stringify({ a: 1, b: { c: { d: 2, e: 3 } } }), expectedOutput: "a,b.c.d,b.c.e\r\n1,2,3\r\n", recipeConfig: [ { op: "JSON to CSV", args: [",", "\\r\\n"] - }, - ], + } + ] } ]); diff --git a/tests/operations/tests/JWTDecode.mjs b/tests/operations/tests/JWTDecode.mjs index 1ef47f81..bd4ab957 100644 --- a/tests/operations/tests/JWTDecode.mjs +++ b/tests/operations/tests/JWTDecode.mjs @@ -8,11 +8,15 @@ */ import TestRegister from "../../lib/TestRegister.mjs"; -const outputObject = JSON.stringify({ - String: "SomeString", - Number: 42, - iat: 1 -}, null, 4); +const outputObject = JSON.stringify( + { + String: "SomeString", + Number: 42, + iat: 1 + }, + null, + 4 +); TestRegister.addTests([ { @@ -22,9 +26,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Decode", - args: [], + args: [] } - ], + ] }, { name: "JWT Decode: RS", @@ -33,9 +37,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Decode", - args: [], + args: [] } - ], + ] }, { name: "JWT Decode: ES", @@ -44,8 +48,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Decode", - args: [], + args: [] } - ], + ] } ]); diff --git a/tests/operations/tests/JWTSign.mjs b/tests/operations/tests/JWTSign.mjs index 3970a5e5..a1ba203f 100644 --- a/tests/operations/tests/JWTSign.mjs +++ b/tests/operations/tests/JWTSign.mjs @@ -8,11 +8,15 @@ */ import TestRegister from "../../lib/TestRegister.mjs"; -const inputObject = JSON.stringify({ - String: "SomeString", - Number: 42, - iat: 1 -}, null, 4); +const inputObject = JSON.stringify( + { + String: "SomeString", + Number: 42, + iat: 1 + }, + null, + 4 +); const hsKey = "secret_cat"; const rsKey = `-----BEGIN RSA PRIVATE KEY----- @@ -40,35 +44,38 @@ TestRegister.addTests([ { name: "JWT Sign: HS256", input: inputObject, - expectedOutput: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.0ha6-j4FwvEIKPVZ-hf3S_R9Hy_UtXzq4dnedXcUrXk", + expectedOutput: + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.0ha6-j4FwvEIKPVZ-hf3S_R9Hy_UtXzq4dnedXcUrXk", recipeConfig: [ { op: "JWT Sign", - args: [hsKey, "HS256"], + args: [hsKey, "HS256"] } - ], + ] }, { name: "JWT Sign: HS384", input: inputObject, - expectedOutput: "eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ._bPK-Y3mIACConbJqkGFMQ_L3vbxgKXy9gSxtL9hA5XTganozTSXxD0vX0N1yT5s", + expectedOutput: + "eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ._bPK-Y3mIACConbJqkGFMQ_L3vbxgKXy9gSxtL9hA5XTganozTSXxD0vX0N1yT5s", recipeConfig: [ { op: "JWT Sign", - args: [hsKey, "HS384"], + args: [hsKey, "HS384"] } - ], + ] }, { name: "JWT Sign: HS512", input: inputObject, - expectedOutput: "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.vZIJU4XYMFt3FLE1V_RZOxEetmV4RvxtPZQGzJthK_d47pjwlEb6pQE23YxHFmOj8H5RLEdqqLPw4jNsOyHRzA", + expectedOutput: + "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.vZIJU4XYMFt3FLE1V_RZOxEetmV4RvxtPZQGzJthK_d47pjwlEb6pQE23YxHFmOj8H5RLEdqqLPw4jNsOyHRzA", recipeConfig: [ { op: "JWT Sign", - args: [hsKey, "HS512"], + args: [hsKey, "HS512"] } - ], + ] }, { name: "JWT Sign: ES256", @@ -77,13 +84,13 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Sign", - args: [esKey, "ES256"], + args: [esKey, "ES256"] }, { op: "JWT Decode", args: [] } - ], + ] }, { name: "JWT Sign: ES384", @@ -92,13 +99,13 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Sign", - args: [esKey, "ES384"], + args: [esKey, "ES384"] }, { op: "JWT Decode", args: [] } - ], + ] }, { name: "JWT Sign: ES512", @@ -107,13 +114,13 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Sign", - args: [esKey, "ES512"], + args: [esKey, "ES512"] }, { op: "JWT Decode", args: [] } - ], + ] }, { name: "JWT Sign: RS256", @@ -122,13 +129,13 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Sign", - args: [rsKey, "RS256"], + args: [rsKey, "RS256"] }, { op: "JWT Decode", args: [] } - ], + ] }, { name: "JWT Sign: RS384", @@ -137,13 +144,13 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Sign", - args: [rsKey, "RS384"], + args: [rsKey, "RS384"] }, { op: "JWT Decode", args: [] } - ], + ] }, { name: "JWT Sign: RS512", @@ -152,12 +159,12 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Sign", - args: [esKey, "RS512"], + args: [esKey, "RS512"] }, { op: "JWT Decode", args: [] } - ], + ] } ]); diff --git a/tests/operations/tests/JWTVerify.mjs b/tests/operations/tests/JWTVerify.mjs index 0a0817cc..b038e4d9 100644 --- a/tests/operations/tests/JWTVerify.mjs +++ b/tests/operations/tests/JWTVerify.mjs @@ -8,11 +8,15 @@ */ import TestRegister from "../../lib/TestRegister.mjs"; -const outputObject = JSON.stringify({ - String: "SomeString", - Number: 42, - iat: 1 -}, null, 4); +const outputObject = JSON.stringify( + { + String: "SomeString", + Number: 42, + iat: 1 + }, + null, + 4 +); const hsKey = "secret_cat"; /* Retaining private key as a comment @@ -58,9 +62,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Verify", - args: [hsKey], + args: [hsKey] } - ], + ] }, { name: "JWT Verify: RS", @@ -69,9 +73,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Verify", - args: [rsPub], + args: [rsPub] } - ], + ] }, { name: "JWT Verify: ES", @@ -80,8 +84,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "JWT Verify", - args: [esPub], + args: [esPub] } - ], + ] } ]); diff --git a/tests/operations/tests/Jump.mjs b/tests/operations/tests/Jump.mjs index 4a1d91b0..b9a4f92f 100644 --- a/tests/operations/tests/Jump.mjs +++ b/tests/operations/tests/Jump.mjs @@ -11,44 +11,36 @@ import TestRegister from "../../lib/TestRegister.mjs"; TestRegister.addTests([ { name: "Jump: Empty Label", - input: [ - "should be changed", - ].join("\n"), - expectedOutput: [ - "c2hvdWxkIGJlIGNoYW5nZWQ=", - ].join("\n"), + input: ["should be changed"].join("\n"), + expectedOutput: ["c2hvdWxkIGJlIGNoYW5nZWQ="].join("\n"), recipeConfig: [ { op: "Jump", - args: ["", 10], + args: ["", 10] }, { op: "To Base64", - args: ["A-Za-z0-9+/="], - }, - ], + args: ["A-Za-z0-9+/="] + } + ] }, { name: "Jump: skips 1", - input: [ - "shouldnt be changed", - ].join("\n"), - expectedOutput: [ - "shouldnt be changed", - ].join("\n"), + input: ["shouldnt be changed"].join("\n"), + expectedOutput: ["shouldnt be changed"].join("\n"), recipeConfig: [ { op: "Jump", - args: ["skipReplace", 10], + args: ["skipReplace", 10] }, { op: "To Base64", - args: ["A-Za-z0-9+/="], + args: ["A-Za-z0-9+/="] }, { op: "Label", args: ["skipReplace"] - }, - ], + } + ] } ]); diff --git a/tests/operations/tests/LS47.mjs b/tests/operations/tests/LS47.mjs index ce613923..d5742310 100644 --- a/tests/operations/tests/LS47.mjs +++ b/tests/operations/tests/LS47.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "LS47 Encrypt", - args: ["helloworld", 0, "test"], - }, - ], + args: ["helloworld", 0, "test"] + } + ] }, { name: "LS47 Decrypt", @@ -27,9 +27,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "LS47 Decrypt", - args: ["helloworld", 0], - }, - ], + args: ["helloworld", 0] + } + ] }, { name: "LS47 Encrypt", @@ -38,8 +38,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "LS47 Encrypt", - args: ["Helloworld", 0, "test"], - }, - ], + args: ["Helloworld", 0, "test"] + } + ] } ]); diff --git a/tests/operations/tests/LZNT1Decompress.mjs b/tests/operations/tests/LZNT1Decompress.mjs index dcfad01a..6ec3dade 100644 --- a/tests/operations/tests/LZNT1Decompress.mjs +++ b/tests/operations/tests/LZNT1Decompress.mjs @@ -17,6 +17,6 @@ TestRegister.addTests([ op: "LZNT1 Decompress", args: [] } - ], + ] } ]); diff --git a/tests/operations/tests/LZString.mjs b/tests/operations/tests/LZString.mjs index 69e47bdd..daba2eea 100644 --- a/tests/operations/tests/LZString.mjs +++ b/tests/operations/tests/LZString.mjs @@ -17,7 +17,7 @@ TestRegister.addTests([ "op": "LZString Compress", "args": ["Base64"] } - ], + ] }, { name: "LZString Decompress From Base64", @@ -28,6 +28,6 @@ TestRegister.addTests([ "op": "LZString Decompress", "args": ["Base64"] } - ], + ] } ]); diff --git a/tests/operations/tests/LevenshteinDistance.mjs b/tests/operations/tests/LevenshteinDistance.mjs index e304165b..c64b2d38 100644 --- a/tests/operations/tests/LevenshteinDistance.mjs +++ b/tests/operations/tests/LevenshteinDistance.mjs @@ -13,11 +13,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", 1, 1, 1, - ], - }, - ], + "args": ["\\n", 1, 1, 1] + } + ] }, { "name": "Levenshtein Distance: Wikipedia example 2", @@ -26,11 +24,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", 1, 1, 1, - ], - }, - ], + "args": ["\\n", 1, 1, 1] + } + ] }, { "name": "Levenshtein Distance: Wikipedia example 1 with substitution cost 2", @@ -39,11 +35,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", 1, 1, 2, - ], - }, - ], + "args": ["\\n", 1, 1, 2] + } + ] }, { "name": "Levenshtein Distance: varied costs 1", @@ -52,11 +46,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", 10, 100, 1000, - ], - }, - ], + "args": ["\\n", 10, 100, 1000] + } + ] }, { "name": "Levenshtein Distance: varied costs 2", @@ -65,11 +57,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", 1000, 100, 10, - ], - }, - ], + "args": ["\\n", 1000, 100, 10] + } + ] }, { "name": "Levenshtein Distance: another delimiter", @@ -78,11 +68,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - " ", 1, 1, 1, - ], - }, - ], + "args": [" ", 1, 1, 1] + } + ] }, { "name": "Levenshtein Distance: too few samples", @@ -91,11 +79,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", 1, 1, 1, - ], - }, - ], + "args": ["\\n", 1, 1, 1] + } + ] }, { "name": "Levenshtein Distance: too many samples", @@ -104,11 +90,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", 1, 1, 1, - ], - }, - ], + "args": ["\\n", 1, 1, 1] + } + ] }, { "name": "Levenshtein Distance: negative insertion cost", @@ -117,11 +101,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", -1, 1, 1, - ], - }, - ], + "args": ["\\n", -1, 1, 1] + } + ] }, { "name": "Levenshtein Distance: negative deletion cost", @@ -130,11 +112,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", 1, -1, 1, - ], - }, - ], + "args": ["\\n", 1, -1, 1] + } + ] }, { "name": "Levenshtein Distance: negative substitution cost", @@ -143,11 +123,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", 1, 1, -1, - ], - }, - ], + "args": ["\\n", 1, 1, -1] + } + ] }, { "name": "Levenshtein Distance: cost zero", @@ -156,10 +134,8 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Levenshtein Distance", - "args": [ - "\\n", 0, 0, 0, - ], - }, - ], - }, + "args": ["\\n", 0, 0, 0] + } + ] + } ]); diff --git a/tests/operations/tests/Lorenz.mjs b/tests/operations/tests/Lorenz.mjs index 088707f6..6516498c 100644 --- a/tests/operations/tests/Lorenz.mjs +++ b/tests/operations/tests/Lorenz.mjs @@ -16,7 +16,39 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Lorenz", - "args": ["SZ40", "No Pattern", false, "Send", "Plaintext", "Plaintext", "5/8/9", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", "x..xxx...x.xxxx..xx..x..xx.xx..", "..xx..x.xxx...xx...xx..xx.xx.", "xx..x..xxxx..xx.xxx....x..", "xx..xx....xxxx.x..x.x.."] + "args": [ + "SZ40", + "No Pattern", + false, + "Send", + "Plaintext", + "Plaintext", + "5/8/9", + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", + ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", + ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", + ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", + "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", + "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", + ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", + ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", + "x..xxx...x.xxxx..xx..x..xx.xx..", + "..xx..x.xxx...xx...xx..xx.xx.", + "xx..x..xxxx..xx.xxx....x..", + "xx..xx....xxxx.x..x.x.." + ] } ] }, @@ -28,7 +60,39 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Lorenz", - "args": ["SZ40", "KH Pattern", false, "Send", "Plaintext", "Plaintext", "5/8/9", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", "x..xxx...x.xxxx..xx..x..xx.xx..", "..xx..x.xxx...xx...xx..xx.xx.", "xx..x..xxxx..xx.xxx....x..", "xx..xx....xxxx.x..x.x.."] + "args": [ + "SZ40", + "KH Pattern", + false, + "Send", + "Plaintext", + "Plaintext", + "5/8/9", + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", + ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", + ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", + ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", + "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", + "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", + ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", + ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", + "x..xxx...x.xxxx..xx..x..xx.xx..", + "..xx..x.xxx...xx...xx..xx.xx.", + "xx..x..xxxx..xx.xxx....x..", + "xx..xx....xxxx.x..x.x.." + ] } ] }, @@ -40,7 +104,39 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Lorenz", - "args": ["SZ40", "KH Pattern", false, "Send", "Plaintext", "Plaintext", "5/8/9", 20, 40, 3, 9, 27, 36, 4, 1, 9, 14, 21, 8, ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", "x..xxx...x.xxxx..xx..x..xx.xx..", "..xx..x.xxx...xx...xx..xx.xx.", "xx..x..xxxx..xx.xxx....x..", "xx..xx....xxxx.x..x.x.."] + "args": [ + "SZ40", + "KH Pattern", + false, + "Send", + "Plaintext", + "Plaintext", + "5/8/9", + 20, + 40, + 3, + 9, + 27, + 36, + 4, + 1, + 9, + 14, + 21, + 8, + ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", + ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", + ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", + ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", + "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", + "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", + ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", + ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", + "x..xxx...x.xxxx..xx..x..xx.xx..", + "..xx..x.xxx...xx...xx..xx.xx.", + "xx..x..xxxx..xx.xxx....x..", + "xx..xx....xxxx.x..x.x.." + ] } ] }, @@ -52,7 +148,39 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Lorenz", - "args": ["SZ40", "ZMUG Pattern", false, "Send", "Plaintext", "Plaintext", "5/8/9", 20, 40, 3, 9, 27, 36, 4, 1, 9, 14, 21, 8, ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", "x..xxx...x.xxxx..xx..x..xx.xx..", "..xx..x.xxx...xx...xx..xx.xx.", "xx..x..xxxx..xx.xxx....x..", "xx..xx....xxxx.x..x.x.."] + "args": [ + "SZ40", + "ZMUG Pattern", + false, + "Send", + "Plaintext", + "Plaintext", + "5/8/9", + 20, + 40, + 3, + 9, + 27, + 36, + 4, + 1, + 9, + 14, + 21, + 8, + ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", + ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", + ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", + ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", + "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", + "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", + ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", + ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", + "x..xxx...x.xxxx..xx..x..xx.xx..", + "..xx..x.xxx...xx...xx..xx.xx.", + "xx..x..xxxx..xx.xxx....x..", + "xx..xx....xxxx.x..x.x.." + ] } ] }, @@ -64,7 +192,39 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Lorenz", - "args": ["SZ40", "BREAM Pattern", false, "Send", "Plaintext", "Plaintext", "5/8/9", 20, 40, 3, 9, 27, 36, 4, 1, 9, 14, 21, 8, ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", "x..xxx...x.xxxx..xx..x..xx.xx..", "..xx..x.xxx...xx...xx..xx.xx.", "xx..x..xxxx..xx.xxx....x..", "xx..xx....xxxx.x..x.x.."] + "args": [ + "SZ40", + "BREAM Pattern", + false, + "Send", + "Plaintext", + "Plaintext", + "5/8/9", + 20, + 40, + 3, + 9, + 27, + 36, + 4, + 1, + 9, + 14, + 21, + 8, + ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", + ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", + ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", + ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", + "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", + "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", + ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", + ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", + "x..xxx...x.xxxx..xx..x..xx.xx..", + "..xx..x.xxx...xx...xx..xx.xx.", + "xx..x..xxxx..xx.xxx....x..", + "xx..xx....xxxx.x..x.x.." + ] } ] }, @@ -76,7 +236,39 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Lorenz", - "args": ["SZ42a", "KH Pattern", false, "Send", "Plaintext", "Plaintext", "5/8/9", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", "x..xxx...x.xxxx..xx..x..xx.xx..", "..xx..x.xxx...xx...xx..xx.xx.", "xx..x..xxxx..xx.xxx....x..", "xx..xx....xxxx.x..x.x.."] + "args": [ + "SZ42a", + "KH Pattern", + false, + "Send", + "Plaintext", + "Plaintext", + "5/8/9", + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", + ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", + ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", + ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", + "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", + "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", + ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", + ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", + "x..xxx...x.xxxx..xx..x..xx.xx..", + "..xx..x.xxx...xx...xx..xx.xx.", + "xx..x..xxxx..xx.xxx....x..", + "xx..xx....xxxx.x..x.x.." + ] } ] }, @@ -84,11 +276,44 @@ TestRegister.addTests([ // KH Pattern, Full Test on real message name: "Lorenz SZ42a: Receive, KH pattern, ITA2 output", input: "J3KF+LXT/.+YTMLE/RFVC-SE///4GYX3Q.Z3GVWKWDVAPURPYL/.UYAI.EOW3ZBVVAQRTO/PACJ.NLVLZYYNTU.IDCPKTEZOSWCOBNWFJ+UAKE+WU-JMWYWLXRM+M/HV+TVTC-FOGN3QZG4J.VLM/KK+OVC/YIWTSZUDTSY+3LCCHZADQ-3VBXKEOCSO/+ZBFN34-F.+4UVFVLIP4KFGRBFIVFFJX/FKFSHJ.VUJVWXE+LFAICDYX3EZD33U+GSOGXPAXHTJSNUQI+PXS3JRG+-U+YZITF/SM4LIDPSYMVJM/BL/YHDGBG/UI+EM.JEMX.YQNUWTLAUCLUSDMZGXCQ3CPPCCYLTJC4KXB--G4VGQ4J.EYTEVSG33DVLVPDGNOGAJOUWGFY4KGO-4+IRKDPGDHGBQLFSS/YDP/FM-/BANLERZEMT.U3XZA43RGYD+-J4VYRTONRYF/OI4Y+I3LXUFAHGRT.RXCO3HKCQIML.VHVIGHBWBTU3RZFN.J.WGNLSGLYBJT+TPM-RHHMXTNDSVUO3W/4ORZ4UY.LA-XZYVLCZROMPM3RYSLUD-SNQQA+RK/UV4K/GOSSMJRGIZYPO+BEEB+OEWAWKYXW.-NKUQERUM-PA4WFNKU-Q-LNC.D-A3C.FB.RFOGZHUWTEAYB3HNHCEW.N33QEEVUEC3OOR4BRNLH/IF3+DJJ3S3J4XA+Z3SMT/K4L-IDLQWCLMQ3TO3PNYVCGZCXUMSSBH.BWMGGTIYSC/UBX/PE+3IZZ.Z/CCWLSL+4/4+IET/ELBCBDAM4ELKDAGB3O.3J+IEQQJ.U.VSAQSAYZAU+3YOZWPPPV/YOVOE/P/E4UOZYK4PE3A.ETZGFBCZE.4WA3PSDR3XMLJLH+S3UWOA.T-RID-MA.CVZGLNYK4U.HBPSA+3U+BLSGS/FNRXMOMEBBABIPOAGDWA-4T/B.L.HDSAJE.HE-4FZW+SDBAYCNBTEODDALCMIG-QNM+-PEFC+ABNQ-MVT3-GHKAN/ENZLPMJRVRB+4NBCRTFDVNLRTPIGIEZGSPUXMW3WJQTOEV+WA-HJZLX-JQID-X++FFGKCTO.3.F+JIISVTXKC+..YM/SOQUIAS-IAGJJPRYLLT.EJBJAMRP+MS-ZRUVLBBE-UNYQGBBHEB+QCHYYHVN.NHKS-YG3BNZKQJBO-FQ.SZB/JRFILGUZUZVCOVGULEKU4/HRBGYIZVLCM3/ONJ-OBIRSCT+IZCB-TTZMDQWQUCIVTGTTYNEOTTORM-FSKS3WJWL/ZXOCOCYGC.BRIRKXK.FLJUSP/-G.WP.MMVHBYREWQZZAN/BKSEYDBGXAUV+NUKUKIKIGS+VO-4EY/GWI+SGJOJCBYGGMY4+/EMGULCSC-Y+CXLIECYC-+-ZXHSPOTFGFDWIFT-4XXDDLMMKT433WH/BX-OILWDJC/FFE-ZYH3C4GI4T/3KUJQ4YNBQWXWB-RM.Q3GG/4Z-AIGW4GYYEBXRJHXQA..-.G/3W/-LVS+4GS-+FRYIOFYGUK-FEYA4J-ZB-MSPAM/WLLJ3GFMJP/GGF-C+O-KQ.K4PWVL+3O.LX4TUD+Y+QOO3GTJT+.MR-4JSRXD-X4SCIDIVLCDEGSOZOGWXQZOZ.3PPQ4ZYXKL+QETCM/3/--CHG4+W.BNHTB+Z-NZCO+QEB+-/FNJ+NSHTO+CW.CM/VHIM-S.3VAFDJ3MEH.G+NQFDCUSK+MCKDLEC-TFWSYBQSWE4UOQOXY-E.ESE4OLJQOBUQZUSLRWV-AVOYX3CKS3ZFUAQAWESYMXQV/4MOXORAVKOIELRXCSRAEU/KEFDQWQ-BWEXGALS/.JLQ/CEKT-4C+TWDNGST-UQ-ERBP.YZ-ZH/Q3ITMN-O3P/JBEVZUOY4CTNY4PKCB3YIW/+BOKDEZE.VCTROQDTAXI3VKGYQVOKSCXPDDAD4DLTELK.GDDLTRPXORSFTDOGB.-NQJHNM/4/JOTIVGOQF+FC.GDX4DMT.UBRVUIBCHGLDBZSFSICVVAF4TN.BMAP-IQR-LBCQ/TTHH", - expectedOutput: "XWOLLE9WI9R99AUCH9BLEIBEN955Z88KR99GWFRL5X89FUES959WPYP9QXT9QIPQ9V9AACQEM9959AA899QEE9959AA8999AN99OB5M89SUEDW/ST5V9AA8GEHEIME9KOMMANDOSACHE5AA89959AA89NUR9ZUR9PERSOENLICHENSINTERRICHTUNG5N889WEITERGABE9VERBOTEN5MA9AA8LAGEBERICHT9VOM99GSEPMM98NN99VOM9959EPMRM9QORT9AA889KATEN9NN9KAT9NN9KARTEN9959Q9C9QSVPP9PPP9A9MA98889ROEM959QM89WESTEN9959C899AOK999L9U9C88889ROEMS59QWM89A5M89K5MCMA989PANZERUNTERSTUEZ9NN9PANZSRUNTERSTUETZTESFEINDANGRIFFE99GEGEN9EIGENE9STUETZPU9NKTFRONT9NAHMEN9O4D9ELSTER5N89SOHL5N89RAU9NN9RAU9N9UND9BAD9BRAMBACH95K9WR8889NN9995KWT88SKM9BFO9HOF5LM89NEUE9STUETZPUNKTFRONT9B99DIESER9ORT5M89UEBRIGE9CORPSFRONT9BEIDERSEITIGE9AUFKLAERUNGSTAETIGKEI5M9DIESER9ORT5M89I/BRIGE9KORPSFRONT9BEIDERSEITIGE9AUFKLAERUNGSTAETIGKEI5MA99A8STELWV5M89ROEM959QEM89A5M8K5MMA989ZUNEHMENDER9FEINDDRUCK9IM9RAUXSN9UND99W99BAERNAU95K9T889NN9959KWT889KM9SW9MARIENBAD5LM889FEINDAFGRIF9F99VON99SO99GEGEN9PAULUSBRUNN5M899LAGE9DORT9UNGEKL4ERT5M89SCHWACHE99EIGENEN9SICHERUNGEN9DURCH9FEIND9AUS99SCHAENWAWDE9UND9WOSANT995K9Y89KM9SO99TACHAU5L89NACH9O99ZURUECKGEWOFNN9TURUEIKGEWORFEN5M89FEIND99MIT9INF9UND9PZ5M89IN9PEISSIGKAU9UND9WLAD9NS9DAHENTEN5M89EIGENE9SICHERANGEN9IN9MOLGAU959A89DRI9UND9WLAD9N993AHENTEN5M89EIGENE9SIC4ERUNGENSIGKAU9UND9WLAD9N99DAHENTEN5M89EUGENE9SICHERUNGEN9IN9MOLGAU959A89DRISSGLOBEN959A89WURKAU5M89IM9A9SNN9IM9RAUM99TAUS99PANZERUNTERSTUETZTE99FEINDANGRIFFE5MA99AA899A5X8O5M8K5M99QC9MA9989UEBER9ISAR9MIT9INF9UND9PZ5M89UEBERBESETZTEJ9FEIND9STIESZ99UEBER9S9NN9UEBER99VILSA9BSCHNITT9VOR9UND9NAHXS9AUNKIRCHEN959A89ALDERSBACH959A89EGGERSDORF995KWP889KM9W9P49SAU5LMA9A88ROEM9959IWM89A5MLK5MCMA989DWP889KM9W9PASSAU5LMASA88ROEM9959IWM89A5MLK5MCMA989DER9ZWISCHEN9PLATTLING9UND9LANDAI9FU9NN3/UF99BREITER9FRONT99UEBER9DIE9ISAR99UEBERB99NNN9UEBER5ESETZTE99FEIND9DRUECKTE9EIGENEN9LINIE5N89TROTZ9HIFTIGEN9WIDERST4F3ES5N89AUN9VISLABSCHNITT9ZUREUCK585M89FEINDPANZER9N9NN9IN9ARTOFJFN9IN9ARNTORF959KQT889KM9SO9LANDAU5B89UND99N9ROTTESDORF599IN9ARNZORZ959KQT889KM9SO9LANDAU5L89UND99N9ROTTESDORF59KI89KM9S9LANDAUGWMA59A89ROEM959QEM8939NN9959A899ROEM9959QK4OLE", + expectedOutput: + "XWOLLE9WI9R99AUCH9BLEIBEN955Z88KR99GWFRL5X89FUES959WPYP9QXT9QIPQ9V9AACQEM9959AA899QEE9959AA8999AN99OB5M89SUEDW/ST5V9AA8GEHEIME9KOMMANDOSACHE5AA89959AA89NUR9ZUR9PERSOENLICHENSINTERRICHTUNG5N889WEITERGABE9VERBOTEN5MA9AA8LAGEBERICHT9VOM99GSEPMM98NN99VOM9959EPMRM9QORT9AA889KATEN9NN9KAT9NN9KARTEN9959Q9C9QSVPP9PPP9A9MA98889ROEM959QM89WESTEN9959C899AOK999L9U9C88889ROEMS59QWM89A5M89K5MCMA989PANZERUNTERSTUEZ9NN9PANZSRUNTERSTUETZTESFEINDANGRIFFE99GEGEN9EIGENE9STUETZPU9NKTFRONT9NAHMEN9O4D9ELSTER5N89SOHL5N89RAU9NN9RAU9N9UND9BAD9BRAMBACH95K9WR8889NN9995KWT88SKM9BFO9HOF5LM89NEUE9STUETZPUNKTFRONT9B99DIESER9ORT5M89UEBRIGE9CORPSFRONT9BEIDERSEITIGE9AUFKLAERUNGSTAETIGKEI5M9DIESER9ORT5M89I/BRIGE9KORPSFRONT9BEIDERSEITIGE9AUFKLAERUNGSTAETIGKEI5MA99A8STELWV5M89ROEM959QEM89A5M8K5MMA989ZUNEHMENDER9FEINDDRUCK9IM9RAUXSN9UND99W99BAERNAU95K9T889NN9959KWT889KM9SW9MARIENBAD5LM889FEINDAFGRIF9F99VON99SO99GEGEN9PAULUSBRUNN5M899LAGE9DORT9UNGEKL4ERT5M89SCHWACHE99EIGENEN9SICHERUNGEN9DURCH9FEIND9AUS99SCHAENWAWDE9UND9WOSANT995K9Y89KM9SO99TACHAU5L89NACH9O99ZURUECKGEWOFNN9TURUEIKGEWORFEN5M89FEIND99MIT9INF9UND9PZ5M89IN9PEISSIGKAU9UND9WLAD9NS9DAHENTEN5M89EIGENE9SICHERANGEN9IN9MOLGAU959A89DRI9UND9WLAD9N993AHENTEN5M89EIGENE9SIC4ERUNGENSIGKAU9UND9WLAD9N99DAHENTEN5M89EUGENE9SICHERUNGEN9IN9MOLGAU959A89DRISSGLOBEN959A89WURKAU5M89IM9A9SNN9IM9RAUM99TAUS99PANZERUNTERSTUETZTE99FEINDANGRIFFE5MA99AA899A5X8O5M8K5M99QC9MA9989UEBER9ISAR9MIT9INF9UND9PZ5M89UEBERBESETZTEJ9FEIND9STIESZ99UEBER9S9NN9UEBER99VILSA9BSCHNITT9VOR9UND9NAHXS9AUNKIRCHEN959A89ALDERSBACH959A89EGGERSDORF995KWP889KM9W9P49SAU5LMA9A88ROEM9959IWM89A5MLK5MCMA989DWP889KM9W9PASSAU5LMASA88ROEM9959IWM89A5MLK5MCMA989DER9ZWISCHEN9PLATTLING9UND9LANDAI9FU9NN3/UF99BREITER9FRONT99UEBER9DIE9ISAR99UEBERB99NNN9UEBER5ESETZTE99FEIND9DRUECKTE9EIGENEN9LINIE5N89TROTZ9HIFTIGEN9WIDERST4F3ES5N89AUN9VISLABSCHNITT9ZUREUCK585M89FEINDPANZER9N9NN9IN9ARTOFJFN9IN9ARNTORF959KQT889KM9SO9LANDAU5B89UND99N9ROTTESDORF599IN9ARNZORZ959KQT889KM9SO9LANDAU5L89UND99N9ROTTESDORF59KI89KM9S9LANDAUGWMA59A89ROEM959QEM8939NN9959A899ROEM9959QK4OLE", recipeConfig: [ { "op": "Lorenz", - "args": ["SZ42a", "KH Pattern", false, "Receive", "Plaintext", "ITA2", "5/8/9", 12, 12, 41, 45, 17, 12, 3, 11, 31, 29, 12, 23, ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", "x..xxx...x.xxxx..xx..x..xx.xx..", "..xx..x.xxx...xx...xx..xx.xx.", "xx..x..xxxx..xx.xxx....x..", "xx..xx....xxxx.x..x.x.."] + "args": [ + "SZ42a", + "KH Pattern", + false, + "Receive", + "Plaintext", + "ITA2", + "5/8/9", + 12, + 12, + 41, + 45, + 17, + 12, + 3, + 11, + 31, + 29, + 12, + 23, + ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", + ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", + ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", + ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", + "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", + "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", + ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", + ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", + "x..xxx...x.xxxx..xx..x..xx.xx..", + "..xx..x.xxx...xx...xx..xx.xx.", + "xx..x..xxxx..xx.xxx....x..", + "xx..xx....xxxx.x..x.x.." + ] } ] }, @@ -96,13 +321,45 @@ TestRegister.addTests([ // ZMUG Pattern, Full Test, Receive name: "Lorenz SZ42b: Receive, ZMUG pattern, KT-Schalte, Plaintext output", input: "YQPLQQX4OJGFOKBXROZVPBVIJOXSMQSMTMHX8VSBBMIHKJTYKR4ANTQRPCJXR3YE8KVLDN8SQN4VCJQUW3BB4HWEXRD4LUJNF99DV5FLQ4IRANWRCLYX//J8YSIWO44LCPTCBKX4TZGBPYHCE/FBJ4DSBFF5YLOVPBSRUDQULTTO9BYLLUCRGTM/VXQCS8XUDLY/5O3TPSYFQ89RQRGG/IEOKULB8MHQQBHIWRW38W5XSPT9YF8WJGN3HMEBY8XKQW/3BC888Q3JC/K8SOXJWONNQCM8Z4UQQQGE8RL3GXZ3YI4O/RBCF5JXJE5W5GJAT9/9XP9V8SFZLKUBUPD4HXABGLB8D3E4YTERP3GGISVNYHOL3BQVJUOFEBZMYHBKFGPWEOGGMFGF/EVGWT584T8BMURIBSIBELCANKT/VXHUHONHFPJ/OBCQGCQPFQSQW3GEFCQKY9Z4/KVIQJPJQ4ZQJZP/PEIHQG4H99B58HD5/XCLRBPXMR8P84CMHO5RYODKY94NINO4OGY8TOF9BD9EPD5U3P9KMJ/WBXX9CO9SHMK5KHQFA9BE35R4OSAPCAXZ9SALUKVPVVYB8MGGK3XSVLKGUT/8JVIF5DSDUQT3ZKZTICJTSGXVZAZ4WWGAMOFWUN94OZR4Y8AVLGZHOV/UHCURM5RQPKDCEMRBWLKYLTTGGE8ZIVP4HJMVW5HWKOHRZ4OIUL5OZJOVHL9AQUZA93F3H9QNS5VZYZXUM8AD3RZC9CQ5B//4J8/B35XVB9MHMYQSVQPFWSXWEDU5NHXBSO/W/NBW3V/KO5VHIZQRZOKIJSV4G9Y/H3FIYLBH5/XA3AYRPUREKAQL5WTXJ4EK3EAYQ8GIDXTBXMUFUGKZHZZZPYAQMQOXZAGKP4SPIEIKVUPVPRVRSXSDRJSS3XM5KOTUVK3O435VB93H4HB8IEXHDGCJ3VHPG48VZKB4GHRNFHDQ8LN4P9TI3VD9//LACSHQJZWK5/WLC5/PHN5JTVWAOXWX59/SIZ4ADMXO5GCMYSPNLR33CFLKGSN/ZYCFAR5I4/ZQRWCVGY9GCAA5GJCW55HXVGAKGZG/V9Q9AGB9WAVKJX9DM/FOCHWZXAVEPMKTSQJYPWCYFTH3WXZRVAFCLHFMFQUGUWDHQQSUF/QSPSY/8PWPU9B8WUXFE5IPYCSYX3FKEGXIY8DCNLOWZTU8N98ZNWL8QDP/JHTU5YNHN8OI8TMBBIUQEOVT4S/N9V//LZCQ5LN3X43LUG/KDVSOXUTKOP5VTI/OUV98ULIJW9EBVUMBYBLOIKJX/XUHHYPB/N3PEVBFJGXGO3H8VTIO9D8IV5FAL5DZDOC88WNITD/CEZOB3IS8W//ZIBFQOMG3HNUXV3YMM5QH8YYPV/EJMUCKSNRTGFHBZJFTX59CMRM/D5GVFWHF8QWPY44IKNLH8A9SMHYUNXGDJBX9PA4CJPRO4RZSPTG4SYBLHMSV/9UJPUJEPHPZWSDKMMMN/WEHOZDXBPWS3DHG9SBWFTB85HOPZYTVZ9KSBGZ8PAIGGIVXU/8YIFQGQDDDVDDV3TL8L5G9C/98CYDUGWWCGQCQLS4Y8BGSSMYLOODGA/YMRWI9LJI8TXT3ZYZ8NR/3RNDYHR9DINKB//HWPJETJ8/RFXSV/SKWEBKOMSJ9W393JH8E/G3UX/5CD35H4BZOU8GYELU4EUYNYP/UUBYQZKLIPFPOPZ8WNJ4WR5QWIZVMQ9BCVZM3MB8BES5APTTVTBSILLUQHY9X/A9FFQWR5DUMNHPUKVZDYB38ZSI3CNCZPG9C/UKYRX5YWXEIBIMCBNRPGGCZKHLNG4T/R5K4LSBZUVNGBCHPI/JUIZ/IMFXEE4KYSEMYBPWBZ/UCANCY4MPXFQB3NRZQOSLBOMD9TP3IY8RQWIEG9HG3CH8AI/GGPGLXNNV4Q/ZOMVCVS4UCQFFEMMWK/RSV8RXQQPSOT8GYAUXOUJQ9VQCHAS4FL3WAMQXARHYNEPYS5TR3/MHCUSPE33NWZ48X3J9HWEJGIKOTLKAJXXAQ5X3YVLGNSSM3XT/9E/PBTN5PHCJLWKICIHER/QQMVGAGCVTKBUL3B3GQUKLKZ38YMOOJ5DTAFZSFZLVO4UZXGNNR4SJ3JFMLKDP3MXSZXX3YVLGXF3O8H5JHBZFTOZ4JDTLQGHLD5XOBLVQI/MQXS4EJAIU/VLYIGGJWNOTTF9AEQSEEGT84GI355YLVTTDGVICR8ACXJFHPTHRG8UXCLIHMW4Z3CUV89YLL3W3HDC5HUUDJ/PUS54PIJ98IXL3SEEOWWPGFN9O9ICPG4K8558ONZOHSW/U4ZRSC4C3UOHHIEARXSCZDZM4IBDBLRI99DEKKIAYPJSOSC59XGUVKSPHV9FRE35A5SII3G3DRQDQKTSC9DNUPBXVD3ORPX9NM3BK3PB5PIWUZKNCL4I4IWVO4FE4GCZBHSZWN3GS88G884DUFDUFE9RJEEKM3AJHNSEANJWQMRP5DUXHEKDWAAQGZYUL3EXY4ALN4NR3SF5CFOTZ9FGNJDFQEZU4TTVORUVS5WIZBQLZQF5HD4TTYIRPAZDNPCIYS93ZY5QQEBTYIYCQ4AJGK83BFOIK9S5GAJCBYLKSDADHOS4/XVSHDYBFSO3FZIHHHWSJ5L4R33KCXOW8T9KFQ4C8UCOCOCKXU8JJ5R9JL88UAJQ4HXWDBQ45JGY/AYGP8PMGWWLFM/9SP5OHR3FQKDIYIAOLKWM8OT8JO4W9ET5LIZMMNJBNN/A999JNG3ALKLKEK/HWZJUC5PLAILQJ8MCOO8T3X98H4ZKFIKYUKDI4ODART/K4JZDHMBY4X/BDKOYRJ/CQKZCFFBY3494/DUFHLVYZL5VG35KFSVC9IXI4S3RB3FXBDCYYKVUUTBTEFNJVRB3H5BU9NGUGJ3FBD9OOXWRTUZ8GHAHKPNL5TTUHNGMARBKFQMKFN4ODB4Y8OKCJPFQNHIGK8WFYOHI/ZW/PMHF4JAFIAYNNPOYJY/AFTDSOPNGP8GK94X3QY4A/THAWWGH3LSRST4/AV8GY4QV53A5MRYF3K3MWK5YJAWLLYWV9U/CZN4WAV3OELTO45G5IEY4P845ZJJAYGTBHXBFE5XJ5C5FFUFXCOUSWTU/LSSQ/VWNP9BSOLUB5PLNWAZF4O8LKGTA9ZAAVRIW8CP3UFS5I5N/MNMVCRD/3AM/XUPGMJAM45AY4VDA5XY4F8ZV4NXZMPZROZ/QFPLOQ/3WSZ8/FXEJEFC9W3UJGOO4RL9FEVQL/DYDAK8JLMVPY9IPYXBX3WIYOLYB5VDUAJBKCINPZZ5843H/8ZIZCVQ4RTVCOTSATJC4ZVBXYROCDXRIPGH5/WS83Y4TAA45YBPNGFFSY3I/O3JIKWMAS9TYTY38JMIEREZWOYWT3ZYRA84IRDX93H3JJQSFL43JOLPPX3UDF59RL3ESVR8J83QKTJLSJAEQOBZ8FCLWIRBXOUXQOKQ/AE885X/VQIUFETMEUC48CJMKQIJQ9ZVPHOJMCIR93GTVYWMIYMPOWFWOL99NRTWQAQ3WKLF//F3VDQDS8HLLDRKESD89OU9PSPIXW5/TX35KZUONYTLQKMGRWTSV3/5/BJZV9MHPL5UZR4ZMJZEXUE8F8E3RVDEDGVQWENRFYBOEKQMBILPWUFXZQB9XGYOSZKS8IRL9VMH5DWE3WHY3FRR83I55XUXHBJ5BMAPOHIGHQIZ/RSSAK83AUEW4Q5DZ9WTDKRMLT9OYH/VZGXUMEOV/4PL3P/SSIHX3UQIVDVQKZWHYQGZO9NLMPRSJV8/G5FTKLJ8FSKRAOZ/FZCRJLBRIBTJPGUDLFGYBXBVMJQQA3MSHFDZE/HRUOUGYZJNNWARNXNYKAWYQQWMES8K4UCFEGHDPYD/NK/U/B84NI54QLJWW/8NTWPOS/ENS355GHATHAFKK4ONFQR/WHNY3IQTTCBWF35XYXLSOXV5AIZBIGDNFDHL5OO4H/3SJBJBPTQ/3WAAO9ZGW9GYP8/JKVZKK/O9VEMBDKIJYMMVCGODXZY3QNUB8EOWKXS3HT9OFV5JJCDC9FE3FUZJOHL4HH4PA9YFA5TI5ZHFPG/RXQ/5ZMGNSTHWZC4ZC9JA8JNHKT/HNE8CLU9QF385/HDJAEEGSKGPFRKDHEPAXDH9M8Q8KQKEGYWDI9ERQGWMDPZYS/WS9PRP3/3MUKLQIKR5V4GYHNQWTB/SZM9VPQSJZLLKIF5WC5EHTILCZ95RMOJZ89LPJMPRNZ4ERL8HXZIL5B9KEBFN4YJ4LNEQOSS5ILTYECXG/MY9MRQWHFM8QFLI8CAG3BUUG53XPH4CE8GUQKZBKLNAGWXORPFZR3V9XTLBBATUTFUPC/ULGGWLFMCSP8KUYIFXTZ8V4HUQLS9MKYMJMLF/94U3PNELHVWRMISI9QYL53O5XDSFP84VOOAYCKJE4HPG3GA8MGGZVMSBMT5KWQ9V88USEMD3T8IYMIYFENMRZURQLNCICODEG/ZW4HNTOKZMC//ZGQL/XBC8STG3RXKMCO9NSVQQ8QDFDZWNIAENP/J898ADWNHCDCIO5XT8PR4BCDDAQEJV4LGLRALWU5YUL5GBDH//4TQJHBP8JWWMVBV89E/VMRUCLXGKABKSXK5KXWF9NIZB/ADKX38LTZIUBBMWIMMNZXO/EKXEGZBQZD8CYXXRVVF3/NIDWVFYU99H5KJ9DE55N59LRTPLL9PAKPPLSRC38SEUGYSUG5GRTV/5WIDY9YBNDIS4QEBELA/4QVPMVWZG3R9HSE/ZXYK8GGHQ5WVDSYI4RZTBYMUL8QLMPB4P43Y9R3PAWWZRFNNIEXPL83DVJWL3YDG/OJ9UN5CS/L3LDTGMVHMFKZE/BD4MVKJTWFXWPR4KJXYUGIZBZZMTH/JM3MIWOV/ETI5NNOUSLUYL89G3X/TPHC3A/CTNT5HM4CX5PQDMKRSLAOFGPNVRFSE/HDZFE8LFIYM5GDMAYBVRCJCHJBDJ9YS9SLJ/LA54C5DPH8LX8Y3VLP4GROV/QIPZQDB5CS4EAKFULGLIB9XSOXKDE4OJVQXYEI8RBV9PLOT8QE5WLSXG8JW8C/5FGKUR9NHIKNLYFJNSIE8WPARBOUAMNDOKRZXNIWKF8EDD/4VIFV/4UIEVIG48/M4OLBDZKOXRO4//8XAOXY8FPVJZ/O4OWL4CIVNGMWACYCYUJJLPDS/D/KYLBBFCVRTQ/DJZ3WVQEZDVYIBOKDHCYGDP4FENMNOCYJVG/RJJVKIU4EZNQRAN9WWSGYSHZWQQWXKD5RLQDSMDW9R34CYUPW/5899KP3BJM/ZGIWMAPGYF/PYLHDXDXWUPMTNAFPZMQOQVBXRI3VL84TYQRVRVPIJTTUJ8EKOQWMRTR3QGYOBSQWWKO/V4I8S/E8XW9A3HYYVSIVFS8LTWURNZ8M5EGBCLFGC3LJLVZE8MEQNTXY3XL8YTQPA4KZCMO8OJ5RDCIELIKSANPLQAVEPE5IWXMA534XDAV9CZTCBEHVVCFAGIXS4F4KVB4K/AM/DCHYW4BTY4A954GJPQ3NAK8STGW4E/FE4L/WZZJGJPLH/MSDCMK/VQ5HLLONBWSKW3LPSPIB3BSZS8ZZVRAQPO5G5MAWGVFKJSYDBXB5KGUWQZ4FBPUQS9LBKWTQCS3RC8MVTQTTS9STDAXAQJHHZSGN/RXLODYJY8EUTA8H3IFIW5FI5UFTOPTOET8F5/MUQTONBCD3OTMS3QSV/UKAIINVWPQFNHYREGBG/XWEQN/HGMG9TRHLIIQIM5WZQDX5QEBCFRJVOO8/KS9NUJRLL8LJ/5/LH4RIJUIY4/MZT4VKPL5ITODTSAULBRRG8H945J84ABZA3JT9MFA/Z3OLMHMGLO8M8DVMAEHQJMEY3JGORHACL4BGQWCE99NIGNAOSMEI9FHIY5BVB3DR4FICF8VSI3Z/HWDAXUW8RIMJQUABTRXWOEDTIFBRFBE33RM/Y4INUYXHI9393YDIEIS9DUN/AMLN99F4LML3XOCSSCSWLK9UTIUVH4TWITVCY5XDV/59GCZHTE588MXX5EWURPG35BV8VIGNZKR5BYYRULFSVMACN3VH5P5U4SQ/KWFJPAMVFVRVPBOPB8IFKYKG5D8/E4LYAVOSNXRGIFOTAVPR/CG3YK8BBAOWO3M5V/OMIWMWVI98H5PVPDF8TZNNU4EVSYYY9YFLZPCGIOQM/IZ4HWGJ5RMT98Z/HMYXWS9JL5KNFHWO3VJXC/5IOKRAURSUTLQZGTOVGFTGZQ5HXSYF495/B9VSQBSKVSSSK49TKERKV9/YV9P/OF8MOHMT3DW4DNVN4H/M3RUDL/NCEY8PUNIJBSLL/ENHJ/QJAANL/IHZYGCR3548RIDAEJOVDE9OYJZWL5CB4VXH4ILMMBKSOZNWBCZEB3KB5VPUC/5MY3RVHB5IEJCNUNKDRLBAJRHPVCNDNMBYGJQRRRHNTZPNB3IFXN3DE8OB8WBN8U8BVY/CY5TALOLPKCQEN5NBRRXZEKLQQGYOCAM8DBXYSK8H9V5H8GBK5KR/V43YXMRAK/XCKCE99KGWIMZZCYOMJCMNFIE/ONFBORYY4DPM8CWLWR/V4F8ZMQEV/RBPXAKTEEYPD8QQ5HLCNUVMW/CC//YHPVRV5I4NQF5EMRHW4CWCJHDTPYUU3895ITSPBX8FIYHO3H/UX8Z8O/JRIGGYWLDYKEOLJJXWA8C/B4/DJIBRO5/JZD4XBGLVGSYSR8TN/U/WEM/3MMUVHGDFSSXXIYXE8Z9P59MDK5PQUQATLPNK9DKTXVYX4VZIBSKKSSQ4KN/FSYKHA8VE4YYHJMGTQWMBQPRDYK/UNNNLNCKH/UJ5CDTQ8ZWTGUV4FMKPJO/FI9S8N5PPZFVVZXPBYQUAOFBS4C5H4Z/DFTEF5K4P/VEZC3X9WJHPIZMSRZSCNUKGFSUQS3CSHSQL8AN3FZGERFOSY9SA4KURA4NWWNCJRINHI5A/H3TSJ9A/ZNLM5QFQICNRSKIKRQNA3A8WNPNLEBDB3QW9/4B5YYIIWDKG5C3/IOZXIDIFUE/NX8YTCMPGQ9YMN3AXXE85C5Y33ICVD3IXFP3AJ9UJYD/G54", - expectedOutput: "IF I SAID BLETCHLEY PARK, ENIGMA AND ALAN TURING, I WOULD THINK MANY OF YOU WOULD KNOW A LITTLE ABOUT THEM, THANKS TO THE WORK OF BOTH BLETCHLEY PARK AND RECENT FILMS SUCH AS THE IMITATION GAME. NOW, WHAT ABOUT IF I SAID COLOSSUS, TOMMY FLOWERS AND BILL TUTTE? I SUSPECT THAT VERY FEW PEOPLE, EVEN IN THE LOCAL AREA AROUND BLETCHLEY PARK AND MILTON KEYNES, WOULD BE FAMILIAR WITH THESE NAMES. COLOSSUS IS, ARGUABLY, THE WORLDS FIRST ELECTRONIC COMPUTER EVER BUILT AND ITS STORY IS EVEN MORE AMAZING THAN ENIGMA, BUT IT HAS RECEIVED SIGNIFICANTLY LESS PUBLIC RECOGNITION. MANY PEOPLE WHO HAVE HEARD OF COLOSSUS BELIEVE THAT IT IS SOMETHING TO DO WITH ENIGMA, BUT THIS IS NOT THE CASE IN FACT, IT WAS BUILT TO CRACK A HARDER AND MORE SECRETIVE DEVICE BUILT BY THE LORENZ COMPANY IN GERMANY. ADOLF HITLER, REALISING THE REQUIREMENT FOR FAST AND SECURE COMMUNICATION BETWEEN HIS HIGH COMMAND AND GENERALS IN THE FIELD, ORDERED A FORMIDABLE CIPHER ATTACHMENT WHICH COULD SEND AND RECEIVE ENCODED MESSAGES AT A MUCH HIGHER RATE THAN ENIGMA. THEY BUILT A MACHINE WHICH, RATHER THAN HAVING THREE OR FOUR WHEELS LIKE ENIGMA, HAD TWELVE WHEELS, EACH OF WHICH COULD HAVE ITS SETTINGS ALTERED TO MAKE DECIPHERING THE COMMUNICATIONS EXTREMELY DIFFICULT, IF NOT (THEY HOPED) IMPOSSIBLE. IN 1940, BLETCHLEY PARK STARTED PICKING UP NEW TRANSMISSIONS, BUT NOBODY KNEW WHAT WAS ENCIPHERING THE CODES. THESE TRANSMISSIONS WERE RECORDED AND MANUALLY TRANSCRIBED ONTO PUNCHED TAPE AND SENT ON TO BLETCHLEY PARK. FINALLY, ON 30TH AUGUST 1941, A BREAKTHROUGH WAS MADE A GERMAN OPERATOR MANUALLY TYPED OUT AND TRANSMITTED A 4000 CHARACTER ENCODED MESSAGE. UNFORTUNATELY FOR HIM, THE RECEIVING END REPLIED SORRY, SEND IT AGAIN. IT WAS STRICTLY FORBIDDEN TO SEND TWO MESSAGES WITH THE SAME SETTINGS, BUT BEING ANNOYED AT HAVING TO TYPE THIS OUT AGAIN, HE DID JUST THAT AND STARTED TYPING AGAIN. TO SAVE TIME THOUGH, HE SHORTENED SOME OF THE WORDS (JUST LIKE WE WOULD TYPE NO RATHER THAN NUMBER) BUT DOING THIS MEANT THAT BLETCHLEY PARK HAD TWO MESSAGES, BOTH SENT WITH THE SAME KEY GENERATED BY THE MACHINE BUT WITH DIFFERENT ORIGINAL TEXTS. BRIGADIER JOHN TILTMAN, A SENIOR CODE BREAKER, WORKED HARD FOR TEN DAYS AND MANAGED TO SUCCESSFULLY SPLIT THESE MESSAGES BACK INTO GERMAN. MORE IMPORTANTLY, HE ALSO WORKED OUT THE ORIGINAL KEY STRING WHICH WAS GENERATED BY THIS NEW UNKNOWN MACHINE. VERY LITTLE PROGRESS WAS MADE TO CRACK THIS CODE, UNTIL THE KEY AND MESSAGES ENDED UP ON THE DESK OF A NEW MATHEMATICIAN BY THE NAME OF BILL TUTTE, WHO HAD JUST RECENTLY JOINED BLETCHLEY PARK. AFTER WEEKS OF PAINSTAKING MANUAL WORK WITH PAPER AND PENCIL, DRAWING OUT GRIDS OF DOTS AND CROSSES, HE FINALLY DISCOVERED A REPEATING PATTERN USING ROWS OF 41. HE CORRECTLY REALISED THIS WAS HOW MANY POSITIONS THE FIRST OF THE ENCODING WHEELS MUST HAVE IN THE UNKNOWN MACHINE. FROM THIS BREAK, WITH THE ASSISTANCE OF OTHER CODEBREAKERS, HE MANAGED TO SUCCESSFULLY RECREATE THE WORKINGS OF THE WHOLE MACHINE. REMEMBER, THIS WAS WITHOUT EVER SEEING THE LORENZ WHICH WAS AN ASTOUNDING PIECE OF WORK. BILL TUTTE, WHOSE CENTENARY WILL BE CELEBRATED IN MAY THIS YEAR, DID FURTHER WORK ON METHODS WHICH COULD POTENTIALLY BREAK INTO AN ENCODED MESSAGE, BUT IT INVOLVED A HUGE AMOUNT OF MANUAL EFFORT TO COUNT RESULTS FROM ALL SETTINGS UNTIL THE CORRECT ONE WAS FOUND. MAX NEWMAN MANAGED THE CONSTRUCTION OF A MACHINE TO USE TUTTES CALCULATIONS, WHICH WAS NICKNAMED HEATH ROBINSON, BUT IT WAS, UNFORTUNATELY, RELATIVELY SLOW AND UNRELIABLE. THEY INVITED, TOMMY FLOWERS, FROM THE POST OFFICE RESEARCH STATION IN DOLLIS HILL TO SEE IF HE COULD IMPROVE THE MACHINE. TOMMY FLOWERS CAME BACK TO THEM WITH A PLAN TO BUILD A NEW MACHINE USING 1500 THERMIONIC VALVES. VALVES AT THIS TIME WERE BELIEVED TO BE UNRELIABLE AND REQUIRE REGULAR REPLACEMENT, BUT TOMMY FLOWERS KNEW FROM HIS RESEARCH THAT IF NOT SWITCHED OFF, THEY WORKED PERFECTLY. WHILE BLETCHLEY PARK INITIALLY REFUSED, FLOWERS RETURNED TO DOLLIS HILL AND PERSUADED HIS SUPERIORS TO CONTINUE TO BUILD THIS MACHINE. IN JANUARY 1944, THE FIRST COLOSSUS WAS DELIVERED TO BLETCHLEY PARK, AND BY FEBRUARY WAS RUNNING SUCCESSFULLY AND RELIABLY FIRST TIME, MUCH TO EVERYONES ASTONISHMENT THEY QUICKLY PLACED ORDERS FOR AS MANY AS POSSIBLE, FLOWERS ALREADY HAVING STARTED WORKING ON A FASTER MARK 2. A FURTHER NINE COLOSSUS COMPUTERS WERE DELIVERED TO BLETCHLEY PARK BY THE END OF THE WAR (APPROXIMATELY ONE PER MONTH) AND THEY HELPED BREAK AN AMAZING 63 MILLION CHARACTERS, SHORTENING THE CONFLICT AND SAVING MANY LIVES. AFTER THE WAR, CHURCHILL ORDERED THE DISMANTLING OF ALL BUT TWO OF THE MACHINES AND THEIR EXISTENCE WAS KEPT SECRET FOR THIRTY YEARS. TONY SALE, AN ELECTRONIC ENGINEER WORKING AS SENIOR CURATOR AT THE SCIENCE MUSEUM, ALONG WITH SEVERAL COLLEAGUES STARTED, IN 1991, THE CAMPAIGN TO SAVE BLETCHLEY PARK FROM PROPERTY DEVELOPERS. HE ALSO BEGAN GATHERING INFORMATION ABOUT COLOSSUS. BY 1993, HE HAD RECOVERED EIGHT PHOTOGRAPHS FROM 1945, PLUS SOME FRAGMENTS OF CIRCUIT DIAGRAMS. HE STARTED TO BELIEVE THAT IT WOULD BE POSSIBLE TO REBUILD COLOSSUS, ALTHOUGH HE SAID THAT NOBODY BELIEVED THAT THIS WOULD BE POSSIBLE JUST LIKE TOMMY FLOWERS BEFORE HIM AFTER MONTHS OF WORK AND WITH HELP FROM THE ORIGINAL DESIGNER OF THE OPTICAL TAPE SYSTEM, DR ARNOLD LYNCH, HE MANAGED TO RE-ENGINEER THE BASIC SYSTEM. HE VISITED DR ALLEN COOMBS, WHO HELPED BUILD THE MK 2 COLOSSUS, ALONG WITH HARRY FENSON, ONE OF THE ORIGINAL COLOSSUS ENGINEERS. DR COOMBS GAVE TONY HIS WARTIME NOTES AND SOME CIRCUIT DIAGRAMS. USING HIS, AND HIS WIFE MARGARETS OWN FUNDS, HE STARTED THE HUGE TASK REBUILDING THE COLOSSUS. HE PUT TOGETHER A TEAM OF EX-POST OFFICE AND RADIO ENGINEERS TO HELP THE REBUILD. ON 6TH JUNE 1996, A BASIC WORKING COLOSSUS REBUILD WAS SWITCHED ON, AN OCCASION WHERE DR TOMMY FLOWERS ATTENDED AS WELL AS MANY PEOPLE WHO WORKED AT BLETCHLEY PARK DURING THE WAR. THE NEWMANRY REPORT WAS DECLASSIFIED IN 2000, ALLOWING THEM TO BUILD A WORKING COLOSSUS MK 2 BY 1ST JUNE 2004, THE 60TH ANNIVERSARY OF THE FIRST RUNNING OF A COLOSSUS MK 2 IN 1944. THE REBUILD CAN BE SEEN IN THE NATIONAL MUSEUM OF COMPUTING IN BLOCK H LOCATED WITHIN BLETCHLEY PARK. IT STANDS IN THE ORIGINAL ROOM WHERE COLOSSUS NO 9 STOOD IN WORLD WAR II. IT IS A MARVELLOUS WORKING TRIBUTE TO TOMMY FLOWERS AND THE ENGINEERS AT DOLLIS HILL, TO BILL TUTTE, JOHN TILTMAN, MAX NEWMAN, RALPH TESTER AND ALL THE CODE BREAKERS AT BLETCHLEY PARK, ALL THE WRNS WHO OPERATED COLOSSUS AND THE RADIO INTERCEPTORS AT KNOCKHOLT. BY MARTIN GILLOW, VIRTUALCOLOSSUS.CO.UK", + expectedOutput: + "IF I SAID BLETCHLEY PARK, ENIGMA AND ALAN TURING, I WOULD THINK MANY OF YOU WOULD KNOW A LITTLE ABOUT THEM, THANKS TO THE WORK OF BOTH BLETCHLEY PARK AND RECENT FILMS SUCH AS THE IMITATION GAME. NOW, WHAT ABOUT IF I SAID COLOSSUS, TOMMY FLOWERS AND BILL TUTTE? I SUSPECT THAT VERY FEW PEOPLE, EVEN IN THE LOCAL AREA AROUND BLETCHLEY PARK AND MILTON KEYNES, WOULD BE FAMILIAR WITH THESE NAMES. COLOSSUS IS, ARGUABLY, THE WORLDS FIRST ELECTRONIC COMPUTER EVER BUILT AND ITS STORY IS EVEN MORE AMAZING THAN ENIGMA, BUT IT HAS RECEIVED SIGNIFICANTLY LESS PUBLIC RECOGNITION. MANY PEOPLE WHO HAVE HEARD OF COLOSSUS BELIEVE THAT IT IS SOMETHING TO DO WITH ENIGMA, BUT THIS IS NOT THE CASE IN FACT, IT WAS BUILT TO CRACK A HARDER AND MORE SECRETIVE DEVICE BUILT BY THE LORENZ COMPANY IN GERMANY. ADOLF HITLER, REALISING THE REQUIREMENT FOR FAST AND SECURE COMMUNICATION BETWEEN HIS HIGH COMMAND AND GENERALS IN THE FIELD, ORDERED A FORMIDABLE CIPHER ATTACHMENT WHICH COULD SEND AND RECEIVE ENCODED MESSAGES AT A MUCH HIGHER RATE THAN ENIGMA. THEY BUILT A MACHINE WHICH, RATHER THAN HAVING THREE OR FOUR WHEELS LIKE ENIGMA, HAD TWELVE WHEELS, EACH OF WHICH COULD HAVE ITS SETTINGS ALTERED TO MAKE DECIPHERING THE COMMUNICATIONS EXTREMELY DIFFICULT, IF NOT (THEY HOPED) IMPOSSIBLE. IN 1940, BLETCHLEY PARK STARTED PICKING UP NEW TRANSMISSIONS, BUT NOBODY KNEW WHAT WAS ENCIPHERING THE CODES. THESE TRANSMISSIONS WERE RECORDED AND MANUALLY TRANSCRIBED ONTO PUNCHED TAPE AND SENT ON TO BLETCHLEY PARK. FINALLY, ON 30TH AUGUST 1941, A BREAKTHROUGH WAS MADE A GERMAN OPERATOR MANUALLY TYPED OUT AND TRANSMITTED A 4000 CHARACTER ENCODED MESSAGE. UNFORTUNATELY FOR HIM, THE RECEIVING END REPLIED SORRY, SEND IT AGAIN. IT WAS STRICTLY FORBIDDEN TO SEND TWO MESSAGES WITH THE SAME SETTINGS, BUT BEING ANNOYED AT HAVING TO TYPE THIS OUT AGAIN, HE DID JUST THAT AND STARTED TYPING AGAIN. TO SAVE TIME THOUGH, HE SHORTENED SOME OF THE WORDS (JUST LIKE WE WOULD TYPE NO RATHER THAN NUMBER) BUT DOING THIS MEANT THAT BLETCHLEY PARK HAD TWO MESSAGES, BOTH SENT WITH THE SAME KEY GENERATED BY THE MACHINE BUT WITH DIFFERENT ORIGINAL TEXTS. BRIGADIER JOHN TILTMAN, A SENIOR CODE BREAKER, WORKED HARD FOR TEN DAYS AND MANAGED TO SUCCESSFULLY SPLIT THESE MESSAGES BACK INTO GERMAN. MORE IMPORTANTLY, HE ALSO WORKED OUT THE ORIGINAL KEY STRING WHICH WAS GENERATED BY THIS NEW UNKNOWN MACHINE. VERY LITTLE PROGRESS WAS MADE TO CRACK THIS CODE, UNTIL THE KEY AND MESSAGES ENDED UP ON THE DESK OF A NEW MATHEMATICIAN BY THE NAME OF BILL TUTTE, WHO HAD JUST RECENTLY JOINED BLETCHLEY PARK. AFTER WEEKS OF PAINSTAKING MANUAL WORK WITH PAPER AND PENCIL, DRAWING OUT GRIDS OF DOTS AND CROSSES, HE FINALLY DISCOVERED A REPEATING PATTERN USING ROWS OF 41. HE CORRECTLY REALISED THIS WAS HOW MANY POSITIONS THE FIRST OF THE ENCODING WHEELS MUST HAVE IN THE UNKNOWN MACHINE. FROM THIS BREAK, WITH THE ASSISTANCE OF OTHER CODEBREAKERS, HE MANAGED TO SUCCESSFULLY RECREATE THE WORKINGS OF THE WHOLE MACHINE. REMEMBER, THIS WAS WITHOUT EVER SEEING THE LORENZ WHICH WAS AN ASTOUNDING PIECE OF WORK. BILL TUTTE, WHOSE CENTENARY WILL BE CELEBRATED IN MAY THIS YEAR, DID FURTHER WORK ON METHODS WHICH COULD POTENTIALLY BREAK INTO AN ENCODED MESSAGE, BUT IT INVOLVED A HUGE AMOUNT OF MANUAL EFFORT TO COUNT RESULTS FROM ALL SETTINGS UNTIL THE CORRECT ONE WAS FOUND. MAX NEWMAN MANAGED THE CONSTRUCTION OF A MACHINE TO USE TUTTES CALCULATIONS, WHICH WAS NICKNAMED HEATH ROBINSON, BUT IT WAS, UNFORTUNATELY, RELATIVELY SLOW AND UNRELIABLE. THEY INVITED, TOMMY FLOWERS, FROM THE POST OFFICE RESEARCH STATION IN DOLLIS HILL TO SEE IF HE COULD IMPROVE THE MACHINE. TOMMY FLOWERS CAME BACK TO THEM WITH A PLAN TO BUILD A NEW MACHINE USING 1500 THERMIONIC VALVES. VALVES AT THIS TIME WERE BELIEVED TO BE UNRELIABLE AND REQUIRE REGULAR REPLACEMENT, BUT TOMMY FLOWERS KNEW FROM HIS RESEARCH THAT IF NOT SWITCHED OFF, THEY WORKED PERFECTLY. WHILE BLETCHLEY PARK INITIALLY REFUSED, FLOWERS RETURNED TO DOLLIS HILL AND PERSUADED HIS SUPERIORS TO CONTINUE TO BUILD THIS MACHINE. IN JANUARY 1944, THE FIRST COLOSSUS WAS DELIVERED TO BLETCHLEY PARK, AND BY FEBRUARY WAS RUNNING SUCCESSFULLY AND RELIABLY FIRST TIME, MUCH TO EVERYONES ASTONISHMENT THEY QUICKLY PLACED ORDERS FOR AS MANY AS POSSIBLE, FLOWERS ALREADY HAVING STARTED WORKING ON A FASTER MARK 2. A FURTHER NINE COLOSSUS COMPUTERS WERE DELIVERED TO BLETCHLEY PARK BY THE END OF THE WAR (APPROXIMATELY ONE PER MONTH) AND THEY HELPED BREAK AN AMAZING 63 MILLION CHARACTERS, SHORTENING THE CONFLICT AND SAVING MANY LIVES. AFTER THE WAR, CHURCHILL ORDERED THE DISMANTLING OF ALL BUT TWO OF THE MACHINES AND THEIR EXISTENCE WAS KEPT SECRET FOR THIRTY YEARS. TONY SALE, AN ELECTRONIC ENGINEER WORKING AS SENIOR CURATOR AT THE SCIENCE MUSEUM, ALONG WITH SEVERAL COLLEAGUES STARTED, IN 1991, THE CAMPAIGN TO SAVE BLETCHLEY PARK FROM PROPERTY DEVELOPERS. HE ALSO BEGAN GATHERING INFORMATION ABOUT COLOSSUS. BY 1993, HE HAD RECOVERED EIGHT PHOTOGRAPHS FROM 1945, PLUS SOME FRAGMENTS OF CIRCUIT DIAGRAMS. HE STARTED TO BELIEVE THAT IT WOULD BE POSSIBLE TO REBUILD COLOSSUS, ALTHOUGH HE SAID THAT NOBODY BELIEVED THAT THIS WOULD BE POSSIBLE JUST LIKE TOMMY FLOWERS BEFORE HIM AFTER MONTHS OF WORK AND WITH HELP FROM THE ORIGINAL DESIGNER OF THE OPTICAL TAPE SYSTEM, DR ARNOLD LYNCH, HE MANAGED TO RE-ENGINEER THE BASIC SYSTEM. HE VISITED DR ALLEN COOMBS, WHO HELPED BUILD THE MK 2 COLOSSUS, ALONG WITH HARRY FENSON, ONE OF THE ORIGINAL COLOSSUS ENGINEERS. DR COOMBS GAVE TONY HIS WARTIME NOTES AND SOME CIRCUIT DIAGRAMS. USING HIS, AND HIS WIFE MARGARETS OWN FUNDS, HE STARTED THE HUGE TASK REBUILDING THE COLOSSUS. HE PUT TOGETHER A TEAM OF EX-POST OFFICE AND RADIO ENGINEERS TO HELP THE REBUILD. ON 6TH JUNE 1996, A BASIC WORKING COLOSSUS REBUILD WAS SWITCHED ON, AN OCCASION WHERE DR TOMMY FLOWERS ATTENDED AS WELL AS MANY PEOPLE WHO WORKED AT BLETCHLEY PARK DURING THE WAR. THE NEWMANRY REPORT WAS DECLASSIFIED IN 2000, ALLOWING THEM TO BUILD A WORKING COLOSSUS MK 2 BY 1ST JUNE 2004, THE 60TH ANNIVERSARY OF THE FIRST RUNNING OF A COLOSSUS MK 2 IN 1944. THE REBUILD CAN BE SEEN IN THE NATIONAL MUSEUM OF COMPUTING IN BLOCK H LOCATED WITHIN BLETCHLEY PARK. IT STANDS IN THE ORIGINAL ROOM WHERE COLOSSUS NO 9 STOOD IN WORLD WAR II. IT IS A MARVELLOUS WORKING TRIBUTE TO TOMMY FLOWERS AND THE ENGINEERS AT DOLLIS HILL, TO BILL TUTTE, JOHN TILTMAN, MAX NEWMAN, RALPH TESTER AND ALL THE CODE BREAKERS AT BLETCHLEY PARK, ALL THE WRNS WHO OPERATED COLOSSUS AND THE RADIO INTERCEPTORS AT KNOCKHOLT. BY MARTIN GILLOW, VIRTUALCOLOSSUS.CO.UK", recipeConfig: [ { "op": "Lorenz", - "args": ["SZ42b", "ZMUG Pattern", true, "Receive", "Plaintext", "Plaintext", "5/8/9", 32, 28, 24, 11, 44, 6, 50, 34, 12, 18, 18, 9, ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", "x..xxx...x.xxxx..xx..x..xx.xx..", "..xx..x.xxx...xx...xx..xx.xx.", "xx..x..xxxx..xx.xxx....x..", "xx..xx....xxxx.x..x.x.."] + "args": [ + "SZ42b", + "ZMUG Pattern", + true, + "Receive", + "Plaintext", + "Plaintext", + "5/8/9", + 32, + 28, + 24, + 11, + 44, + 6, + 50, + 34, + 12, + 18, + 18, + 9, + ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", + ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", + ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", + ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", + "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", + "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", + ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", + ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", + "x..xxx...x.xxxx..xx..x..xx.xx..", + "..xx..x.xxx...xx...xx..xx.xx.", + "xx..x..xxxx..xx.xxx....x..", + "xx..xx....xxxx.x..x.x.." + ] } ] } - ]); diff --git a/tests/operations/tests/LuhnChecksum.mjs b/tests/operations/tests/LuhnChecksum.mjs index 498a1542..4deef8e4 100644 --- a/tests/operations/tests/LuhnChecksum.mjs +++ b/tests/operations/tests/LuhnChecksum.mjs @@ -16,8 +16,8 @@ TestRegister.addTests([ { op: "Luhn Checksum", args: [] - }, - ], + } + ] }, { name: "Luhn Checksum on standard data 2", @@ -27,8 +27,8 @@ TestRegister.addTests([ { op: "Luhn Checksum", args: [] - }, - ], + } + ] }, { name: "Luhn Checksum on standard data 3", @@ -38,8 +38,8 @@ TestRegister.addTests([ { op: "Luhn Checksum", args: [] - }, - ], + } + ] }, { name: "Luhn Checksum on invalid data", @@ -49,8 +49,8 @@ TestRegister.addTests([ { op: "Luhn Checksum", args: [] - }, - ], + } + ] }, { name: "Luhn Checksum on empty data", @@ -60,7 +60,7 @@ TestRegister.addTests([ { op: "Luhn Checksum", args: [] - }, - ], + } + ] } ]); diff --git a/tests/operations/tests/MS.mjs b/tests/operations/tests/MS.mjs index 5862e430..c2ece985 100644 --- a/tests/operations/tests/MS.mjs +++ b/tests/operations/tests/MS.mjs @@ -11,12 +11,12 @@ TestRegister.addTests([ { name: "Microsoft Script Decoder", input: "#@~^RQAAAA==-mD~sX|:/TP{~J:+dYbxL~@!F@*@!+@*@!&@*eEI@#@&@#@&\x7fjm.raY 214Wv:zms/obI0xEAAA==^#~@", - expectedOutput: "var my_msg = \"Testing <1><2><3>!\";\r\n\r\nWScript.Echo(my_msg);", + expectedOutput: 'var my_msg = "Testing <1><2><3>!";\r\n\r\nWScript.Echo(my_msg);', recipeConfig: [ { "op": "Microsoft Script Decoder", "args": [] - }, - ], - }, + } + ] + } ]); diff --git a/tests/operations/tests/Magic.mjs b/tests/operations/tests/Magic.mjs index 90401dc1..bf50afc8 100644 --- a/tests/operations/tests/Magic.mjs +++ b/tests/operations/tests/Magic.mjs @@ -13,13 +13,14 @@ TestRegister.addTests([ { name: "Magic: nothing", input: "", - expectedOutput: "Nothing of interest could be detected about the input data.\nHave you tried modifying the operation arguments?", + expectedOutput: + "Nothing of interest could be detected about the input data.\nHave you tried modifying the operation arguments?", recipeConfig: [ { op: "Magic", args: [3, false, false] } - ], + ] }, { name: "Magic: hex, correct rank", @@ -30,7 +31,7 @@ TestRegister.addTests([ op: "Magic", args: [3, false, false] } - ], + ] }, { name: "Magic: jpeg render", @@ -41,7 +42,7 @@ TestRegister.addTests([ op: "Magic", args: [3, false, false] } - ], + ] }, { name: "Magic: mojibake", @@ -52,7 +53,7 @@ TestRegister.addTests([ op: "Magic", args: [1, true, false] } - ], + ] }, { name: "Magic: extensive language support, Yiddish", @@ -63,18 +64,19 @@ TestRegister.addTests([ op: "Magic", args: [1, false, true] } - ], + ] }, { name: "Magic Chain: Base64", input: "WkVkV2VtUkRRbnBrU0Vwd1ltMWpQUT09", - expectedMatch: /From_Base64\('A-Za-z0-9\+\/=',true,false\)\nFrom_Base64\('A-Za-z0-9\+\/=',true,false\)\nFrom_Base64\('A-Za-z0-9\+\/=',true,false\)/, + expectedMatch: + /From_Base64\('A-Za-z0-9\+\/=',true,false\)\nFrom_Base64\('A-Za-z0-9\+\/=',true,false\)\nFrom_Base64\('A-Za-z0-9\+\/=',true,false\)/, recipeConfig: [ { op: "Magic", args: [3, false, false] } - ], + ] }, { name: "Magic Chain: Hex -> Hexdump -> Base64", @@ -85,7 +87,7 @@ TestRegister.addTests([ op: "Magic", args: [3, false, false] } - ], + ] }, { name: "Magic Chain: Charcode -> Octal -> Base32", @@ -96,7 +98,7 @@ TestRegister.addTests([ op: "Magic", args: [3, false, false] } - ], + ] }, { name: "Magic Chain: Base64 output", @@ -107,7 +109,7 @@ TestRegister.addTests([ op: "Magic", args: [3, false, false] } - ], + ] }, { name: "Magic Chain: Decimal -> Base32 -> Base32", @@ -118,12 +120,13 @@ TestRegister.addTests([ op: "Magic", args: [3, false, false] } - ], + ] }, { name: "Magic: Raw Inflate", input: "\x4d\x52\xb1\x6e\xdc\x30\x0c\xdd\xf3\x15\x44\x80\x6e\xae\x91\x02\x4d\x80\x8e\x4d\x9a\x21\x53\x8b\xa6\x43\x56\x5a\xe2\x9d\x84\x93\x25\x43\x94\xed\xf8\xef\xf3\xe8\x6b\x0e\xb7\x1c\xce\xd4\x7b\x8f\x8f\x7c\x7c\xda\x06\xa9\x4f\x41\x0e\x14\x95\x98\x34\x8e\x53\x92\x8e\x62\x6e\x73\x6c\x71\x11\x5a\x65\x20\x9e\x26\x3a\x94\x4a\x8e\x6b\xdd\x62\x3e\x52\x99\x1b\x71\x4a\x34\x72\xce\x52\xa9\x1c\xe8\xd6\x99\xd0\x2d\x95\x49\x2a\xb7\x58\xb2\xd2\x1a\x5b\x88\x19\xa2\x26\x31\xd4\xb2\xaa\xd4\x9e\xfe\x05\x51\xb9\x86\xc5\xec\xd2\xec\xe5\x7f\x6b\x92\xec\x8a\xb7\x1e\x29\x9e\x84\xde\x7e\xff\x25\x34\x7e\x64\x95\x87\xef\x1d\x8d\xa5\x0a\xb9\x62\xc0\x77\x43\xd6\x6d\x32\x91\x33\xf6\xe7\xf3\x6b\x47\xbf\x9e\x5f\x89\xb3\xa7\xc7\x54\xd6\x43\xd4\xd0\x91\xab\x82\x4e\x10\x1c\x62\xe6\xba\xed\xaf\x41\xde\xfd\x3c\x4e\x8a\x57\x88\x55\x51\x35\x15\x7b\xf1\x72\x5d\xc1\x60\x9e\x1b\x03\xc6\xc9\xcd\xe9\xac\x13\x58\x31\xc3\x8e\x76\x41\xdc\x49\xe7\x11\x42\x2f\x7f\x96\x87\xbd\xf6\xd6\xdf\xdf\xfd\xa0\x89\xab\x02\x0c\x66\xe0\x7c\x34\x1a\xfe\x54\x76\x0d\xeb\xfa\x1c\x11\x2c\x23\x8c\xb3\x0b\xfb\x64\xfd\xcd\x0d\xb6\x43\xad\x94\x64\x69\x78\xd1\x78\xcc\xe2\x51\x00\x85\x07\x2c\x67\x28\x2d\x50\x13\x17\x72\x84\xa3\x9d\x9d\x4b\xfe\x7a\x5d\xe1\xb4\x69\x53\xe3\x20\x9c\x38\x99\x69\xd9\x87\xc0\xa2\x2f\xab\x5b\x79\x3b\xe7\x63\x41\x06\x5e\xcc\x1f\x18\x5e\x20\x61\xe5\x0b\xd0\xbc\xa8\x25\xc0\xe9\x58\x2a\x5e\x46\xed\xe9\xa5\x41\x40\x81\xc9\x4e\x70\x22\xbe\xbb\x58\xed\x68\x98\x63\xc2\x6d\xc0\x18\x72\xad\x32\x4a\x6e\x38\x94\x8d\x10\x6e\x2d\xc0\xd2\x60\x09\x7c\xfa\x34\x4f\x2d\x48\xac\xf4\xed\xee\x0b\x3e\x72\x59\xf6\xab\xa0\x16\x47\x1c\xc9\x82\x65\xa9\xe0\x17\xb6\x36\xc1\x46\xfb\x0f", - expectedMatch: /#recipe=Raw_Inflate(.|\n)+CyberChef is a simple, intuitive web app for carrying out all manner of /, + expectedMatch: + /#recipe=Raw_Inflate(.|\n)+CyberChef is a simple, intuitive web app for carrying out all manner of /, recipeConfig: [ { op: "Magic", diff --git a/tests/operations/tests/Media.mjs b/tests/operations/tests/Media.mjs index cbf09c5c..efbb9a4f 100644 --- a/tests/operations/tests/Media.mjs +++ b/tests/operations/tests/Media.mjs @@ -11,14 +11,13 @@ TestRegister.addTests([ name: "Play Media: nothing", input: "", expectedOutput: "", - recipeConfig: [ - { op: "Play Media", args: ["Raw"] } - ] + recipeConfig: [{ op: "Play Media", args: ["Raw"] }] }, { name: "Play Media: raw wav", input: "52494646bcaf010057415645666d74201000000001000100401f0000401f0000010008006461746198af0100818081808180818081808180818081808180818081808180818081808180818081808180818081808180818081808180818081808180818081808180818081808180818081808180818081808180818081818281807f82807f817e81808280827d8086817d80828184817f80807d847f7e7e8582837b81857e7e82867f7c7f857e7d838182837f83847b7c838082807c7d838481827e83827c7f848383807c7f7c80848085808180827e83827f7c82827c7f858183807c837b847f7f82827a85837a8287817f7882827f89837e7f877b7e808281817f7e807c827b7e7d8383838486838883837d7d7682797d847f7d868287867d83847c81807d7e818080828082828380807e7f827d8181807e828082858581808081807f7a7f81808183807d7c7f7f858180848484857f8082817e827b7e7f7f8385807f7f7d858183808081807f7f8183847f7e7d81828284857d7f7e8084868182837d7e7d7a7e7e8085837f80807b7f7b7a80827d7f817e8386838588868386868689868586838386868584807c7a78787875706e6c6a6c6d70757a7c7e7f80858b94a1a29a9996989a9e9ca09ea19caa8e554129243e4d475e7184a0ada2a4a0918179646167696f7b7a8390939ca4aab2af9c9691909aa2a3ae74321e162a4d5c506c88a5babca6a4a7a18c7a5e5c646f6a6b6d7f929a8f858182827e79849299a1abb2c7cc975b3826324447496788a5b8b6a9aaa9977b60494c586467707c949fa195938f8f847a717c88a0aab7b7d6a46045362f3c483d6089a1acb4a3a4a89570615652676f6d788f97a29c8e8992898381808393999da9bf8e515e504c4e5d4879929a90a1909e9c855c5b5f717679768b9b9f958c838c8d8c7f8782969ca797a963585f63425d60687e93818b99938c84786f7e7a7b7f86838a867f8486858899939697a7a6be6e465f6c4d465d678e948275958a867063688e8b828fa2a0988b7a7f7c737185898a8e90989c9b8c8c6e5f5a655159646f727f737382857c7f898a9aa4b1b6cac5d4957d695b403c4152", - expectedOutput: "", + expectedOutput: + "", recipeConfig: [ { op: "From Hex", args: ["Space"] }, { op: "Play Media", args: ["Raw"] } @@ -27,17 +26,15 @@ TestRegister.addTests([ { name: "Play Media: hex ogg", input: "4f676753000200000000000000003129000000000000642493e3011e01766f72626973000000000244ac0000000000008138010000000000b8014f676753000000000000000000003129000001000000a3565ae9102dffffffffffffffffffffffffffff2403766f726269731d000000586970682e4f7267206c6962566f726269732049203230303230373137000000000105766f726269732242435601000001009c739a318799629452892194de3968196394526929a55a4aa9a183166babbdf7de7befbdf7de7bef1d739431469552524aa99d739631471563524a89a5945642682184d662abbdf7de6befb5f6de7bef99424c29a41442084a281d538c29a494424a4a0825640e3ac61c538c52093dd65e6bccbdb6d87beda163ce39e61c534c4a6821740e3ae69c534c4a68a984524206a153d05289adf7de62ebb9a5da7bef81d0905500000100c040101ab20a00500000108aa1188a028486ac020032000004e0288ee3388ee23892623916101ab20a00000200100000c0900c4bb114cdd1244dd22ccf134dd3377dd3366d55d7755dd7755dd77520346415000001004040a719a61a20c28c6416080d590500200000004420c3140342435601000001000052243949a2e4a494520e836431492ae5a494521ec5e4514d3206a594524a29a594524a29a594520a8364394a2ae5a4945212a364314aaad4a494521ee5e4", - expectedOutput: "", - recipeConfig: [ - { op: "Play Media", args: ["Hex"] } - ] + expectedOutput: + "", + recipeConfig: [{ op: "Play Media", args: ["Hex"] }] }, { name: "Play Media: base64 webm", input: "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", - expectedOutput: "", - recipeConfig: [ - { op: "Play Media", args: ["Base64"] } - ] + expectedOutput: + "", + recipeConfig: [{ op: "Play Media", args: ["Base64"] }] } ]); diff --git a/tests/operations/tests/MorseCode.mjs b/tests/operations/tests/MorseCode.mjs index 8df76d80..f564d78a 100644 --- a/tests/operations/tests/MorseCode.mjs +++ b/tests/operations/tests/MorseCode.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Morse Code", - args: ["-/.", "Space", "Line feed"], - }, - ], + args: ["-/.", "Space", "Line feed"] + } + ] }, { name: "From Morse Code '... --- ...'", @@ -27,8 +27,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Morse Code", - args: ["Space", "Line feed"], - }, - ], - }, + args: ["Space", "Line feed"] + } + ] + } ]); diff --git a/tests/operations/tests/MultipleBombe.mjs b/tests/operations/tests/MultipleBombe.mjs index adec6174..fcdab2ee 100644 --- a/tests/operations/tests/MultipleBombe.mjs +++ b/tests/operations/tests/MultipleBombe.mjs @@ -20,11 +20,13 @@ TestRegister.addTests([ "EKMFLGDQVZNTOWYHXUSPAIBRCJA65 ~G6C %96 {2KJ s@8]", + expectedOutput: '%96 "F:4< qC@H? u@I yF>A65 ~G6C %96 {2KJ s@8]', recipeConfig: [ { op: "ROT47", args: [47] - }, - ], + } + ] }, { name: "ROT47: full loop", @@ -209,8 +208,8 @@ TestRegister.addTests([ { op: "ROT47", args: [94] - }, - ], + } + ] }, { name: "ROT8000: nothing", @@ -220,8 +219,8 @@ TestRegister.addTests([ { op: "ROT8000", args: [] - }, - ], + } + ] }, { name: "ROT8000: normal", @@ -231,8 +230,8 @@ TestRegister.addTests([ { op: "ROT8000", args: [] - }, - ], + } + ] }, { name: "ROT8000: backward", @@ -242,7 +241,7 @@ TestRegister.addTests([ { op: "ROT8000", args: [] - }, - ], - }, + } + ] + } ]); diff --git a/tests/operations/tests/SIGABA.mjs b/tests/operations/tests/SIGABA.mjs index 5f07ce20..1fa0ad9d 100644 --- a/tests/operations/tests/SIGABA.mjs +++ b/tests/operations/tests/SIGABA.mjs @@ -16,21 +16,46 @@ TestRegister.addTests([ { "op": "SIGABA", "args": [ - "BHKWECJDOVAYLFMITUGXRNSPZQ", true, "G", - "CDTAKGQOZXLVJYHSWMIBPRUNEF", false, "L", - "WAXHJZMBVDPOLTUYRCQFNSGKEI", false, "I", - "HUSCWIMJQXDALVGBFTOYZKRPNE", false, "T", - "RTLSMNKXFVWQUZGCHEJBYDAIPO", false, "B", - "GHAQBRJWDMNZTSKLOUXYPFIECV", false, "N", - "VFLGEMTCXZIQDYAKRPBONHWSUJ", true, "Q", - "ZQCAYHRJNXPFLKIOTBUSVWMGDE", false, "B", - "EZVSWPCTULGAOFDJNBIYMXKQHR", false, "J", - "ELKSGDXMVYJUZNCAROQBPWHITF", false, "R", - "3891625740", "3", - "6297135408", "1", - "2389715064", "8", - "9264351708", "6", - "9573086142", "6", + "BHKWECJDOVAYLFMITUGXRNSPZQ", + true, + "G", + "CDTAKGQOZXLVJYHSWMIBPRUNEF", + false, + "L", + "WAXHJZMBVDPOLTUYRCQFNSGKEI", + false, + "I", + "HUSCWIMJQXDALVGBFTOYZKRPNE", + false, + "T", + "RTLSMNKXFVWQUZGCHEJBYDAIPO", + false, + "B", + "GHAQBRJWDMNZTSKLOUXYPFIECV", + false, + "N", + "VFLGEMTCXZIQDYAKRPBONHWSUJ", + true, + "Q", + "ZQCAYHRJNXPFLKIOTBUSVWMGDE", + false, + "B", + "EZVSWPCTULGAOFDJNBIYMXKQHR", + false, + "J", + "ELKSGDXMVYJUZNCAROQBPWHITF", + false, + "R", + "3891625740", + "3", + "6297135408", + "1", + "2389715064", + "8", + "9264351708", + "6", + "9573086142", + "6", "Encrypt" ] } @@ -39,52 +64,108 @@ TestRegister.addTests([ { name: "SIGABA: encrypt test 2", input: "PCRPJZWSPNOHMWANBFBEIVZOXDQESPYDEFBNTHXLSICIRPKUATJVDUQFLZOKGHHHDUDIBRKUHVCGAGLBWVGFFXNDHKPFSPSCIIPCXUFRRHNYWIJFEJWQSGMSNJHWSLPKVXHUQUWIURHDIHIUTWGQFIYLTKEZAUESWYEKIWXUSSXWXBEHCXCUDQWKCISVPKXJVPOIJZWTUGKAORBMKBAQUZOPTSUSYZRROWQUYKNCLHVIHEGWCCONGVHEKCEXVYIPNILIXTXDELNGLJGMEQKKQJWZLPNXPOGIOSVAEAJYKWYJXXGKKPLVYAZGDCMNHMPLCYWDQSRBEMVVVZVFYJMRYGHJOTDOEQVRQOVXOGOVYGTXETFHAYELRYVDGWOFVGAOWPMHQYRZMNXVTAHWSKZLJDFVQPZGMHZWFNOBHSZHEDAEXIFCEEJYZDOEFOQWCXTKPJRUEITKHVCITCLKBUFNAFBYXELAYPBRGGGOCCAGLXXJXTSWCJHMHQPVUIBAGBDKAGEEEPKRGGICJQXSYHBNNAKGYODRAUWAEYHWCKHEQIBAONWQJYQCIFKDTOCTJMBJULWKMSNNMPXINHZQWUMJQLQKIPVZVRGYPCJJZMENWTFTUSPCSPRXHMZPCHCNQTUDCOUJHRKYQIUWWVEVVRYFDIYRQISNGPMQLNMCNMVBEWHNCUODHAGEVEUMKVZLEIKYAMPGVVSBYNRJMFCATDXTQCYXIBCXXKYEYHHYERQGQWZTWCEJBFQLRFFCIVVSZUKGLOTLNGLQNTIKTBBWVFMONUFKRLCJASEKUEEDDQDIVQMFRSJRNHYZJODFHSCJSDAIRUXOSDNFUFUFMNZYQIEGRUXKUPCHENUEZHRKYHDRJYSHLZNYRBWVXORMJMJRIRNSAJQRUMPCXUDFYRGKEAXQXJHPEWNIYIDURDGWIFEMSOFYYCFRZGMZXJNTLTJBBSZIULQSOMEVGCTCVXUHTIEHSPOPQYCJLPAJAPQPAQXE", - expectedOutput: "GMEXPPCMFGKUVGXZHVTCKXRSTJUYWNOKFVELWAHHSJBXGOEXCMLOVSIMCDMGEYMWWTFDUMCDUJEZITNPVVBGQDJEVHJXSKJAAUZWBELMSPUTXCUYPDTJCQXEBGWPWRSQLSNFMASCTJZDSFNKDDTAXLRGUPKCBNXMZPADJSFGGNYKRPYBNTYPTGVPACBEINILNACWFVKMJPGCEZFROEYYKTGYSQYMFSGVDOJJONNYEYSCCIXWLKUSJZDRVAQSNUWHMDJVDNNMPGOYRGQRSBGSPQKGCTFZQWSOXBWSQZDCRQJQAWZDPQEILGMMABIMCDPNSKAFCLPQGIRJCMGQREBEUHBYREXFABFMVZTZBDUMASVNUMHIYRSZLGNZFMVAIABLCUZLJLKKZPWEXDHYZFVSNRLCLNDRKLKSWRHQVQJRTHCNFZXDEXSLAXXOGMFVSGCJGAWOLGDMTLWSFNTCUVCCEACINRZAZZOGLEHHXLPHVKILBBJDPOOCILQKKGODSXOBDPZZDXHJLLBOBVFCHJVMUBUZZIKGCWGCYGXVEHHIJGPEQERWEZLILQNHPHALFKFMGADNELGBKILKIUETGDCBQUEOECWVFNOXTJKUYPWBNEKYSIKMVSAMBZGLIKDAOELRSTKFASEKABTUCPSFEGXXQGDFPSPVOLBHGLZSLLWCABSRKZDQQRKVCKXDGTIHPDNMPDZEXYFYKXZTPJPLYOFNLWAGKJEOHOYLMZELXIDWWNXPKEPUCKNNNHJLFYHPQNHMMCGMUPHSUSYYIVWTIMFKKKTFPGFTLTWWSQBRBMGBTZXPVULKNZIIKVTYLJFISGPTLZFTCLGNZOMVKZOIMUDGXRDDSVFRHRYWBEWHYLCUISYMRWAZZAQPJYXZQQKZLILOSHXUTQJFPTXQSREKSUDZTLGUDLUGOJMQHJRJHXCHQTKJULTWWQOXIRFRQEYBPJPEKXFIRMNATWNFBADOSIJVZYRYDBHDAEDJUVDHLDAU", + expectedOutput: + "GMEXPPCMFGKUVGXZHVTCKXRSTJUYWNOKFVELWAHHSJBXGOEXCMLOVSIMCDMGEYMWWTFDUMCDUJEZITNPVVBGQDJEVHJXSKJAAUZWBELMSPUTXCUYPDTJCQXEBGWPWRSQLSNFMASCTJZDSFNKDDTAXLRGUPKCBNXMZPADJSFGGNYKRPYBNTYPTGVPACBEINILNACWFVKMJPGCEZFROEYYKTGYSQYMFSGVDOJJONNYEYSCCIXWLKUSJZDRVAQSNUWHMDJVDNNMPGOYRGQRSBGSPQKGCTFZQWSOXBWSQZDCRQJQAWZDPQEILGMMABIMCDPNSKAFCLPQGIRJCMGQREBEUHBYREXFABFMVZTZBDUMASVNUMHIYRSZLGNZFMVAIABLCUZLJLKKZPWEXDHYZFVSNRLCLNDRKLKSWRHQVQJRTHCNFZXDEXSLAXXOGMFVSGCJGAWOLGDMTLWSFNTCUVCCEACINRZAZZOGLEHHXLPHVKILBBJDPOOCILQKKGODSXOBDPZZDXHJLLBOBVFCHJVMUBUZZIKGCWGCYGXVEHHIJGPEQERWEZLILQNHPHALFKFMGADNELGBKILKIUETGDCBQUEOECWVFNOXTJKUYPWBNEKYSIKMVSAMBZGLIKDAOELRSTKFASEKABTUCPSFEGXXQGDFPSPVOLBHGLZSLLWCABSRKZDQQRKVCKXDGTIHPDNMPDZEXYFYKXZTPJPLYOFNLWAGKJEOHOYLMZELXIDWWNXPKEPUCKNNNHJLFYHPQNHMMCGMUPHSUSYYIVWTIMFKKKTFPGFTLTWWSQBRBMGBTZXPVULKNZIIKVTYLJFISGPTLZFTCLGNZOMVKZOIMUDGXRDDSVFRHRYWBEWHYLCUISYMRWAZZAQPJYXZQQKZLILOSHXUTQJFPTXQSREKSUDZTLGUDLUGOJMQHJRJHXCHQTKJULTWWQOXIRFRQEYBPJPEKXFIRMNATWNFBADOSIJVZYRYDBHDAEDJUVDHLDAU", recipeConfig: [ - { "op": "SIGABA", + { + "op": "SIGABA", "args": [ - "YCHLQSUGBDIXNZKERPVJTAWFOM", true, "A", - "INPXBWETGUYSAOCHVLDMQKZJFR", false, "B", - "WNDRIOZPTAXHFJYQBMSVEKUCGL", false, "C", - "TZGHOBKRVUXLQDMPNFWCJYEIAS", false, "D", - "YWTAHRQJVLCEXUNGBIPZMSDFOK", true, "E", - "QSLRBTEKOGAICFWYVMHJNXZUDP", false, "F", - "CHJDQIGNBSAKVTUOXFWLEPRMZY", false, "G", - "CDFAJXTIMNBEQHSUGRYLWZKVPO", true, "H", - "XHFESZDNRBCGKQIJLTVMUOYAPW", false, "I", - "EZJQXMOGYTCSFRIUPVNADLHWBK", false, "J", - "7591482630", "0", - "3810592764", "1", - "4086153297", "2", - "3980526174", "3", - "6497135280", "4", - "Encrypt"] + "YCHLQSUGBDIXNZKERPVJTAWFOM", + true, + "A", + "INPXBWETGUYSAOCHVLDMQKZJFR", + false, + "B", + "WNDRIOZPTAXHFJYQBMSVEKUCGL", + false, + "C", + "TZGHOBKRVUXLQDMPNFWCJYEIAS", + false, + "D", + "YWTAHRQJVLCEXUNGBIPZMSDFOK", + true, + "E", + "QSLRBTEKOGAICFWYVMHJNXZUDP", + false, + "F", + "CHJDQIGNBSAKVTUOXFWLEPRMZY", + false, + "G", + "CDFAJXTIMNBEQHSUGRYLWZKVPO", + true, + "H", + "XHFESZDNRBCGKQIJLTVMUOYAPW", + false, + "I", + "EZJQXMOGYTCSFRIUPVNADLHWBK", + false, + "J", + "7591482630", + "0", + "3810592764", + "1", + "4086153297", + "2", + "3980526174", + "3", + "6497135280", + "4", + "Encrypt" + ] } ] }, { name: "SIGABA: decrypt test", input: "AKDHFWAYSLHJDKXEVMJJHGKFTQBZPJPJILOVHMBYOAGBZVLLTQUOIKXFPUFNILBDPCAELMAPSXTLMUEGSDTNUDWGZDADBFELWWHKVPRZNDATDPYEHIDMTGAGPDEZYXFSASVKSBMXVOJQXRMHDBWUNZDTIIIVKHJYPIEUHAJCNBXNLGVFADEWIKXDJZBUTGOQBCQZWYKRVEENWRWWRYDNOAPGMODTPTUJZCLUCRDILJABNTBTWUEIJSJRQBUVCOUJJDWFMNNUHXBDFYXLGUMXQEAWSVHBXQGEOOGPYRVOAJLAIYIOHHEXACDTAWWCBGQRNPERSIKHTXPXKBUNACZLFZTRBMBBDDGKNBIQMFHZROCZZBGNZSJKDRRWPEQHLCFADNPWPWSLPIFNKBWQPMARUERGWUUODXSCOJQECGHIZRFRNRSXWSFWKISHHTUFRVXLHCQWGBMRDHCYDSVNIDDRSTODCGJSSBLUYOBGEWFOVKOZBJTYCAKMZECUGLJGTSZJNBOLTMUZRRSIGGRQHLRPMGLINASSMZOBNACKUMSFNIZAUFCPFXXOOTJQWWLZOFLGZLHJCWZJCRJKVOUDLNMKQATGVTOFHACAEKFLRWRTTMVRXHYGOTYPNBMUSKDAKXFCICUOVSWXGPQOYUUWTWRPQMEQCSDJMMJKELIHGEDYKWOVHVPUAIBFGAODXODXVFIIZIGWRZSBTIGXVHFABMMOPGVMLGHQQXNOEJRDLOBGUOWSELBHERZFSBLUODMOGIBNVGVGQYDBTKLOPNKZZNGLTTGZYYXIBAHZJDCILZXKNSJDHXWTYQLFHTUINTYSBPIXOPLOQHSAHGQPYUWYNPKMRBBBYIICCBBJRKWVLBIDBBEKJCXHLPUBMIGBUFYDPOCSRUNZOKMKJHMYFJZWFNHQZOGGRTNNUVLMRLDSAJIECTYCJKBYVNAXGCMGNVFJEDSATZQDQTYRBPLZKHAXMOVJZEDKINXKBUVWXXHTYUFO", - expectedOutput: "KTSOYDGMLPMVXEAJIATXCNQFXHBNCBXIJOCQGCQBRQSBYFOOEVPVXACBMIUIRNVMJHREKRHBSXJFSMWCKTTCYXJOFSJCQECXXCHTEGPEYSMYDHCSMODUAVBNLILYUIBBIXJCXXNQPCERRSMJTPQLMOXSKTRPWOFUSWXOYRJLBIJGIOYTEAEJEGGYAGSXNHNQTETANPWEGATHSBFLHCVHVIJUAKDVGQCWUSIFFFVAJYPJAFUYDXSLGPGESOUAYXBQIIOXWTXNOXLNCGWSUKVIBMOUGNHORYLSNVNNJLKKFDUAEISOLBLCXYHMDGVBVVVIKDLTMTDVWWJBXWXROVTJBXXKXLEWTTISKIUMYSACVUGGNANMCGUMFNQUXDLTHJNYTFIQEPKQQQSSROYJOILJYQXICXACWGOHCSHENXJILOMIIFCIOUDXDCINIVKIRJCVHWXSFQXMNRBJJWTPXNJADEOPEJBLKHKXNTORIRVRLXUXXAMKMODBXNLQCVJXVOTBRHXBBVJHPFEQFCRXYRRXHXPTXXSUESUTHUGOWQYQPQFPXQPVGEIRPQNKXXMBHIPECRUWFEWJUTYIKSMJSRQIQAIAMXTGDXSJIABHIGKUPJBCHWMVYTMQNQYGDHCNMBSVTPXNFRELFXXQYIOLCDEXDXDVSINICOXRMNSPICPQMOBIDJCNBJKXFAVMUXOXHERJIBIXLMXXULDXKXXHAQDXEXIWXOEEUGKSUGCMRWJDPYCYKXTPCOXMURAJCPRXKFJAJALERWRHVMFHOGMFHXGSXQDPJCJNXRQFGHKRCYTEBJDHPCMYFEAPWSVVMMBVUJJMCAAYURHUPVQVJYDCSNMQEMNIFEXYXIIXBVRVILXAUCBDXRJHGPKPYXHPPPNVSBBCDRLVVIYPKAKYIXTJVYDGVPHXULWMADBEICNIFKWUOOHEFNANDKOXMCVBVORLQYNXLULOEGVGWNKNMOHYVRSYSOVYGAKCGAWKGAIAQNQR", + expectedOutput: + "KTSOYDGMLPMVXEAJIATXCNQFXHBNCBXIJOCQGCQBRQSBYFOOEVPVXACBMIUIRNVMJHREKRHBSXJFSMWCKTTCYXJOFSJCQECXXCHTEGPEYSMYDHCSMODUAVBNLILYUIBBIXJCXXNQPCERRSMJTPQLMOXSKTRPWOFUSWXOYRJLBIJGIOYTEAEJEGGYAGSXNHNQTETANPWEGATHSBFLHCVHVIJUAKDVGQCWUSIFFFVAJYPJAFUYDXSLGPGESOUAYXBQIIOXWTXNOXLNCGWSUKVIBMOUGNHORYLSNVNNJLKKFDUAEISOLBLCXYHMDGVBVVVIKDLTMTDVWWJBXWXROVTJBXXKXLEWTTISKIUMYSACVUGGNANMCGUMFNQUXDLTHJNYTFIQEPKQQQSSROYJOILJYQXICXACWGOHCSHENXJILOMIIFCIOUDXDCINIVKIRJCVHWXSFQXMNRBJJWTPXNJADEOPEJBLKHKXNTORIRVRLXUXXAMKMODBXNLQCVJXVOTBRHXBBVJHPFEQFCRXYRRXHXPTXXSUESUTHUGOWQYQPQFPXQPVGEIRPQNKXXMBHIPECRUWFEWJUTYIKSMJSRQIQAIAMXTGDXSJIABHIGKUPJBCHWMVYTMQNQYGDHCNMBSVTPXNFRELFXXQYIOLCDEXDXDVSINICOXRMNSPICPQMOBIDJCNBJKXFAVMUXOXHERJIBIXLMXXULDXKXXHAQDXEXIWXOEEUGKSUGCMRWJDPYCYKXTPCOXMURAJCPRXKFJAJALERWRHVMFHOGMFHXGSXQDPJCJNXRQFGHKRCYTEBJDHPCMYFEAPWSVVMMBVUJJMCAAYURHUPVQVJYDCSNMQEMNIFEXYXIIXBVRVILXAUCBDXRJHGPKPYXHPPPNVSBBCDRLVVIYPKAKYIXTJVYDGVPHXULWMADBEICNIFKWUOOHEFNANDKOXMCVBVORLQYNXLULOEGVGWNKNMOHYVRSYSOVYGAKCGAWKGAIAQNQR", recipeConfig: [ - { "op": "SIGABA", + { + "op": "SIGABA", "args": [ - "YCHLQSUGBDIXNZKERPVJTAWFOM", true, "A", - "INPXBWETGUYSAOCHVLDMQKZJFR", false, "B", - "WNDRIOZPTAXHFJYQBMSVEKUCGL", false, "C", - "TZGHOBKRVUXLQDMPNFWCJYEIAS", false, "D", - "YWTAHRQJVLCEXUNGBIPZMSDFOK", true, "E", - "QSLRBTEKOGAICFWYVMHJNXZUDP", false, "F", - "CHJDQIGNBSAKVTUOXFWLEPRMZY", false, "G", - "CDFAJXTIMNBEQHSUGRYLWZKVPO", true, "H", - "XHFESZDNRBCGKQIJLTVMUOYAPW", false, "I", - "EZJQXMOGYTCSFRIUPVNADLHWBK", false, "J", - "7591482630", "0", - "3810592764", "1", - "4086153297", "2", - "3980526174", "3", - "6497135280", "4", - "Decrypt"] + "YCHLQSUGBDIXNZKERPVJTAWFOM", + true, + "A", + "INPXBWETGUYSAOCHVLDMQKZJFR", + false, + "B", + "WNDRIOZPTAXHFJYQBMSVEKUCGL", + false, + "C", + "TZGHOBKRVUXLQDMPNFWCJYEIAS", + false, + "D", + "YWTAHRQJVLCEXUNGBIPZMSDFOK", + true, + "E", + "QSLRBTEKOGAICFWYVMHJNXZUDP", + false, + "F", + "CHJDQIGNBSAKVTUOXFWLEPRMZY", + false, + "G", + "CDFAJXTIMNBEQHSUGRYLWZKVPO", + true, + "H", + "XHFESZDNRBCGKQIJLTVMUOYAPW", + false, + "I", + "EZJQXMOGYTCSFRIUPVNADLHWBK", + false, + "J", + "7591482630", + "0", + "3810592764", + "1", + "4086153297", + "2", + "3980526174", + "3", + "6497135280", + "4", + "Decrypt" + ] } ] } diff --git a/tests/operations/tests/SM4.mjs b/tests/operations/tests/SM4.mjs index 3d7bc453..68d8c63e 100644 --- a/tests/operations/tests/SM4.mjs +++ b/tests/operations/tests/SM4.mjs @@ -11,8 +11,10 @@ import TestRegister from "../../lib/TestRegister.mjs"; /* Cleartexts */ -const TWO_BLOCK_PLAIN = "aa aa aa aa bb bb bb bb cc cc cc cc dd dd dd dd ee ee ee ee ff ff ff ff aa aa aa aa bb bb bb bb"; -const FOUR_BLOCK_PLAIN = "aa aa aa aa aa aa aa aa bb bb bb bb bb bb bb bb cc cc cc cc cc cc cc cc dd dd dd dd dd dd dd dd ee ee ee ee ee ee ee ee ff ff ff ff ff ff ff ff aa aa aa aa aa aa aa aa bb bb bb bb bb bb bb bb"; +const TWO_BLOCK_PLAIN + = "aa aa aa aa bb bb bb bb cc cc cc cc dd dd dd dd ee ee ee ee ff ff ff ff aa aa aa aa bb bb bb bb"; +const FOUR_BLOCK_PLAIN + = "aa aa aa aa aa aa aa aa bb bb bb bb bb bb bb bb cc cc cc cc cc cc cc cc dd dd dd dd dd dd dd dd ee ee ee ee ee ee ee ee ff ff ff ff ff ff ff ff aa aa aa aa aa aa aa aa bb bb bb bb bb bb bb bb"; /* Keys */ const KEY_1 = "01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10"; const KEY_2 = "fe dc ba 98 76 54 32 10 01 23 45 67 89 ab cd ef"; @@ -22,16 +24,20 @@ const IV = "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f"; const ECB_1 = "5e c8 14 3d e5 09 cf f7 b5 17 9f 8f 47 4b 86 19 2f 1d 30 5a 7f b1 7d f9 85 f8 1c 84 82 19 23 04"; const ECB_2 = "c5 87 68 97 e4 a5 9b bb a7 2a 10 c8 38 72 24 5b 12 dd 90 bc 2d 20 06 92 b5 29 a4 15 5a c9 e6 00"; /* With PKCS#7 padding */ -const ECB_1P ="5e c8 14 3d e5 09 cf f7 b5 17 9f 8f 47 4b 86 19 2f 1d 30 5a 7f b1 7d f9 85 f8 1c 84 82 19 23 04 00 2a 8a 4e fa 86 3c ca d0 24 ac 03 00 bb 40 d2"; -const ECB_2P= "c5 87 68 97 e4 a5 9b bb a7 2a 10 c8 38 72 24 5b 12 dd 90 bc 2d 20 06 92 b5 29 a4 15 5a c9 e6 00 a2 51 49 20 93 f8 f6 42 89 b7 8d 6e 8a 28 b1 c6"; +const ECB_1P + = "5e c8 14 3d e5 09 cf f7 b5 17 9f 8f 47 4b 86 19 2f 1d 30 5a 7f b1 7d f9 85 f8 1c 84 82 19 23 04 00 2a 8a 4e fa 86 3c ca d0 24 ac 03 00 bb 40 d2"; +const ECB_2P + = "c5 87 68 97 e4 a5 9b bb a7 2a 10 c8 38 72 24 5b 12 dd 90 bc 2d 20 06 92 b5 29 a4 15 5a c9 e6 00 a2 51 49 20 93 f8 f6 42 89 b7 8d 6e 8a 28 b1 c6"; const CBC_1 = "78 eb b1 1c c4 0b 0a 48 31 2a ae b2 04 02 44 cb 4c b7 01 69 51 90 92 26 97 9b 0d 15 dc 6a 8f 6d"; const CBC_2 = "0d 3a 6d dc 2d 21 c6 98 85 72 15 58 7b 7b b5 9a 91 f2 c1 47 91 1a 41 44 66 5e 1f a1 d4 0b ae 38"; const OFB_1 = "ac 32 36 cb 86 1d d3 16 e6 41 3b 4e 3c 75 24 b7 1d 01 ac a2 48 7c a5 82 cb f5 46 3e 66 98 53 9b"; const OFB_2 = "5d cc cd 25 a8 4b a1 65 60 d7 f2 65 88 70 68 49 33 fa 16 bd 5c d9 c8 56 ca ca a1 e1 01 89 7a 97"; const CFB_1 = "ac 32 36 cb 86 1d d3 16 e6 41 3b 4e 3c 75 24 b7 69 d4 c5 4e d4 33 b9 a0 34 60 09 be b3 7b 2b 3f"; const CFB_2 = "5d cc cd 25 a8 4b a1 65 60 d7 f2 65 88 70 68 49 0d 9b 86 ff 20 c3 bf e1 15 ff a0 2c a6 19 2c c5"; -const CTR_1 = "ac 32 36 cb 97 0c c2 07 91 36 4c 39 5a 13 42 d1 a3 cb c1 87 8c 6f 30 cd 07 4c ce 38 5c dd 70 c7 f2 34 bc 0e 24 c1 19 80 fd 12 86 31 0c e3 7b 92 6e 02 fc d0 fa a0 ba f3 8b 29 33 85 1d 82 45 14"; -const CTR_2 = "5d cc cd 25 b9 5a b0 74 17 a0 85 12 ee 16 0e 2f 8f 66 15 21 cb ba b4 4c c8 71 38 44 5b c2 9e 5c 0a e0 29 72 05 d6 27 04 17 3b 21 23 9b 88 7f 6c 8c b5 b8 00 91 7a 24 88 28 4b de 9e 16 ea 29 06"; +const CTR_1 + = "ac 32 36 cb 97 0c c2 07 91 36 4c 39 5a 13 42 d1 a3 cb c1 87 8c 6f 30 cd 07 4c ce 38 5c dd 70 c7 f2 34 bc 0e 24 c1 19 80 fd 12 86 31 0c e3 7b 92 6e 02 fc d0 fa a0 ba f3 8b 29 33 85 1d 82 45 14"; +const CTR_2 + = "5d cc cd 25 b9 5a b0 74 17 a0 85 12 ee 16 0e 2f 8f 66 15 21 cb ba b4 4c c8 71 38 44 5b c2 9e 5c 0a e0 29 72 05 d6 27 04 17 3b 21 23 9b 88 7f 6c 8c b5 b8 00 91 7a 24 88 28 4b de 9e 16 ea 29 06"; TestRegister.addTests([ { @@ -41,7 +47,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: "", option: "Hex"}, "ECB/NoPadding", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: "", option: "Hex" }, "ECB/NoPadding", "Hex", "Hex"] } ] }, @@ -52,7 +58,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: "", option: "Hex"}, "ECB/NoPadding", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: "", option: "Hex" }, "ECB/NoPadding", "Hex", "Hex"] } ] }, @@ -63,7 +69,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: "", option: "Hex"}, "ECB", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: "", option: "Hex" }, "ECB", "Hex", "Hex"] } ] }, @@ -74,7 +80,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: "", option: "Hex"}, "ECB", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: "", option: "Hex" }, "ECB", "Hex", "Hex"] } ] }, @@ -85,7 +91,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: IV, option: "Hex"}, "CBC/NoPadding", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: IV, option: "Hex" }, "CBC/NoPadding", "Hex", "Hex"] } ] }, @@ -96,7 +102,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: IV, option: "Hex"}, "CBC/NoPadding", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: IV, option: "Hex" }, "CBC/NoPadding", "Hex", "Hex"] } ] }, @@ -107,7 +113,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: IV, option: "Hex"}, "OFB", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: IV, option: "Hex" }, "OFB", "Hex", "Hex"] } ] }, @@ -118,7 +124,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: IV, option: "Hex"}, "OFB", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: IV, option: "Hex" }, "OFB", "Hex", "Hex"] } ] }, @@ -129,7 +135,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: IV, option: "Hex"}, "CFB", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: IV, option: "Hex" }, "CFB", "Hex", "Hex"] } ] }, @@ -140,7 +146,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: IV, option: "Hex"}, "CFB", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: IV, option: "Hex" }, "CFB", "Hex", "Hex"] } ] }, @@ -151,7 +157,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: IV, option: "Hex"}, "CTR", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: IV, option: "Hex" }, "CTR", "Hex", "Hex"] } ] }, @@ -162,7 +168,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Encrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: IV, option: "Hex"}, "CTR", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: IV, option: "Hex" }, "CTR", "Hex", "Hex"] } ] }, @@ -173,7 +179,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Decrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: "", option: "Hex"}, "ECB/NoPadding", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: "", option: "Hex" }, "ECB/NoPadding", "Hex", "Hex"] } ] }, @@ -184,7 +190,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Decrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: "", option: "Hex"}, "ECB/NoPadding", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: "", option: "Hex" }, "ECB/NoPadding", "Hex", "Hex"] } ] }, @@ -195,7 +201,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Decrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: IV, option: "Hex"}, "CBC/NoPadding", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: IV, option: "Hex" }, "CBC/NoPadding", "Hex", "Hex"] } ] }, @@ -206,7 +212,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Decrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: IV, option: "Hex"}, "CBC/NoPadding", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: IV, option: "Hex" }, "CBC/NoPadding", "Hex", "Hex"] } ] }, @@ -217,7 +223,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Decrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: IV, option: "Hex"}, "OFB", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: IV, option: "Hex" }, "OFB", "Hex", "Hex"] } ] }, @@ -228,7 +234,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Decrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: IV, option: "Hex"}, "OFB", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: IV, option: "Hex" }, "OFB", "Hex", "Hex"] } ] }, @@ -239,7 +245,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Decrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: IV, option: "Hex"}, "CFB", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: IV, option: "Hex" }, "CFB", "Hex", "Hex"] } ] }, @@ -250,7 +256,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Decrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: IV, option: "Hex"}, "CFB", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: IV, option: "Hex" }, "CFB", "Hex", "Hex"] } ] }, @@ -261,7 +267,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Decrypt", - "args": [{string: KEY_1, option: "Hex"}, {string: IV, option: "Hex"}, "CTR", "Hex", "Hex"] + "args": [{ string: KEY_1, option: "Hex" }, { string: IV, option: "Hex" }, "CTR", "Hex", "Hex"] } ] }, @@ -272,8 +278,8 @@ TestRegister.addTests([ recipeConfig: [ { "op": "SM4 Decrypt", - "args": [{string: KEY_2, option: "Hex"}, {string: IV, option: "Hex"}, "CTR", "Hex", "Hex"] + "args": [{ string: KEY_2, option: "Hex" }, { string: IV, option: "Hex" }, "CTR", "Hex", "Hex"] } ] - }, + } ]); diff --git a/tests/operations/tests/SeqUtils.mjs b/tests/operations/tests/SeqUtils.mjs index 3076cf96..1bb44190 100644 --- a/tests/operations/tests/SeqUtils.mjs +++ b/tests/operations/tests/SeqUtils.mjs @@ -17,18 +17,19 @@ TestRegister.addTests([ "op": "Sort", "args": ["Line feed", false, "Numeric"] } - ], + ] }, { name: "SeqUtils - Numeric sort CVE IDs", input: "CVE-2017-1234,CVE-2017-9999,CVE-2017-10000,CVE-2017-10001,CVE-2017-12345,CVE-2016-1234,CVE-2016-4321,CVE-2016-10000,CVE-2016-9999,CVE-2016-10001", - expectedOutput: "CVE-2017-12345,CVE-2017-10001,CVE-2017-10000,CVE-2017-9999,CVE-2017-1234,CVE-2016-10001,CVE-2016-10000,CVE-2016-9999,CVE-2016-4321,CVE-2016-1234", + expectedOutput: + "CVE-2017-12345,CVE-2017-10001,CVE-2017-10000,CVE-2017-9999,CVE-2017-1234,CVE-2016-10001,CVE-2016-10000,CVE-2016-9999,CVE-2016-4321,CVE-2016-1234", recipeConfig: [ { "op": "Sort", "args": ["Comma", true, "Numeric"] } - ], + ] }, { name: "SeqUtils - Hexadecimal sort", @@ -39,6 +40,6 @@ TestRegister.addTests([ "op": "Sort", "args": ["Comma", false, "Numeric (hexadecimal)"] } - ], - }, + ] + } ]); diff --git a/tests/operations/tests/SetDifference.mjs b/tests/operations/tests/SetDifference.mjs index 40fac524..f79ec98d 100644 --- a/tests/operations/tests/SetDifference.mjs +++ b/tests/operations/tests/SetDifference.mjs @@ -16,20 +16,21 @@ TestRegister.addTests([ recipeConfig: [ { op: "Set Difference", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Set Difference: wrong sample count", input: "1 2 3 4 5_3_4 5 6 7", - expectedOutput: "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", + expectedOutput: + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", recipeConfig: [ { op: "Set Difference", - args: [" ", "_"], - }, - ], + args: [" ", "_"] + } + ] }, { name: "Set Difference: item delimiter", @@ -38,9 +39,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Set Difference", - args: ["\n\n", ";"], - }, - ], + args: ["\n\n", ";"] + } + ] }, { name: "Set Difference: sample delimiter", @@ -49,8 +50,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "Set Difference", - args: ["===", ";"], - }, - ], - }, + args: ["===", ";"] + } + ] + } ]); diff --git a/tests/operations/tests/SetIntersection.mjs b/tests/operations/tests/SetIntersection.mjs index c9146c01..94d607ee 100644 --- a/tests/operations/tests/SetIntersection.mjs +++ b/tests/operations/tests/SetIntersection.mjs @@ -16,20 +16,21 @@ TestRegister.addTests([ recipeConfig: [ { op: "Set Intersection", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Set Intersection: only one set", input: "1 2 3 4 5 6 7 8", - expectedOutput: "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", + expectedOutput: + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", recipeConfig: [ { op: "Set Intersection", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Set Intersection: item delimiter", @@ -38,9 +39,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Set Intersection", - args: ["\n\n", "-"], - }, - ], + args: ["\n\n", "-"] + } + ] }, { name: "Set Intersection: sample delimiter", @@ -49,8 +50,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "Set Intersection", - args: ["z", "-"], - }, - ], + args: ["z", "-"] + } + ] } ]); diff --git a/tests/operations/tests/SetUnion.mjs b/tests/operations/tests/SetUnion.mjs index f6517118..b81d03c5 100644 --- a/tests/operations/tests/SetUnion.mjs +++ b/tests/operations/tests/SetUnion.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Set Union", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Set Union", @@ -27,20 +27,21 @@ TestRegister.addTests([ recipeConfig: [ { op: "Set Union", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Set Union: invalid sample number", input: "1 2 3 4 5\n\n3 4 5 6 7\n\n1", - expectedOutput: "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", + expectedOutput: + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", recipeConfig: [ { op: "Set Union", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Set Union: item delimiter", @@ -49,9 +50,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Set Union", - args: ["\n\n", ","], - }, - ], + args: ["\n\n", ","] + } + ] }, { name: "Set Union: sample delimiter", @@ -60,8 +61,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "Set Union", - args: ["whatever", " "], - }, - ], - }, + args: ["whatever", " "] + } + ] + } ]); diff --git a/tests/operations/tests/SplitColourChannels.mjs b/tests/operations/tests/SplitColourChannels.mjs index 4452d970..0bb8a27b 100644 --- a/tests/operations/tests/SplitColourChannels.mjs +++ b/tests/operations/tests/SplitColourChannels.mjs @@ -8,8 +8,10 @@ */ import TestRegister from "../../lib/TestRegister.mjs"; // Base 85 encoded -const testCard = "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"; -const testCardSplit = "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"; +const testCard + = "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"; +const testCardSplit + = "iVBORw0KGgoAAAANSUhEUgAAAUAAAAC0CAYAAADl5PURAAAhfklEQVR4AezBP49maZon5Ot+zhsRVdXTO03zRyxidxnhIKQRHgjhgMMXwMblS+EigYGBhYMQKwwsLLDQaqRFsAxCC730dE1lRrzn+dHSvejM2YjMyqzMrIiseK6r/lvyZxiIx+LLmtpFu2qbFgQDQeEev0Lh3vvd+7Ki3WubdtHutL/AX+A/8XX5Fj/gou1elkIQZ/+R9p9qb7Wrs+F57SgUgt/gH+K3KIddG9qubZ5HtF8j+C2mr8/lz/Bn3i2+rKlt2q5t3u0NvtHuvV/5sqLda5t2cfY9/oBfofANJsrzilbOot3hHr9BsCMO5WV40K7an2q/1m61q7PheU2Uw5/gV/iVs10b2q5tnke0X2HHN7jiAcGG8m7lZbgEQTkE5eUKguDi08Sn2bRNK2dB8IC3+B6Fe0xcvQylxdm32PE7BNPLUlqcTe2iXXw9fos/9XUIJiYm4hCH6Wxo0/O6BPG0eH7RyqFQiJdvICgUCoVCeTlKi7Nd271M8bSpTWellRbPqzwWX5eJielQWrxsF/+MQrwsQSEoh0J5GTZPmwh2TATBWy/TcDa0W+2qlRbPa3ra0Ib3K88rWjkEQTlMbWjx/IKBDYWBiUIQ7za1eF4X/4wgXo7yZcWnKR+mUL5uQRCUVl6moBBn5eUJymFiojC0OIufR1Aei0OcBRPx8l2CoBCU16V8mmhX7cZZoVAoL1c8rbSplVaI53dBYWrRhrNdm9rwMgwEQWnxWHke5WnlMFAorbRCvGyXQmmF0grx/KZWHgvKy1aIxwrxcpSnxWOFQiGeX/yyFArD1yEIogXl63CJs2jxMpTHSivE85patGjlUNgwtMLARLwM09N2bUe8PNO7BaVt2qaVl2vDcDacDS/H0MpZvHzDsizLJ4iv18VXLj5N+TSbs/JYsGPXgl0bntfUytM2PGBDsDsbntf0bnEoL9OuDZS2Y6JQ2tSGNr0MA+XrNSzLsrxSF1+58jKUpwXxbtPLEE/btR3x2PSyDJRWDruXafPYhuFsOBteluHrNCzLL1Qsy/tdvHLl00TbnZWzQmmFDRPTy1CeNrSBYDobntd0NlEI4jCclRbPK1o5TI9NbWhTG5ZPMSzLsrxSl0K0QiGeXzxWPr/4PC6eVihn8XLF+xXiML088ePi6zYsn8OwLMvyCcrXa1iWZXmlhmVZlldqWJZleaWGZVmWV2pYlmV5pYZlWZZXaliWjxDL8ssxLMuyvFLDsizLKzUsy7K8UsOyLMsrNSzLsrxSw7Isyys1LMuyvFLDsnyEsiy/HMOyLMsrNSzLsrxSw7Isyys1LMuyvFLDsizLKzUsy7K8UsOyLMsrNSzLR4hl+eUYlmVZXqlhWZbllRqWZVleqWFZluWVGpZlWV6pYVmW5ZUalmVZXqlhWT5CWZZfjmFZluWVGpZlWV6pYVmW5ZUalmVZXqlhWZbllRqWZVleqWFZluWVGpblI8Sy/HIMy7Isr9SwLMvySg3Lsiyv1LAsy/JKDcuyLK/UsCzL8koNy7Isr9SwLB+hLMsvx7Asy/JKDcuyLK/UsCzL8koNy7Isr9SwLMvySg3Lsiyv1LAsy/JKDcvyEWJZfjmGZVmWV2pYlmV5pYZlWZZXaliWZXmlhmVZlldqWJZleaWGZVmWV2pYlo9QluWXY1iWZXmlhmVZlldqWJZleaWGZVmWV2pYlmV5pYZlWZZXaliWZXmlhmX5CLEsvxzDsizLKzUsy7K8UsOyLMsrNSzLsrxSw7Isyys1LMuyvFLDsizLKzUsyweKZfllGZZlWV6pYVmW5ZUalmVZXqlhWZbllRqWZVleqWFZluWVGpZlWV6pYVk+UFmWX5ZhWZbllRqWZVleqWFZluWVGpZlWV6pYVmW5ZUalmVZXqlhWZbllboMDK208vPZtF2LtjsrDI/F8yqtnE3tAYWJqRUKG6bnVVppcbZ5v+F5TY8VJiZ2bddutfg8pk+zaUFpw2FqQ5va8HIUrtgxtOnrMPxRfF3K16O0QqF8XaLF1yOI5ecShyC+Hpd73KNQKMTP50bbtHvt1tk9gs3Z8LzutRtn99odCre4RbTdyxAtzsrZdHaD4Op5DRSi3Wkbgl2LdtUuPo/Np9m1zWFiavfaN9qDdutlKBRuseONs3J2q1216XldLF9cfL3Kyxe/XOWstPLylK/P5QY3CAqFeLfh83rQbrV42kRQmFphel63nrZppW0YDtPLsGnT2abF08rLMJ39oN0huPW0B23zaYZPc9U2Z7tWvg7BxEW7atFKe+tlucSy/PLE+0WLTxNfVpzFyxQE8XW5DAyU53Gj7dqds7faN1owMBGU5/VGu9NKu2gThd/jr7w8u6ft2qZ9h+AH7d7LdIeJ77Vo5WxqNz5N+TR3WlDaLW603dmts93zu/fYtyj8tRYv08U/FZTlc5soRCsUplbeL55H+ToU4t3K00orL9twVs6G5xWUs0KhvHz1d8gdpsNEtDgbPq8H7U773tl3CP4KhQ2/wl94GaKVNrXh7H/Hv4p/gIk7TNx7XndaaW+1aH8X/yX+XdziFsFFe+N5lbO/1v5z/Hv4j7W/pU3tjbb5NNOnucem7fgP8Z/hzzGwa5u2a9HK8/or3OG/wRUXDPweE3+i3WvfaVctntflH+EO02EinjZ8Xg/anfbG2S2CB4dfIwjuvV98Wbs2tF3btB0Df63dYOA7BD94v/iy7rTShhZtQ2HHAwrlsHtehaC0HcGOHRftok3tom0+zfTpCgMTQ/vHzjZt1+JluMcdfoMb3Gm/RuFPtHvtG21q8bwuE28Qz+OiPWibtmv32h2Ce2wICt94XtHKuwW32r/mMDE8r6kNZ1Mb+Hv4N5ztCIbnNTztBjf4P7R/pJUWbfg08WkumNi1v9R+h8IPXrYLvsEFNxgI/hYKU5ueVp7XxVektIkdA5vnVX6aIJ5fnEWLQ3msUF628vINxNM2j5UWL8PAwMTUymFow9nwMlz80UC06ed11UqLp+0OwY0PE19WadGilTYxcdUmJoYWrTyPzVlpm8NEULhiOAzP61671Xbtgg2lRbvR7rXpeb11Vg5XP27zvO7xBvcYuNV2BOXswdnmeV38URDPK95vIlp8uPLzKGelFQZKC4Jo8X7xZQ1Pm9rQSiuHeBnilyPaQPy4eF6FG9zi4mxgatHiLJ7XxR9t2B3ix5UWn8dFu2rD2XQoh90hHitf1tB2rbRdu9W+0aa2aVOLVs7Kl3XVLs6Gsys2TBQu2vS8bj3tih3RSnvweZVPE60QlPYG5bE4m55XYWLDhmibNrSp3XpZLv4oWny4+LziLFpQKC2IQzmUFi9PeVohDvHzig8zUZjYLF/CwNDi61AoFAbK1+XijzZMBOVluEUhmHjQBm61oLxfeVpp8WlKu2rfaJuzt9rAhiB+mvLh4v2Gp01tYEdwxZ2zoDytUH5em1YoXBDsWhyGQ7Q4G54WLSgUSotDUJgeG4i24YobLYjD0Ka2OQTR4v0KcRja9LRyKC2IFgxc8Y22Y3N262lBYdfibHO2aw8IvtV2rVAorbzfxR9NTD+PchZtIB4LylmwY0M8NhziLFo8rfx0QZyVdqeVVlo8Vp4WLQ5xVj6PcrgguOLO2XAWhyAoj5UWrXy6iaEVBiYKhcLuMFFa/DTDIQ7x46bDFd+iPK2cxWOFeL94v/K00uKscMUFEwMbJoYfFy0olFZaadGiRSuttCAYWnm/iz+6ojCw+zClxceJpz1opb11tmHHd/gWOzaU9ytn5cu41Up70Da8xffajl3bMHy48vm90TbvdoM7XBzuceuxclber3weE4Ud93jAjl271XZnpcXTpveLHxdPKwzs2g8OG3YMrbRyNh3iUNpwFi1anMVZeb+gcMU3eIMbFKazoLSJ4Ea7aNHKWWk32o2zTYsW7eoszi7+KBgoHy6+jNLibNeCiQ0Tw/vF+xXi3cpZnJU2tdKmVhgY2g2uKEwMz6sQj0UrFAoXh+Aetz5OtPL5FR5QuMONs3gsnk8wsGPDxNB2rbTSSitPK620OIsWbTiLD1PaDSYumLh1mChPK5THyoeJVs4KQbThLM4u3mFgeqwQlA8T73eHYGq793uDDRvix5UfV94tHiuPRSvtVrviDjcOF4f4eHEY3m86lMc2xCFaHHZcUdi0O8THK5/XjoGBHYWBb3DjcO/sO0y89fMoBEMLBh60XXvrsDlcEY+VFi3OLtrU4ixaPG0gKGfRgu+wYWjRLoizIM6CqRUKQbRCedrVoVDO4mw4u/ijwsTUCvG0aNHKIT7e1OJQiDYwHXZEK8ShPBaH8liclbPyftGmFpTDBcHV03aUx0qLVp42nZWzeFpp8bRyGChsDlMrz+uKO0S74AH3uPVuVww/n2hBtOmxW23DjqHF0wpBIZ4WRIuz8rRo0aJFi7bhLUoLytMK5bHC0EorRCvvVs6CaEE5i7PLLX6lBYXSJkqLFq0QDC1aHILhEC0Ope3avXbRfoOJ32PDFb/F/4xv8b1DPLZ5LA6lRYuzDXGIsxvtQbtFEG3HxO/xd/DXKOwo3DjEIVp5WrSLQ7RoQTnEYxPBLYJ7BFftn8Nf4n/Aju/wgCsGvnEWFKIV4jC1aJsWLYjDcIjHNgR/0Ep7i9/hP8DFYccVwbf4d7TpacNZtF170HYU7rUH7S0K99quXVF4iyt2XPGvaL9C4a32gGA6m54W7cH7Te83vd8b/J/4+yjcoVDYcEFwo32jbZi40S7aBYUbFAYKdwjutKFtPs3lv8C/iFtMBNEK0aLF2XQI4hCHYGIiCIKJ4EF7g2BD8FsEf8AVP6Dw5z6/YCIIgqlNBMFEtCC4x8QFExPBRPCA/wn/C4J7BBcEQTARBMGOIJiYCKb2gCCYCCaCYNeCiSAIggcEN5h4g+ABwT+Pv8K/jx13mHir3SCYCCaCiSAIgmAiCIIdQRBMBEEQj8Vhwz0eMPEG3+G/xn+P/877vdWmpw2ttKntKNxioHCLwq224QY32HCHDbcILghu8IP2b+PfxL+FHb9H8AMe8D2ueIOJ/xUTP+CK77HjAcFVmwh2FKb2DQrBQDBQKGwoFAYmyuEBA/8VJv6AHd/iewRvEdxr97jirRYU7jHxgE37BgPf4YJf4xZ/ggt+hRv8KW7wt3CDP8UNfqUNbTi7/Dn+nrMgCCaCOARB4aoFE9GCiUIQTATBRLBp95h4i4lbbUPwBsE/wcT/iImJYGIimAiCYGIimAgmJoKJHUEQ7JjaxEQQTExEu2JHMLFjQ3CDqU18j+AWE28QBEEwMTGxIwgmdkwEQRBMBBMTExPBRDARBBPTobBjYuIBE/8AO/4CO75HsCO4RzAxMRFMbSK4IlowEQQTE0EQBNEmJqIFQfAdCr/HxG9QWhzuEOyYCP5l/H2f5h432HHBjg0PuMHEwBvcYccFE8NhYuABb/H/YMc/xBW/wwP+L9zj/8UD/jdc8Ttc8Y9xxT/BjgctWmEgKOw+j0IwMLFhd9iw4wYPGJgoBIWgENwg+DVu8Ftc8Ldxgw23+Ndxh38BF/xdfIO/jQt+o5XHglEo7xeHIFp8uHi/aPFYtHi/0sq7lUOhUCgUSiuUViiHQjmUHxc/TaFQWqFQKJ9HvF+hMFAoH66cBUEQX0Y8Fo+VLy9aeb+JYCII4mnlEIcgiBY/n2jRopVWfpqBgQ0bBjYMbB4rH+eyYUO0wtSCYCJaEASFQhAUogWFQlAIgqAQvEGwaRcEt4jDBcG/hIm32oZgIpgIJoIgmJgIJiaiTewIgomJiWBiIpgIJiaC0oKrtiN4wEQhCIIrJgamFq1QKGeFQiEolFYICoVCaaWVQ6HwRivs2BDcYWJi4g8IdgQ3CAaCiYmJYCIIJm4QBMFEtImJIAiCIAgmogVBUNoFE1ftiuBWu3d2wY3D1KKVVtpEYcfApt1qF6200kobKESLdsUFF21i4g2uuMPAd7jiOzzgLW7wHa74g7MH7IizYHcYKBQGrhiYGJgYCApXFIKB6awQh4EdQ9twxYaJaHE2MXGP4KoFExsG3mo7ymFgQ3najmD4p8rTCoXSCoVyKIdCOQTxYaIF0eIQxKH8NIVyVg7l3cpZnEUrh2hxFh8niEN8WYUgDuUQPy5aoVAoFMqhtEJ5rFA+TBAtiOcTrZxFK2eFQjkrrbTSosWXFR+mnJVWfpogCIIgCOKsUA7xbtEu97jXgg1TizYxtSCINrWJINrE1IKJaEEwcUFwg4kdA/daIfgewQ2CP0XwfyOYCCaCiSAIJoKJYCIIJiYmgmDHRDAxEUwEExPBxA0mNkSbeMCOHaUFV+zYtDjEobSgUFqhMBFPKwSFOATR/kS7YscDgrcIrgjeILjRgiAIgmhxVohDtEJQiA9XiHZFEO0HBNOhHL5DULj1WHlaOQsKb3CDe9ziijvs2FDaRbvRLtoVhaFF+xYb7nHBBdEKb/GgRQsKhQsKV4dCMBAUpjYRTG1qU5sOhWi32DFwxYYdAxNTe6vdI3jQvsEVA/e4YEehEARX7YqBiTgEwcSOB+1e27SpTW34G8pZOZSnlaeVz6N8PvFh4vMI4seVd4vHosWXU1oQP11ppQVBMJ2VQ3la+XFxKGdBED+P8n5xFsSnKT+fIN4tPk75ePG0aOXdLje4cShMZxPRgoloE8FEHCZKCybiMDExELzFxMDEVbug8GtM/DWCv0TwLYJCUAgKQRAUCkFQmFpphaBQKAQDExMDE4XCWwQTE7sW7HiLiUIwEGzajmBHMBEEEzuCiYlgYmrBxMREMBFMTAQTE8HERHCvTUxMBMHEBUEh2DDxgOCKYGJqE0EQBMHUgiCYCCaCIAiCiSCIFkwEE8EdgsLEQOEHbXP2A37nMLxfOQyHG2y4wYbdWVDYseEBN7jHLb7RJgpv8YAdE29wxRtcsWHHjfZXuOJ7POAeV1yxIw7RdmfRdm1qU5tatGjBgza1XZtaIbjgigvucYMHvHF2xdQmgmDDhjvc4Fvc4Rvc4g63uMENBjZsKAxtc3bxI4IgWhDEh4vPo7xbIZ4WP64QjxWiFYLSyoeJDxOPlVYoBIXS4udRWqFQfppCaYXpp4sWxMeLL698nPhliJ8mzgqFQqFQKJRPd4lWmAiixSEIgmCiEARBtCBatCAIgmhXBEOLdqNdMTER3CDYEEwtCIJoQRBEmwiCaMFEEARBEExMBMGOieAGQRyCqd1g0yZ2TK0wMLFhYEcQhzibGAiGQ2FqEwOF6RAEhUJholAYmJgoTEQLHjARBBuCQiEoTARBEG06BAPRgiAIogVBtGiFicJ0CK4ICsGDs4HvMD1taEFhahPBQDkMbWgDhR0bokW7aBMDA8HAhmCgtA1BEBQKv8IVf8CmBRPxWGFgojC9WyEoDAxcMRAMTEwMTI9NbWpX7UErBDd4wAVXbeAGF1y1N9hxr10xsGHDPSauKGzarm3Ohj8q7xdn0eJ5xfMqj5Xl/xc/j0L5ZSiUFkt8vPLhLuX5xPOLVgiCOBRKKwSFQrxf+TIK8dPEWXzdCtEK0UqL9xver7ThUChtx0A8rbSLdtGGVg6FCwqFoFAIgh07rrjiiiuCoFAYCOIs2LWgMLCjEBSCaMGOXdu16TC1aIXggitu8BZ3uMcN3iLag/agxdmGDRdccItbvEXwgMLExMDw2O5sWJ4UlENp5ax8mFh+DoXy48rycyhnpZWfJs4KhfLTDH9DWf6m+DiF8uPKL1sQP69yVn4etyhs2tDK2VW7arunFQqFQqE8NjEdCoULLrjBDS64YGDThkOwa9Hiw11QuGgXbXN21XbsuEdwo92isGmF0uIQBDt2fIfv8C2+wx3ucMHFYWBgYGBgYFi+mPJ84iwei0Ocla9f+ToFhfJ1Kj+faEF8vItFEEQr7xZn5acrX0a0eFp8mPL1iJ9m935BYWo7CoVbvMUNrrjBA+5wr03cYMcFE9PhLW604AFXTAQDAxftgolbFK64YseOHTuu2DE9rVCYGJgOhWCgUNrAxMDEwL121e61B+1B27UHbdeu2hXBrkW7ajsKO3bs2HGv3WtvMfHgaeVseOXKWTnETxM/rvw0pRXKWSwfozy/QjnEoSwfKwiC+HGXQhCUw8AVA0G0ICgtnhaHIJgY2LFhIg6FOAQbrigEQSEYmJgOhSDOSistiFYoFOJQiBZnEwMThSAICsFEYWJgaoUrLrg6xFmhsKMQFIKBB5QWh3JWCAqFoBCUVlpQDnEWBMH0WDxWCAqFaKXFWbSB3fsVJgpBIZjawAMGJiY2RNt8mE3bUCjtBgO32kW7wQVB4Ua7wXC4YDhszq64YseOB+zYccUNChcEAxuCeNpEOUxn0aazgYmBiYFCMDBxwRU3eMANHrBhx8B0uOABGyYKcdiwYcPmLCgUNmy4wQ02bB6LNrURFAYKpQWlFUorlBYEE0EcymFgw4aBYOKKQqG0QqFQuGJqAwOlTcShtEKhEAQTQRAUhncrFAYKA4XSCvFuhdI2DAyUw45CoVAoZxPRCoXhMBHEWaEQhyDOJiaCiSCYmBgOhYGBwvBYOZuYmJiYCIIgCIIgWrCjUCiUQ6G0gQuuiHbRpkNhQ2nl48XZ1KKVtmmllVbOylmhHAYGCqUFQVAoFMqHi48XLdpEaeVsaldtanFWKO9WKBQGylmhHIIgiB932RFtahNBIVoQBIWJHcNZtGjBRDBR/r/24GbHjus6A+jap6r5Y8eGBWSSx8xbZZxZHifTBEYSyrIp8tb5gmAjOLi+l81uUqJIqdYiKGw4tGBiIpgIdkwtiFaIJQiCIAgGgtImJoKJYCIIgiAIgosWTASFiYkgCIIgCIJoQbRCIQiCIK7tKESbiBaUNhBtaNGCgaAwUJYgKExMlBYE0xIEQWmF0goDQSEoTC2YWjC0aMHERBAEQRAEU5u44BXe4y1+j6kVohWC+DSFskxtYsPEwMRAUAgKEwNB4YIHHAje4cAFF1xwQRBsCF5ohcLAhg0ThUJ82MRAYWLgwMBEISgE0WKZ2uHawIENFzzgHTYc2HDgPYL3WlzbseMBOzbs2LDhwMTEgULhAS8sUztQmNpeWqFQ2sTABcHERGkT0QqxBEGwaQcKhYFCYSDa0GKZWhAEhQ2FIChMbaK095gYKJRbhaAQFApBYWgHgolCfNzQgmhBIRgIJgqFWIJgIpiWgQPB1IKJiaAwEUwcmAiCYYklmG7FUpgIokULYgmCYCIIphZMRDswMXzYwIENByYK/4D3lkIQbaIwEC2ulVZaUJgolPvKtdJK27TSNhQKhYFgYEOhUCjXCoWBgfI8hUKhUCgMBIUgPl20uFbahgs2HJYNwYYNhbJEGyjLxMSBw32x7IWLFpR2oDBQOFAYWmlTGwiiDQSFDYWgMBFMTC2IpRBtQ7QLJoKLFgQTQRAEG8oSlFaWQlCIVlppE4VowUAwUSgMTEthYmiHFteCIJgIBgqFTQumViiUa2UpDAQDhUObWhAtlguiBUEsAxMDEwOxXFwrlGVDEESL5UC0IAiC4AUOvMZfUSj8iAccKNcKA0E8XVAISnvQhmsHNhzY8RYv8RYvccEDSpsoTExMTEtZpuUdDhQKr/GA7zAxtYlCobRCtImBiaEVBgrBwIGBicKPCF7iPR7wDg94jx1v8RI/4gV2bPgR0TZMFKZWKG1iYiK4YOAFXmBgs7xH4aJNbdM2bf9XfIegUNrEhgMDB4INQbBjIG4FQRAEwYYLXmilRQuCaNEmgkPbMS1BtCDagYmJaA/YMFEIgmAimNpEULjgNQ4MBAeCIJgIgiAIgpfYUdrEoQUbgiDagYGBl5gILtrARLRgIggmCjuiFQ7tQCxBEAQX7NgRTEtwIJiIFgTBay0IosUSLQiiFXZLLEEw8Q4vtcI7/B7/gjdaUJgIgjf43rVope0IDu2wDLzFjr9iww8YeIMdP2LD99jwF2x4h4FC4Z32PYL/QfCfuODPuOA/cOANDvw7gr/hwPeIr88P2g/ue6dFO7R3GPgbNvwF7/AKO/4bD3iFHRMPCHa81aa2abu2/zMKQSEoBKUNTG1govAamxaUW6UFExsKf8QLPLgVS2FgolB4gT9iQ7RopcUSrfASf8BLBJsWLVq0oFAI/hGFgcJmCWIJNkwMbNixoRA8+LBCELzEdxgoTAwEQSyxvMJL/B6bNnBgeFzwgN/hlTZRKASbFi2W4J98XLSBIBh4wB8QS2lBMLSgtAs2/BveYCIYiBa8wZ/cV9pAEBSmawOFw32lDe1wrVyLazsmSjtcKy1uFYYW16LF05QPKwzEEgRxq7AjuGi7dmjR/kv7s2u7dtEetPeWYZnarj1o+9DiVrSJaEG0gd9pQbk1sWkTpb3GK0yPCzZMlDYwMCxBuRYMLQgGNmw4cGjlWqFwoBAEO4ZWOLSylFYIJiamNjEQDC1uBYVgIpjaBbsWrVCWwg8IXmnRDmyIW4VoP2LDgxYUChNTi1auvdfivoEDhYGJic1SbhVKCwpBYdcmgri24cDh4+LzRIvHxX1TC8rTlRa3CvF5ohWC6Vp8WBC3CoX4fOVx0fZpiRb3FaYW7JZy30AQlGXTyocFA7EUgs21cqsQrVB4jw2HVj4sKJRWliAot+LaQLAhGFohPm4gKK2woRCUJZZgR2FohYlNK/eVNvCAWKIV4lpcmx43ERQOrRAU4nHlVlAYiGVqh4+LFkvcmp5mui8eNz0u7osWt8rzxX3R4r6yxHJx7eJ5Lq69dy2IWxftog0/s7gvPq6cgvh1K6cvKYgvK75Ou88UX0b5ZZSvR1C+LeV5yvPE6VPFzy++bsMXFC2+rPj2xS+r3IrPV1qhLIVyOv28hmcqvz1B/LTKtyt+WuWnE6fT0w3fqCCeLn46hfLbUCin06/T8AXEEt+2cvo/8XWJ0+n5hi8kPl359Sinvxen0y9jeIJoQWnl6QqlleeLz1NaadPTBYXSYonnC4J4ukJp8WnKMjxPUJZC/DSC0oLSpucpt+J0etxwOp1Ov1HD6VcvTqfTPcPpq1ZOp9PPZTj9ZgRxOp3+33D6ZsXTxel0+nvD6VctTqfThwynr145nU4/h+ELCGIpFMrTlFaY2BDPFxQKQWmFQqFQKK0QrRBM9xXKtdIKpRUKQaFQ7itMlLYhnm4gGAgKQTxNeVyh3CqUpVAoFAqlFSYKQXm+WKINp9Pjdt+AWMpSKC2ulSWulWvxYYWg3Be3YgmiBdFKixb3TQRBEM8TRAuCINrweab74loQS7RNK5RWTqcvY/eZ4nHlVrT4uKDcKpSlfFhZSisUgnJfUJbSSitEK0u5b2BoA2WJxxUGBqKVjwsGBgYGgqBweFwhCKYlKGweN1yLFm2iEC0oHDh8mnI6Pc3uZxaUJVo8X7RCobR4mtLKsnlcUIhWWiEYlnJfUNiwawNBLHFfsGHDjmiF+LgdO4KhBYUHjxt4jVc4LMHAYYmltM21cm2gEAxEu+CVpwnKrXI6Pe5/AXt+L94J8N2HAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAAUAAAAC0CAYAAADl5PURAAAjzUlEQVR4AezBwY5maZ4f5Of/ni8iq7qY7vFoLDRIlj1CXAASO18C98FlcCVsESztC0Cy8cJbhFjakr0ALEaA7J7uroz4zvtDPX+1DscRGZVZWVkRWd/7POV/En+NgXgqfh5TG1q0QhAEGx7wiML0sgc/j02bWrQ77Vf41/hzhx3ldQ1ncfYN/gabFq20eH3B0C7aP9P+O23TLlppu9dVKEwE3+Lf4D9BIdrQopUWryPa9wgKE4VgolBatNLiTbj4a/y1D4ufx9SGFm1oE8HA93iv7V5Wfh6bNrVoU/sGf4vfoLSJ8rrKWZwVHnBBEATlbYhW2kX7jfZn2qZdtNJ2r2ugsGvf4Dt8p0UbWrTS4nVE27BrVxSCiUJp0UqLN+EiCMohKG9LOQQTwcXnKZ9n10obzjYE97jgDoXCxOZ1RYtWWmn3+B4XRAtKi7chzi7a1HbtQYtWXl8hiPYHDGdDi7chWmFix9VhauV50cqrugjiefH64qlCId6+gaBQKBQKhfK2lFbajh3ledPri6emNrU4i1beliCYKIdo8TZEK0xMTBQGylfh4j9WiLclWjBQKAzEy8qXVVpp8WGFQqG06XVFi1ZaaUOb2tDibRjOJgqbNrSplTa18rpKCwobNtyhMLWhxdsRbWBiYKBQCOKsvCkX/7Eg3o7S4qwQPyy+rGjR4nmFwkBpA/H1CII4lNcVTwVBIVqcxdtQCKIFExOFaNHi5xWUp+IQh2gTQZyVN+UiCApB+ToUCvGy8rL4acXZru3YsaNQmCivaziLVg7RCkG0YHhdO8ohDnHYtKFFi7ejfLryZZXnlRYUCoVCoVCIs6FNrbyqi0JphdIK8fqm5wVBedsK8VShUF5XeV5p8VRp5W0IytevUCgUBnZv20QQxFfnIs6ixdtQDtEKhUJ5XaWVNrTpbKA8Vd6GeN7AhoFgICgtXtdAIdpEaUG0aFOLt6G0IJgIgoloU5vOhtcVFOIwtTiUFq20eFXDsizL54hDfFUubl18GaWVs4HC0Havq7Q4K60wUQiCOMTrGiiHQmlxiLNo5XUNbaIwMFAolDY8r7yuIJ4qrZyVFq28qmFZluVGXbwV5XWUzzO1aPGyaEEwvK7S4qy0gYHSSitvw45yiDYRlFZaeVumFgQTExOFaNHibQqC0oL4sHgThmX5mpUPi2V50cVrKy1eR3ye0korL4sWBOV1RYsWrbSBIIin4nUNLQ6FQiGeF29boRxK25xNb0OhUM5KixYt2vCqhmVZlht1UYhWKMTPJ1q04SxaOSuUz1d+GlOLVloQh4FCEJS3pbTyYUFQKK8rKMQhDtGGFq20eBsKhUI5RIsWb0uhEASlBXEY2tRKi1c1LMuyfI7y1RqWZVlu1LAsy3KjhmVZlp9SfDWGZVmWLyHevGFZluVGDcuyLD9W+aoNy/IpYlkO8WHlzRuWZVlu1LAsy3KjhmVZlhs1LMuy3KhhWZblRg3Lsiw3aliWZblRw7J8irIsvxjDsizLjRqWZVlu1LAsy3KjhmVZlhs1LMuy3KhhWZblRg3Lsiw3aliWTxHL8osxLMuy3KhhWZblRg3Lsiw3aliWZblRw7Isy40almVZbtSwLMtyo4Zl+RRlWX4xhmVZlhs1LMuy3KhhWZblRg3Lsiw3aliWZblRw7Isy40almVZbtSwLJ8iluUXY1iWZblRw7Isy40almVZbtSwLMtyo4ZlWZYbNSzLstyoYVmW5UYNy/IpyrL8YgzLsiw3aliWZblRw7Isy40almVZbtSwLMtyo4ZlWZYbNSzLstyoYVk+RSzLL8awLMtyo4ZlWZYbNSzLstyoYVmW5UYNy7IsN2pYlmW5UcOyLMuNGpblU5Rl+cUYlmVZbtSwLMtyo4ZlWZYbNSzLstyoYVmW5UYNy7IsN2pYlmW5UcOyfIpYll+MYVmW5UYNy7IsN2pYlmW5UcOyLMuNGpZlWW7UsCzLcqOGZVmWG3Wx3Lb4eNHKsvwiDMuyLDdqWJZluVHDsizLjRqWZVlu1LAsy3KjhmVZlhs1LMuy3KhhWT5WabEsvwjDsizLjRqWZVlu1LAsy3KjhmVZlhs1LMuy3KhhWZblRg3Lsiw36mJiolAYiBZEK1/WcFbOJgau2LVCvK6pRYt20TYUCoVHFC4YPl/8NHbt4mwgCKIVLgiuXldQzgqFwtCGdtWilc9TPs+uDQRBEASbdtU2bWrD6wp2DATRBgrRdq20oU2v6uKPgvL1KF+P0gqFclZeFq8rWpwF8TYFsfxc4hBflYs73KEcys8n2tQ2bWrRNm3DxHvE67vXdmdDu6KwY8edFi1e16aVs6kFwcUheEBw53VdtdJ2LQjK2UV7r20+T3yeTZtaobBp5WXT2xAE9wh2BNGiRYtWXtXF8uXF16u8fUH5ZSqttNLK21AoBKWVr8bFxEShUIgPi1ZafJ6hlbNd25wFwUC8vgdt16K9cyhM7M6C8rL4sh600uKsMFAICoUdwfS6LlpQ2BAEwe5577T4PPF5hhaUQ2lDG9pF27V4fQMTwYOzcvaN9uBNuIjlSypPBUF8/crbFC2eFy0+T3xZ0aJFixZvQxBn5c27+JOpDQTlZfHT2LWh7c6G9ojCBQOlxevatKFdnQWFC+6wawOFeFn5su61XRva1DZseERwh+AO0+sLgg0D7zFx0S7a1HZtaLvX9ahdUNix43vtXpvag7ZrF6/rgolHbWgPKFy0TXvwplz8SVCWn9pEIVqhsGnxsviySiuttHKIp6LF6xpaeV5ppZVWWnnbhhattGjD6yqUs0KhvHkX/zXeYdeCiU2LFi3a0OLzbNpVu9eiXRHcozDxHQYe8a1D+flt2tQu2lUbGPgL/Ff4bzAxMXHvdV21oQ3tov0N/in+e9xjR7Brw+sqZ3faf45/jP9Be9BKu9Omz1M+T2HDFTv+Ff5b/B8Y+F6LVtrwNlzxDv8brggGLpiYWmm7NrwJF/873mHXgonNWbRoQ4vPs2lX7V6L9ojgGy34Dd4hflh8WZs2tYt21YKBbzBxh4FCMLwsvqyrs6FdtA2FHY/YUbhqm9dVCEobCHbsuGhTK+2iTZ+nfJ4NhYGJgd/hb3093uHPcYeh3aEwtdJ2bXgTLv4omFoQBMHQ4mxq5fN8r5X2B23Ton2P4IIdQeHf+7BCfFlxVtpVuyD4NR7wB+0OOwrleYX4sjbtUbtoV+0Rf8DfYNMKG4LpdU2ttCD4h3jE39M27aqVFp+nfJ4rJu4x8Gt851BaaVMrLV7fhnvcoxCUNrWL9qi98yZc/EkhzsrrC0orBBM7hpcF5edVWmmFaAOFiYlo0cqhEMSXFS1anBXKWaFQmF5Xeaq08vYNxPMKpZWz0uL1DUxMbCiH4Wxow5tw8UeFOCsE0eKstOnz3GnRokUbKOxaobChsHvZ9GWVs6mVtqEwMHDBxAXB1MpZafFl7Vq0qZW2YyIIBgq7Nr2ui7ZrmxZMxNmuvdPidQUXbFoQLYg2nMXbUFpQuGoDwebsnTflIgiiBRNBHOJ58XmiRYuzQjARDMShPBWH8mWVlxUGCkEQRIvnRYsva2pTK62cFQrlEG9DfL0mCkEQDF+Pwh3uMTAdBqKVN+niT0oLCkGwaXFWWvk8F+1RG9p0tmmFgSsGyiFaOZQvK1ppQyvtPQoPeMCGDTuCclbOype1aZsWZxsG7rAhKDxow+t61IZW2sCG0q7acBafJz7PnbYjmNg9NZ1FG17XxBXvEVy0IJjaRdu1aMOruvijaNHiEC2+jGhxFm2iUFohWjAcSou3o1AoZ8HEBXGI1xEtnjdRCDbLT2Ui2sBA+XjxugqFwkBp01fhIthwxY6BQlCIs2ilxeeJFmc7Cht23GPgATs27JieikN5Xmnx09i0R23TJgbeY8MjLigMxKcrHy9eVtrUytlAcK9dsSPYEJTnFSbKIQ7lqfg0E4WpBRNBMBGUdo+JRwxEK62cTc8rbaIQFApxVlpQ2sTQNgQPmHjEnXbVopUWLc7K84LSgtLi8xV2DAQ7hrOJOAytUJ6anjecTWeFwtTiRReFiempieGHBYWgvKycDW0gKGdB4YJHLXjEBfHUcIizaPG88uMF0aLt2jtMlFY+rDwvWhzirPw0SitcEFwxMPCIR9w7i0MwUZ4qBNHKj1O44BE7vsEFhYGJQqEQh+nzDS2IQ7RyKBQmgolNe8B3KIfC0HYfp7TSpkP8sHIWP+yKCyYGNlwxEC1aOYtWzoYWLVq00spZEMRHuSgEAwNBMBAMlKdKi5fFy6ZDIdqdsx2PGAgGLnh0Vs7K2fDxCvGyXYt2p23aO7zH0IIrBjZctTgrbTorZ8OHBfGyTQuCoZX2PR7xgB1Du8e3+K2XDZSnopVDeSpetiG4R+EeD3jEjk0LgkLhHhNTK62c7Vq0clba5lAoFK4YiLZhw0Thiis2PGh32oOn4mXT54mPU1pQ2LHhAXe481ScBROFQhAfFpQ2tCsKpW3a0KazcnKxY6BQ2DExtCCYzoY2nZWPE4dCOSvtgit2BMHEholyCOIsXrYhnheUszjbUZjOymFg4A53uGJgIg5xiFZeFof4OHEoRCuHaBcUBu5QeETwB5RWnhfEIVq04RBPlaeCQrDhEQOFRxTe4Q6lBdEKA0F8nnKIFgSFcgiCYEdhaN9gYmDHox+ntHhZPK8QP6y0DRMXTNw7TJTnFQoTcRjO4iza1DZnhSDa8KKLgUIcCgPTYWhBUNrwsnheaVcEU9u0oT0g2PANCncoPGI4K2flLM6ml01PlcM9gqFdEYeJbxBM/AGFgQfc+3RxGF42HcqHlXZxtmNHsOMBhe+wo7R43nAIyln5sKA8VVohuMeOB1ww8B6/R2mbFkw8YOJOK88rZ4VyCAqFQjwvCKZWGLjiDleHe21gOiuttGjR4uOUFmfxcaY2ccEDNm1HYXhqIg4DE3EoLVqhtOmsHEorHxYnF4XCFbs2EOwY2tSiTa0c4qmpledNLQ6FoQUT0a4IdgzEoRBncShPxVk5K2flbHc2UQ4XXHHVNgQThR3lqdKiledNZ+UsnldaPK+0DQOFC3ZccdWms0Jpwe6sfJp42Y53iHbBIx5wj2Ag2sDEFcMPixaHOFy0oU0tiEMQBNGmVhiYuMcVA9NThUJpE0EhPl5QDuUsPt57FAo7Ni0oh8JwFgyH0grRymEgKB8WLShncXJxh++wIxgobWJoU4tDsGnR4hAMh2hxKGf32tR+h0Jh4Ff4+/gO32JziKc2T8WhtGhxtiEOcRZtaI8INq0w8Vf4S1xReERhOsQhWnletItDtGhBOcRTFwQ7gguCoT3iG/wVdu0R9xjYnRUK0QpxKC3apkUL4jAc4qmJYGib9g0m/i0u2LV7XDHxLf6tVp4XZ0Mb2qZtKFy0i7ahsGl32obCBVd8iyv+PS74DQpXbSAoZ3/mbNMGSosWFEorvNdKKy3a7qycXfAb/JmPU86i7dqOwkThisKO4OpQeMDA1N4juKKwa9Hi5OJ/xN/HhqlFK4epRYsWhyAOcQgmJoIgmAimdkGwI/gDgg1XbCj8K+y4IAiCIIh2RRBMTARBsCMIgokgCKY2EQQT0d4jKEy8x8RAMBB8i/8V7xA8INgRBMFEEAQ7gmBiIpjaI4JgIpgIgl0LJoIgCArBFRMDQSH4f/Bb/J/YsWNi0x4QTEQLJoIgCIJCEMSX87/gf8Z/iQuuCL7BVftz/COtPC9aaaUNFH6NgXe4x3e4x7fY8Bvc4R7v8B3ucY8LfoU7h1/jn+D/xo7fIZh4xI4rdkxcMHHFFTt2TARTC4JCobSBQmFgYKBQGChtoFAobcfAP8fE/4sdA7/De7zH3+IBv8cDfof3+B7BAx7wBzziqg0M7YKBe1xwwcAdNtxh4g6FO2xatDi5+C/wDxGHoBBMBLtDEBR2LZiIFkwUgmAiCCaCXRuYGJh41K6IFlww8Q8wMRFMTAQTQRBMTAQTwcREMLEjCIIdU5uYCIKJiSC44oLgETsmgkdMBBP/DsEjJoIgCIKJiYkdQTCxYyIIgmAimJiYmAgmgokgmJjYtR07gomBiQ07/jPsuEMwEBSCiYmJYGoTwUS0YCIIJiaCIAiiTUxEC4LgexTuMPE9Cjv+A/4lgomgMLW/wr/QyvOmVigUBu5xwV/iDt/hHn+Bd/h7uMdf4g5/jnf4C9zjO9zhW9zjV9jwK2z4T7FjwxUDj7jgATsecYcrJq4YuGo7SgsKhYGBwkChMLSBiYEdQyutUBi4IniPR/wKD/gt7vF/YcPExO/xgN/iAf8OO36HB/wWV3yP4Io77Lhodyjc4xHvMHHBjm8wcfFUOYShUF4WhyBafLx4WbR4Klq8rLTyYeVQKBQKhdIKpRXKoVAO5YfFj1MolFYoFMpPI15WKAwUyscrZ0EQxJcRh2jxVPnyopXnBRMTExNBEM8rhzgEQbT48oIdOyaiBROFQjlEi+eVw8DAhg0DGwY2T5VPchEE0QpBEATxvEIQBBPRgolCMBEEwUQwEExEC64IgolC8HtMBFMLJoKJYCIIgmAimJiIFgRBEARBMDERTAQTE6VNBBNxuGCiELxHMLQdQTARBEEwEQRBEEwtCIKJIAiCIAiCIAiCixbseI/CAyYumPgGQRA8IAiCiYmJaEEwMREEwUQQTEwEQRAEQTARLQiCzdnQCsGu3WtXDFxxxdBKKy3OCoWBgYGBiYkgDkFQKK0cBjZccMEjJu5Q2BBM7JjYMTARbccVhWBgYGhDC0obKBQeUSgMbSAYmAgKpRVK27QgKJQWBMHExBVXPOIRG4JCobRCMDC0gaAcNmzawNQm4lBaaYUw/El5XqFQWqFQDuVQKIcgPk60IFocgjiUH6dQzsqhfFg5i7No5RAtzuLTBHGIL6sQxKEc4odFKxQKhUI5lFYoTxXKxwmiBUEQP71C+bBo5RBEKxQKhUKhnJVWWmnR4suK520YKAwUyqG0QnleOSuHIAiCIAjirFAO8WHxdy4KhUJQDkFQCMoh2nAoxFPB1ApBYWJHsGOiEGza1DYMLfhbBO+00korZ4WBqRUGgkKhHAqlFUoLCoVCtCsmHhFsmNixoxAEwcR0iEMcSgsKpRUKE/G8QlCIQxDtvcPusCEoFAaCq1YoxFkhCIJoQRBMxKEQH68Qh2Ai2BCHHYWpPTobnldaaUMrFAY23OEOd7jDwEChMBFcMfCoPaDwa1y0oRWueEThig07JoJCOQt27Ah2h4nSgkI5FApxViittKEVHrFjYsfE7rBhwwUTd5i4w8SOK3bsmJgOA0MbmBiYKAwMBAMDhYENm7PS4u8M/3/lrBzK88rzyk+j/HTi48RPI4gfVj4snooWX05pQfx4pZUWBMF0Vg7leeWHxaG8rvKyaKUF8XnKzyeI5xXi05RPF8+LVj7oYseOoQXTU1MLJuIQTMRhYmrBRBwmJoLggomJYGjR3mPiTvs1gu8RBEEQBEEQBEEQBFMLJoIgCII4RAuCYMNAtDttonDBRBBcEWza1EoLSisU4lAoBKUVCqUVBiZKK5RWKO1OmyhMRJt4RPCI4IqpFQaCQiEoBEEQBOUQBIWgEARBMDARBNGCQjC1HcHExBWFTbs6e4dv8XtnpUWbKE9N7NgxcMVAEBQKhcIFF9zhDu9wjwcUvkVhYKIwMBBsWjC1iXcoh6EF5TBQKAwUChsKhYGJgWBgYiAorbTCpm0ICsNZEEzs2HHFFRdtwwUbgg2lDUxtxxU7Bh4RRJsY2DGwoxBtaru/c/FDgiBaEEQrPyx+GuXDCvG8+GGFeKoQrRCUVj5OED8sniqtUAgKpcXPo7RC+fEKpRXix4sWxKcJ4ssrT5UPi69DaYXSogXB9OnirFAoFAqFQvlsF4WBwtRKCwpDC4LCRCFaOQSFgWBgakG0oQVBHKa2YWrBRDARFAoThdIGplbawK4VSiuttEKhEGeF6bAjKBQK0QZ2rTAxMBGHoDCw+2HR4qwQLVohzoI4TATRgomgtCAYWrSJIAiiBUEQBEEcgiAIgiAIgiAIogXRopW2YWAgWjCcXXHFcFba1AYKpQ0UChsmJkoLgiBatEIQTOwYDhOFaEMLJiYuKEwED7hiw8QFhUJQWrQgDsHAxEQhmCgEE/HUQDARZwMDA8Nhw4YLdi244oodV+xasDtccNEGBgauCDYMBANTK2ebvzP8UXlZnEWL1xWvqzxVlj+Jn0eh/DIUSotfpvLx4tOVj3ZRXk+8vmiFIIhDobRCUCjEy8qXUYgfJ/9fe3C2LFl2ZQV0zH08spFQYYXxwmfyVzzzxkeByWSlKmVcP3tiaIEdvO7NaLKJbORjeFS/bUGNoEaM+rBtxKhH9WEHDiwsBHEpio2NEyc2Nopie23jMBYWFhaCjWAhCDa2sRGPFoIguKNGsFCXIDiwUCxj4W4EcdnYuOOOO+54wQve4z0ObNxQHCiWcUdRFEWxsfE1vkLwDsENJ4Iay6gHy9PbirjEiEfxaerpSwji4+LpS4hHMeKHqUdBED/Izf8vqKf/pz5PEB8X1O9XUV9WUJegfrj6NO9R3BGcOLGxXYJgYeHAgSBe29hYKIqiKIoiHhVFsRGXuATBgYUiWFjYCIJ4LQg2NjY2NjaKIgiChQMHbrjhBS+4446NjW3E24Lgb9h4QbGMEws14k3L088nfjn1qF6rSz2K3774bSqC+G2KL6dGUZ/t5omiqBHfrx7FDxc/jxr1tvo08dtRP8zhw4ogxoHgwIF3eIcbbrjhhhtuOHDgwIGFhSA4cOBAEcRYKIqNjY2NYuOG5RIEQRGXIIjL9mgbG8FGjIViGQvvsHA3Dmwc2DhwIAiChSAIgoWFm7GNEwc2lrEQBDccuOGGAzcUN2wjxunB8o8uHsWlfpj6uPhhYgTxqJ4+R/zygrjUJZ4+V1EU9VE3QVHEZeGOhaJGUcSot9WlKDYWThzYqEtQl+LAHUFRBMXCxnYJinoUI0ZRIwiCugQ16tHGwkZQFEVQbAQbC9sI7rjh7lKPguBEUATFwgti1CUeBUUQFEERI0YRl3pUFMX2Wr0WFEFQI0Y9qrFw+rBgIyiCYhsLL1jY2DhQYxtBXWrUOIwTwcaJelRsnDhx4sCJO14QvCB4MRaKhRMLdTlQLNxQbJw4EZxYHi2XoEaNGMFCsFwWgmIZy1i4Y+PEHRtFsVEUcSmKYmNjY+PEiRPFHTWCjdOo14qiKLaxjBjxdzdFEJeiiBGjCGIUxUZRxAhqLARBUGzccbgUQVzu2DiwPNqoS1AEMTaKGkURLGxvixFsLBQxgvp+cTkQFEWNE3EJgrpsFEEQLJeNoh7F2C5FPdooio2i2CgWthEsY2NhexTUZRsbxUZRoyiKokaxEY9qxCgWDvwbbsYNd2yX4EBQBPVaUY9qFHHZKGoECwduCIIgCBYWgiCIEcRlYSGIURTFQhDExxVFEW8LgqAuNWpsBEEQY2Nj444TG0WNYCGI7xfEWKhHQVyKoqiPujlRYxsbRVCjKIpg48TyqEaNYqPYCIrgwGkUGxvFRnHDNooaQV2KoiiKYqGIsbFRbBQbRVEURVHcjWKjCDY2iqIoiqIoahQ1gqAoiqIe3RDU2KhRxFiosYwaxUIRLMSlKIKNjRhFsV2KoogRxAgWiqAItlFso1hGjWJjoyiKoiiKbWzc8Q1e8Df8EdsIagRFvS0IinoUBEEQrxVFUSzEJUZRBMFCsVAUxcbGiRPFRrERFEVRbCyjiEsQBMEdQVAERRAsxFgoFhaC77CNIFhYWAhiFBsnTpxYWAiCGqdxNxZObBQLCyeCeC1GsYyFIP7uJkYQxNhYuKPY2IixUSOoS1EUh3EiCBaCYKHGMuqyjaIoggNBUQTb2Ijxgo2FIF4LiqAIgiJYxoliI6iPW0ZRowiKhWIjCOpSFBvFdlk4UWyj2Ngogo1i48RGUSyXuhTba3UJNooaNYq6FEWxURTbKDZqnNhYvt/CiQMnNoL/gBeXoKixESxsI0aMGjWCIAiK7bV4FATBwoEbbrjhwEIQLBTFgSII4lEQLCO+XxAjRhAEQRAsBEFdtrGNoEYQj4KiKOoSBAc2DmwsFAeKA4cRlxoLcdnYOHEiXivi726Cu1HEOBEsBCeCZcTYxkJRY6EIDgRFsFFsbKOoS1DjQI07Noq7URQbRVEUB+JSxIhLUAQ1YsTYCGoUC8VGECxsl2BjGadRj4qi2CgWguAwim0EQTyKS7BQLASnsY2iRl3uqFEUdVnYWNhYqMvdoyAuB4qiRl1O1CiKoii+wolv8a8Igu/wDifiUbBQvPO2uhQxllEUJ+64Y+EFwQuCFxQvWDhx4sTC33BgIzhwIjixsHHHC4r3KF7wFU5svKC4o9hYRhAjKIKbESwEC0WwEJxYKJYRLBTv8YL3eI/3eMGJO+6444477rjjBS+4446NE9vYOBFsBAvBge9wosYNNyx8hdNYRo27v7v57/hnFEGMjQMnFk4UB4rihoV6rSiKoigO3PGVEaNGUdSosVGcxg3bpahR1DixsVHjHQ5sBEVRbBTb2CiCO77FiYXiRFEUG0VRFEXxNW6IsXEaxYGiqHFiYeFrbBR3Y2GjRrFRFBvBDTWC0zhRl6IoijtuuKHYLsWJYqNGURTfGkVRoy41iqJGcHOpS1FsvMfXRvAef8R/w1+MItgoir/g7lGNGkFdlnHDwl9xw59x4H9h4U+44T/hwJ9w4E848Acs/AHB18YNRVAUd7zDHQsnghP/ETVOLGwsFAeKGDW2sRAjRlDjQHAiqEtcvsOJf8Udf8WJP+M9/ow7/ow7/or3+Bec+Bec+A4nXhC8x0JxYOM9ihve4x2+ww3BO9xxwzaWUQ9u/iuCIiiCIsbCNhY2gm9xGEW8FqPYOBD8E77CO6/VJVjYCIKv8E84UKNGjLrUCL7Gn/A1isOoUaNGEQTFf0awEBwuRV2KAxsLB244EBTvfL+gKL7GP2Mh2FgoirrU5Rt8jT/iMBZOLB9WvMMf8I2xEQTFYdSoS/FffFyNhaJYeIc/oS4ximIZRYw7DvwP/AUbxUKN4i/YKOJRfdhC8D89WkYR1KhHMWrEiLH9MmLE2H6cAxvLOD1aKOpRjODEwkZxxzYW3uPEd1jGxsL2QTfLqNdqbNQoaiz8wSjitY3D2IjxLb7B9mHFgY0YCwvLpYhHxTKKYuHAgROnEY+C4ERQFDcsIziNuMQIio2NbWwsFMuo14qg2Ci2ccfNqBHEJfgrim+MGicO1GtBje9w4J1RBMHGNmrEoxej3rZwIljY2Dhc4rUgRhEUwc3YKOrRgROnzxcfFqNGfZr6PEH99GrUT2MbQb1W1GtBsF3ibXWJEZ/kZrvUqLcF2yhuLvG2haKIy2HE9ysW6hIUh0fxWlAjCF5w4DTi+xVBjLgURbxWjxaKA8Uygvq4hSJGcCAo4lKX4oZgGcHGYcTbYiy8Q11qBPWoHm0ftlEEpxEUQX1YvFYEC3XZxum1+jQ16m2nS32/elt9mvrh4lJfxol6rd62PTq9bXt0utRHLT+3elt9XDwV9fsWT19SUV9W/Srd/Fj1ZcQvI349ivhtic8Tn6eefqj6+dWv2vIl1agvq3776pcVr9WPFyOISxBPTz+r5XPFP56iflrx21U/rfjp1NPTJ1t+q4r6dPXTCeIfQxBPT79Ly5dQl/pti6f/o35d6unpsy1fSv1w8fsRT/9ePT39IpZPUaOIEZ8uiBGfr36cGDG2T1cEMepSn68o6tMFMeqHicvyeYq4BPXTKGIUMbbPE6/V09MHLU9PT0//oJan3796enp6w/L06xZPT08/k+XpH0dRT09P/9fy9NtVn66enp7+neXp962enp6+x/L06xdPT08/g+VLKOoSBPFpYgQbB+rzFUFQxAiCIAhiBDWCYntbEI9iBDGCoAiCeFuwEeNAfbqFYqEIivo08WFBvBbEJQiCIIgRbARFfL661Fienj7o5regLnEJYtSjuNSjeFTfLyjibfVaXYoaRY0YNeptG0VR1OcpahRFUWP5cba31aOiLjUOI4gRT09fxM2PVR8Wr9WojyvitSAu8f3iEiMIinhbEZcYMYIacYm3LSxjIS71YcHCQo34uGJhYWGhKILThwVFsV2K4PBhy6MaNTaCGkVw4vTDxNPTJ7n5uRVxqVGfr0YQxKhPEyMuhw8rghoxgmK5xNuK4MDNWCjqUm8rDhy4oUZQH3fDDcUyiuCdD1v4Ft/gdCkWTpe6xDg8ikcLQbFQ445vfJoiXounpw/63wTdhS07SlnhAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAAUAAAAC0CAYAAADl5PURAAAhNElEQVR4AezBy4pl25oQ4O8fc66IyMxzrcJDFSVogSCICII9e76B+Cp2fBMbYtOWL2DDTkF17HhpCWohlqIcL3U5e+/MWGvO8WvVj2eeWSsi8rYzV8RZ4/uCf5n8LhrSufRlhbIqB2W1STQkZhzx17wsfxv/Cf9BOWHF0WUt9g5KU/4r/if+gb2DsrisGWmzKH9f+cf2vlO6cnBZicABiX+K/4x/4mX5OToSiSMCizIrR2X2HMz8Ln7X49KXFcqqTEoq4dwJP1TeeFr4smZlUWZlUe6V38I3+JmyoOPosk72DkpTvsERP0BiQuJGWV3WpKRyr/xY+aG9SenKweUFZuWHeIODclAWe7OyuIxUTsodFiRSCTRltjd7DmYSibBJhOcnEVixIPE/PC/NXkPiO3yDewQSHa9c1g887KSs6PgOifQ8hb1UbpWm3CnheXiHwIzEhGazKKuHpctI5UdY8EMkQkkllaZ0pSnpkmYS6WHp8lIJm0AgPX8NiUAgEEogPE+hrFjRPW9prytdaUpXJiVdVleakkh0hE3aSyVdRtp0pWNSQknP2exMIF1et0lMSAQSK9Lz0+2dkEjlgFBWNM9TKoHwsoRNszfZC5d1pzRlxmzTlW4vlO5yEr9A4h1W3CGURLMX9sIlzc4k0vMRHhZIL0cgEDbN8CUkEoH0/KVNoqMjPC6VdFlpL5VE2kxKV8JzMJNIBBLheepIpWNBd3k3ymKvK4FAIOwFustalVQmJZUDZhyUFYkDEqvLSgSaksqkdGVSTkpTwmU1D0uklyORCAQmJe2FEp6DmUAogVAC6fK6EvYS6fkLpMeFywp7oYSSzgUCgdXlpV8fgVAaupchkUgvyUzaSyV9HelpoSS6kggE0vPQPWxVFpywIJSO5rJmJZVQVqUjsSKRyr3nZbEJdCSavYPnbUVX0uMmpbusGR236Jjthb2wFy6pGYZh+CzppZq9GM1eR0dzWUcfZsKE2aYhPA9hr9nrXo5U0vPXleZhTeke1lxWItHRkUogkUpTTvaaS2qGYRiu1OzZ6MqkNKV7WFO6521CYsZsL1zeaq8pXWlomJBIJJqSLisRNoFAoKErk7Iq4XlqaGgIpIetSndZN8qMjrAJ5w5KeA6aYXjRwuPSMDxldnHd05qSSkPzcqzKEUccEUh0HFxWsxdKs5dIpNK9DM1eKM3zFAg0BFLp9rrnYcWKEzpSCSSaEh6WLqkZhmG4UjOBVAKB9PU0ZVJWpSmhrOiY0bAivTwzAoE0fF/CJrGgY1JWZVK60jwvK1YsCITnbVUO6AilKal0pSnpOWiGYRiuVDMMw3ClmmEYhivVDMMwfK/SS9EMwzBcqWYYhuFKNcMwDFeqGYZhuFLNMAzDlWqGYRiuVDMMw3ClmmEYhivVDMMwXKlmGIbhSjXDMAxXqhmGYbhSzTAMw5VqhmEYrlQzDMNwpZphGIYr1QzDMFypZhiG4Uo1wzAMV6oZhmG4Us0wDMOVaoZhGK5UMwzDcKWaYRiGK9UMwzBcqWYYhuFKNcMwDFeqGYZhuFLNMAzDlWqGYRiuVDMMw3ClmmEYhivVDMMwXKlmGIbhSjXDMAxXqhmGYbhSzTAMw5VqhmEYrlQzDMNwpZphGIYr1QzDMFypZhiG4Uo1wzAMV6oZhmG4Us0wDMOVaoZhGK5UMwzDcKWaYRiGK9UMwzBcqWYYhuFKNcMwDFeqGYZhuFLNMAzDlWqGYRiuVDMMw3ClmmEYhivVDMMwXKlmGIbhSjXDMAxXqhmGYbhSzTAMw5VqhmEYrlQzDMNwpZphGIYr1QzDMFypZhiG4Uo1wzAMV6oZhmG4Us0wDMOVaoZhGK5UMwzDcKWaYRiGK9UMwzBcqWYYhuFKNcMwDFdqNly5UNJeVzq6kobh10kzDMNwpZphGIYr1QzDMFypZhiG4Uo1wzAMV6oZhmG4Us0wDMOVaobhg4Vh+HXSDMMwXKlmGIbhSjXDMAxXqhmGYbhSzTAMw5VqhmEYrlQzDMNwpWbuMCERNuHrWJXJ0wIH5RbpebhRjsqtclK6csQRTblXbnye8HlWZVJSOSgL7nFA4uj5CZtA4DW6c2+VV56nhqYk0l5TuufhFRYEGsJeKKGkEp6D2fCVBMK58LR0WamklyORhq8lvVQz91ixIhBIm6Z0X0az15WuHJRv0fAKJ9wicXRZR3v39m4RaGg2ByVd1r1yq0z2bnCDxV5DIj0PqaSyIG0m5cbz1BE2B+WkhNKUULrLequcsGJB4qDMyqy8U26V7pJmw1eQXq7w/KVff6GEvXBZaRNKeClmv3RAeNxkL5XweVI5KbMSykn5kU3Dvefl1t5JuVcawiaQ6J6WntZ8njsPW2xCSc9PKOlhqYTSPE8rAh0dYa8r3fM0KT/wtK40pbmkmTRcQiKRhi8hlVRCSSUM36dEemlm3uIt7pRZWe01e4sy+zyhzErYOymBwBEnBNLlvVLeKk3pSkPgBrdYlFnpnha+rLD3TrlV3uItQpmQCHSEy+r2GjpSuVdulWZvdVmT0hFoaJiVo71J6Uq6rFscbd4pBwSaclTe2EuXNPulRBi+bx2BVAJh0zwvoYRNOpdKet5CCQ8LL0uz111WIOwFAuG5m/ltZbYXSirhyzgpTenKQXmtHBF4hVf47zjhZBO+vqNyo3yrvFEOaPhX+Dv4bXQ0dLz2PByVV8qfKn8Tv4cf4Qb/y164rElJm4Y/wt/FnbLaSyVc1jeY8Er5W/jnSDT8ROnKrLxVust6jZ/iLRZMaHiHjlReKf9H6crBJc38N9zijXJAx2JvVkK5V2afZ1Ga0pUb5YDEd8otfow/RqJ7WvqyjspJ+dZeQ8N36Dig4YDEraelr2NSXiknZVJWnJxLl7V62IrVZvI83SBsGr7FWy9Dxy1+4MO88pzM/CZu8FNlVjoSq3Jj76jMPk+zl0rYe4dE4A5/XekeF0hfVlNWpSuT0pQ/wG/gfysrVqTHBdLXEUra+7HyrectlBmJQCCVRTnYS5c1o9tMnnarHD0PJ6xYMGNBYkHgTjkqN8qiNJc0+6VA2gvPSyB9uET4OkIJJZxrCHR0pKelryc9LLw8oYTnryF9uFBCSZfV0NBtAmGv2WtKc0kzK7oSNoH0fuHzdOWt8trePQJ3yqr8MQI/dlnvlFmZ7S3omDHjhI70tFDSlzUpTTkpoRyUW0x4i4ZJWVxWV1JZlY4V3cNOSnNZgbBpaB53r6TSXFbHd1iRmJXZ3qLM9rpLmkkk0l4ikR6WSvo8qaSSStikTcfk+QglPCzQEEgk0vulr6N7WNoLBMImDZ+rI2wSzYdLl3fADcLj0l56DmYCgbDXkJg9bFaa78et0uzNSioLDviJc+lc+LJu7Z2USZmUFSu60pBIe+EyViWUVJryzl5X0mXNyqJ0ZUW3OdhbldllrUibRMeMQFdW5UY5KunyTggllVBSuVNWZVLSJc3+XCrpXHpY+n6lh3UEQgmPC89X2EskAmmTLisNX1NHYlYaAunlCIQSSnoJZhITGlabRPjy3iqvlJNyUBo6Tmjo3i9twpe1KpNyUP5U+ZFywCubVNLHCx8ufZo3yltlVhYlMWH1uEAibNImnEsfJxF4rXynvMM7TMqizOi4U9Je97RmL5xLm/C0hqaccMI7dHsH5d5eQyI9LRDoPk4oDYGGRFdWvMZ3eKN0NGVVEmnTbQJNCSWV5nGJUFIJH2Mm0NGd6768Zi/sJQITTj5MeFx6Wvh0iVDS3q0PFx6WSvryQgklsdpbEfbSJpX0sPT5AjM6ViUQaDaBQNpLe2kvfJxUUgkPSwRCOeGAsAmEEh6WPlz6dKGkvcCCGYlAQ0dDKl0Je6kkAqGEh6WHhZL2wlNmOhasaDYdiQWB2d6qzJ6WnnawN3tYYMZJOeIGq73wtLCX9tImkJ422YTNj5XEPb7DO8zK4nHp65uRWJXvlO+U7lw4F/YC4XFpE86lpy1Y7CW6vckmbJq95tMsSkcgEDihodlLZUJisjlgxgmhzEoos9KVrqS92V5XunJQutKVVFJZPC5xwi1WTGjK7OOkvbBJhL0VgVC6MindU2ZWNATCuUQ6l0q3Fz5M2oTHzViVRCoTOsImkfbS0xrSwxJhLz2t20s0NBxwwOL5CKQSNqnMSsOEFauSaEp4WCJt0l7YpHPhXCKQHneLg68nkEoiEQibVBIdgVlpSsOKkxJKKKGEh4W9tJf2QgklkD7chI4ZHZPPEx4Xzk32AolUmqfM3GFGQ7Np6Jg9bFLSXtpLTwt0zEoqi01iwoRZmXwdaS8Q9hKhNGVVfoE7hHKPwB2O6D5PeFp6WiqLvVRSmRA44AYLVnSfJ32/Ag0zAqvSlUAg0DF5WjoXNisC3blEQ9g0m6YETsoJgcCEVVmQSCWV1dO6Ekook3L0tAlp05SurLhDoikdgUA6l2g2iVQCgY5UAqGkvbAJJbB4WvNnZgKBFStulMTqcV1pNulcV8LD0rlAs+k2i720CefSJpxLe2EvPG1VJg+bsWBRJiQ6wudLX9akBGZlweJ5mnHCETdINJuGjhXN+6VzadOUpnQlkTaJRCKR6JiUho4bLJiwIpVUAoHmw6VziXAulFRSSSWVVCbcI5SO5mGhhL1A2GtIJWwCifCwRCKRCA9Lf2bmn+ENfojELQILuk1TQrlH4rWSStokmk0qabMqr5TFXkPHHSYs+Ble4xWONunc5FzahJJK2puQNmnvZO81Et8o79DxDX6Ov4fADxE42aRNKuFhqcw2qaSSCJt0bkaiIXFEIpXfwM/xl7AicMIJDc25QCqBdC6VSUklkTbNJp1rSMzKjfJT3OIPMOMb5YAFE17hP9oLe2kv7S3KCYF75aTcI3BUVmVBoGPBhAX/Fv/audXe6sOkkvZWD0tlUg7KnXKrTMpv4Me4U5q98OnCw8LjJh9j5h8aflUikUh0pSOR6EjlWyQSHXfoOCBxj8R3+Hf4F8oBicXLsGBFR8fJ8/af8Xv4fcz4BRK3WHDAT/A79sJeKqF0m8AtGhI3yo0y4YADJtxiwg0SM2YcsCqv8Tfwh1jxDokDTlixINDxDh2BBR0rEmnTkLhB4Eb5GQIzGt6g4RUCrxG4Q8MtArPyBg3/Bh3fYsUrfIsF91hwROKIBfc4IJUjOk4IpaGhY1ZuEJhxhwNmHLDioBwQSirhV838e/wV3CgTEisSHYmwSSwIHJVERyqJjkAi0ZFIdCROSqBjRcekJBKJxAEdf4SOWyQ6OhIdiUSioyPRkejoSHSsSCQSK7rS0ZFIdHQkDljwCyQCKw5InNBxQMc/QiLQMSORSCQ6OjpWJBIdKzoSiUSiI9HR0dGR6Eh0JBIdHU1ZseKIjhVdWfFDrHiHREPiHomOjo5EVzoSHakkOhKJjo5EIpFIpaMjlUQiEQgkOo4IBL7B7yPxc6TNAb+N/6I0D0sl7c2YcY8DTrjBPW5xjwkrDjghkJix4ICTcosJRyw2gcQrnHCHIwIn3GLBhAUHLEisaMoNAj9AwxsE/ioCv4mGGzT8Fhp+Bw1/GYGfIfAjNLx2rqPZHHGDBTNOaDjiFToCR9xgwQGpBBbMeIcDVtzgLW6RmJAIH6oRCE9Lm0Qq6cOlp6WSzqWSnhZKeFzYBAKBQCCUQCiBsAmETXi/9GkCgVACgUD4fqSnBQINgfDhwl4ikUhfRtqkks6F56Ojo3u/sEmbRCKV9HWk0u2lEvZSSQ8Lm1AmpWFC87DwMWa/tCgrupJIdHRlRWJFYEIilVRSCaSSSKSSeIPECYmGVBJHdNwjkej4CTp+gURHoiPRkUgkOjoSHR2pdKxIJDo6OhIdHYmOREfHO6xIJO7QMSHREfhTJH6CxJ8iEEglkfYSibSXzqWP962SWHFA4AYdCzr+CIkTErdINKS9RCCRNolEKolAIJBIJBKJRCCQSiKR+E4JdExKIvFH9m6Q+Cl+ij/0aRKJxAmJRVmVVTkpqSzKqjSbGxwRWBFIvFW+sfdOOSkdabMqRwS60hCYEZjRcEDDAQ0NzSYQaGhKR8OKhlQSgYMyKzfKa6VjxoTApIRNKKGkcofwfqmkEkjNL4WHBQKhBAJhEzaBsEmkD5NKIpW0SaRN+DSBsBc24XFhL+2lEjappL30cRJpk76sQCJtwia9XyqBQCAQCJtQAuFcIHyYRCqJ9GWFzxMIBAKBsBcuKz2uIdCU8HHCXnhcIpE+T/ozM29wZ5PoSqKhoysrEpOy2gTSwxJpE0ibZhNYlQmJGYkFiQmJWyQ6Eh2JjkQi0ZHoSHQkEh0dHYnEio5ER0eiI9HRcYOOGR0LEr9Axy0Sb5DoSPwMK/5E6WhIdDSbRFcCiVA6uk3aBDoCXUl0BBpeK4kVDakkAolE4g4diY5UAoGGbhMIdJtEINARSB8ukMobJI5oaEhMyrf2jsof4zW6T7Mila50exNW3OGIGyw4IHGLP8GKVZmwYrY3YcENTko6N2FxriNsGsImEGhoaGg2XVnR0G3C3orAghvc4xYLZhzRcI83mJTm/RoCs3KPW6yYsWDGEQcsStoLf6Z5UtiEh4WHhe9H+P6kD5O+H4n0fuFx6Vwq6csJJZE+XSihJBKJbi9swsPC+6X3S19H+Djp84WvKz0skL689LBUwmNmv9SVjo6mJDoWJdGRStgLJT0ukMq3SEzoaOhIZULDDTq+Q+ItEg2JjkRHoiORSHR0JBIdXelYkUh0dHQkEh0diY6OjrdI3KHjF8otVnR0JBIdiZ9jxa29dC6RSJv0tEB6v1RSuUdiRUdDIpSm3CORSHR0JDoSiUQi0dHRkUgl0ZFIJBKJjkQilURHYlYWJCZ0HBCY7S3KCd+h2Wv2FgTS3owZ73DAghvcoymJxAkd75RFeafM6AgEuk1XFpvEhNVmxoIbLFixelwgsCCwIm260pVE2nSPawg0BCZlUg4I5zoSCwIdgQNWzOhINGVGQyizMqOheUrzXolEIpFIJNKHSd+P8LjwuPR+4WFhE0oo4cMk0vulc4FAIJRAIHw9gUAgEAgfLxAINJ8nlUT6eOn5SS9D2ISSSirdx0t7gUAgEAjfl5kjOgIdgaakEpiQSAQ6AulcKoFEIJVEIhG4QSKVRNqs6OhINCRmJDoCaS+Q9gId6Vx6WCKRSKUjkbhDIpF4hURHoCsNHYmOO3R0JAINq/dLJe0FUkklkPYSqQQ6EokJXWnoNokFHQ2ppE0i0JFIJFLpaEgkGlJJJBKJVBKJVFIJLEjc2DQckQgkutJsbtHtdefSuQWhJMImlFBSaeg2B5yUQKLbNEw4IZDoSigzFizKW6RzicQ9Gk4IJZDo6EoqBwRu0DChYUJTOhpCSSWUriw4YEXgiBkdTZkRmOyF0nyY5kM0fy48Le2lki4rXVY4F4b/L30dgfDrIWzSr6fw4dKXNBMuJ11eKoFEIm0CoQQSgUB6WvgyAunTpL30sgVSCaQSSnpaU7pPtyj3yklZlbTX0G06ur1EYlVSWZTFwxpWzFjRlBmBN2j4AQIHNEwINDSbjsAJDfdouEfDHZrSlEmZlRvloEzKLRILDujOhb0FgRUHHJUVNzjigAUHhNKV5lc1wyMSYRNK2AsfJg1fQyC8XxheorQXCIRP0eyE4VeljxMI7xd+vSXS1xX2wpfXMeEOB7xGw61yUCZlsmloSnculUkJ5Ua5QWCx15VEoqOjo9skEiecsGLFihUd3WbChBvc4ICDp3VlUU7KCSveITAj0JRmk/YaGmblFSbcIHCLhglh09D8Rc3wBYXLSXvpXNqkvfDyhZcrvFzhpZgN/08ikUp4XNoLny58Gamkh6UPE16OdBmrsiodq7Iqq3JSunL04VLpyorEjMWmYbVJZUHghIYjAgc0TAhMaGhoNt3DVqyYsOAWK2abphyUg3KnNJuOxaZjxgmzTSiJsFkxYUVD2mt+VXP1wl7YpE+T3i98mlACYS8NHyMMv25SSaT3aQQS3V5DIpBIJZEIhMelTSLREehoCHthLzGhI5REINEQSJtQ0l4gEAglkQgEwl4glbTXEUiEkkiE0hHoCKQSWDEhbdJeINARSAQSDR2hpE3YCyQCgUQogUAglEAgkPYSiUR3Lp0LJRA2gXAulYb0tEAilFA6Eg0dTekIpBIIhE+3KiflqHQllFACgRs03OIGB0zKhAlpb1FWpaE5FwgEAg0NgcCMWUklbAJpE2hoaJgwYcKMCZMSSldSWZQViaO9CQ03uMEN7jDjFgdM9u7RcVJSaWhoaGho/qJGItAQCCURSiCUQCiJREcibcKmYcKEhkTHgkAglEAgEFjQlYaGUDrSJpRAIJBIdCQSiUDzuECgIdAQCCWQHhcIZUJDQ9isCAQCgbDXkUog0Gw6EmkvEEibRNrr6Eh0JBIdHc0m0NAQaM6FvY6Ojo6ORCKRSCQSqSRWBAKBsAmE0jBjQSqz0m0CE0IJJBLp+xNKKKGE0tAQCAQCgUDYNITHBQLhwyQS6XGBQNhLJBKJroQSSle6sippE2g+XChhLxA2iUQivc/MilS60pEIpJJIJAIdK5q9VFJJdCQ6AonAhFVJdHQkOhIzupJIJZA2iUQikUg0JELp6Eh0JDoSiUQikUgsSqIjEejoSCQSiUQikUglkUogkEgkEmlvRiCVjlQSoTSk0pRUEg2JQEPYJBKBjo5QEoluk0gkQgmEEmhIBBKBriS6kmhKKomOjkQikUgkEl3pWHCHE97hDboSSCWQSB+mKR2BVAITVgQSMxYccMSEBaGEkugIrFidOyGRSI+7t7cqK9K5CQ2hNAQa/m97cJQbR3qdAfTcv6pJyZMxMkBevEzvKs95y268AAexBcQWya7/C4SLoNDpFkVqNJrRqM4ZWrBhYKIwtScMPKHwFqUt2km701ZtsQuCBzzhhCf8gA2rS0HhPe6w4YSBwqqdUFhRdps2UZg+WCmtUChtYuCMYGKitIlohdgFQbBoGwqFgUJhINrQYje1IAgKCwpBUJjaRGlPmBgolGuFoBAUCkFhaBuCiUJ82tCCaEEhGAgmCoXYBcFEMO0GNgRTCyYmgsJEMLFhIgiGXeyC6VrsChNBtGhB7IIgmAiCqQUT0TZMDB83sGHBhonCv+DJrhBEmygMTM+bdrELppcpbWDDig0rzm4b2FBaIa4V4tMKhUKhUCgUCoXCwEAhWjARTEyUl4kWu0JhwcSCicJwrVyKNlyaWLBhuC3+z0rhrAWlbSgMFDYUhlba1AaCaANBYUEhKEwEE1MLYleItiDaGRPBWQuCiSAIggVlF5RWdoWgEK200iYK0YKBYKJQGJh2hYmhbVpcCoJgIhgoFBYtmFqhUC6VXWEgGChs2tSCaLE7I1oQxG5gYmBiIHZnlwpltyAIosVuQ7QgCILgDhve4h8oFB5wwoZyqTAQ3GlxqbQFsZsobcWCOwR32HCHM+5QWLHhHhP3CE74BxZMFAY23GPDCU/aEwqPuMMTzti0J6w4Y8HEtCvcoXBC4Ul7xMAjBh5QmCg8YWBiYKLwgOCEJyx4xB2ecMJ7vMUD7vCAgQf8KyYKhQ1nLHYLzlixYMWq/RN3mDjZLS5N7axNH6z8B35CUChtYsGGgQ3BgiBYMRDXgiAIgmDBGXdaadGCIFq0iWDTVky7IFoQbcPERLQTFkwUgiCYCKY2ERTOeIsNA8GGIAgmgiAIguAeK0qb2LRgQRBE2zAwcI+J4KwNTEQLJoJgorAiWmHTNsQuCILgjBUrgmkXbAgmogVB8FYLgmixixYE0QqrXeyCYOIR91rhET/g3/FOCwoTQfAOjz7fg/bg2/F37W/af6HwEwp/R+G/tXco/BWFv2o/ovBWu8OGO5zxFhtWPOIHnPEGZ6x41DacsOENNqwoTAw8YsF7PKKw4m844YwVTzjhESs27Uk7a/HByp9RCApBIShtYGoDE4W3WLSgXCstmFhQ+CPucHItdoWBiULhDn/EgmjRSotdtMI9fsQ9gkWLFi1aUCgE/4bCQGGxC2IXLJgYWLBiQSE4+bhCENzjJwwUJgaCIHaxe4N7/IBFG9gwPC844Q94o00UCsGiRYtd8CefFm0gCAZO+BGxKy0IhhaUdsaC/8Q7TAQD0YJ3KMTHDUQrTJcWFM5uK6206dIb7UGLVlphunavPbi0aAOFR7eV9hftL9q9Fu1Ri1baop1RKMQuLpU2UFgRLYhLZ7vYlTbsCpsWl0obLpUPVoYW16JNRAuiDfxBC8q1iUWbKO0t3mB6XrBgorSBgWEXlEvB0IJgYMGCDZtWLhUKGwpBsGJohU0ru9IKwcTE1CYGgqHFtaAQTARTO2PVohXKrvA/CN5o0TYsiGuFaA9YcNKCQmFiatHKpSctbhvYUBiYmFjsyrVCaUEhKKzaRBCXFmzYfFpcKi1eJl4mbptuK8THlY8rHxdtel7sgnheIVoQLYhWWlAobC6Va/F68cHKtIsWtxWmFqx25baBICi7RSsfFwzErhAsLpVrhWiFwhMWbFr5uKBQWtkFQbkWlwaCBcHQCvFpA0FphQWFoOxiF6woDK0wsWjlttIGTohdtEJcikvT8yaCwqYVgkI8r1wLCgOxm9rm5WIX1zYvE7e9d1s8773bNm3zvHcuRXvwvGiblyktCDZt83mm14m2uWX4xcVt8WnlEMTvWzl8TUF8XfFbtPrZ4usov47y2xGUb0t5nfI6cfhc8cuL37Lhq4oWX1d8++LXVa7Fz1daoewK5XD4JQ2vVr4/QXxZ5dsVX1b5cuJweKnhmxXEy8WXUyjfh0I5HH6Phq8idvFtK4cP4rclDofXGr6a+Hzl96Mc/r84HH4Nw4tEC0orL1corbxe/DyllTa9XFAoLXbxekEQL1coLT5P2Q2vE5RdIb6MoLSgtOl1yrU4HJ4zHA6Hw3dqOHwH4nA4XBsOv3HlcDj8MobDdySIw+HQhsM3LF4uDofDpeHwOxeHw+G24fANKIfD4csbvoogdoVCeZnSChML4vWCQiEorVAoFAqlFaIVgum2QrlUWqG0QiEoFMpthYnSFsTLDQQDQSGIlynPK5RrhbIrFAqFQmmFiUJQXi920YbD4Tmrb0Lsyq5QWlwqu7hULsXHFYJyW1yLXRAtiFZatLhtIgiCeJ0gWhAE0YafZ7otLgWxi7ZohdLK4fA1rH62eF65Fi0+LSjXCmVXPq7sSisUgnJbUHallVaIVnbltoGhDZRdPK8wMBCtfFowMDAwEASFzfMKQTDtgsLiecOlaNEmCtGCwobN5ymHw0usfnFB2UWL14tWKJQWL1Na2S2eFxSilVYIhl25LSgsWLWBIHZxW7BgwYpohfi0FSuCoQWFk+cNvMUbbHbBwGYXu9IWl8qlgUIwEO2MN14mKNfK4fCc/wWQn0TduldZ/gAAAABJRU5ErkJggg=="; TestRegister.addTests([ { diff --git a/tests/operations/tests/StrUtils.mjs b/tests/operations/tests/StrUtils.mjs index 70e9c362..a8962589 100644 --- a/tests/operations/tests/StrUtils.mjs +++ b/tests/operations/tests/StrUtils.mjs @@ -17,7 +17,7 @@ TestRegister.addTests([ "op": "Diff", "args": ["\\n\\n", "Character", true, true, false, false] } - ], + ] }, { name: "Diff added with subtraction, basic usage", @@ -28,7 +28,7 @@ TestRegister.addTests([ "op": "Diff", "args": ["\\n\\n", "Character", true, true, true, false] } - ], + ] }, { name: "Diff removed with subtraction, basic usage", @@ -39,7 +39,7 @@ TestRegister.addTests([ "op": "Diff", "args": ["\\n\\n", "Character", true, true, true, false] } - ], + ] }, { name: "Head 0", @@ -50,7 +50,7 @@ TestRegister.addTests([ "op": "Head", "args": ["Line feed", 0] } - ], + ] }, { name: "Head 1", @@ -61,7 +61,7 @@ TestRegister.addTests([ "op": "Head", "args": ["Line feed", 1] } - ], + ] }, { name: "Head 2", @@ -72,7 +72,7 @@ TestRegister.addTests([ "op": "Head", "args": ["Line feed", 2] } - ], + ] }, { name: "Head 6", @@ -83,7 +83,7 @@ TestRegister.addTests([ "op": "Head", "args": ["Line feed", 6] } - ], + ] }, { name: "Head big", @@ -94,7 +94,7 @@ TestRegister.addTests([ "op": "Head", "args": ["Line feed", 100] } - ], + ] }, { name: "Head all but 1", @@ -105,7 +105,7 @@ TestRegister.addTests([ "op": "Head", "args": ["Line feed", -1] } - ], + ] }, { name: "Head all but 2", @@ -116,7 +116,7 @@ TestRegister.addTests([ "op": "Head", "args": ["Line feed", -2] } - ], + ] }, { name: "Head all but 6", @@ -127,7 +127,7 @@ TestRegister.addTests([ "op": "Head", "args": ["Line feed", -6] } - ], + ] }, { name: "Head all but big", @@ -138,7 +138,7 @@ TestRegister.addTests([ "op": "Head", "args": ["Line feed", -100] } - ], + ] }, { name: "Tail 0", @@ -149,7 +149,7 @@ TestRegister.addTests([ "op": "Tail", "args": ["Line feed", 0] } - ], + ] }, { name: "Tail 1", @@ -160,7 +160,7 @@ TestRegister.addTests([ "op": "Tail", "args": ["Line feed", 1] } - ], + ] }, { name: "Tail 2", @@ -171,7 +171,7 @@ TestRegister.addTests([ "op": "Tail", "args": ["Line feed", 2] } - ], + ] }, { name: "Tail 6", @@ -182,7 +182,7 @@ TestRegister.addTests([ "op": "Tail", "args": ["Line feed", 6] } - ], + ] }, { name: "Tail big", @@ -193,7 +193,7 @@ TestRegister.addTests([ "op": "Tail", "args": ["Line feed", 100] } - ], + ] }, { name: "Tail all but 1", @@ -204,7 +204,7 @@ TestRegister.addTests([ "op": "Tail", "args": ["Line feed", -1] } - ], + ] }, { name: "Tail all but 2", @@ -215,7 +215,7 @@ TestRegister.addTests([ "op": "Tail", "args": ["Line feed", -2] } - ], + ] }, { name: "Tail all but 6", @@ -226,7 +226,7 @@ TestRegister.addTests([ "op": "Tail", "args": ["Line feed", -6] } - ], + ] }, { name: "Tail all but big", @@ -237,7 +237,7 @@ TestRegister.addTests([ "op": "Tail", "args": ["Line feed", -100] } - ], + ] }, { name: "Escape String: single quotes", @@ -248,29 +248,30 @@ TestRegister.addTests([ "op": "Escape string", "args": ["Special chars", "Single", false, true, false] } - ], + ] }, { name: "Escape String: double quotes", - input: "Hello \"World\"!", - expectedOutput: "Hello \\\"World\\\"!", + input: 'Hello "World"!', + expectedOutput: 'Hello \\"World\\"!', recipeConfig: [ { "op": "Escape string", "args": ["Special chars", "Double", false, true, false] } - ], + ] }, { name: "Escape String: special characters", - input: "Fizz & buzz\n\ttabbed newline\rcarriage returned line\nbackspace character: \"\" form feed character: \" \"", - expectedOutput: "Fizz & buzz\\n\\ttabbed newline\\rcarriage returned line\\nbackspace character: \\\"\\b\\\" form feed character: \\\"\\f\\\"", + input: 'Fizz & buzz\n\ttabbed newline\rcarriage returned line\nbackspace character: "" form feed character: " "', + expectedOutput: + 'Fizz & buzz\\n\\ttabbed newline\\rcarriage returned line\\nbackspace character: \\"\\b\\" form feed character: \\"\\f\\"', recipeConfig: [ { "op": "Escape string", "args": ["Special chars", "Double", false, true, false] } - ], + ] }, { name: "Unescape String: quotes", @@ -281,39 +282,42 @@ TestRegister.addTests([ "op": "Unescape string", "args": [] } - ], + ] }, { name: "Unescape String: special characters", - input: "Fizz \x26 buzz\\n\\ttabbed newline\\rcarriage returned line\\nbackspace character: \\\"\\b\\\" form feed character: \\\"\\f\\\"", - expectedOutput: "Fizz & buzz\n\ttabbed newline\rcarriage returned line\nbackspace character: \"\" form feed character: \" \"", + input: 'Fizz \x26 buzz\\n\\ttabbed newline\\rcarriage returned line\\nbackspace character: \\"\\b\\" form feed character: \\"\\f\\"', + expectedOutput: + 'Fizz & buzz\n\ttabbed newline\rcarriage returned line\nbackspace character: "" form feed character: " "', recipeConfig: [ { "op": "Unescape string", "args": [] } - ], + ] }, { name: "Escape String: complex", input: "null\0backspace\btab\tnewline\nverticaltab\vformfeed\fcarriagereturn\rdoublequote\"singlequote'hex\xa9unicode\u2665codepoint\u{1D306}", - expectedOutput: "null\\0backspace\\btab\\tnewline\\nverticaltab\\x0bformfeed\\fcarriagereturn\\rdoublequote\"singlequote\\'hex\\xa9unicode\\u2665codepoint\\u{1d306}", + expectedOutput: + "null\\0backspace\\btab\\tnewline\\nverticaltab\\x0bformfeed\\fcarriagereturn\\rdoublequote\"singlequote\\'hex\\xa9unicode\\u2665codepoint\\u{1d306}", recipeConfig: [ { "op": "Escape string", "args": ["Special chars", "Single", false, true, false] } - ], + ] }, { name: "Unescape String: complex", input: "null\\0backspace\\btab\\tnewline\\nverticaltab\\vformfeed\\fcarriagereturn\\rdoublequote\\\"singlequote\\'hex\\xa9unicode\\u2665codepoint\\u{1D306}", - expectedOutput: "null\0backspace\btab\tnewline\nverticaltab\vformfeed\fcarriagereturn\rdoublequote\"singlequote'hex\xa9unicode\u2665codepoint\u{1D306}", + expectedOutput: + "null\0backspace\btab\tnewline\nverticaltab\vformfeed\fcarriagereturn\rdoublequote\"singlequote'hex\xa9unicode\u2665codepoint\u{1D306}", recipeConfig: [ { "op": "Unescape string", "args": [] } - ], - }, + ] + } ]); diff --git a/tests/operations/tests/Subsection.mjs b/tests/operations/tests/Subsection.mjs index 6a181985..0d981fd4 100644 --- a/tests/operations/tests/Subsection.mjs +++ b/tests/operations/tests/Subsection.mjs @@ -15,9 +15,9 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Subsection", - "args": ["", true, true, false], - }, - ], + "args": ["", true, true, false] + } + ] }, { name: "Subsection, Full Merge: nothing", @@ -26,13 +26,13 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Subsection", - "args": ["", true, true, false], + "args": ["", true, true, false] }, { "op": "Merge", - "args": [true], - }, - ], + "args": [true] + } + ] }, { name: "Subsection, Partial Merge: nothing", @@ -41,13 +41,13 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Subsection", - "args": ["", true, true, false], + "args": ["", true, true, false] }, { "op": "Merge", - "args": [false], - }, - ], + "args": [false] + } + ] }, { name: "Subsection, Full Merge: Base64 with Hex", @@ -56,21 +56,21 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Subsection", - "args": ["386756", true, true, false], + "args": ["386756", true, true, false] }, { "op": "From Hex", - "args": ["Auto"], + "args": ["Auto"] }, { "op": "Merge", - "args": [true], + "args": [true] }, { "op": "From Base64", - "args": ["A-Za-z0-9+/=", true, false], - }, - ], + "args": ["A-Za-z0-9+/=", true, false] + } + ] }, { name: "Subsection, Partial Merge: Base64 with Hex surrounded by binary data.", @@ -79,24 +79,24 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Subsection", - "args": ["SGVsbG38675629ybGQ=", true, true, false], + "args": ["SGVsbG38675629ybGQ=", true, true, false] }, { "op": "Subsection", - "args": ["386756", true, true, false], + "args": ["386756", true, true, false] }, { "op": "From Hex", - "args": ["Auto"], + "args": ["Auto"] }, { "op": "Merge", - "args": [false], + "args": [false] }, { "op": "From Base64", - "args": ["A-Za-z0-9+/=", true, false], - }, - ], - }, + "args": ["A-Za-z0-9+/=", true, false] + } + ] + } ]); diff --git a/tests/operations/tests/SwapCase.mjs b/tests/operations/tests/SwapCase.mjs index 2506fc44..3f18cf3e 100644 --- a/tests/operations/tests/SwapCase.mjs +++ b/tests/operations/tests/SwapCase.mjs @@ -13,10 +13,9 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Swap case", - "args": [ - ], - }, - ], + "args": [] + } + ] }, { "name": "Swap Case: empty input", @@ -25,9 +24,8 @@ TestRegister.addTests([ "recipeConfig": [ { "op": "Swap case", - "args": [ - ], - }, - ], - }, + "args": [] + } + ] + } ]); diff --git a/tests/operations/tests/SymmetricDifference.mjs b/tests/operations/tests/SymmetricDifference.mjs index 8e589c1b..6ed1f71c 100644 --- a/tests/operations/tests/SymmetricDifference.mjs +++ b/tests/operations/tests/SymmetricDifference.mjs @@ -16,20 +16,21 @@ TestRegister.addTests([ recipeConfig: [ { op: "Symmetric Difference", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Symmetric Difference: wrong sample count", input: "1 2\n\n3 4 5\n\n3 4 5 6 7", - expectedOutput: "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", + expectedOutput: + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", recipeConfig: [ { op: "Symmetric Difference", - args: ["\n\n", " "], - }, - ], + args: ["\n\n", " "] + } + ] }, { name: "Symmetric Difference: item delimiter", @@ -38,9 +39,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Symmetric Difference", - args: ["\n\n", "_"], - }, - ], + args: ["\n\n", "_"] + } + ] }, { name: "Symmetric Difference: sample delimiter", @@ -49,8 +50,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "Symmetric Difference", - args: ["AAAAA", "_"], - }, - ], - }, + args: ["AAAAA", "_"] + } + ] + } ]); diff --git a/tests/operations/tests/TextEncodingBruteForce.mjs b/tests/operations/tests/TextEncodingBruteForce.mjs index dfc5073b..8314e3e9 100644 --- a/tests/operations/tests/TextEncodingBruteForce.mjs +++ b/tests/operations/tests/TextEncodingBruteForce.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Text Encoding Brute Force", - args: ["Encode"], - }, - ], + args: ["Encode"] + } + ] }, { name: "Text Encoding Brute Force - Decode", @@ -27,9 +27,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "Text Encoding Brute Force", - args: ["Decode"], - }, - ], + args: ["Decode"] + } + ] } ]); - diff --git a/tests/operations/tests/ToFromInsensitiveRegex.mjs b/tests/operations/tests/ToFromInsensitiveRegex.mjs index 1394bfe8..e1ee0e4f 100644 --- a/tests/operations/tests/ToFromInsensitiveRegex.mjs +++ b/tests/operations/tests/ToFromInsensitiveRegex.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "From Case Insensitive Regex: nothing", @@ -27,9 +27,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: simple test", @@ -38,9 +38,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "From Case Insensitive Regex: simple test", @@ -49,9 +49,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "From Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: [A-Z] -> [A-Za-z]", @@ -60,9 +60,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: [a-z] -> [A-Za-z]", @@ -71,9 +71,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: [H-d] -> [A-DH-dh-z]", @@ -82,9 +82,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: [!-D] -> [!-Da-d]", @@ -93,9 +93,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: [%-^] -> [%-^a-z]", @@ -104,9 +104,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: [K-`] -> [K-`k-z]", @@ -115,9 +115,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: [[-}] -> [[-}A-Z]", @@ -126,9 +126,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: [b-}] -> [b-}B-Z]", @@ -137,9 +137,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: [<-j] -> [<-z]", @@ -148,9 +148,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: [^-j] -> [A-J^-j]", @@ -159,20 +159,21 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: not simple test", input: "Mozilla[A-Z0-9]+[A-Z]Mozilla[0-9whatA-Z][H-d][!-H][a-~](.)+", - expectedOutput: "[mM][oO][zZ][iI][lL][lL][aA][A-Za-z0-9]+[A-Za-z][mM][oO][zZ][iI][lL][lL][aA][0-9[wW][hH][aA][tT]A-Za-z][A-DH-dh-z][!-Ha-h][a-~A-Z](.)+", + expectedOutput: + "[mM][oO][zZ][iI][lL][lL][aA][A-Za-z0-9]+[A-Za-z][mM][oO][zZ][iI][lL][lL][aA][0-9[wW][hH][aA][tT]A-Za-z][A-DH-dh-z][!-Ha-h][a-~A-Z](.)+", recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] }, { name: "To Case Insensitive Regex: erroneous test", @@ -181,8 +182,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "To Case Insensitive Regex", - args: [], - }, - ], + args: [] + } + ] } ]); diff --git a/tests/operations/tests/TranslateDateTimeFormat.mjs b/tests/operations/tests/TranslateDateTimeFormat.mjs index 571fe0e5..ffecb1c4 100644 --- a/tests/operations/tests/TranslateDateTimeFormat.mjs +++ b/tests/operations/tests/TranslateDateTimeFormat.mjs @@ -16,9 +16,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Translate DateTime Format", - args: ["Standard date and time", "DD/MM/YYYY HH:mm:ss", "UTC", "dddd Do MMMM YYYY HH:mm:ss Z z", "UTC"], - }, - ], + args: ["Standard date and time", "DD/MM/YYYY HH:mm:ss", "UTC", "dddd Do MMMM YYYY HH:mm:ss Z z", "UTC"] + } + ] }, { name: "Translate DateTime Format: invalid input", @@ -27,9 +27,9 @@ TestRegister.addTests([ recipeConfig: [ { op: "Translate DateTime Format", - args: ["Standard date and time", "DD/MM/YYYY HH:mm:ss", "UTC", "dddd Do MMMM YYYY HH:mm:ss Z z", "UTC"], - }, - ], + args: ["Standard date and time", "DD/MM/YYYY HH:mm:ss", "UTC", "dddd Do MMMM YYYY HH:mm:ss Z z", "UTC"] + } + ] }, { name: "Translate DateTime Format: timezone conversion", @@ -38,9 +38,15 @@ TestRegister.addTests([ recipeConfig: [ { op: "Translate DateTime Format", - args: ["Standard date and time", "DD/MM/YYYY HH:mm:ss", "UTC", "dddd Do MMMM YYYY HH:mm:ss Z z", "US/Eastern"], - }, - ], + args: [ + "Standard date and time", + "DD/MM/YYYY HH:mm:ss", + "UTC", + "dddd Do MMMM YYYY HH:mm:ss Z z", + "US/Eastern" + ] + } + ] }, { name: "Translate DateTime Format: automatic input format", @@ -49,9 +55,8 @@ TestRegister.addTests([ recipeConfig: [ { op: "Translate DateTime Format", - args: ["Automatic", "", "UTC", "dddd Do MMMM YYYY HH:mm:ss Z z", "UTC"], - }, - ], + args: ["Automatic", "", "UTC", "dddd Do MMMM YYYY HH:mm:ss Z z", "UTC"] + } + ] } ]); - diff --git a/tests/operations/tests/Typex.mjs b/tests/operations/tests/Typex.mjs index f7f3d757..20b60ea5 100644 --- a/tests/operations/tests/Typex.mjs +++ b/tests/operations/tests/Typex.mjs @@ -18,18 +18,29 @@ TestRegister.addTests([ "op": "Typex", "args": [ "MCYLPQUVRXGSAOWNBJEZDTFKHI - src.replace("if (pixelSize < elementMinSize)", "if (false)") + modify: (src, path) => src.replace("if (pixelSize < elementMinSize)", "if (false)") } ] }) @@ -98,7 +99,7 @@ module.exports = { resolve: { extensions: [".mjs", ".js", ".json"], // Allows importing files without extensions alias: { - jquery: "jquery/src/jquery", + jquery: "jquery/src/jquery" }, fallback: { "fs": false, @@ -170,25 +171,27 @@ module.exports = { } }, "css-loader", - "postcss-loader", + "postcss-loader" ] }, { test: /\.(ico|eot|ttf|woff|woff2)$/, - type: "asset/resource", + type: "asset/resource" }, { test: /\.svg$/, - type: "asset/inline", + type: "asset/inline" }, - { // Store font .fnt and .png files in a separate fonts folder + { + // Store font .fnt and .png files in a separate fonts folder test: /(\.fnt$|bmfonts\/.+\.png$)/, type: "asset/resource", generator: { filename: "assets/fonts/[name][ext]" } }, - { // First party images are saved as files to be cached + { + // First party images are saved as files to be cached test: /\.(png|jpg|gif)$/, exclude: /(node_modules|bmfonts)/, type: "asset/resource", @@ -196,11 +199,12 @@ module.exports = { filename: "images/[name][ext]" } }, - { // Third party images are inlined + { + // Third party images are inlined test: /\.(png|jpg|gif)$/, exclude: /web\/static/, - type: "asset/inline", - }, + type: "asset/inline" + } ] }, stats: {