} The project name
- */
-async function getProjectTitle(lesson) {
- const yamlString = lesson.match(/(?<=---\n).*?(?=---\n)/s)?.[0];
- const yaml = await jsyaml.load(yamlString);
- return yaml.title;
-}
-
-/**
- * Gets all content within a lesson
- * @param {string} dir - The relative path to the english locale file
- * @param {number} lessonNumber - The number of the lesson
- * @returns {string} The content of the lesson
- */
-function getLessonFromDirectory(dir, lessonNumber) {
- // get lesson file contents from directory, that matches `problem-${lessonNumber}-`
- const lessonFile = fs
- .readdirSync(dir)
- .find(file => file.includes(`problem-${lessonNumber}-`));
- const lessonFilePath = `${dir}/${lessonFile}`;
- const lesson = fs.readFileSync(lessonFilePath, 'utf8');
- return lesson;
-}
-
-/**
- * Gets the description of the lesson
- * @param {string} lesson - The lesson content
- * @returns {string} The description of the lesson
- */
-function getLessonDescription(lesson) {
- const description = lesson.match(
- new RegExp(`${DESCRIPTION_MARKER}\n(.*?)\n(?=${NEXT_MARKER})`, 's')
- )?.[1];
- return description;
-}
-
-/**
- * Gets the hints and tests of the lesson
- * @param {string} lesson - The lesson content
- * @returns {[string, string]} An array of [hint, test]
- */
-function getLessonHintsAndTests(lesson) {
- const testsString = lesson.trim().split(NEXT_MARKER)?.[2];
- const hintsAndTestsArr = [];
- const hints = testsString?.match(/^(.*?)$(?=\n+```js)/gm).filter(Boolean);
- const tests = testsString.match(/(?<=```js\n).*?(?=\n```)/gms);
-
- if (hints?.length) {
- for (let i = 0; i < hints.length; i++) {
- hintsAndTestsArr.push([hints[i], tests[i]]);
- }
- }
- return hintsAndTestsArr;
-}
-
-/**
- * Gets the seed of the lesson. If none is found, returns `''`.
- * @param {string} lesson - The lesson content
- * @returns {string} The seed of the lesson
- */
-function getLessonSeed(lesson) {
- const seed = lesson.match(new RegExp(`${SEED_MARKER}\n(.*)`, 's'))?.[1];
- return seed ?? '';
-}
-
-/**
- * Gets any commands of the lesson seed. If none is found, returns an empty array.
- * @param {string} seed - The seed content
- * @returns {string[]} The commands of the lesson in order
- */
-function getCommands(seed) {
- const cmds = seed.match(new RegExp(`${CMD_MARKER}\n(.*?\`\`\`\n)`, 'gs'));
- const commands = cmds?.map(cmd => extractStringFromCode(cmd)?.trim());
- return commands ?? [];
-}
-
-/**
- * Gets any seed for specified files of the lesson seed. If none is found, returns an empty array.
- * @param {string} seed - The seed content
- * @returns {[string, string][]} [[filePath, fileSeed]]
- */
-function getFilesWithSeed(seed) {
- // eslint-disable-next-line no-control-regex
- const files = seed.match(new RegExp('#### --"([^"]+)"--\n(.*?```\n)', 'gs'));
- const filePaths = seed.match(new RegExp(FILE_MARKER_REG, 'gsm'));
- const fileSeeds = files?.map(file => extractStringFromCode(file)?.trim());
-
- // console.log(filePaths, fileSeeds, files);
- const pathAndSeedArr = [];
- if (filePaths?.length) {
- for (let i = 0; i < filePaths.length; i++) {
- pathAndSeedArr.push([filePaths[i], fileSeeds[i]]);
- }
- }
- return pathAndSeedArr;
-}
-
-/**
- * Returns `boolean` for if lesson seed contains `force` flag
- * @param {string} seed - The seed content
- * @returns {boolean} Whether the seed has the `force` flag
- */
-function isForceFlag(seed) {
- return seed.includes('#### --force--');
-}
-
-/**
- * Returns a string stripped from the input codeblock
- * @param {string} code - The codeblock to strip
- * @returns {string} The stripped codeblock
- */
-function extractStringFromCode(code) {
- return code.replace(/.*?```[a-z]+\n(.*?)\n```/s, '$1');
-}
-
-// ----------------
-// EXPORT
-// ----------------
-module.exports = {
- getLessonFromDirectory,
- getLessonDescription,
- getLessonHintsAndTests,
- getLessonSeed,
- getCommands,
- getFilesWithSeed,
- getProjectTitle,
- isForceFlag
-};
diff --git a/.freeCodeCamp/tooling/server.js b/.freeCodeCamp/tooling/server.js
deleted file mode 100644
index ada90e5..0000000
--- a/.freeCodeCamp/tooling/server.js
+++ /dev/null
@@ -1,77 +0,0 @@
-const express = require('express');
-const runTests = require('./test');
-const { readEnv, updateEnv } = require('./env');
-
-const { WebSocketServer } = require('ws');
-const runLesson = require('./lesson');
-const { updateTests } = require('./client-socks');
-
-const app = express();
-
-// Send './output/' as static
-app.use(express.static('./output'));
-app.use(express.static('./node_modules/marked'));
-
-function handleRunTests(ws, _data) {
- const { CURRENT_PROJECT, CURRENT_LESSON } = readEnv();
- runTests(ws, CURRENT_PROJECT, Number(CURRENT_LESSON));
-}
-
-function handleResetProject(_ws, _data) {}
-
-function handleGoToNextLesson(ws, _data) {
- const { CURRENT_LESSON, CURRENT_PROJECT } = readEnv();
- const nextLesson = Number(CURRENT_LESSON) + 1;
- updateEnv({ CURRENT_LESSON: nextLesson });
- runLesson(ws, CURRENT_PROJECT, nextLesson);
- updateTests(ws, '');
-}
-
-function handleGoToPreviousLesson(ws, _data) {
- const { CURRENT_LESSON, CURRENT_PROJECT } = readEnv();
- const prevLesson = Number(CURRENT_LESSON) - 1;
- updateEnv({ CURRENT_LESSON: prevLesson });
- runLesson(ws, CURRENT_PROJECT, prevLesson);
- updateTests(ws, '');
-}
-
-function handleConnect(ws) {
- const { CURRENT_PROJECT, CURRENT_LESSON } = readEnv();
- runLesson(ws, CURRENT_PROJECT, CURRENT_LESSON);
-}
-
-const server = app.listen(8080, () => {
- console.log('Listening on port 8080');
-});
-
-const handle = {
- connect: (ws, _data) => {
- handleConnect(ws);
- },
- 'run-tests': handleRunTests,
- 'reset-project': handleResetProject,
- 'go-to-next-lesson': handleGoToNextLesson,
- 'go-to-previous-lesson': handleGoToPreviousLesson
-};
-
-const wss = new WebSocketServer({ server });
-
-wss.on('connection', function connection(ws) {
- ws.on('message', function message(data) {
- const parsedData = parseBuffer(data);
- handle[parsedData.event]?.(ws, parsedData);
- });
- sock('connect', { message: "Server says 'Hello!'" });
-
- function sock(type, data = {}) {
- ws.send(parse({ event: type, data }));
- }
-});
-
-function parse(obj) {
- return JSON.stringify(obj);
-}
-
-function parseBuffer(buf) {
- return JSON.parse(buf.toString());
-}
diff --git a/.freeCodeCamp/tooling/t.js b/.freeCodeCamp/tooling/t.js
deleted file mode 100644
index de9c727..0000000
--- a/.freeCodeCamp/tooling/t.js
+++ /dev/null
@@ -1,23 +0,0 @@
-const { readEnv } = require('./env');
-
-const LOCALE = readEnv('.meta').LOCALE;
-
-function t(key, args = {}, forceLangToUse) {
- const loc = readEnv().LOCALE;
- // Get key from ./locales/{locale}/comments.json
- // Read file and parse JSON
- const locale = forceLangToUse ?? loc === 'undefined' ? 'english' : loc;
- const comments = require(`./locales/${locale}/comments.json`);
-
- // Get value from JSON
- const value = comments[key];
- // Replace placeholders in value with args
- const result =
- Object.values(args)?.length > 0
- ? value.replace(/\{\{(\w+)\}\}/g, (_, m) => args[m])
- : value;
- // Return value
- return result;
-}
-
-module.exports = { t, LOCALE };
diff --git a/.freeCodeCamp/tooling/test-utils.js b/.freeCodeCamp/tooling/test-utils.js
deleted file mode 100644
index 823f909..0000000
--- a/.freeCodeCamp/tooling/test-utils.js
+++ /dev/null
@@ -1,89 +0,0 @@
-// TODO: This file has some helper functions to make testing FUN!
-const fs = require('fs');
-const util = require('util');
-const path = require('path');
-const execute = util.promisify(require('child_process').exec);
-
-const ROOT = '.';
-
-async function getDirectory(path) {
- const files = await fs.promises.readdir(`${ROOT}/${path}`);
- return files;
-}
-
-/**
- * Checks if file is open in VSCode editor
- * @param {string} path Path to file
- * @returns {boolean}
- */
-async function isFileOpen(_path) {
- // TODO: Probably not possible
- await new Promise(resolve => setTimeout(resolve, 10000));
- return true;
-}
-
-async function getTerminalOutput() {
- const pathToTerminalLogs = path.join(`${ROOT}/.logs/.terminal-out.log`);
- const terminalLogs = await fs.promises.readFile(pathToTerminalLogs, 'utf8');
-
- if (!terminalLogs) {
- throw new Error('No terminal logs found');
- }
-
- return terminalLogs;
-}
-
-/**
- * Returns stdout of a command called from a given path
- * @param {string} command
- * @param {string} path Path relative to curriculum folder
- * @returns
- */
-async function getCommandOutput(command, path = '') {
- const { stdout } = await execute(command, {
- cwd: `${ROOT}/${path}`,
- shell: '/bin/bash'
- });
- return stdout;
-}
-
-/**
- * TODO
- */
-async function getLastCommand(howManyBack = 0) {
- const pathToBashLogs = path.join(`${ROOT}/.logs/.bash_history`);
- const bashLogs = await fs.promises.readFile(pathToBashLogs, 'utf8');
-
- if (!bashLogs) {
- throw new Error(`Could not find ${pathToBashLogs}`);
- }
-
- const logs = bashLogs.split('\n');
- const lastLog = logs[logs.length - howManyBack - 2];
-
- return lastLog;
-}
-
-// TODO: Do not return whole file
-async function getCWD() {
- const pathToCWD = path.join(`${ROOT}/.logs/.cwd`);
- const cwd = await fs.promises.readFile(pathToCWD, 'utf8');
- return cwd;
-}
-
-async function getFile(path) {
- const file = await fs.promises.readFile(`${ROOT}/${path}`, 'utf8');
- return file;
-}
-
-const __helpers = {
- getDirectory,
- isFileOpen,
- getFile,
- getTerminalOutput,
- getCommandOutput,
- getLastCommand,
- getCWD
-};
-
-module.exports = __helpers;
diff --git a/.freeCodeCamp/tooling/test.js b/.freeCodeCamp/tooling/test.js
deleted file mode 100644
index ba69dbf..0000000
--- a/.freeCodeCamp/tooling/test.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/* eslint-disable no-unused-vars */
-// IMPORTS
-const fs = require('fs');
-// These are used in the local scope of the `eval` in `runTests`
-const assert = require('chai').assert;
-const __helpers = require('./test-utils');
-
-let wasm = {};
-
-const {
- getLessonHintsAndTests,
- getLessonFromDirectory
-} = require('./parser.js');
-
-const { t, LOCALE } = require('./t');
-const { updateEnv, PATH } = require('./env.js');
-const runLesson = require('./lesson');
-const { toggleLoaderAnimation, updateTests } = require('./client-socks');
-
-async function runTests(ws, project, lessonNumber) {
- const wasmBuffer = fs.readFileSync('../pkg/curriculum_bg.wasm');
- WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
- // Exported function live under instance.exports
- wasm = wasmModule.instance.exports;
- Object.entries(wasm).forEach(([id, func]) => {
- global[id] = func;
- });
- });
- const locale = LOCALE === 'undefined' ? 'english' : LOCALE;
- toggleLoaderAnimation(ws);
- try {
- const projectDir = `${PATH}/tooling/locales/${locale}/${project}`;
- const lesson = getLessonFromDirectory(projectDir, lessonNumber);
- const hintsAndTestsArr = getLessonHintsAndTests(lesson);
-
- const testPromises = hintsAndTestsArr.map(async ([hint, test]) => {
- try {
- const _testOutput = await eval(`(async () => {${test}})();`);
- } catch (e) {
- return Promise.reject(`- ${hint}\n`);
- }
- return Promise.resolve();
- });
-
- try {
- const passed = await Promise.all(testPromises);
- if (passed) {
- console.log(t('lesson-correct', { lessonNumber }));
- updateEnv({ CURRENT_LESSON: lessonNumber + 1 });
- runLesson(ws, project, lessonNumber + 1);
- updateTests(ws, '');
- }
- } catch (e) {
- // console.log(e);
- updateTests(ws, e);
- }
- } catch (e) {
- console.log(t('tests-error'));
- console.log(e);
- } finally {
- toggleLoaderAnimation(ws);
- }
-}
-
-module.exports = runTests;
diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml
deleted file mode 100644
index ea43832..0000000
--- a/.github/workflows/linter.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-name: Linter
-on:
- push:
- branches-ignore:
- - "renovate/**"
- pull_request:
-jobs:
- lint:
- name: Lint
- runs-on: ubuntu-20.04
-
- strategy:
- fail-fast: false
- matrix:
- node-version: [16.x]
-
- steps:
- - name: Checkout Source Files
- uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2
-
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3
- with:
- node-version: ${{ matrix.node-version }}
- cache: "npm"
-
- - name: Lint Source Files
- run: |
- cd .freeCodeCamp
- npm ci
- npm run lint
diff --git a/.gitpod.yml b/.gitpod.yml
index 5c7cabf..051d207 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -2,7 +2,8 @@ image: gitpod/workspace-full
# Commands to start on workspace startup
tasks:
- - init: cd .freeCodeCamp && cp sample.env .env && npm ci && cd ../ && npm ci && cargo install wasm-pack && npm run build
+ - init: npm ci && cargo install wasm-pack
+ - command: node tooling/adjust-url.js
ports:
- port: 8080
@@ -10,22 +11,5 @@ ports:
vscode:
extensions:
- - https://github.com/freeCodeCamp/courses-vscode-extension/releases/download/v1.1.1/freecodecamp-courses-patch.vsix
+ - https://github.com/freeCodeCamp/courses-vscode-extension/releases/download/v3.0.0/freecodecamp-courses-3.0.0.vsix
- https://github.com/freeCodeCamp/freecodecamp-dark-vscode-theme/releases/download/v1.0.0/freecodecamp-dark-vscode-theme-1.0.0.vsix
-
-github:
- prebuilds:
- # enable for the default branch (defaults to true)
- master: false
- # enable for all branches in this repo (defaults to false)
- branches: false
- # enable for pull requests coming from this repo (defaults to true)
- pullRequests: false
- # enable for pull requests coming from forks (defaults to false)
- pullRequestsFromForks: false
- # add a check to pull requests (defaults to true)
- addCheck: false
- # add a "Review in Gitpod" button as a comment to pull requests (defaults to false)
- addComment: false
- # add a "Review in Gitpod" button to the pull request's description (defaults to false)
- addBadge: false
diff --git a/.logs/.bash_history b/.logs/.bash_history
deleted file mode 100644
index 8b13789..0000000
--- a/.logs/.bash_history
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/.logs/.cwd b/.logs/.cwd
deleted file mode 100644
index e69de29..0000000
diff --git a/.logs/.next_command b/.logs/.next_command
deleted file mode 100644
index e69de29..0000000
diff --git a/.logs/.temp.log b/.logs/.temp.log
deleted file mode 100644
index e69de29..0000000
diff --git a/.logs/.terminal-out.log b/.logs/.terminal-out.log
deleted file mode 100644
index e69de29..0000000
diff --git a/.vscode/euler-rust-gitpod.png b/.vscode/euler-rust-gitpod.png
index 9db8203..945da8d 100644
Binary files a/.vscode/euler-rust-gitpod.png and b/.vscode/euler-rust-gitpod.png differ
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 3cb544f..83409ec 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,20 +1,36 @@
{
"files.exclude": {
- ".devcontainer": true,
- ".github": true,
- ".vscode": true,
- ".gitpod.yml": true,
- "renovate.json": true,
- ".freeCodeCamp": true,
- ".logs": true,
- "**/.DS_Store": true,
- "**/.git": true,
- "**/.hg": true,
- "**/.svn": true,
- "**/CVS": true,
- "Dockerfile": true,
- "LICENSE": true
+ ".devcontainer": false,
+ ".editorconfig": false,
+ ".freeCodeCamp": false,
+ ".gitignore": false,
+ ".gitpod.Dockerfile": false,
+ ".gitpod.yml": false,
+ ".logs": false,
+ ".prettierignore": false,
+ ".prettierrc": false,
+ ".vscode": false,
+ "node_modules": false,
+ "package.json": false,
+ "package-lock.json": false,
+ "LICENSE": false,
+ "README.md": false,
+ "renovate.json": false,
+ "build-x-using-y": false,
+ "learn-freecodecamp-os": false,
+ "project-euler-problems-1-to-100": false
},
- "workbench.startupEditor": "none",
+ "terminal.integrated.defaultProfile.linux": "bash",
+ "freecodecamp-courses.autoStart": true,
+ "freecodecamp-courses.scripts.develop-course": "NODE_ENV=development npm run start",
+ "freecodecamp-courses.scripts.run-course": "NODE_ENV=production npm run start",
+ "freecodecamp-courses.workspace.previews": [
+ {
+ "open": true,
+ "url": "http://localhost:8080",
+ "showLoader": true,
+ "timeout": 4000
+ }
+ ],
"workbench.colorTheme": "freeCodeCamp Dark Theme"
}
diff --git a/Cargo.lock b/Cargo.lock
deleted file mode 100644
index b9986a1..0000000
--- a/Cargo.lock
+++ /dev/null
@@ -1,126 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "bumpalo"
-version = "3.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "curriculum"
-version = "0.1.0"
-dependencies = [
- "wasm-bindgen",
-]
-
-[[package]]
-name = "log"
-version = "0.4.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66"
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.36"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029"
-dependencies = [
- "unicode-xid",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "syn"
-version = "1.0.86"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-xid",
-]
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
-
-[[package]]
-name = "wasm-bindgen"
-version = "0.2.84"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
-dependencies = [
- "cfg-if",
- "wasm-bindgen-macro",
-]
-
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.84"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
-dependencies = [
- "bumpalo",
- "log",
- "once_cell",
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.84"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
-dependencies = [
- "quote",
- "wasm-bindgen-macro-support",
-]
-
-[[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.84"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-backend",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.84"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
diff --git a/Dockerfile b/Dockerfile
index 75de00d..6cee09e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,50 +1,5 @@
-FROM ubuntu
+FROM gitpod/workspace-full:2024-01-17-19-15-31
-ARG USERNAME=camper
-ARG HOMEDIR=/home/$USERNAME
+WORKDIR /workspace/euler-rust
-ENV TZ="America/New_York"
-
-RUN apt update && apt install -y sudo
-
-# Unminimize Ubuntu to restore man pages
-RUN yes | unminimize
-
-# Set up timezone
-RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
-
-# Set up user, disable pw, and add to sudo group
-RUN adduser --disabled-password \
- --gecos '' ${USERNAME}
-
-RUN adduser ${USERNAME} sudo
-
-RUN sudo usermod -aG root ${USERNAME}
-
-RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> \
- /etc/sudoers
-
-
-# Install packages for projects - Docker for testing
-RUN sudo apt-get install -y curl git bash-completion man-db docker wget build-essential
-
-# Install Rust for this project
-RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
-ENV PATH="/root/.cargo/bin:${PATH}"
-
-# Install Node LTS
-RUN curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
-RUN sudo apt-get install -y nodejs
-
-# /usr/lib/node_modules is owned by root, so this creates a folder ${USERNAME}
-# can use for npm install --global
-WORKDIR ${HOMEDIR}
-RUN mkdir ~/.npm-global
-RUN npm config set prefix '~/.npm-global'
-
-# Configure course-specific environment
-RUN mkdir curriculum
-COPY ./ ./curriculum/
-WORKDIR ${HOMEDIR}/curriculum
-
-RUN cd .freeCodeCamp && cp sample.env .env && npm ci && cd ../ && npm ci && cargo install wasm-pack && npm run build
+COPY --chown=gitpod:gitpod . .
diff --git a/README.md b/README.md
index cb041a8..87e463f 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# freeCodeCamp - Project Euler with Rust
-## Course Desciption
+## Course Description
This enables you to complete the [Project Euler](https://projecteuler.net/) problems in Rust.
diff --git a/config/projects.json b/config/projects.json
new file mode 100644
index 0000000..5945dee
--- /dev/null
+++ b/config/projects.json
@@ -0,0 +1,57 @@
+[
+ {
+ "id": 0,
+ "dashedName": "project-euler-problems-1-to-100",
+ "isIntegrated": false,
+ "isPublic": true,
+ "currentLesson": 0,
+ "runTestsOnWatch": false,
+ "seedEveryLesson": false,
+ "isResetEnabled": false,
+ "numberOfLessons": 100
+ },
+ {
+ "id": 1,
+ "dashedName": "project-euler-problems-101-to-200",
+ "isIntegrated": false,
+ "isPublic": true,
+ "currentLesson": 0,
+ "runTestsOnWatch": false,
+ "seedEveryLesson": false,
+ "isResetEnabled": false,
+ "numberOfLessons": 100
+ },
+ {
+ "id": 2,
+ "dashedName": "project-euler-problems-201-to-300",
+ "isIntegrated": false,
+ "isPublic": true,
+ "currentLesson": 0,
+ "runTestsOnWatch": false,
+ "seedEveryLesson": false,
+ "isResetEnabled": false,
+ "numberOfLessons": 100
+ },
+ {
+ "id": 3,
+ "dashedName": "project-euler-problems-301-to-400",
+ "isIntegrated": false,
+ "isPublic": true,
+ "currentLesson": 0,
+ "runTestsOnWatch": false,
+ "seedEveryLesson": false,
+ "isResetEnabled": false,
+ "numberOfLessons": 100
+ },
+ {
+ "id": 4,
+ "dashedName": "project-euler-problems-401-to-480",
+ "isIntegrated": false,
+ "isPublic": true,
+ "currentLesson": 0,
+ "runTestsOnWatch": false,
+ "seedEveryLesson": false,
+ "isResetEnabled": false,
+ "numberOfLessons": 80
+ }
+]
\ No newline at end of file
diff --git a/config/state.json b/config/state.json
new file mode 100644
index 0000000..2746624
--- /dev/null
+++ b/config/state.json
@@ -0,0 +1,8 @@
+{
+ "currentProject": "project-euler-problems-1-to-100",
+ "locale": "english",
+ "lastSeed": {
+ "projectDashedName": null,
+ "lessonNumber": -1
+ }
+}
\ No newline at end of file
diff --git a/curriculum/locales/english/project-euler-problems-1-to-100.md b/curriculum/locales/english/project-euler-problems-1-to-100.md
new file mode 100644
index 0000000..b086c67
--- /dev/null
+++ b/curriculum/locales/english/project-euler-problems-1-to-100.md
@@ -0,0 +1,4798 @@
+# Project Euler in Rust: 1 to 100
+
+Complete the freeCodeCamp Project Euler problems in the Rust programming language using WebAssembly.
+
+## 0
+
+### --description--
+
+If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
+
+Find the sum of all the multiples of 3 or 5 below the provided parameter value `number`.
+
+### --tests--
+
+`multiplesOf3Or5(10)` should return a number.
+
+```js
+assert(typeof multiplesOf3Or5(10) === 'number');
+```
+
+`multiplesOf3Or5(49)` should return 543.
+
+```js
+assert.strictEqual(multiplesOf3Or5(49), 543);
+```
+
+`multiplesOf3Or5(1000)` should return 233168.
+
+```js
+assert.strictEqual(multiplesOf3Or5(1000), 233168);
+```
+
+`multiplesOf3Or5(8456)` should return 16687353.
+
+```js
+assert.strictEqual(multiplesOf3Or5(8456), 16687353);
+```
+
+`multiplesOf3Or5(19564)` should return 89301183.
+
+```js
+assert.strictEqual(multiplesOf3Or5(19564), 89301183);
+```
+
+## 1
+
+### --description--
+
+Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
+
+1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
+
+By considering the terms in the Fibonacci sequence whose values do not exceed `n`, find the sum of the even-valued terms.
+
+### --tests--
+
+`fiboEvenSum(10)` should return a number.
+
+```js
+assert(typeof fiboEvenSum(10) === 'number');
+```
+
+Your function should return an even value.
+
+```js
+assert.equal(fiboEvenSum(10) % 2 === 0, true);
+```
+
+Your function should sum the even-valued Fibonacci numbers: `fiboEvenSum(8)` should return 10.
+
+```js
+assert.strictEqual(fiboEvenSum(8), 10);
+```
+
+`fiboEvenSum(10)` should return 10.
+
+```js
+assert.strictEqual(fiboEvenSum(10), 10);
+```
+
+`fiboEvenSum(34)` should return 44.
+
+```js
+assert.strictEqual(fiboEvenSum(34), 44);
+```
+
+`fiboEvenSum(60)` should return 44.
+
+```js
+assert.strictEqual(fiboEvenSum(60), 44);
+```
+
+`fiboEvenSum(1000)` should return 798.
+
+```js
+assert.strictEqual(fiboEvenSum(1000), 798);
+```
+
+`fiboEvenSum(100000)` should return 60696.
+
+```js
+assert.strictEqual(fiboEvenSum(100000), 60696);
+```
+
+`fiboEvenSum(4000000)` should return 4613732.
+
+```js
+assert.strictEqual(fiboEvenSum(4000000), 4613732);
+```
+
+## 2
+
+### --description--
+
+The prime factors of 13195 are 5, 7, 13 and 29.
+
+What is the largest prime factor of the given `number`?
+
+### --tests--
+
+`largestPrimeFactor(2)` should return a number.
+
+```js
+assert(typeof largestPrimeFactor(2) === 'number');
+```
+
+`largestPrimeFactor(2)` should return 2.
+
+```js
+assert.strictEqual(largestPrimeFactor(2), 2);
+```
+
+`largestPrimeFactor(3)` should return 3.
+
+```js
+assert.strictEqual(largestPrimeFactor(3), 3);
+```
+
+`largestPrimeFactor(5)` should return 5.
+
+```js
+assert.strictEqual(largestPrimeFactor(5), 5);
+```
+
+`largestPrimeFactor(7)` should return 7.
+
+```js
+assert.strictEqual(largestPrimeFactor(7), 7);
+```
+
+`largestPrimeFactor(8)` should return 2.
+
+```js
+assert.strictEqual(largestPrimeFactor(8), 2);
+```
+
+`largestPrimeFactor(13195)` should return 29.
+
+```js
+assert.strictEqual(largestPrimeFactor(13195), 29);
+```
+
+`largestPrimeFactor(600851475143)` should return 6857.
+
+```js
+assert.strictEqual(largestPrimeFactor(600851475143), 6857);
+```
+
+## 3
+
+### --description--
+
+A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
+
+Find the largest palindrome made from the product of two `n`-digit numbers.
+
+### --tests--
+
+`largestPalindromeProduct(2)` should return a number.
+
+```js
+assert(typeof largestPalindromeProduct(2) === 'number');
+```
+
+`largestPalindromeProduct(2)` should return 9009.
+
+```js
+assert.strictEqual(largestPalindromeProduct(2), 9009);
+```
+
+`largestPalindromeProduct(3)` should return 906609.
+
+```js
+assert.strictEqual(largestPalindromeProduct(3), 906609);
+```
+
+## 4
+
+### --description--
+
+2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
+
+What is the smallest positive number that is evenly divisible by all of the numbers from 1 to `n`?
+
+### --tests--
+
+`smallestMult(5)` should return a number.
+
+```js
+assert(typeof smallestMult(5) === 'number');
+```
+
+`smallestMult(5)` should return 60.
+
+```js
+assert.strictEqual(smallestMult(5), 60);
+```
+
+`smallestMult(7)` should return 420.
+
+```js
+assert.strictEqual(smallestMult(7), 420);
+```
+
+`smallestMult(10)` should return 2520.
+
+```js
+assert.strictEqual(smallestMult(10), 2520);
+```
+
+`smallestMult(13)` should return 360360.
+
+```js
+assert.strictEqual(smallestMult(13), 360360);
+```
+
+`smallestMult(20)` should return 232792560.
+
+```js
+assert.strictEqual(smallestMult(20), 232792560);
+```
+
+## 5
+
+### --description--
+
+The sum of the squares of the first ten natural numbers is,
+
+12 + 22 + ... + 102 = 385
+
+The square of the sum of the first ten natural numbers is,
+
+(1 + 2 + ... + 10)2 = 552 = 3025
+
+Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.
+
+Find the difference between the sum of the squares of the first `n` natural numbers and the square of the sum.
+
+### --tests--
+
+`sumSquareDifference(10)` should return a number.
+
+```js
+assert(typeof sumSquareDifference(10) === 'number');
+```
+
+`sumSquareDifference(10)` should return 2640.
+
+```js
+assert.strictEqual(sumSquareDifference(10), 2640);
+```
+
+`sumSquareDifference(20)` should return 41230.
+
+```js
+assert.strictEqual(sumSquareDifference(20), 41230);
+```
+
+`sumSquareDifference(100)` should return 25164150.
+
+```js
+assert.strictEqual(sumSquareDifference(100), 25164150);
+```
+
+## 6
+
+### --description--
+
+By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
+
+What is the `n`th prime number?
+
+### --tests--
+
+`nthPrime(6)` should return a number.
+
+```js
+assert(typeof nthPrime(6) === 'number');
+```
+
+`nthPrime(6)` should return 13.
+
+```js
+assert.strictEqual(nthPrime(6), 13);
+```
+
+`nthPrime(10)` should return 29.
+
+```js
+assert.strictEqual(nthPrime(10), 29);
+```
+
+`nthPrime(100)` should return 541.
+
+```js
+assert.strictEqual(nthPrime(100), 541);
+```
+
+`nthPrime(1000)` should return 7919.
+
+```js
+assert.strictEqual(nthPrime(1000), 7919);
+```
+
+`nthPrime(10001)` should return 104743.
+
+```js
+assert.strictEqual(nthPrime(10001), 104743);
+```
+
+## 7
+
+### --description--
+
+The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = 5832.
+
+73167176531330624919225119674426574742355349194934
+96983520312774506326239578318016984801869478851843
+85861560789112949495459501737958331952853208805511
+12540698747158523863050715693290963295227443043557
+66896648950445244523161731856403098711121722383113
+62229893423380308135336276614282806444486645238749
+30358907296290491560440772390713810515859307960866
+70172427121883998797908792274921901699720888093776
+65727333001053367881220235421809751254540594752243
+52584907711670556013604839586446706324415722155397
+53697817977846174064955149290862569321978468622482
+83972241375657056057490261407972968652414535100474
+82166370484403199890008895243450658541227588666881
+16427171479924442928230863465674813919123162824586
+17866458359124566529476545682848912883142607690042
+24219022671055626321111109370544217506941658960408
+07198403850962455444362981230987879927244284909188
+84580156166097919133875499200524063689912560717606
+05886116467109405077541002256983155200055935729725
+71636269561882670428252483600823257530420752963450
+
+Find the `n` adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?
+
+### --tests--
+
+`largestProductinaSeries(4)` should return a number.
+
+```js
+assert(typeof largestProductinaSeries(4) === 'number');
+```
+
+`largestProductinaSeries(4)` should return 5832.
+
+```js
+assert.strictEqual(largestProductinaSeries(4), 5832);
+```
+
+`largestProductinaSeries(13)` should return 23514624000.
+
+```js
+assert.strictEqual(largestProductinaSeries(13), 23514624000);
+```
+
+## 8
+
+### --description--
+
+A Pythagorean triplet is a set of three natural numbers, `a` < `b` < `c`, for which,
+
+a2 + b2 = c2
+
+For example, 32 + 42 = 9 + 16 = 25 = 52.
+
+There exists exactly one Pythagorean triplet for which `a` + `b` + `c` = 1000. Find the product `abc` such that `a` + `b` + `c` = `n`.
+
+### --tests--
+
+`specialPythagoreanTriplet(24)` should return a number.
+
+```js
+assert(typeof specialPythagoreanTriplet(24) === 'number');
+```
+
+`specialPythagoreanTriplet(24)` should return 480.
+
+```js
+assert.strictEqual(specialPythagoreanTriplet(24), 480);
+```
+
+`specialPythagoreanTriplet(120)` should return 49920, 55080 or 60000.
+
+```js
+assert([49920, 55080, 60000].includes(specialPythagoreanTriplet(120)));
+```
+
+`specialPythagoreanTriplet(1000)` should return 31875000.
+
+```js
+assert.strictEqual(specialPythagoreanTriplet(1000), 31875000);
+```
+
+## 9
+
+### --description--
+
+The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
+
+Find the sum of all the primes below `n`.
+
+### --tests--
+
+`primeSummation(17)` should return a number.
+
+```js
+assert(typeof primeSummation(17) === 'number');
+```
+
+`primeSummation(17)` should return 41.
+
+```js
+assert.strictEqual(primeSummation(17), 41);
+```
+
+`primeSummation(2001)` should return 277050.
+
+```js
+assert.strictEqual(primeSummation(2001), 277050);
+```
+
+`primeSummation(140759)` should return 873608362.
+
+```js
+assert.strictEqual(primeSummation(140759), 873608362);
+```
+
+`primeSummation(2000000)` should return 142913828922.
+
+```js
+assert.strictEqual(primeSummation(2000000), 142913828922);
+```
+
+## 10
+
+### --description--
+
+In the 20×20 grid below, four numbers along a diagonal line have been marked in red.
+
+
+ 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
+ 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
+ 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
+ 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
+ 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
+ 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
+ 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
+ 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
+ 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
+ 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
+ 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
+ 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
+ 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
+ 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
+ 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
+ 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
+ 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
+ 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
+ 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
+ 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
+
+
+The product of these numbers is 26 × 63 × 78 × 14 = 1788696.
+
+What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in a given `arr` grid?
+
+### --tests--
+
+`largestGridProduct(testGrid)` should return a number.
+
+```js
+assert(typeof largestGridProduct(testGrid) === 'number');
+```
+
+`largestGridProduct(testGrid)` should return 14169081.
+
+```js
+assert.strictEqual(largestGridProduct(testGrid), 14169081);
+```
+
+`largestGridProduct(grid)` should return 70600674.
+
+```js
+assert.strictEqual(largestGridProduct(grid), 70600674);
+```
+
+## 11
+
+### --description--
+
+The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:
+
+1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
+
+Let us list the factors of the first seven triangle numbers:
+
+1: 1
+3: 1, 3
+6: 1, 2, 3, 6
+10: 1, 2, 5, 10
+15: 1, 3, 5, 15
+21: 1, 3, 7, 21
+28: 1, 2, 4, 7, 14, 28
+
+We can see that 28 is the first triangle number to have over five divisors.
+
+What is the value of the first triangle number to have over `n` divisors?
+
+### --tests--
+
+`divisibleTriangleNumber(5)` should return a number.
+
+```js
+assert(typeof divisibleTriangleNumber(5) === 'number');
+```
+
+`divisibleTriangleNumber(5)` should return 28.
+
+```js
+assert.strictEqual(divisibleTriangleNumber(5), 28);
+```
+
+`divisibleTriangleNumber(23)` should return 630.
+
+```js
+assert.strictEqual(divisibleTriangleNumber(23), 630);
+```
+
+`divisibleTriangleNumber(167)` should return 1385280.
+
+```js
+assert.strictEqual(divisibleTriangleNumber(167), 1385280);
+```
+
+`divisibleTriangleNumber(374)` should return 17907120.
+
+```js
+assert.strictEqual(divisibleTriangleNumber(374), 17907120);
+```
+
+`divisibleTriangleNumber(500)` should return 76576500.
+
+```js
+assert.strictEqual(divisibleTriangleNumber(500), 76576500);
+```
+
+## 12
+
+### --description--
+
+Work out the first ten digits of the sum of the following one-hundred 50-digit numbers.
+
+
+ 37107287533902102798797998220837590246510135740250
+ 46376937677490009712648124896970078050417018260538
+ 74324986199524741059474233309513058123726617309629
+ 91942213363574161572522430563301811072406154908250
+ 23067588207539346171171980310421047513778063246676
+ 89261670696623633820136378418383684178734361726757
+ 28112879812849979408065481931592621691275889832738
+ 44274228917432520321923589422876796487670272189318
+ 47451445736001306439091167216856844588711603153276
+ 70386486105843025439939619828917593665686757934951
+ 62176457141856560629502157223196586755079324193331
+ 64906352462741904929101432445813822663347944758178
+ 92575867718337217661963751590579239728245598838407
+ 58203565325359399008402633568948830189458628227828
+ 80181199384826282014278194139940567587151170094390
+ 35398664372827112653829987240784473053190104293586
+ 86515506006295864861532075273371959191420517255829
+ 71693888707715466499115593487603532921714970056938
+ 54370070576826684624621495650076471787294438377604
+ 53282654108756828443191190634694037855217779295145
+ 36123272525000296071075082563815656710885258350721
+ 45876576172410976447339110607218265236877223636045
+ 17423706905851860660448207621209813287860733969412
+ 81142660418086830619328460811191061556940512689692
+ 51934325451728388641918047049293215058642563049483
+ 62467221648435076201727918039944693004732956340691
+ 15732444386908125794514089057706229429197107928209
+ 55037687525678773091862540744969844508330393682126
+ 18336384825330154686196124348767681297534375946515
+ 80386287592878490201521685554828717201219257766954
+ 78182833757993103614740356856449095527097864797581
+ 16726320100436897842553539920931837441497806860984
+ 48403098129077791799088218795327364475675590848030
+ 87086987551392711854517078544161852424320693150332
+ 59959406895756536782107074926966537676326235447210
+ 69793950679652694742597709739166693763042633987085
+ 41052684708299085211399427365734116182760315001271
+ 65378607361501080857009149939512557028198746004375
+ 35829035317434717326932123578154982629742552737307
+ 94953759765105305946966067683156574377167401875275
+ 88902802571733229619176668713819931811048770190271
+ 25267680276078003013678680992525463401061632866526
+ 36270218540497705585629946580636237993140746255962
+ 24074486908231174977792365466257246923322810917141
+ 91430288197103288597806669760892938638285025333403
+ 34413065578016127815921815005561868836468420090470
+ 23053081172816430487623791969842487255036638784583
+ 11487696932154902810424020138335124462181441773470
+ 63783299490636259666498587618221225225512486764533
+ 67720186971698544312419572409913959008952310058822
+ 95548255300263520781532296796249481641953868218774
+ 76085327132285723110424803456124867697064507995236
+ 37774242535411291684276865538926205024910326572967
+ 23701913275725675285653248258265463092207058596522
+ 29798860272258331913126375147341994889534765745501
+ 18495701454879288984856827726077713721403798879715
+ 38298203783031473527721580348144513491373226651381
+ 34829543829199918180278916522431027392251122869539
+ 40957953066405232632538044100059654939159879593635
+ 29746152185502371307642255121183693803580388584903
+ 41698116222072977186158236678424689157993532961922
+ 62467957194401269043877107275048102390895523597457
+ 23189706772547915061505504953922979530901129967519
+ 86188088225875314529584099251203829009407770775672
+ 11306739708304724483816533873502340845647058077308
+ 82959174767140363198008187129011875491310547126581
+ 97623331044818386269515456334926366572897563400500
+ 42846280183517070527831839425882145521227251250327
+ 55121603546981200581762165212827652751691296897789
+ 32238195734329339946437501907836945765883352399886
+ 75506164965184775180738168837861091527357929701337
+ 62177842752192623401942399639168044983993173312731
+ 32924185707147349566916674687634660915035914677504
+ 99518671430235219628894890102423325116913619626622
+ 73267460800591547471830798392868535206946944540724
+ 76841822524674417161514036427982273348055556214818
+ 97142617910342598647204516893989422179826088076852
+ 87783646182799346313767754307809363333018982642090
+ 10848802521674670883215120185883543223812876952786
+ 71329612474782464538636993009049310363619763878039
+ 62184073572399794223406235393808339651327408011116
+ 66627891981488087797941876876144230030984490851411
+ 60661826293682836764744779239180335110989069790714
+ 85786944089552990653640447425576083659976645795096
+ 66024396409905389607120198219976047599490197230297
+ 64913982680032973156037120041377903785566085089252
+ 16730939319872750275468906903707539413042652315011
+ 94809377245048795150954100921645863754710598436791
+ 78639167021187492431995700641917969777599028300699
+ 15368713711936614952811305876380278410754449733078
+ 40789923115535562561142322423255033685442488917353
+ 44889911501440648020369068063960672322193204149535
+ 41503128880339536053299340368006977710650566631954
+ 81234880673210146739058568557934581403627822703280
+ 82616570773948327592232845941706525094512325230608
+ 22918802058777319719839450180888072429661980811197
+ 77158542502016545090413245809786882778948721859617
+ 72107838435069186155435662884062257473692284509516
+ 20849603980134001723930671666823555245252804609722
+ 53503534226472524250874054075591789781264330331690
+
+
+### --tests--
+
+`largeSum(testNums)` should return a number.
+
+```js
+assert(typeof largeSum(testNums) === 'number');
+```
+
+`largeSum(testNums)` should return 8348422521.
+
+```js
+assert.strictEqual(largeSum(testNums), 8348422521);
+```
+
+`largeSum(fiftyDigitNums)` should return 5537376230.
+
+```js
+assert.strictEqual(largeSum(fiftyDigitNums), 5537376230);
+```
+
+## 13
+
+### --description--
+
+The following iterative sequence is defined for the set of positive integers:
+
+n → n/2 (n is even)
+
+n → 3n + 1 (n is odd)
+
+Using the rule above and starting with 13, we generate the following sequence:
+
+13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
+
+It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.
+
+Which starting number, under the given `limit`, produces the longest chain?
+
+**Note:** Once the chain starts the terms are allowed to go above `limit`.
+
+### --tests--
+
+`longestCollatzSequence(14)` should return a number.
+
+```js
+assert(typeof longestCollatzSequence(14) === 'number');
+```
+
+`longestCollatzSequence(14)` should return 9.
+
+```js
+assert.strictEqual(longestCollatzSequence(14), 9);
+```
+
+`longestCollatzSequence(5847)` should return 3711.
+
+```js
+assert.strictEqual(longestCollatzSequence(5847), 3711);
+```
+
+`longestCollatzSequence(46500)` should return 35655.
+
+```js
+assert.strictEqual(longestCollatzSequence(46500), 35655);
+```
+
+`longestCollatzSequence(54512)` should return 52527.
+
+```js
+assert.strictEqual(longestCollatzSequence(54512), 52527);
+```
+
+`longestCollatzSequence(100000)` should return 77031.
+
+```js
+assert.strictEqual(longestCollatzSequence(100000), 77031);
+```
+
+`longestCollatzSequence(1000000)` should return 837799.
+
+```js
+assert.strictEqual(longestCollatzSequence(1000000), 837799);
+```
+
+## 14
+
+### --description--
+
+Starting in the top left corner of a 2×2 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner.
+
+
+
+How many such routes are there through a given `gridSize`?
+
+### --tests--
+
+`latticePaths(4)` should return a number.
+
+```js
+assert(typeof latticePaths(4) === 'number');
+```
+
+`latticePaths(4)` should return 70.
+
+```js
+assert.strictEqual(latticePaths(4), 70);
+```
+
+`latticePaths(9)` should return 48620.
+
+```js
+assert.strictEqual(latticePaths(9), 48620);
+```
+
+`latticePaths(20)` should return 137846528820.
+
+```js
+assert.strictEqual(latticePaths(20), 137846528820);
+```
+
+## 15
+
+### --description--
+
+215 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26.
+
+What is the sum of the digits of the number 2exponent
?
+
+### --tests--
+
+`powerDigitSum(15)` should return a number.
+
+```js
+assert(typeof powerDigitSum(15) === 'number');
+```
+
+`powerDigitSum(15)` should return 26.
+
+```js
+assert.strictEqual(powerDigitSum(15), 26);
+```
+
+`powerDigitSum(128)` should return 166.
+
+```js
+assert.strictEqual(powerDigitSum(128), 166);
+```
+
+`powerDigitSum(1000)` should return 1366.
+
+```js
+assert.strictEqual(powerDigitSum(1000), 1366);
+```
+
+## 16
+
+### --description--
+
+If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.
+
+If all the numbers from 1 to given `limit` inclusive were written out in words, how many letters would be used?
+
+**Note:** Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.
+
+### --tests--
+
+`numberLetterCounts(5)` should return a number.
+
+```js
+assert(typeof numberLetterCounts(5) === 'number');
+```
+
+`numberLetterCounts(5)` should return 19.
+
+```js
+assert.strictEqual(numberLetterCounts(5), 19);
+```
+
+`numberLetterCounts(150)` should return 1903.
+
+```js
+assert.strictEqual(numberLetterCounts(150), 1903);
+```
+
+`numberLetterCounts(1000)` should return 21124.
+
+```js
+assert.strictEqual(numberLetterCounts(1000), 21124);
+```
+
+## 17
+
+### --description--
+
+By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.
+
+
+ 3
+ 7 4
+ 2 4 6
+ 8 5 9 3
+
+
+That is, 3 + 7 + 4 + 9 = 23.
+
+Find the maximum total from top to bottom of the triangle below:
+
+75
+95 64
+17 47 82
+18 35 87 10
+20 04 82 47 65
+19 01 23 75 03 34
+88 02 77 73 07 63 67
+99 65 04 28 06 16 70 92
+41 41 26 56 83 40 80 70 33
+41 48 72 33 47 32 37 16 94 29
+53 71 44 65 25 43 91 52 97 51 14
+70 11 33 28 77 73 17 78 39 68 17 57
+91 71 52 38 17 14 91 43 58 50 27 29 48
+63 66 04 68 89 53 67 30 73 16 69 87 40 31
+04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
+
+**NOTE:** As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o)
+
+### --tests--
+
+`maximumPathSumI([[3, 0, 0, 0], [7, 4, 0, 0],[2, 4, 6, 0],[8, 5, 9, 3]])` should return a number.
+
+```js
+assert(typeof maximumPathSumI(_testTriangle) === 'number');
+```
+
+`maximumPathSumI([[3, 0, 0, 0], [7, 4, 0, 0],[2, 4, 6, 0],[8, 5, 9, 3]])` should return 23.
+
+```js
+assert.strictEqual(maximumPathSumI(_testTriangle), 23);
+```
+
+`maximumPathSumI([[75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [17, 47, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [18, 35, 87, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [20, 4, 82, 47, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [19, 1, 23, 75, 3, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0], [88, 2, 77, 73, 7, 63, 67, 0, 0, 0, 0, 0, 0, 0, 0], [99, 65, 4, 28, 6, 16, 70, 92, 0, 0, 0, 0, 0, 0, 0], [41, 41, 26, 56, 83, 40, 80, 70, 33, 0, 0, 0, 0, 0, 0], [41, 48, 72, 33, 47, 32, 37, 16, 94, 29, 0, 0, 0, 0, 0], [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14, 0, 0, 0, 0], [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57, 0, 0, 0], [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48, 0, 0], [63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31, 0], [4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23]])` should return 1074.
+
+```js
+assert.strictEqual(maximumPathSumI(_numTriangle), 1074);
+```
+
+## 18
+
+### --description--
+
+You are given the following information, but you may prefer to do some research for yourself.
+
+
+ - 1 Jan 1900 was a Monday.
+ - Thirty days has September,
April, June and November.
All the rest have thirty-one,
Saving February alone,
Which has twenty-eight, rain or shine.
And on leap years, twenty-nine.
+ - A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.
+
+
+How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?
+
+### --tests--
+
+`countingSundays(1943, 1946)` should return a number.
+
+```js
+assert(typeof countingSundays(1943, 1946) === 'number');
+```
+
+`countingSundays(1943, 1946)` should return 6.
+
+```js
+assert.strictEqual(countingSundays(1943, 1946), 6);
+```
+
+`countingSundays(1995, 2000)` should return 10.
+
+```js
+assert.strictEqual(countingSundays(1995, 2000), 10);
+```
+
+`countingSundays(1901, 2000)` should return 171.
+
+```js
+assert.strictEqual(countingSundays(1901, 2000), 171);
+```
+
+## 19
+
+### --description--
+
+`n`! means `n` × (`n` − 1) × ... × 3 × 2 × 1
+
+For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800,
+and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.
+
+Find the sum of the digits `n`!
+
+### --tests--
+
+`sumFactorialDigits(10)` should return a number.
+
+```js
+assert(typeof sumFactorialDigits(10) === 'number');
+```
+
+`sumFactorialDigits(10)` should return 27.
+
+```js
+assert.strictEqual(sumFactorialDigits(10), 27);
+```
+
+`sumFactorialDigits(25)` should return 72.
+
+```js
+assert.strictEqual(sumFactorialDigits(25), 72);
+```
+
+`sumFactorialDigits(50)` should return 216.
+
+```js
+assert.strictEqual(sumFactorialDigits(50), 216);
+```
+
+`sumFactorialDigits(75)` should return 432.
+
+```js
+assert.strictEqual(sumFactorialDigits(75), 432);
+```
+
+`sumFactorialDigits(100)` should return 648.
+
+```js
+assert.strictEqual(sumFactorialDigits(100), 648);
+```
+
+## 20
+
+### --description--
+
+Let d(`n`) be defined as the sum of proper divisors of `n` (numbers less than `n` which divide evenly into `n`).
+
+If d(`a`) = `b` and d(`b`) = `a`, where `a` ≠ `b`, then `a` and `b` are an amicable pair and each of `a` and `b` are called amicable numbers.
+
+For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220.
+
+Evaluate the sum of all the amicable numbers under `n`.
+
+### --tests--
+
+`sumAmicableNum(1000)` should return a number.
+
+```js
+assert(typeof sumAmicableNum(1000) === 'number');
+```
+
+`sumAmicableNum(1000)` should return 504.
+
+```js
+assert.strictEqual(sumAmicableNum(1000), 504);
+```
+
+`sumAmicableNum(2000)` should return 2898.
+
+```js
+assert.strictEqual(sumAmicableNum(2000), 2898);
+```
+
+`sumAmicableNum(5000)` should return 8442.
+
+```js
+assert.strictEqual(sumAmicableNum(5000), 8442);
+```
+
+`sumAmicableNum(10000)` should return 31626.
+
+```js
+assert.strictEqual(sumAmicableNum(10000), 31626);
+```
+
+## 21
+
+### --description--
+
+Using `names`, an array defined in the background containing over five-thousand first names, begin by sorting it into alphabetical order. Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score.
+
+For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would obtain a score of 938 × 53 = 49714.
+
+What is the total of all the name scores in the array?
+
+### --tests--
+
+`namesScores(test1)` should return a number.
+
+```js
+assert(typeof namesScores(test1) === 'number');
+```
+
+`namesScores(test1)` should return 791.
+
+```js
+assert.strictEqual(namesScores(test1), 791);
+```
+
+`namesScores(test2)` should return 1468.
+
+```js
+assert.strictEqual(namesScores(test2), 1468);
+```
+
+`namesScores(names)` should return 871198282.
+
+```js
+assert.strictEqual(namesScores(names), 871198282);
+```
+
+## 22
+
+### --description--
+
+A perfect number is a number for which the sum of its proper divisors is exactly equal to the number. For example, the sum of the proper divisors of 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect number.
+
+A number `n` is called deficient if the sum of its proper divisors is less than `n` and it is called abundant if this sum exceeds `n`.
+
+As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, the smallest number that can be written as the sum of two abundant numbers is 24. By mathematical analysis, it can be shown that all integers greater than 28123 can be written as the sum of two abundant numbers. However, this upper limit cannot be reduced any further by analysis even though it is known that the greatest number that cannot be expressed as the sum of two abundant numbers is less than this limit.
+
+Find the sum of all positive integers <= `n` which cannot be written as the sum of two abundant numbers.
+
+### --tests--
+
+`sumOfNonAbundantNumbers(10000)` should return a number.
+
+```js
+assert(typeof sumOfNonAbundantNumbers(10000) === 'number');
+```
+
+`sumOfNonAbundantNumbers(10000)` should return 3731004.
+
+```js
+assert(sumOfNonAbundantNumbers(10000) === 3731004);
+```
+
+`sumOfNonAbundantNumbers(15000)` should return 4039939.
+
+```js
+assert(sumOfNonAbundantNumbers(15000) === 4039939);
+```
+
+`sumOfNonAbundantNumbers(20000)` should return 4159710.
+
+```js
+assert(sumOfNonAbundantNumbers(20000) === 4159710);
+```
+
+`sumOfNonAbundantNumbers(28123)` should return 4179871.
+
+```js
+assert(sumOfNonAbundantNumbers(28123) === 4179871);
+```
+
+## 23
+
+### --description--
+
+A permutation is an ordered arrangement of objects. For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. If all of the permutations are listed numerically or alphabetically, we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are:
+
+012 021 102 120 201 210
+
+What is the `n`th lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
+
+### --tests--
+
+`lexicographicPermutations(699999)` should return a number.
+
+```js
+assert(typeof lexicographicPermutations(699999) === 'number');
+```
+
+`lexicographicPermutations(699999)` should return 1938246570.
+
+```js
+assert(lexicographicPermutations(699999) == 1938246570);
+```
+
+`lexicographicPermutations(899999)` should return 2536987410.
+
+```js
+assert(lexicographicPermutations(899999) == 2536987410);
+```
+
+`lexicographicPermutations(900000)` should return 2537014689.
+
+```js
+assert(lexicographicPermutations(900000) == 2537014689);
+```
+
+`lexicographicPermutations(999999)` should return 2783915460.
+
+```js
+assert(lexicographicPermutations(999999) == 2783915460);
+```
+
+## 24
+
+### --description--
+
+The Fibonacci sequence is defined by the recurrence relation:
+
+Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.
+
+Hence the first 12 terms will be:
+
+F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8
F7 = 13
F8 = 21
F9 = 34
F10 = 55
F11 = 89
F12 = 144
+
+The 12th term, F12, is the first term to contain three digits.
+
+What is the index of the first term in the Fibonacci sequence to contain `n` digits?
+
+### --tests--
+
+`digitFibonacci(5)` should return a number.
+
+```js
+assert(typeof digitFibonacci(5) === 'number');
+```
+
+`digitFibonacci(5)` should return 21.
+
+```js
+assert.strictEqual(digitFibonacci(5), 21);
+```
+
+`digitFibonacci(10)` should return 45.
+
+```js
+assert.strictEqual(digitFibonacci(10), 45);
+```
+
+`digitFibonacci(15)` should return 69.
+
+```js
+assert.strictEqual(digitFibonacci(15), 69);
+```
+
+`digitFibonacci(20)` should return 93.
+
+```js
+assert.strictEqual(digitFibonacci(20), 93);
+```
+
+## 25
+
+### --description--
+
+A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:
+
+1/2 = 0.5
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1
+
+Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.
+
+Find the value of `d` < `n` for which 1/d contains the longest recurring cycle in its decimal fraction part.
+
+### --tests--
+
+`reciprocalCycles(700)` should return a number.
+
+```js
+assert(typeof reciprocalCycles(700) === 'number');
+```
+
+`reciprocalCycles(700)` should return 659.
+
+```js
+assert(reciprocalCycles(700) == 659);
+```
+
+`reciprocalCycles(800)` should return 743.
+
+```js
+assert(reciprocalCycles(800) == 743);
+```
+
+`reciprocalCycles(900)` should return 887.
+
+```js
+assert(reciprocalCycles(900) == 887);
+```
+
+`reciprocalCycles(1000)` should return 983.
+
+```js
+assert(reciprocalCycles(1000) == 983);
+```
+
+## 26
+
+### --description--
+
+Euler discovered the remarkable quadratic formula:
+
+$n^2 + n + 41$
+
+It turns out that the formula will produce 40 primes for the consecutive integer values $0 \\le n \\le 39$. However, when $n = 40, 40^2 + 40 + 41 = 40(40 + 1) + 41$ is divisible by 41, and certainly when $n = 41, 41^2 + 41 + 41$ is clearly divisible by 41.
+
+The incredible formula $n^2 - 79n + 1601$ was discovered, which produces 80 primes for the consecutive values $0 \\le n \\le 79$. The product of the coefficients, −79 and 1601, is −126479.
+
+Considering quadratics of the form:
+
+
+ $n^2 + an + b$, where $|a| < range$ and $|b| \le range$
+ where $|n|$ is the modulus/absolute value of $n$
+ e.g. $|11| = 11$ and $|-4| = 4$
+
+
+Find the product of the coefficients, $a$ and $b$, for the quadratic expression that produces the maximum number of primes for consecutive values of $n$, starting with $n = 0$.
+
+### --tests--
+
+`quadraticPrimes(200)` should return a number.
+
+```js
+assert(typeof quadraticPrimes(200) === 'number');
+```
+
+`quadraticPrimes(200)` should return -4925.
+
+```js
+assert(quadraticPrimes(200) == -4925);
+```
+
+`quadraticPrimes(500)` should return -18901.
+
+```js
+assert(quadraticPrimes(500) == -18901);
+```
+
+`quadraticPrimes(800)` should return -43835.
+
+```js
+assert(quadraticPrimes(800) == -43835);
+```
+
+`quadraticPrimes(1000)` should return -59231.
+
+```js
+assert(quadraticPrimes(1000) == -59231);
+```
+
+## 27
+
+### --description--
+
+Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows:
+
+
+
21
22 23 24
25
+ 20
7
8
9
10
+ 19 6
1
2 11
+ 18
5
4
3
12
+
17
16 15 14
13
+
+
+It can be verified that the sum of the numbers on the diagonals is 101.
+
+What is the sum of the numbers on the diagonals in an `n` by `n` spiral formed in the same way?
+
+### --tests--
+
+`spiralDiagonals(101)` should return a number.
+
+```js
+assert(typeof spiralDiagonals(101) === 'number');
+```
+
+`spiralDiagonals(101)` should return 692101.
+
+```js
+assert(spiralDiagonals(101) == 692101);
+```
+
+`spiralDiagonals(303)` should return 18591725.
+
+```js
+assert(spiralDiagonals(303) == 18591725);
+```
+
+`spiralDiagonals(505)` should return 85986601.
+
+```js
+assert(spiralDiagonals(505) == 85986601);
+```
+
+`spiralDiagonals(1001)` should return 669171001.
+
+```js
+assert(spiralDiagonals(1001) == 669171001);
+```
+
+## 28
+
+### --description--
+
+Consider all integer combinations of $a^b$ for 2 ≤ a ≤ 5 and 2 ≤ b ≤ 5:
+
+
+ 22=4, 23=8, 24=16, 25=32
+ 32=9, 33=27, 34=81, 35=243
+ 42=16, 43=64, 44=256, 45=1024
+ 52=25, 53=125, 54=625, 55=3125
+
+
+If they are then placed in numerical order, with any repeats removed, we get the following sequence of 15 distinct terms:
+
+
+ 4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
+
+
+How many distinct terms are in the sequence generated by $a^b$ for 2 ≤ `a` ≤ `n` and 2 ≤ `b` ≤ `n`?
+
+### --tests--
+
+`distinctPowers(15)` should return a number.
+
+```js
+assert(typeof distinctPowers(15) === 'number');
+```
+
+`distinctPowers(15)` should return 177.
+
+```js
+assert.strictEqual(distinctPowers(15), 177);
+```
+
+`distinctPowers(20)` should return 324.
+
+```js
+assert.strictEqual(distinctPowers(20), 324);
+```
+
+`distinctPowers(25)` should return 519.
+
+```js
+assert.strictEqual(distinctPowers(25), 519);
+```
+
+`distinctPowers(30)` should return 755.
+
+```js
+assert.strictEqual(distinctPowers(30), 755);
+```
+
+## 29
+
+### --description--
+
+Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits:
+
+
+ 1634 = 14 + 64 + 34 + 44
+ 8208 = 84 + 24 + 04 + 84
+ 9474 = 94 + 44 + 74 + 44
+
+
+As 1 = 14 is not a sum it is not included.
+
+The sum of these numbers is 1634 + 8208 + 9474 = 19316.
+
+Find the sum of all the numbers that can be written as the sum of `n` powers of their digits.
+
+### --tests--
+
+`digitnPowers(2)` should return a number.
+
+```js
+assert(typeof digitnPowers(2) === 'number');
+```
+
+`digitnPowers(2)` should return 0.
+
+```js
+assert(digitnPowers(2) == 0);
+```
+
+`digitnPowers(3)` should return 1301.
+
+```js
+assert(digitnPowers(3) == 1301);
+```
+
+`digitnPowers(4)` should return 19316.
+
+```js
+assert(digitnPowers(4) == 19316);
+```
+
+`digitnPowers(5)` should return 443839.
+
+```js
+assert(digitnPowers(5) == 443839);
+```
+
+## 30
+
+### --description--
+
+In England the currency is made up of pound, £, and pence, p, and there are eight coins in general circulation:
+
+1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).
+
+It is possible to make £2 in the following way:
+
+1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
+
+How many different ways can `n` pence be made using any number of coins?
+
+### --tests--
+
+`coinSums(50)` should return a number.
+
+```js
+assert(typeof coinSums(50) === 'number');
+```
+
+`coinSums(50)` should return 451.
+
+```js
+assert(coinSums(50) == 451);
+```
+
+`coinSums(100)` should return 4563.
+
+```js
+assert(coinSums(100) == 4563);
+```
+
+`coinSums(150)` should return 21873.
+
+```js
+assert(coinSums(150) == 21873);
+```
+
+`coinSums(200)` should return 73682.
+
+```js
+assert(coinSums(200) == 73682);
+```
+
+## 31
+
+### --description--
+
+We shall say that an `n`-digit number is pandigital if it makes use of all the digits 1 to `n` exactly once; for example, the 5-digit number, 15234, is 1 through 5 pandigital.
+
+The product 7254 is unusual, as the identity, 39 × 186 = 7254, containing multiplicand, multiplier, and product is 1 through 9 pandigital.
+
+Find the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through `n` pandigital.
+
+**Hint:** Some products can be obtained in more than one way so be sure to only include it once in your sum.
+
+### --tests--
+
+`pandigitalProducts(4)` should return a number.
+
+```js
+assert(typeof pandigitalProducts(4) === 'number');
+```
+
+`pandigitalProducts(4)` should return `12`.
+
+```js
+assert.strictEqual(pandigitalProducts(4), 12);
+```
+
+`pandigitalProducts(6)` should return `162`.
+
+```js
+assert.strictEqual(pandigitalProducts(6), 162);
+```
+
+`pandigitalProducts(7)` should return `0`.
+
+```js
+assert.strictEqual(pandigitalProducts(7), 0);
+```
+
+`pandigitalProducts(8)` should return `13458`.
+
+```js
+assert.strictEqual(pandigitalProducts(8), 13458);
+```
+
+`pandigitalProducts(9)` should return `45228`.
+
+```js
+assert.strictEqual(pandigitalProducts(9), 45228);
+```
+
+## 32
+
+### --description--
+
+The fraction 49/98 is a curious fraction, as an inexperienced mathematician in attempting to simplify it may incorrectly believe that 49/98 = 4/8, which is correct, is obtained by cancelling the 9s.
+
+We shall consider fractions like, 30/50 = 3/5, to be trivial examples.
+
+There are exactly four non-trivial examples of this type of fraction, less than one in value, and containing two digits in the numerator and denominator.
+
+If the product of these four fractions is given in its lowest common terms, find the value of the denominator.
+
+### --tests--
+
+`digitCancellingFractions()` should return a number.
+
+```js
+assert(typeof digitCancellingFractions() === 'number');
+```
+
+`digitCancellingFractions()` should return 100.
+
+```js
+assert.strictEqual(digitCancellingFractions(), 100);
+```
+
+## 33
+
+### --description--
+
+145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145.
+
+Find the numbers and the sum of the numbers which are equal to the sum of the factorial of their digits.
+
+**Note:** as 1! = 1 and 2! = 2 are not sums they are not included.
+
+### --tests--
+
+`digitFactorial()` should return an object.
+
+```js
+assert.typeOf(digitFactorial(), 'object');
+```
+
+`digitFactorial()` should return { sum: 40730, numbers: [145, 40585] }.
+
+```js
+assert.deepEqual(digitFactorial(), { sum: 40730, numbers: [145, 40585] });
+```
+
+## 34
+
+### --description--
+
+The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime.
+
+There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.
+
+How many circular primes are there below `n`, whereas 100 ≤ `n` ≤ 1000000?
+
+**Note:**
+
+Circular primes individual rotation can exceed `n`.
+
+### --tests--
+
+`circularPrimes(100)` should return a number.
+
+```js
+assert(typeof circularPrimes(100) === 'number');
+```
+
+`circularPrimes(100)` should return 13.
+
+```js
+assert(circularPrimes(100) == 13);
+```
+
+`circularPrimes(100000)` should return 43.
+
+```js
+assert(circularPrimes(100000) == 43);
+```
+
+`circularPrimes(250000)` should return 45.
+
+```js
+assert(circularPrimes(250000) == 45);
+```
+
+`circularPrimes(500000)` should return 49.
+
+```js
+assert(circularPrimes(500000) == 49);
+```
+
+`circularPrimes(750000)` should return 49.
+
+```js
+assert(circularPrimes(750000) == 49);
+```
+
+`circularPrimes(1000000)` should return 55.
+
+```js
+assert(circularPrimes(1000000) == 55);
+```
+
+## 35
+
+### --description--
+
+The decimal number, 585 = 10010010012 (binary), is palindromic in both bases.
+
+Find the sum of all numbers, less than `n`, whereas 1000 ≤ `n` ≤ 1000000, which are palindromic in base 10 and base 2.
+
+(Please note that the palindromic number, in either base, may not include leading zeros.)
+
+### --tests--
+
+`doubleBasePalindromes(1000)` should return a number.
+
+```js
+assert(typeof doubleBasePalindromes(1000) === 'number');
+```
+
+`doubleBasePalindromes(1000)` should return 1772.
+
+```js
+assert(doubleBasePalindromes(1000) == 1772);
+```
+
+`doubleBasePalindromes(50000)` should return 105795.
+
+```js
+assert(doubleBasePalindromes(50000) == 105795);
+```
+
+`doubleBasePalindromes(500000)` should return 286602.
+
+```js
+assert(doubleBasePalindromes(500000) == 286602);
+```
+
+`doubleBasePalindromes(1000000)` should return 872187.
+
+```js
+assert(doubleBasePalindromes(1000000) == 872187);
+```
+
+## 36
+
+### --description--
+
+The number 3797 has an interesting property. Being prime itself, it is possible to continuously remove digits from left to right, and remain prime at each stage: 3797, 797, 97, and 7. Similarly we can work from right to left: 3797, 379, 37, and 3.
+
+Find the sum of the only `n` (8 ≤ `n` ≤ 11) primes that are both truncatable from left to right and right to left.
+
+NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes.
+
+### --tests--
+
+`truncatablePrimes(8)` should return a number.
+
+```js
+assert(typeof truncatablePrimes(8) === 'number');
+```
+
+`truncatablePrimes(8)` should return 1986.
+
+```js
+assert(truncatablePrimes(8) == 1986);
+```
+
+`truncatablePrimes(9)` should return 5123.
+
+```js
+assert(truncatablePrimes(9) == 5123);
+```
+
+`truncatablePrimes(10)` should return 8920.
+
+```js
+assert(truncatablePrimes(10) == 8920);
+```
+
+`truncatablePrimes(11)` should return 748317.
+
+```js
+assert(truncatablePrimes(11) == 748317);
+```
+
+## 37
+
+### --description--
+
+Take the number 192 and multiply it by each of 1, 2, and 3:
+
+$$\begin{align}
+ 192 × 1 = 192\\\\
+ 192 × 2 = 384\\\\
+ 192 × 3 = 576\\\\
+\end{align}$$
+
+By concatenating each product we get the 1 to 9 pandigital, 192384576. We will call 192384576 the concatenated product of 192 and (1, 2, 3).
+
+The same can be achieved by starting with 9 and multiplying by 1, 2, 3, 4, and 5, giving the pandigital, 918273645, which is the concatenated product of 9 and (1, 2, 3, 4, 5).
+
+What is the largest 1 to `k` pandigital `k`-digit number that can be formed as the concatenated product of an integer with (1, 2, ..., `n`) where `n` > 1?
+
+### --tests--
+
+`pandigitalMultiples(8)` should return a number.
+
+```js
+assert(typeof pandigitalMultiples(8) === 'number');
+```
+
+`pandigitalMultiples(8)` should return `78156234`.
+
+```js
+assert.strictEqual(pandigitalMultiples(8), 78156234);
+```
+
+`pandigitalMultiples(9)` should return `932718654`.
+
+```js
+assert.strictEqual(pandigitalMultiples(9), 932718654);
+```
+
+## 38
+
+### --description--
+
+If `p` is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exactly three solutions for p = 120.
+
+{20,48,52}, {24,45,51}, {30,40,50}
+
+For which value of `p` ≤ `n`, is the number of solutions maximized?
+
+### --tests--
+
+`intRightTriangles(500)` should return a number.
+
+```js
+assert(typeof intRightTriangles(500) === 'number');
+```
+
+`intRightTriangles(500)` should return 420.
+
+```js
+assert(intRightTriangles(500) == 420);
+```
+
+`intRightTriangles(800)` should return 720.
+
+```js
+assert(intRightTriangles(800) == 720);
+```
+
+`intRightTriangles(900)` should return 840.
+
+```js
+assert(intRightTriangles(900) == 840);
+```
+
+`intRightTriangles(1000)` should return 840.
+
+```js
+assert(intRightTriangles(1000) == 840);
+```
+
+## 39
+
+### --description--
+
+An irrational decimal fraction is created by concatenating the positive integers:
+
+0.12345678910**1**112131415161718192021...
+
+It can be seen that the 12th digit of the fractional part is 1.
+
+If *dn* represents the *n*th digit of the fractional part, find the value of the following expression.
+
+d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000
+
+### --tests--
+
+`champernownesConstant(100)` should return a number.
+
+```js
+assert(typeof champernownesConstant(100) === 'number');
+```
+
+`champernownesConstant(100)` should return 5.
+
+```js
+assert.strictEqual(champernownesConstant(100), 5);
+```
+
+`champernownesConstant(1000)` should return 15.
+
+```js
+assert.strictEqual(champernownesConstant(1000), 15);
+```
+
+`champernownesConstant(1000000)` should return 210.
+
+```js
+assert.strictEqual(champernownesConstant(1000000), 210);
+```
+
+## 40
+
+### --description--
+
+We shall say that an `n`-digit number is pandigital if it makes use of all the digits 1 to `n` exactly once. For example, 2143 is a 4-digit pandigital and is also prime.
+
+What is the largest `n`-length digit pandigital prime that exists?
+
+### --tests--
+
+`pandigitalPrime(4)` should return a number.
+
+```js
+assert(typeof pandigitalPrime(4) === 'number');
+```
+
+`pandigitalPrime(4)` should return 4231.
+
+```js
+assert(pandigitalPrime(4) == 4231);
+```
+
+`pandigitalPrime(7)` should return 7652413.
+
+```js
+assert(pandigitalPrime(7) == 7652413);
+```
+
+## 41
+
+### --description--
+
+The `n`th term of the sequence of triangle numbers is given by, `tn` = ½`n`(`n`+1); so the first ten triangle numbers are:
+
+1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
+
+By converting each letter in a word to a number corresponding to its alphabetical position and adding these values we form a word value. For example, the word value for SKY is 19 + 11 + 25 = 55 = `t`10. If the word value is a triangle number then we shall call the word a triangle word.
+
+Using words array of `n`-length, how many are triangle words?
+
+### --tests--
+
+`codedTriangleNumbers(1400)` should return a number.
+
+```js
+assert(typeof codedTriangleNumbers(1400) === 'number');
+```
+
+`codedTriangleNumbers(1400)` should return 129.
+
+```js
+assert(codedTriangleNumbers(1400) == 129);
+```
+
+`codedTriangleNumbers(1500)` should return 137.
+
+```js
+assert(codedTriangleNumbers(1500) == 137);
+```
+
+`codedTriangleNumbers(1600)` should return 141.
+
+```js
+assert(codedTriangleNumbers(1600) == 141);
+```
+
+`codedTriangleNumbers(1786)` should return 162.
+
+```js
+assert(codedTriangleNumbers(1786) == 162);
+```
+
+## 42
+
+### --description--
+
+The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property.
+
+Let $d_1$ be the $1^{st}$ digit, $d_2$ be the $2^{nd}$ digit, and so on. In this way, we note the following:
+
+- ${d_2}{d_3}{d_4} = 406$ is divisible by 2
+- ${d_3}{d_4}{d_5} = 063$ is divisible by 3
+- ${d_4}{d_5}{d_6} = 635$ is divisible by 5
+- ${d_5}{d_6}{d_7} = 357$ is divisible by 7
+- ${d_6}{d_7}{d_8} = 572$ is divisible by 11
+- ${d_7}{d_8}{d_9} = 728$ is divisible by 13
+- ${d_8}{d_9}{d_{10}} = 289$ is divisible by 17
+
+Find the sum of all 0 to `n` pandigital numbers with sub-strings fulfilling `n - 2` of these divisibility properties.
+
+**Note:** Pandigital numbers starting with `0` are to be considered in the result.
+
+### --tests--
+
+`substringDivisibility(5)` should return a number.
+
+```js
+assert(typeof substringDivisibility(5) === 'number');
+```
+
+`substringDivisibility(5)` should return `12444480`.
+
+```js
+assert.strictEqual(substringDivisibility(5), 12444480)
+```
+
+`substringDivisibility(7)` should return `1099210170`.
+
+```js
+assert.strictEqual(substringDivisibility(7), 1099210170)
+```
+
+`substringDivisibility(8)` should return `1113342912`.
+
+```js
+assert.strictEqual(substringDivisibility(8), 1113342912)
+```
+
+`substringDivisibility(9)` should return `16695334890`.
+
+```js
+assert.strictEqual(substringDivisibility(9), 16695334890)
+```
+
+## 43
+
+### --description--
+
+Pentagonal numbers are generated by the formula, Pn=`n`(3`n`−1)/2. The first ten pentagonal numbers are:
+
+1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...
+
+It can be seen that P4 + P7 = 22 + 70 = 92 = P8. However, their difference, 70 − 22 = 48, is not pentagonal.
+
+Find the pair of pentagonal numbers, Pj and Pk, for which their sum and difference are pentagonal and D = |Pk − Pj| is minimized; what is the value of D?
+
+### --tests--
+
+`pentagonNumbers()` should return a number.
+
+```js
+assert(typeof pentagonNumbers() === 'number');
+```
+
+`pentagonNumbers()` should return 5482660.
+
+```js
+assert.strictEqual(pentagonNumbers(), 5482660);
+```
+
+## 44
+
+### --description--
+
+Triangle, pentagonal, and hexagonal numbers are generated by the following formulae:
+
+Triangle
Tn=n(n+1)/2
1, 3, 6, 10, 15, ...
+Pentagonal
Pn=n(3n−1)/2
1, 5, 12, 22, 35, ...
+Hexagonal
Hn=n(2n−1)
1, 6, 15, 28, 45, ...
+
+It can be verified that T285 = P165 = H143 = 40755.
+
+Find the next triangle number that is also pentagonal and hexagonal.
+
+### --tests--
+
+`triPentaHexa(40756)` should return a number.
+
+```js
+assert(typeof triPentaHexa(40756) === 'number');
+```
+
+`triPentaHexa(40756)` should return 1533776805.
+
+```js
+assert.strictEqual(triPentaHexa(40756), 1533776805);
+```
+
+## 45
+
+### --description--
+
+It was proposed by Christian Goldbach that every odd composite number can be written as the sum of a prime and twice a square.
+
+
+ 9 = 7 + 2×12
+ 15 = 7 + 2×22
+ 21 = 3 + 2×32
+ 25 = 7 + 2×32
+ 27 = 19 + 2×22
+ 33 = 31 + 2×12
+
+
+It turns out that the conjecture was false.
+
+What is the smallest odd composite that cannot be written as the sum of a prime and twice a square?
+
+### --tests--
+
+`goldbachsOtherConjecture()` should return a number.
+
+```js
+assert(typeof goldbachsOtherConjecture() === 'number');
+```
+
+`goldbachsOtherConjecture()` should return 5777.
+
+```js
+assert.strictEqual(goldbachsOtherConjecture(), 5777);
+```
+
+## 46
+
+### --description--
+
+The first two consecutive numbers to have two distinct prime factors are:
+
+
+ 14 = 2 × 7
+ 15 = 3 × 5
+
+
+The first three consecutive numbers to have three distinct prime factors are:
+
+
+ 644 = 22 × 7 × 23
+ 645 = 3 × 5 × 43
+ 646 = 2 × 17 × 19
+
+
+Find the first four consecutive integers to have four distinct prime factors each. What is the first of these numbers?
+
+### --tests--
+
+`distinctPrimeFactors(2, 2)` should return a number.
+
+```js
+assert(typeof distinctPrimeFactors(2, 2) === 'number');
+```
+
+`distinctPrimeFactors(2, 2)` should return 14.
+
+```js
+assert.strictEqual(distinctPrimeFactors(2, 2), 14);
+```
+
+`distinctPrimeFactors(3, 3)` should return 644.
+
+```js
+assert.strictEqual(distinctPrimeFactors(3, 3), 644);
+```
+
+`distinctPrimeFactors(4, 4)` should return 134043.
+
+```js
+assert.strictEqual(distinctPrimeFactors(4, 4), 134043);
+```
+
+## 47
+
+### --description--
+
+The series, 11 + 22 + 33 + ... + 1010 = 10405071317.
+
+Find the last ten digits of the series, 11 + 22 + 33 + ... + 10001000.
+
+### --tests--
+
+`selfPowers(10, 3)` should return a number.
+
+```js
+assert(typeof selfPowers(10, 3) === 'number');
+```
+
+`selfPowers(10, 3)` should return 317.
+
+```js
+assert.strictEqual(selfPowers(10, 3), 317);
+```
+
+`selfPowers(150, 6)` should return 29045.
+
+```js
+assert.strictEqual(selfPowers(150, 6), 29045);
+```
+
+`selfPowers(673, 7)` should return 2473989.
+
+```js
+assert.strictEqual(selfPowers(673, 7), 2473989);
+```
+
+`selfPowers(1000, 10)` should return 9110846700.
+
+```js
+assert.strictEqual(selfPowers(1000, 10), 9110846700);
+```
+
+## 48
+
+### --description--
+
+The arithmetic sequence, 1487, 4817, 8147, in which each of the terms increases by 3330, is unusual in two ways: (i) each of the three terms are prime, and, (ii) each of the 4-digit numbers are permutations of one another.
+
+There are no arithmetic sequences made up of three 1-, 2-, or 3-digit primes, exhibiting this property, but there is one other 4-digit increasing sequence.
+
+What 12-digit number do you form by concatenating the three terms in this sequence?
+
+### --tests--
+
+`primePermutations()` should return a number.
+
+```js
+assert(typeof primePermutations() === 'number');
+```
+
+`primePermutations()` should return 296962999629.
+
+```js
+assert.strictEqual(primePermutations(), 296962999629);
+```
+
+## 49
+
+### --description--
+
+The prime 41, can be written as the sum of six consecutive primes:
+
+41 = 2 + 3 + 5 + 7 + 11 + 13
+
+This is the longest sum of consecutive primes that adds to a prime below one-hundred.
+
+The longest sum of consecutive primes below one-thousand that adds to a prime, contains 21 terms, and is equal to 953.
+
+Which prime, below one-million, can be written as the sum of the most consecutive primes?
+
+### --tests--
+
+`consecutivePrimeSum(1000)` should return a number.
+
+```js
+assert(typeof consecutivePrimeSum(1000) === 'number');
+```
+
+`consecutivePrimeSum(1000)` should return 953.
+
+```js
+assert.strictEqual(consecutivePrimeSum(1000), 953);
+```
+
+`consecutivePrimeSum(1000000)` should return 997651.
+
+```js
+assert.strictEqual(consecutivePrimeSum(1000000), 997651);
+```
+
+## 50
+
+### --description--
+
+By replacing the 1st digit of the 2-digit number \*3, it turns out that six of the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime.
+
+By replacing the 3rd and 4th digits of 56\*\*3 with the same digit, this 5-digit number is the first example having seven primes among the ten generated numbers, yielding the family: 56003, 56113, 56333, 56443, 56663, 56773, and 56993. Consequently 56003, being the first member of this family, is the smallest prime with this property.
+
+Find the smallest prime which, by replacing part of the number (not necessarily adjacent digits) with the same digit, is part of an `n` prime value family.
+
+### --tests--
+
+`primeDigitReplacements(6)` should return a number.
+
+```js
+assert(typeof primeDigitReplacements(6) === 'number');
+```
+
+`primeDigitReplacements(6)` should return `13`.
+
+```js
+assert.strictEqual(primeDigitReplacements(6), 13);
+```
+
+`primeDigitReplacements(7)` should return `56003`.
+
+```js
+assert.strictEqual(primeDigitReplacements(7), 56003);
+```
+
+`primeDigitReplacements(8)` should return `121313`.
+
+```js
+assert.strictEqual(primeDigitReplacements(8), 121313);
+```
+
+## 51
+
+### --description--
+
+It can be seen that the number, 125874, and its double, 251748, contain exactly the same digits, but in a different order.
+
+Find the smallest positive integer, such that multiplied by integers $\\{2, 3, \ldots, n\\}$, contain the same digits.
+
+### --tests--
+
+`permutedMultiples(2)` should return a number.
+
+```js
+assert(typeof permutedMultiples(2) === 'number');
+```
+
+`permutedMultiples(2)` should return `125874`.
+
+```js
+assert.strictEqual(permutedMultiples(2), 125874);
+```
+
+`permutedMultiples(6)` should return `142857`.
+
+```js
+assert.strictEqual(permutedMultiples(6), 142857);
+```
+
+## 52
+
+### --description--
+
+There are exactly ten ways of selecting three from five, 12345:
+
+123, 124, 125, 134, 135, 145, 234, 235, 245, and 345
+
+In combinatorics, we use the notation, $\\displaystyle \\binom 5 3 = 10$
+
+In general, $\\displaystyle \\binom n r = \\dfrac{n!}{r!(n-r)!}$, where $r \\le n$, $n! = n \\times (n-1) \\times ... \\times 3 \\times 2 \\times 1$, and $0! = 1$.
+
+It is not until $n = 23$, that a value exceeds one-million: $\\displaystyle \\binom {23} {10} = 1144066$.
+
+How many, not necessarily distinct, values of $\\displaystyle \\binom n r$ for $1 \\le n \\le 100$, are greater than one-million?
+
+### --tests--
+
+`combinatoricSelections(1000)` should return a number.
+
+```js
+assert(typeof combinatoricSelections(1000) === 'number');
+```
+
+`combinatoricSelections(1000)` should return 4626.
+
+```js
+assert.strictEqual(combinatoricSelections(1000), 4626);
+```
+
+`combinatoricSelections(10000)` should return 4431.
+
+```js
+assert.strictEqual(combinatoricSelections(10000), 4431);
+```
+
+`combinatoricSelections(100000)` should return 4255.
+
+```js
+assert.strictEqual(combinatoricSelections(100000), 4255);
+```
+
+`combinatoricSelections(1000000)` should return 4075.
+
+```js
+assert.strictEqual(combinatoricSelections(1000000), 4075);
+```
+
+## 53
+
+### --description--
+
+In the card game poker, a hand consists of five cards and are ranked, from lowest to highest, in the following way:
+
+
+ - High Card: Highest value card.
+ - One Pair: Two cards of the same value.
+ - Two Pairs: Two different pairs.
+ - Three of a Kind: Three cards of the same value.
+ - Straight: All cards are consecutive values.
+ - Flush: All cards of the same suit.
+ - Full House: Three of a kind and a pair.
+ - Four of a Kind: Four cards of the same value.
+ - Straight Flush: All cards are consecutive values of same suit.
+ - Royal Flush: Ten, Jack, Queen, King, Ace, in same suit.
+
+
+The cards are valued in the order: 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King, Ace.
+
+If two players have the same ranked hands then the rank made up of the highest value wins; for example, a pair of eights beats a pair of fives (see example 1 below). But if two ranks tie, for example, both players have a pair of queens, then highest cards in each hand are compared (see example 4 below); if the highest cards tie then the next highest cards are compared, and so on.
+
+Consider the following five hands dealt to two players:
+
+| Hand | Player 1 | Player 2 | Winner |
+| ------------------ | --------------------------------------------------------- | ---------------------------------------------------------- | -------- |
+| 1 | 5H 5C 6S 7S KD
Pair of Fives | 2C 3S 8S 8D TD
Pair of Eights | Player 2 |
+| 2 | 5D 8C 9S JS AC
Highest card Ace | 2C 5C 7D 8S QH
Highest card Queen | Player 1 |
+| 3 | 2D 9C AS AH AC
Three Aces | 3D 6D 7D TD QD
Flush with Diamonds | Player 2 |
+| 4 | 4D 6S 9H QH QC
Pair of Queens
Highest card Nine | 3D 6D 7H QD QS
Pair of Queens
Highest card Seven | Player 1 |
+| 5 | 2H 2D 4C 4D 4S
Full House
with Three Fours | 3C 3D 3S 9S 9D
Full House
with Three Threes | Player 1 |
+
+The global array (`handsArr`) passed to the function, contains one-thousand random hands dealt to two players. Each line of the file contains ten cards (separated by a single space): the first five are Player 1's cards and the last five are Player 2's cards. You can assume that all hands are valid (no invalid characters or repeated cards), each player's hand is in no specific order, and in each hand there is a clear winner.
+
+How many hands does Player 1 win?
+
+### --tests--
+
+`pokerHands(testArr)` should return a number.
+
+```js
+assert(typeof pokerHands(testArr) === 'number');
+```
+
+`pokerHands(testArr)` should return 2.
+
+```js
+assert.strictEqual(pokerHands(testArr), 2);
+```
+
+`pokerHands(handsArr)` should return 376.
+
+```js
+assert.strictEqual(pokerHands(handsArr), 376);
+```
+
+## 54
+
+### --description--
+
+If we take 47, reverse and add, 47 + 74 = 121, which is palindromic.
+
+Not all numbers produce palindromes so quickly. For example,
+
+
+ 349 + 943 = 1292,
+ 1292 + 2921 = 4213
+ 4213 + 3124 = 7337
+
+
+That is, 349 took three iterations to arrive at a palindrome.
+
+Although no one has proved it yet, it is thought that some numbers, like 196, never produce a palindrome. A number that never forms a palindrome through the reverse and add process is called a Lychrel number. Due to the theoretical nature of these numbers, and for the purpose of this problem, we shall assume that a number is Lychrel until proven otherwise. In addition you are given that for every number below ten-thousand, it will either (i) become a palindrome in less than fifty iterations, or, (ii) no one, with all the computing power that exists, has managed so far to map it to a palindrome. In fact, 10677 is the first number to be shown to require over fifty iterations before producing a palindrome: 4668731596684224866951378664 (53 iterations, 28-digits).
+
+Surprisingly, there are palindromic numbers that are themselves Lychrel numbers; the first example is 4994.
+
+How many Lychrel numbers are there below `num`?
+
+**Note:** Wording was modified slightly on 24 April 2007 to emphasize the theoretical nature of Lychrel numbers.
+
+### --tests--
+
+`countLychrelNumbers(1000)` should return a number.
+
+```js
+assert(typeof countLychrelNumbers(1000) === 'number');
+```
+
+`countLychrelNumbers(1000)` should return 13.
+
+```js
+assert.strictEqual(countLychrelNumbers(1000), 13);
+```
+
+`countLychrelNumbers(3243)` should return 39.
+
+```js
+assert.strictEqual(countLychrelNumbers(3243), 39);
+```
+
+`countLychrelNumbers(5000)` should return 76.
+
+```js
+assert.strictEqual(countLychrelNumbers(5000), 76);
+```
+
+`countLychrelNumbers(7654)` should return 140.
+
+```js
+assert.strictEqual(countLychrelNumbers(7654), 140);
+```
+
+`countLychrelNumbers(10000)` should return 249.
+
+```js
+assert.strictEqual(countLychrelNumbers(10000), 249);
+```
+
+## 55
+
+### --description--
+
+A googol ($10^{100}$) is a massive number: one followed by one-hundred zeros; $100^{100}$ is almost unimaginably large: one followed by two-hundred zeros. Despite their size, the sum of the digits in each number is only 1.
+
+Considering natural numbers of the form, $a^b$, where `a`, `b` < `n`, what is the maximum digital sum?
+
+### --tests--
+
+`powerfulDigitSum(3)` should return a number.
+
+```js
+assert(typeof powerfulDigitSum(3) === 'number');
+```
+
+`powerfulDigitSum(3)` should return `4`.
+
+```js
+assert.strictEqual(powerfulDigitSum(3), 4);
+```
+
+`powerfulDigitSum(10)` should return `45`.
+
+```js
+assert.strictEqual(powerfulDigitSum(10), 45);
+```
+
+`powerfulDigitSum(50)` should return `406`.
+
+```js
+assert.strictEqual(powerfulDigitSum(50), 406);
+```
+
+`powerfulDigitSum(75)` should return `684`.
+
+```js
+assert.strictEqual(powerfulDigitSum(75), 684);
+```
+
+`powerfulDigitSum(100)` should return `972`.
+
+```js
+assert.strictEqual(powerfulDigitSum(100), 972);
+```
+
+## 56
+
+### --description--
+
+It is possible to show that the square root of two can be expressed as an infinite continued fraction.
+
+$\sqrt 2 =1+ \frac 1 {2+ \frac 1 {2 +\frac 1 {2+ \dots}}}$
+
+By expanding this for the first four iterations, we get:
+
+$1 + \\frac 1 2 = \\frac 32 = 1.5$
+
+$1 + \\frac 1 {2 + \\frac 1 2} = \\frac 7 5 = 1.4$
+
+$1 + \\frac 1 {2 + \\frac 1 {2+\\frac 1 2}} = \\frac {17}{12} = 1.41666 \\dots$
+
+$1 + \\frac 1 {2 + \\frac 1 {2+\\frac 1 {2+\\frac 1 2}}} = \\frac {41}{29} = 1.41379 \\dots$
+
+The next three expansions are $\\frac {99}{70}$, $\\frac {239}{169}$, and $\\frac {577}{408}$, but the eighth expansion, $\\frac {1393}{985}$, is the first example where the number of digits in the numerator exceeds the number of digits in the denominator.
+
+In the first `n` expansions, how many fractions contain a numerator with more digits than denominator?
+
+### --tests--
+
+`squareRootConvergents(10)` should return a number.
+
+```js
+assert(typeof squareRootConvergents(10) === 'number');
+```
+
+`squareRootConvergents(10)` should return 1.
+
+```js
+assert.strictEqual(squareRootConvergents(10), 1);
+```
+
+`squareRootConvergents(100)` should return 15.
+
+```js
+assert.strictEqual(squareRootConvergents(100), 15);
+```
+
+`squareRootConvergents(1000)` should return 153.
+
+```js
+assert.strictEqual(squareRootConvergents(1000), 153);
+```
+
+## 57
+
+### --description--
+
+Starting with 1 and spiralling anticlockwise in the following way, a square spiral with side length 7 is formed.
+
+
+ 37 36 35 34 33 32 31
+ 38 17 16 15 14 13 30
+ 39 18 5 4 3 12 29
+ 40 19 6 1 2 11 28
+ 41 20 7 8 9 10 27
+ 42 21 22 23 24 25 26
+ 43 44 45 46 47 48 49
+
+
+It is interesting to note that the odd squares lie along the bottom right diagonal, but what is more interesting is that 8 out of the 13 numbers lying along both diagonals are prime; that is, a ratio of 8/13 ≈ 62%.
+
+If one complete new layer is wrapped around the spiral above, a square spiral with side length 9 will be formed. If this process is continued, what is the side length of the square spiral for which the percent of primes along both diagonals first falls below `percent`?
+
+### --tests--
+
+`spiralPrimes(50)` should return a number.
+
+```js
+assert(typeof spiralPrimes(50) === 'number');
+```
+
+`spiralPrimes(50)` should return `11`.
+
+```js
+assert.strictEqual(spiralPrimes(50), 11);
+```
+
+`spiralPrimes(15)` should return `981`.
+
+```js
+assert.strictEqual(spiralPrimes(15), 981);
+```
+
+`spiralPrimes(10)` should return `26241`.
+
+```js
+assert.strictEqual(spiralPrimes(10), 26241);
+```
+
+## 58
+
+### --description--
+
+Each character on a computer is assigned a unique code and the preferred standard is ASCII (American Standard Code for Information Interchange). For example, uppercase A = 65, asterisk (\*) = 42, and lowercase k = 107.
+
+A modern encryption method is to take a text file, convert the bytes to ASCII, then XOR each byte with a given value, taken from a secret key. The advantage with the XOR function is that using the same encryption key on the cipher text, restores the plain text; for example, 65 XOR 42 = 107, then 107 XOR 42 = 65.
+
+For unbreakable encryption, the key is the same length as the plain text message, and the key is made up of random bytes. The user would keep the encrypted message and the encryption key in different locations, and without both "halves", it is impossible to decrypt the message.
+
+Unfortunately, this method is impractical for most users, so the modified method is to use a password as a key. If the password is shorter than the message, which is likely, the key is repeated cyclically throughout the message. The balance for this method is using a sufficiently long password key for security, but short enough to be memorable.
+
+Your task has been made easy, as the encryption key consists of three lower case characters. Using `cipher`, an array containing the encrypted ASCII codes, and the knowledge that the plain text must contain common English words, decrypt the message and find the sum of the ASCII values in the original text.
+
+### --tests--
+
+`XORDecryption(cipher)` should return a number.
+
+```js
+assert(typeof XORDecryption(cipher) === 'number');
+```
+
+`XORDecryption(cipher)` should return 129448.
+
+```js
+assert.strictEqual(XORDecryption(cipher), 129448);
+```
+
+## 59
+
+### --description--
+
+The primes 3, 7, 109, and 673, are quite remarkable. By taking any two primes and concatenating them in any order the result will always be prime. For example, taking 7 and 109, both 7109 and 1097 are prime. The sum of these four primes, 792, represents the lowest sum for a set of four primes with this property.
+
+Find the lowest sum for a set of five primes for which any two primes concatenate to produce another prime.
+
+### --tests--
+
+`primePairSets()` should return a number.
+
+```js
+assert(typeof primePairSets() === 'number');
+```
+
+`primePairSets()` should return 26033.
+
+```js
+assert.strictEqual(primePairSets(), 26033);
+```
+
+## 60
+
+### --description--
+
+Triangle, square, pentagonal, hexagonal, heptagonal, and octagonal numbers are all figurate (polygonal) numbers and are generated by the following formulae:
+
+| Type of Number | Formula | Sequence |
+| -------------- | ---------------------------- | --------------------- |
+| Triangle | $P_3(n) = \frac{n(n+1)}{2}$ | 1, 3, 6, 10, 15, ... |
+| Square | $P_4(n) = n^2$ | 1, 4, 9, 16, 25, ... |
+| Pentagonal | $P_5(n) = \frac{n(3n−1)}2$ | 1, 5, 12, 22, 35, ... |
+| Hexagonal | $P_6(n) = n(2n−1)$ | 1, 6, 15, 28, 45, ... |
+| Heptagonal | $P_7(n) = \frac{n(5n−3)}{2}$ | 1, 7, 18, 34, 55, ... |
+| Octagonal | $P_8(n) = n(3n−2)$ | 1, 8, 21, 40, 65, ... |
+
+The ordered set of three 4-digit numbers: 8128, 2882, 8281, has three interesting properties.
+
+1. The set is cyclic, in that the last two digits of each number is the first two digits of the next number (including the last number with the first).
+2. Each polygonal type: triangle ($P_3(127) = 8128$), square ($P_4(91) = 8281$), and pentagonal ($P_5(44) = 2882$), is represented by a different number in the set.
+3. This is the only set of 4-digit numbers with this property.
+
+Find the sum of all numbers in ordered sets of `n` cyclic 4-digit numbers for which each of the $P_3$ to $P_{n + 2}$ polygonal types, is represented by a different number in the set.
+
+### --tests--
+
+`cyclicalFigurateNums(3)` should return a number.
+
+```js
+assert(typeof cyclicalFigurateNums(3) === 'number');
+```
+
+`cyclicalFigurateNums(3)` should return `19291`.
+
+```js
+assert.strictEqual(cyclicalFigurateNums(3), 19291);
+```
+
+`cyclicalFigurateNums(4)` should return `28684`.
+
+```js
+assert.strictEqual(cyclicalFigurateNums(4), 28684);
+```
+
+`cyclicalFigurateNums(5)` should return `76255`.
+
+```js
+assert.strictEqual(cyclicalFigurateNums(5), 76255);
+```
+
+`cyclicalFigurateNums(6)` should return `28684`.
+
+```js
+assert.strictEqual(cyclicalFigurateNums(6), 28684);
+```
+
+## 61
+
+### --description--
+
+The cube, 41063625 ($345^3$), can be permuted to produce two other cubes: 56623104 ($384^3$) and 66430125 ($405^3$). In fact, 41063625 is the smallest cube which has exactly three permutations of its digits which are also cube.
+
+Find the smallest cube for which exactly `n` permutations of its digits are cube.
+
+### --tests--
+
+`cubicPermutations(2)` should return a number.
+
+```js
+assert(typeof cubicPermutations(2) === 'number');
+```
+
+`cubicPermutations(2)` should return `125`.
+
+```js
+assert.strictEqual(cubicPermutations(2), 125);
+```
+
+`cubicPermutations(3)` should return `41063625`.
+
+```js
+assert.strictEqual(cubicPermutations(3), 41063625);
+```
+
+`cubicPermutations(4)` should return `1006012008`.
+
+```js
+assert.strictEqual(cubicPermutations(4), 1006012008);
+```
+
+`cubicPermutations(5)` should return `127035954683`.
+
+```js
+assert.strictEqual(cubicPermutations(5), 127035954683);
+```
+
+## 62
+
+### --description--
+
+The 5-digit number, 16807 = 75, is also a fifth power. Similarly, the 9-digit number, 134217728 = 89, is a ninth power.
+
+Complete the function so that it returns how many positive integers are of length `n` and an `n`th power.
+
+### --tests--
+
+`powerfulDigitCounts(1)` should return a number.
+
+```js
+assert(typeof powerfulDigitCounts(1) === 'number');
+```
+
+`powerfulDigitCounts(1)` should return `9`.
+
+```js
+assert.strictEqual(powerfulDigitCounts(1), 9);
+```
+
+`powerfulDigitCounts(2)` should return `6`.
+
+```js
+assert.strictEqual(powerfulDigitCounts(2), 6);
+```
+
+`powerfulDigitCounts(3)` should return `5`.
+
+```js
+assert.strictEqual(powerfulDigitCounts(3), 5);
+```
+
+`powerfulDigitCounts(4)` should return `4`.
+
+```js
+assert.strictEqual(powerfulDigitCounts(4), 4);
+```
+
+`powerfulDigitCounts(5)` should return `3`.
+
+```js
+assert.strictEqual(powerfulDigitCounts(5), 3);
+```
+
+`powerfulDigitCounts(6)` should return `3`.
+
+```js
+assert.strictEqual(powerfulDigitCounts(6), 3);
+```
+
+`powerfulDigitCounts(7)` should return `2`.
+
+```js
+assert.strictEqual(powerfulDigitCounts(7), 2);
+```
+
+`powerfulDigitCounts(8)` should return `2`.
+
+```js
+assert.strictEqual(powerfulDigitCounts(8), 2);
+```
+
+`powerfulDigitCounts(10)` should return `2`.
+
+```js
+assert.strictEqual(powerfulDigitCounts(10), 2);
+```
+
+`powerfulDigitCounts(21)` should return `1`.
+
+```js
+assert.strictEqual(powerfulDigitCounts(21), 1);
+```
+
+## 63
+
+### --description--
+
+All square roots are periodic when written as continued fractions and can be written in the form:
+
+$\\displaystyle \\quad \\quad \\sqrt{N}=a_0+\\frac 1 {a_1+\\frac 1 {a_2+ \\frac 1 {a3+ \\dots}}}$
+
+For example, let us consider $\\sqrt{23}$:
+
+$\\quad \\quad \\sqrt{23}=4+\\sqrt{23}-4=4+\\frac 1 {\\frac 1 {\\sqrt{23}-4}}=4+\\frac 1 {1+\\frac{\\sqrt{23}-3}7}$
+
+If we continue we would get the following expansion:
+
+$\\displaystyle \\quad \\quad \\sqrt{23}=4+\\frac 1 {1+\\frac 1 {3+ \\frac 1 {1+\\frac 1 {8+ \\dots}}}}$
+
+The process can be summarized as follows:
+
+$\\quad \\quad a_0=4, \\frac 1 {\\sqrt{23}-4}=\\frac {\\sqrt{23}+4} 7=1+\\frac {\\sqrt{23}-3} 7$
+
+$\\quad \\quad a_1=1, \\frac 7 {\\sqrt{23}-3}=\\frac {7(\\sqrt{23}+3)} {14}=3+\\frac {\\sqrt{23}-3} 2$
+
+$\\quad \\quad a_2=3, \\frac 2 {\\sqrt{23}-3}=\\frac {2(\\sqrt{23}+3)} {14}=1+\\frac {\\sqrt{23}-4} 7$
+
+$\\quad \\quad a_3=1, \\frac 7 {\\sqrt{23}-4}=\\frac {7(\\sqrt{23}+4)} 7=8+\\sqrt{23}-4$
+
+$\\quad \\quad a_4=8, \\frac 1 {\\sqrt{23}-4}=\\frac {\\sqrt{23}+4} 7=1+\\frac {\\sqrt{23}-3} 7$
+
+$\\quad \\quad a_5=1, \\frac 7 {\\sqrt{23}-3}=\\frac {7 (\\sqrt{23}+3)} {14}=3+\\frac {\\sqrt{23}-3} 2$
+
+$\\quad \\quad a_6=3, \\frac 2 {\\sqrt{23}-3}=\\frac {2(\\sqrt{23}+3)} {14}=1+\\frac {\\sqrt{23}-4} 7$
+
+$\\quad \\quad a_7=1, \\frac 7 {\\sqrt{23}-4}=\\frac {7(\\sqrt{23}+4)} {7}=8+\\sqrt{23}-4$
+
+It can be seen that the sequence is repeating. For conciseness, we use the notation $\\sqrt{23}=\[4;(1,3,1,8)]$, to indicate that the block (1,3,1,8) repeats indefinitely.
+
+The first ten continued fraction representations of (irrational) square roots are:
+
+$\\quad \\quad \\sqrt{2}=\[1;(2)]$, period = 1
+
+$\\quad \\quad \\sqrt{3}=\[1;(1,2)]$, period = 2
+
+$\\quad \\quad \\sqrt{5}=\[2;(4)]$, period = 1
+
+$\\quad \\quad \\sqrt{6}=\[2;(2,4)]$, period = 2
+
+$\\quad \\quad \\sqrt{7}=\[2;(1,1,1,4)]$, period = 4
+
+$\\quad \\quad \\sqrt{8}=\[2;(1,4)]$, period = 2
+
+$\\quad \\quad \\sqrt{10}=\[3;(6)]$, period = 1
+
+$\\quad \\quad \\sqrt{11}=\[3;(3,6)]$, period = 2
+
+$\\quad \\quad \\sqrt{12}=\[3;(2,6)]$, period = 2
+
+$\\quad \\quad \\sqrt{13}=\[3;(1,1,1,1,6)]$, period = 5
+
+Exactly four continued fractions, for $N \\le 13$, have an odd period.
+
+How many continued fractions for $N \\le n$ have an odd period?
+
+### --tests--
+
+`oddPeriodSqrts(13)` should return a number.
+
+```js
+assert(typeof oddPeriodSqrts(13) === 'number');
+```
+
+`oddPeriodSqrts(500)` should return `83`.
+
+```js
+assert.strictEqual(oddPeriodSqrts(500), 83);
+```
+
+`oddPeriodSqrts(1000)` should return `152`.
+
+```js
+assert.strictEqual(oddPeriodSqrts(1000), 152);
+```
+
+`oddPeriodSqrts(5000)` should return `690`.
+
+```js
+assert.strictEqual(oddPeriodSqrts(5000), 690);
+```
+
+`oddPeriodSqrts(10000)` should return `1322`.
+
+```js
+assert.strictEqual(oddPeriodSqrts(10000), 1322);
+```
+
+## 64
+
+### --description--
+
+The square root of 2 can be written as an infinite continued fraction.
+
+$\\sqrt{2} = 1 + \\dfrac{1}{2 + \\dfrac{1}{2 + \\dfrac{1}{2 + \\dfrac{1}{2 + ...}}}}$
+
+The infinite continued fraction can be written, $\\sqrt{2} = \[1; (2)]$ indicates that 2 repeats *ad infinitum*. In a similar way, $\\sqrt{23} = \[4; (1, 3, 1, 8)]$. It turns out that the sequence of partial values of continued fractions for square roots provide the best rational approximations. Let us consider the convergents for $\\sqrt{2}$.
+
+$1 + \\dfrac{1}{2} = \\dfrac{3}{2}\\\\ 1 + \\dfrac{1}{2 + \\dfrac{1}{2}} = \\dfrac{7}{5}\\\\ 1 + \\dfrac{1}{2 + \\dfrac{1}{2 + \\dfrac{1}{2}}} = \\dfrac{17}{12}\\\\ 1 + \\dfrac{1}{2 + \\dfrac{1}{2 + \\dfrac{1}{2 + \\dfrac{1}{2}}}} = \\dfrac{41}{29}$
+
+Hence the sequence of the first ten convergents for $\\sqrt{2}$ are:
+
+$1, \\dfrac{3}{2}, \\dfrac{7}{5}, \\dfrac{17}{12}, \\dfrac{41}{29}, \\dfrac{99}{70}, \\dfrac{239}{169}, \\dfrac{577}{408}, \\dfrac{1393}{985}, \\dfrac{3363}{2378}, ...$
+
+What is most surprising is that the important mathematical constant, $e = \[2; 1, 2, 1, 1, 4, 1, 1, 6, 1, ... , 1, 2k, 1, ...]$. The first ten terms in the sequence of convergents for `e` are:
+
+$2, 3, \\dfrac{8}{3}, \\dfrac{11}{4}, \\dfrac{19}{7}, \\dfrac{87}{32}, \\dfrac{106}{39}, \\dfrac{193}{71}, \\dfrac{1264}{465}, \\dfrac{1457}{536}, ...$
+
+The sum of digits in the numerator of the 10th convergent is $1 + 4 + 5 + 7 = 17$.
+
+Find the sum of digits in the numerator of the `n`th convergent of the continued fraction for `e`.
+
+### --tests--
+
+`convergentsOfE(10)` should return a number.
+
+```js
+assert(typeof convergentsOfE(10) === 'number');
+```
+
+`convergentsOfE(10)` should return `17`.
+
+```js
+assert.strictEqual(convergentsOfE(10), 17);
+```
+
+`convergentsOfE(30)` should return `53`.
+
+```js
+assert.strictEqual(convergentsOfE(30), 53);
+```
+
+`convergentsOfE(50)` should return `91`.
+
+```js
+assert.strictEqual(convergentsOfE(50), 91);
+```
+
+`convergentsOfE(70)` should return `169`.
+
+```js
+assert.strictEqual(convergentsOfE(70), 169);
+```
+
+`convergentsOfE(100)` should return `272`.
+
+```js
+assert.strictEqual(convergentsOfE(100), 272);
+```
+
+## 65
+
+### --description--
+
+Consider quadratic Diophantine equations of the form:
+
+x2 – Dy2 = 1
+
+For example, when D=13, the minimal solution in x is 6492 – 13×1802 = 1.
+
+It can be assumed that there are no solutions in positive integers when D is square.
+
+By finding minimal solutions in x for D = {2, 3, 5, 6, 7}, we obtain the following:
+
+
+ 32 – 2×22 = 1
+ 22 – 3×12 = 1
+ 92 – 5×42 = 1
+ 52 – 6×22 = 1
+ 82 – 7×32 = 1
+
+
+Hence, by considering minimal solutions in `x` for D ≤ 7, the largest `x` is obtained when D=5.
+
+Find the value of D ≤ `n` in minimal solutions of `x` for which the largest value of `x` is obtained.
+
+### --tests--
+
+`diophantineEquation(7)` should return a number.
+
+```js
+assert(typeof diophantineEquation(7) === 'number');
+```
+
+`diophantineEquation(7)` should return `5`.
+
+```js
+assert.strictEqual(diophantineEquation(7), 5);
+```
+
+`diophantineEquation(100)` should return `61`.
+
+```js
+assert.strictEqual(diophantineEquation(100), 61);
+```
+
+`diophantineEquation(409)` should return `409`.
+
+```js
+assert.strictEqual(diophantineEquation(409), 409);
+```
+
+`diophantineEquation(500)` should return `421`.
+
+```js
+assert.strictEqual(diophantineEquation(500), 421);
+```
+
+`diophantineEquation(1000)` should return `661`.
+
+```js
+assert.strictEqual(diophantineEquation(1000), 661);
+```
+
+## 66
+
+### --description--
+
+By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.
+
+
+ 3
+ 7 4
+ 2 4 6
+ 8 5 9 3
+
+
+That is, 3 + 7 + 4 + 9 = 23.
+
+Find the maximum total from top to bottom in `numTriangle`, a 2D array defined in the background containing a triangle with one-hundred rows.
+
+**Note:** This is a much more difficult version of Problem 18. It is not possible to try every route to solve this problem, as there are 299 altogether! If you could check one trillion (1012) routes every second it would take over twenty billion years to check them all. There is an efficient algorithm to solve it. ;o)
+
+### --tests--
+
+`maximumPathSumII([[3, 0, 0, 0],[7, 4, 0, 0],[2, 4, 6, 0],[8, 5, 9, 3]])` should return a number.
+
+```js
+assert(typeof maximumPathSumII(_testTriangle) === 'number');
+```
+
+`maximumPathSumII([[3, 0, 0, 0],[7, 4, 0, 0],[2, 4, 6, 0],[8, 5, 9, 3]])` should return 23.
+
+```js
+assert.strictEqual(maximumPathSumII(_testTriangle), 23);
+```
+
+`maximumPathSumII(numTriangle)` should return 7273.
+
+```js
+assert.strictEqual(maximumPathSumII(_numTriangle), 7273);
+```
+
+## 67
+
+### --description--
+
+Consider the following "magic" 3-gon ring, filled with the numbers 1 to 6, and each line adding to nine.
+
+
+
+Working **clockwise**, and starting from the group of three with the numerically lowest external node (4,3,2 in this example), each solution can be described uniquely. For example, the above solution can be described by the set: 4,3,2; 6,2,1; 5,1,3.
+
+It is possible to complete the ring with four different totals: 9, 10, 11, and 12. There are eight solutions in total.
+
+
+
+|
Total
|
Solution Set
|
+| -------------------------------------- | --------------------------------------------- |
+| 9 | 4,2,3; 5,3,1; 6,1,2 |
+| 9 | 4,3,2; 6,2,1; 5,1,3 |
+| 10 | 2,3,5; 4,5,1; 6,1,3 |
+| 10 | 2,5,3; 6,3,1; 4,1,5 |
+| 11 | 1,4,6; 3,6,2; 5,2,4 |
+| 11 | 1,6,4; 5,4,2; 3,2,6 |
+| 12 | 1,5,6; 2,6,4; 3,4,5 |
+| 12 | 1,6,5; 3,5,4; 2,4,6 |
+
+
+
+By concatenating each group it is possible to form 9-digit strings; the maximum string for a 3-gon ring is 432621513.
+
+Using the numbers 1 to 10, and depending on arrangements, it is possible to form 16- and 17-digit strings. What is the maximum **16-digit** string for a "magic" 5-gon ring?
+
+
+
+### --tests--
+
+`magic5GonRing()` should return a number.
+
+```js
+assert(typeof magic5GonRing() === 'number');
+```
+
+`magic5GonRing()` should return 6531031914842725.
+
+```js
+assert.strictEqual(magic5GonRing(), 6531031914842725);
+```
+
+## 68
+
+### --description--
+
+Euler's Totient function, ${\phi}(n)$ (sometimes called the phi function), is used to determine the number of numbers less than `n` which are relatively prime to `n`. For example, as 1, 2, 4, 5, 7, and 8, are all less than nine and relatively prime to nine, ${\phi}(9) = 6$.
+
+
+
+| $n$ | $\text{Relatively Prime}$ | $\displaystyle{\phi}(n)$ | $\displaystyle\frac{n}{{\phi}(n)}$ |
+| --- | ------------------------- | ------------------------ | ---------------------------------- |
+| 2 | 1 | 1 | 2 |
+| 3 | 1,2 | 2 | 1.5 |
+| 4 | 1,3 | 2 | 2 |
+| 5 | 1,2,3,4 | 4 | 1.25 |
+| 6 | 1,5 | 2 | 3 |
+| 7 | 1,2,3,4,5,6 | 6 | 1.1666... |
+| 8 | 1,3,5,7 | 4 | 2 |
+| 9 | 1,2,4,5,7,8 | 6 | 1.5 |
+| 10 | 1,3,7,9 | 4 | 2.5 |
+
+
+
+It can be seen that `n` = 6 produces a maximum $\displaystyle\frac{n}{{\phi}(n)}$ for `n` ≤ 10.
+
+Find the value of `n` ≤ `limit` for which $\displaystyle\frac{n}{{\phi(n)}}$ is a maximum.
+
+### --tests--
+
+`totientMaximum(10)` should return a number.
+
+```js
+assert(typeof totientMaximum(10) === 'number');
+```
+
+`totientMaximum(10)` should return `6`.
+
+```js
+assert.strictEqual(totientMaximum(10), 6);
+```
+
+`totientMaximum(10000)` should return `2310`.
+
+```js
+assert.strictEqual(totientMaximum(10000), 2310);
+```
+
+`totientMaximum(500000)` should return `30030`.
+
+```js
+assert.strictEqual(totientMaximum(500000), 30030);
+```
+
+`totientMaximum(1000000)` should return `510510`.
+
+```js
+assert.strictEqual(totientMaximum(1000000), 510510);
+```
+
+## 69
+
+### --description--
+
+Euler's Totient function, ${\phi}(n)$ (sometimes called the phi function), is used to determine the number of positive numbers less than or equal to `n` which are relatively prime to `n`. For example, as 1, 2, 4, 5, 7, and 8, are all less than nine and relatively prime to nine, ${\phi}(9) = 6$. The number 1 is considered to be relatively prime to every positive number, so ${\phi}(1) = 1$.
+
+Interestingly, ${\phi}(87109) = 79180$, and it can be seen that 87109 is a permutation of 79180.
+
+Find the value of `n`, 1 < `n` < `limit`, for which ${\phi}(n)$ is a permutation of `n` and the ratio $\displaystyle\frac{n}{{\phi}(n)}$ produces a minimum.
+
+### --tests--
+
+`totientPermutation(10000)` should return a number.
+
+```js
+assert(typeof totientPermutation(10000) === 'number');
+```
+
+`totientPermutation(10000)` should return `4435`.
+
+```js
+assert.strictEqual(totientPermutation(10000), 4435);
+```
+
+`totientPermutation(100000)` should return `75841`.
+
+```js
+assert.strictEqual(totientPermutation(100000), 75841);
+```
+
+`totientPermutation(500000)` should return `474883`.
+
+```js
+assert.strictEqual(totientPermutation(500000), 474883);
+```
+
+`totientPermutation(10000000)` should return `8319823`.
+
+```js
+assert.strictEqual(totientPermutation(10000000), 8319823);
+```
+
+## 70
+
+### --description--
+
+Consider the fraction, $\frac{n}{d}$, where `n` and `d` are positive integers. If `n` < `d` and highest common factor, ${{HCF}(n, d)} = 1$, it is called a reduced proper fraction.
+
+If we list the set of reduced proper fractions for `d` ≤ 8 in ascending order of size, we get:
+
+$$\frac{1}{8}, \frac{1}{7}, \frac{1}{6}, \frac{1}{5}, \frac{1}{4}, \frac{2}{7}, \frac{1}{3}, \frac{3}{8}, \frac{\textbf2}{\textbf5}, \frac{3}{7}, \frac{1}{2}, \frac{4}{7}, \frac{3}{5}, \frac{5}{8}, \frac{2}{3}, \frac{5}{7}, \frac{3}{4}, \frac{4}{5}, \frac{5}{6}, \frac{6}{7}, \frac{7}{8}$$
+
+It can be seen that $\frac{2}{5}$ is the fraction immediately to the left of $\frac{3}{7}$.
+
+By listing the set of reduced proper fractions for `d` ≤ `limit` in ascending order of size, find the numerator of the fraction immediately to the left of $\frac{3}{7}$.
+
+### --tests--
+
+`orderedFractions(8)` should return a number.
+
+```js
+assert(typeof orderedFractions(8) === 'number');
+```
+
+`orderedFractions(8)` should return `2`.
+
+```js
+assert.strictEqual(orderedFractions(8), 2);
+```
+
+`orderedFractions(10)` should return `2`.
+
+```js
+assert.strictEqual(orderedFractions(10), 2);
+```
+
+`orderedFractions(9994)` should return `4283`.
+
+```js
+assert.strictEqual(orderedFractions(9994), 4283);
+```
+
+`orderedFractions(500000)` should return `214283`.
+
+```js
+assert.strictEqual(orderedFractions(500000), 214283);
+```
+
+`orderedFractions(1000000)` should return `428570`.
+
+```js
+assert.strictEqual(orderedFractions(1000000), 428570);
+```
+
+## 71
+
+### --description--
+
+Consider the fraction, $\frac{n}{d}$, where `n` and `d` are positive integers. If `n` < `d` and highest common factor, ${HCF}(n, d) = 1$, it is called a reduced proper fraction.
+
+If we list the set of reduced proper fractions for `d` ≤ 8 in ascending order of size, we get:
+
+$$\frac{1}{8}, \frac{1}{7}, \frac{1}{6}, \frac{1}{5}, \frac{1}{4}, \frac{2}{7}, \frac{1}{3}, \frac{3}{8}, \frac{2}{5}, \frac{3}{7}, \frac{1}{2}, \frac{4}{7}, \frac{3}{5}, \frac{5}{8}, \frac{2}{3}, \frac{5}{7}, \frac{3}{4}, \frac{4}{5}, \frac{5}{6}, \frac{6}{7}, \frac{7}{8}$$
+
+It can be seen that there are `21` elements in this set.
+
+How many elements would be contained in the set of reduced proper fractions for `d` ≤ `limit`?
+
+### --tests--
+
+`countingFractions(8)` should return a number.
+
+```js
+assert(typeof countingFractions(8) === 'number');
+```
+
+`countingFractions(8)` should return `21`.
+
+```js
+assert.strictEqual(countingFractions(8), 21);
+```
+
+`countingFractions(20000)` should return `121590395`.
+
+```js
+assert.strictEqual(countingFractions(20000), 121590395);
+```
+
+`countingFractions(500000)` should return `75991039675`.
+
+```js
+assert.strictEqual(countingFractions(500000), 75991039675);
+```
+
+`countingFractions(1000000)` should return `303963552391`.
+
+```js
+assert.strictEqual(countingFractions(1000000), 303963552391);
+```
+
+## 72
+
+### --description--
+
+Consider the fraction, $\frac{n}{d}$, where `n` and `d` are positive integers. If `n` < `d` and highest common factor, ${HCF}(n, d) = 1$, it is called a reduced proper fraction.
+
+If we list the set of reduced proper fractions for `d` ≤ 8 in ascending order of size, we get:
+
+$$\frac{1}{8}, \frac{1}{7}, \frac{1}{6}, \frac{1}{5}, \frac{1}{4}, \frac{2}{7}, \frac{1}{3}, \mathbf{\frac{3}{8}, \frac{2}{5}, \frac{3}{7}}, \frac{1}{2}, \frac{4}{7}, \frac{3}{5}, \frac{5}{8}, \frac{2}{3}, \frac{5}{7}, \frac{3}{4}, \frac{4}{5}, \frac{5}{6}, \frac{6}{7}, \frac{7}{8}$$
+
+It can be seen that there are `3` fractions between $\frac{1}{3}$ and $\frac{1}{2}$.
+
+How many fractions lie between $\frac{1}{3}$ and $\frac{1}{2}$ in the sorted set of reduced proper fractions for `d` ≤ `limit`?
+
+### --tests--
+
+`countingFractionsInARange(8)` should return a number.
+
+```js
+assert(typeof countingFractionsInARange(8) === 'number');
+```
+
+`countingFractionsInARange(8)` should return `3`.
+
+```js
+assert.strictEqual(countingFractionsInARange(8), 3);
+```
+
+`countingFractionsInARange(1000)` should return `50695`.
+
+```js
+assert.strictEqual(countingFractionsInARange(1000), 50695);
+```
+
+`countingFractionsInARange(6000)` should return `1823861`.
+
+```js
+assert.strictEqual(countingFractionsInARange(6000), 1823861);
+```
+
+`countingFractionsInARange(12000)` should return `7295372`.
+
+```js
+assert.strictEqual(countingFractionsInARange(12000), 7295372);
+```
+
+## 73
+
+### --description--
+
+The number 145 is well known for the property that the sum of the factorial of its digits is equal to 145:
+
+$$1! + 4! + 5! = 1 + 24 + 120 = 145$$
+
+Perhaps less well known is 169, in that it produces the longest chain of numbers that link back to 169; it turns out that there are only three such loops that exist:
+
+$$\begin{align}
+&169 → 363601 → 1454 → 169\\\\
+&871 → 45361 → 871\\\\
+&872 → 45362 → 872\\\\
+\end{align}$$
+
+It is not difficult to prove that EVERY starting number will eventually get stuck in a loop. For example,
+
+$$\begin{align}
+&69 → 363600 → 1454 → 169 → 363601\\ (→ 1454)\\\\
+&78 → 45360 → 871 → 45361\\ (→ 871)\\\\
+&540 → 145\\ (→ 145)\\\\
+\end{align}$$
+
+Starting with 69 produces a chain of five non-repeating terms, but the longest non-repeating chain with a starting number below one million is sixty terms.
+
+How many chains, with a starting number below `n`, contain exactly sixty non-repeating terms?
+
+### --tests--
+
+`digitFactorialChains(2000)` should return a number.
+
+```js
+assert(typeof digitFactorialChains(2000) === 'number');
+```
+
+`digitFactorialChains(2000)` should return `6`.
+
+```js
+assert.strictEqual(digitFactorialChains(2000), 6);
+```
+
+`digitFactorialChains(100000)` should return `42`.
+
+```js
+assert.strictEqual(digitFactorialChains(100000), 42);
+```
+
+`digitFactorialChains(500000)` should return `282`.
+
+```js
+assert.strictEqual(digitFactorialChains(500000), 282);
+```
+
+`digitFactorialChains(1000000)` should return `402`.
+
+```js
+assert.strictEqual(digitFactorialChains(1000000), 402);
+```
+
+## 74
+
+### --description--
+
+It turns out that 12 cm is the smallest length of wire that can be bent to form an integer sided right angle triangle in exactly one way, but there are many more examples.
+
+
+ 12 cm: (3,4,5)
+ 24 cm: (6,8,10)
+ 30 cm: (5,12,13)
+ 36 cm: (9,12,15)
+ 40 cm: (8,15,17)
+ 48 cm: (12,16,20)
+
+
+In contrast, some lengths of wire, like 20 cm, cannot be bent to form an integer sided right angle triangle, and other lengths allow more than one solution to be found; for example, using 120 cm it is possible to form exactly three different integer sided right angle triangles.
+
+
+ 120 cm: (30,40,50), (20,48,52), (24,45,51)
+
+
+Given that L is the length of the wire, for how many values of L ≤ `n` can exactly one, integer sided right angle, triangle be formed?
+
+### --tests--
+
+`singularIntRightTriangles(48)` should return a number.
+
+```js
+assert(typeof singularIntRightTriangles(48) === 'number');
+```
+
+`singularIntRightTriangles(48)` should return `6`.
+
+```js
+assert.strictEqual(singularIntRightTriangles(48), 6);
+```
+
+`singularIntRightTriangles(700000)` should return `75783`.
+
+```js
+assert.strictEqual(singularIntRightTriangles(700000), 75783);
+```
+
+`singularIntRightTriangles(1000000)` should return `107876`.
+
+```js
+assert.strictEqual(singularIntRightTriangles(1000000), 107876);
+```
+
+`singularIntRightTriangles(1500000)` should return `161667`.
+
+```js
+assert.strictEqual(singularIntRightTriangles(1500000), 161667);
+```
+
+## 75
+
+### --description--
+
+It is possible to write five as a sum in exactly six different ways:
+
+
+ 4 + 1
+ 3 + 2
+ 3 + 1 + 1
+ 2 + 2 + 1
+ 2 + 1 + 1 + 1
+ 1 + 1 + 1 + 1 + 1
+
+
+How many different ways can `n` be written as a sum of at least two positive integers?
+
+### --tests--
+
+`countingSummations(5)` should return a number.
+
+```js
+assert(typeof countingSummations(5) === 'number');
+```
+
+`countingSummations(5)` should return `6`.
+
+```js
+assert.strictEqual(countingSummations(5), 6);
+```
+
+`countingSummations(20)` should return `626`.
+
+```js
+assert.strictEqual(countingSummations(20), 626);
+```
+
+`countingSummations(50)` should return `204225`.
+
+```js
+assert.strictEqual(countingSummations(50), 204225);
+```
+
+`countingSummations(100)` should return `190569291`.
+
+```js
+assert.strictEqual(countingSummations(100), 190569291);
+```
+
+## 76
+
+### --description--
+
+It is possible to write ten as the sum of primes in exactly five different ways:
+
+
+ 7 + 3
+ 5 + 5
+ 5 + 3 + 2
+ 3 + 3 + 2 + 2
+ 2 + 2 + 2 + 2 + 2
+
+
+What is the first value which can be written as the sum of primes in over `n` ways?
+
+### --tests--
+
+`primeSummations(5)` should return a number.
+
+```js
+assert(typeof primeSummations(5) === 'number');
+```
+
+`primeSummations(5)` should return `11`.
+
+```js
+assert.strictEqual(primeSummations(5), 11);
+```
+
+`primeSummations(100)` should return `31`.
+
+```js
+assert.strictEqual(primeSummations(100), 31);
+```
+
+`primeSummations(1000)` should return `53`.
+
+```js
+assert.strictEqual(primeSummations(1000), 53);
+```
+
+`primeSummations(5000)` should return `71`.
+
+```js
+assert.strictEqual(primeSummations(5000), 71);
+```
+
+## 77
+
+### --description--
+
+Let ${p}(n)$ represent the number of different ways in which `n` coins can be separated into piles. For example, five coins can be separated into piles in exactly seven different ways, so ${p}(5) = 7$.
+
+
+
+| Coin piles |
+| ----------------- |
+| OOOOO |
+| OOOO O |
+| OOO OO |
+| OOO O O |
+| OO OO O |
+| OO O O O |
+| O O O O O |
+
+
+
+Find the least value of `n` for which ${p}(n)$ is divisible by `divisor`.
+
+### --tests--
+
+`coinPartitions(7)` should return a number.
+
+```js
+assert(typeof coinPartitions(7) === 'number');
+```
+
+`coinPartitions(7)` should return `5`.
+
+```js
+assert.strictEqual(coinPartitions(7), 5);
+```
+
+`coinPartitions(10000)` should return `599`.
+
+```js
+assert.strictEqual(coinPartitions(10000), 599);
+```
+
+`coinPartitions(100000)` should return `11224`.
+
+```js
+assert.strictEqual(coinPartitions(100000), 11224);
+```
+
+`coinPartitions(1000000)` should return `55374`.
+
+```js
+assert.strictEqual(coinPartitions(1000000), 55374);
+```
+
+## 78
+
+### --description--
+
+A common security method used for online banking is to ask the user for three random characters from a passcode. For example, if the passcode was `531278`, they may ask for the 2nd, 3rd, and 5th characters; the expected reply would be: `317`.
+
+The arrays, `keylog1`, `keylog2`, and `keylog3`, contains fifty successful login attempts.
+
+Given that the three characters are always asked for in order, analyze the array so as to determine the shortest possible secret passcode of unknown length.
+
+### --tests--
+
+`passcodeDerivation(keylog1)` should return a number.
+
+```js
+assert(typeof passcodeDerivation(_keylog1) === 'number');
+```
+
+`passcodeDerivation(keylog1)` should return `531278`.
+
+```js
+assert.strictEqual(passcodeDerivation(_keylog1), 531278);
+```
+
+`passcodeDerivation(keylog2)` should return `1230567`.
+
+```js
+assert.strictEqual(passcodeDerivation(_keylog2), 1230567);
+```
+
+`passcodeDerivation(keylog3)` should return `73162890`.
+
+```js
+assert.strictEqual(passcodeDerivation(_keylog3), 73162890);
+```
+
+## 79
+
+### --description--
+
+It is well known that if the square root of a natural number is not an integer, then it is irrational. The decimal expansion of such square roots is infinite without any repeating pattern at all.
+
+The square root of two is `1.41421356237309504880...`, and the digital sum of the first one hundred decimal digits is `475`.
+
+For the first `n` natural numbers, find the total of the digital sums of the first one hundred decimal digits for all the irrational square roots.
+
+### --tests--
+
+`sqrtDigitalExpansion(2)` should return a number.
+
+```js
+assert(typeof sqrtDigitalExpansion(2) === 'number');
+```
+
+`sqrtDigitalExpansion(2)` should return `475`.
+
+```js
+assert.strictEqual(sqrtDigitalExpansion(2), 475);
+```
+
+`sqrtDigitalExpansion(50)` should return `19543`.
+
+```js
+assert.strictEqual(sqrtDigitalExpansion(50), 19543);
+```
+
+`sqrtDigitalExpansion(100)` should return `40886`.
+
+```js
+assert.strictEqual(sqrtDigitalExpansion(100), 40886);
+```
+
+## 80
+
+### --description--
+
+In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom right, by **only moving to the right and down**, is indicated in bold red and is equal to `2427`.
+
+ $$\begin{pmatrix}
+ \color{red}{131} & 673 & 234 & 103 & 18\\\\
+ \color{red}{201} & \color{red}{96} & \color{red}{342} & 965 & 150\\\\
+ 630 & 803 & \color{red}{746} & \color{red}{422} & 111\\\\
+ 537 & 699 & 497 & \color{red}{121} & 956\\\\
+ 805 & 732 & 524 & \color{red}{37} & \color{red}{331}
+ \end{pmatrix}$$
+
+Find the minimal path sum from the top left to the bottom right by only moving right and down in `matrix`, a 2D array representing a matrix. The maximum matrix size used in the tests will be 80 by 80.
+
+### --tests--
+
+`pathSumTwoWays(testMatrix1)` should return a number.
+
+```js
+assert(typeof pathSumTwoWays(_testMatrix1) === 'number');
+```
+
+`pathSumTwoWays(testMatrix1)` should return `2427`.
+
+```js
+assert.strictEqual(pathSumTwoWays(_testMatrix1), 2427);
+```
+
+`pathSumTwoWays(testMatrix2)` should return `427337`.
+
+```js
+assert.strictEqual(pathSumTwoWays(_testMatrix2), 427337);
+```
+
+## 81
+
+### --description--
+
+**Note:** This problem is a more challenging version of Problem 81.
+
+The minimal path sum in the 5 by 5 matrix below, by starting in any cell in the left column and finishing in any cell in the right column, and only moving up, down, and right, is indicated in red and bold; the sum is equal to `994`.
+
+ $$\begin{pmatrix}
+ 131 & 673 & \color{red}{234} & \color{red}{103} & \color{red}{18}\\\\
+ \color{red}{201} & \color{red}{96} & \color{red}{342} & 965 & 150\\\\
+ 630 & 803 & 746 & 422 & 111\\\\
+ 537 & 699 & 497 & 121 & 956\\\\
+ 805 & 732 & 524 & 37 & 331
+ \end{pmatrix}$$
+
+Find the minimal path sum from the left column to the right column in `matrix`, a 2D array representing a matrix. The maximum matrix size used in tests will be 80 by 80.
+
+### --tests--
+
+`pathSumThreeWays(testMatrix1)` should return a number.
+
+```js
+assert(typeof pathSumThreeWays(_testMatrix1) === 'number');
+```
+
+`pathSumThreeWays(testMatrix1)` should return `994`.
+
+```js
+assert.strictEqual(pathSumThreeWays(_testMatrix1), 994);
+```
+
+`pathSumThreeWays(testMatrix2)` should return `260324`.
+
+```js
+assert.strictEqual(pathSumThreeWays(_testMatrix2), 260324);
+```
+
+## 82
+
+### --description--
+
+**Note:** This problem is a significantly more challenging version of Problem 81.
+
+In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom right, by moving left, right, up, and down, is indicated in bold red and is equal to `2297`.
+
+ $$\begin{pmatrix}
+ \color{red}{131} & 673 & \color{red}{234} & \color{red}{103} & \color{red}{18}\\\\
+ \color{red}{201} & \color{red}{96} & \color{red}{342} & 965 & \color{red}{150}\\\\
+ 630 & 803 & 746 & \color{red}{422} & \color{red}{111}\\\\
+ 537 & 699 & 497 & \color{red}{121} & 956\\\\
+ 805 & 732 & 524 & \color{red}{37} & \color{red}{331}
+ \end{pmatrix}$$
+
+Find the minimal path sum from the top left to the bottom right by moving left, right, up, and down in `matrix`, a 2D array representing a matrix. The maximum matrix size used in tests will be 80 by 80.
+
+### --tests--
+
+`pathSumFourWays(testMatrix1)` should return a number.
+
+```js
+assert(typeof pathSumFourWays(_testMatrix1) === 'number');
+```
+
+`pathSumFourWays(testMatrix1)` should return `2297`.
+
+```js
+assert.strictEqual(pathSumFourWays(_testMatrix1), 2297);
+```
+
+`pathSumFourWays(testMatrix2)` should return `425185`.
+
+```js
+assert.strictEqual(pathSumFourWays(_testMatrix2), 425185);
+```
+
+## 83
+
+### --description--
+
+In the game, *Monopoly*, the standard board is set up in the following way:
+
+
+
+
+
+ GO |
+ A1 |
+ CC1 |
+ A2 |
+ T1 |
+ R1 |
+ B1 |
+ CH1 |
+ B2 |
+ B3 |
+ JAIL |
+
+
+ H2 |
+ |
+ C1 |
+
+
+ T2 |
+ |
+ U1 |
+
+
+ H1 |
+ |
+ C2 |
+
+
+ CH3 |
+ |
+ C3 |
+
+
+ R4 |
+ |
+ R2 |
+
+
+ G3 |
+ |
+ D1 |
+
+
+ CC3 |
+ |
+ CC2 |
+
+
+ G2 |
+ |
+ D2 |
+
+
+ G1 |
+ |
+ D3 |
+
+
+ G2J |
+ F3 |
+ U2 |
+ F2 |
+ F1 |
+ R3 |
+ E3 |
+ E2 |
+ CH2 |
+ E1 |
+ FP |
+
+
+
+
+
+A player starts on the GO square and adds the scores on two 6-sided dice to determine the number of squares they advance in a clockwise direction. Without any further rules we would expect to visit each square with equal probability: 2.5%. However, landing on G2J (Go To Jail), CC (community chest), and CH (chance) changes this distribution.
+
+In addition to G2J, and one card from each of CC and CH, that orders the player to go directly to jail, if a player rolls three consecutive doubles, they do not advance the result of their 3rd roll. Instead they proceed directly to jail.
+
+At the beginning of the game, the CC and CH cards are shuffled. When a player lands on CC or CH they take a card from the top of the respective pile and, after following the instructions, it is returned to the bottom of the pile. There are sixteen cards in each pile, but for the purpose of this problem we are only concerned with cards that order a movement; any instruction not concerned with movement will be ignored and the player will remain on the CC/CH square.
+
+
+ - Community Chest (2/16 cards):
+
+ - Advance to GO
+ - Go to JAIL
+
+
+ - Chance (10/16 cards):
+
+ - Advance to GO
+ - Go to JAIL
+ - Go to C1
+ - Go to E3
+ - Go to H2
+ - Go to R1
+ - Go to next R (railway company)
+ - Go to next R
+ - Go to next U (utility company)
+ - Go back 3 squares.
+
+
+
+The heart of this problem concerns the likelihood of visiting a particular square. That is, the probability of finishing at that square after a roll. For this reason it should be clear that, with the exception of G2J for which the probability of finishing on it is zero, the CH squares will have the lowest probabilities, as 5/8 request a movement to another square, and it is the final square that the player finishes at on each roll that we are interested in. We shall make no distinction between "Just Visiting" and being sent to JAIL, and we shall also ignore the rule about requiring a double to "get out of jail", assuming that they pay to get out on their next turn.
+
+By starting at GO and numbering the squares sequentially from 00 to 39 we can concatenate these two-digit numbers to produce strings that correspond with sets of squares.
+
+Statistically it can be shown that the three most popular squares, in order, are JAIL (6.24%) = Square 10, E3 (3.18%) = Square 24, and GO (3.09%) = Square 00. So these three most popular squares can be listed with the six-digit modal string `102400`.
+
+If, instead of using two 6-sided dice, two `n`-sided dice are used, find the six-digit modal string.
+
+### --tests--
+
+`monopolyOdds(8)` should return a string.
+
+```js
+assert(typeof monopolyOdds(8) === 'string');
+```
+
+`monopolyOdds(8)` should return string `102400`.
+
+```js
+assert.strictEqual(monopolyOdds(8), '102400');
+```
+
+`monopolyOdds(10)` should return string `100024`.
+
+```js
+assert.strictEqual(monopolyOdds(10), '100024');
+```
+
+`monopolyOdds(20)` should return string `100005`.
+
+```js
+assert.strictEqual(monopolyOdds(20), '100005');
+```
+
+`monopolyOdds(4)` should return string `101524`.
+
+```js
+assert.strictEqual(monopolyOdds(4), '101524');
+```
+
+## 84
+
+### --description--
+
+By counting carefully it can be seen that a rectangular grid measuring 3 by 2 contains eighteen rectangles:
+
+
+
+Although there may not exists a rectangular grid that contains exactly `n` rectangles, find the area of the grid with the nearest solution.
+
+### --tests--
+
+`countingRectangles(18)` should return a number.
+
+```js
+assert(typeof countingRectangles(18) === 'number');
+```
+
+`countingRectangles(18)` should return `6`.
+
+```js
+assert.strictEqual(countingRectangles(18), 6);
+```
+
+`countingRectangles(250)` should return `22`.
+
+```js
+assert.strictEqual(countingRectangles(250), 22);
+```
+
+`countingRectangles(50000)` should return `364`.
+
+```js
+assert.strictEqual(countingRectangles(50000), 364);
+```
+
+`countingRectangles(1000000)` should return `1632`.
+
+```js
+assert.strictEqual(countingRectangles(1000000), 1632);
+```
+
+`countingRectangles(2000000)` should return `2772`.
+
+```js
+assert.strictEqual(countingRectangles(2000000), 2772);
+```
+
+## 85
+
+### --description--
+
+A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a fly, F, sits in the opposite corner. By travelling on the surfaces of the room the shortest "straight line" distance from S to F is 10 and the path is shown on the diagram.
+
+
+
+However, there are up to three "shortest" path candidates for any given cuboid and the shortest route doesn't always have integer length.
+
+It can be shown that there are exactly `2060` distinct cuboids, ignoring rotations, with integer dimensions, up to a maximum size of M by M by M, for which the shortest route has integer length when M = 100. This is the least value of M for which the number of solutions first exceeds two thousand; the number of solutions when M = 99 is `1975`.
+
+Find the least value of M such that the number of solutions first exceeds `n`.
+
+### --tests--
+
+`cuboidRoute(2000)` should return a number.
+
+```js
+assert(typeof cuboidRoute(2000) === 'number');
+```
+
+`cuboidRoute(2000)` should return `100`.
+
+```js
+assert.strictEqual(cuboidRoute(2000), 100);
+```
+
+`cuboidRoute(25000)` should return `320`.
+
+```js
+assert.strictEqual(cuboidRoute(25000), 320);
+```
+
+`cuboidRoute(500000)` should return `1309`.
+
+```js
+assert.strictEqual(cuboidRoute(500000), 1309);
+```
+
+`cuboidRoute(1000000)` should return `1818`.
+
+```js
+assert.strictEqual(cuboidRoute(1000000), 1818);
+```
+
+## 86
+
+### --description--
+
+The smallest number expressible as the sum of a prime square, prime cube, and prime fourth power is `28`. In fact, there are exactly four numbers below fifty that can be expressed in such a way:
+
+
+ 28 = 22 + 23 + 24
+ 33 = 32 + 23 + 24
+ 49 = 52 + 23 + 24
+ 47 = 22 + 33 + 24
+
+
+How many numbers below `n` can be expressed as the sum of a prime square, prime cube, and prime fourth power?
+
+### --tests--
+
+`primePowerTriples(50)` should return a number.
+
+```js
+assert(typeof primePowerTriples(50) === 'number');
+```
+
+`primePowerTriples(50)` should return `4`.
+
+```js
+assert.strictEqual(primePowerTriples(50), 4);
+```
+
+`primePowerTriples(10035)` should return `684`.
+
+```js
+assert.strictEqual(primePowerTriples(10035), 684);
+```
+
+`primePowerTriples(500000)` should return `18899`.
+
+```js
+assert.strictEqual(primePowerTriples(500000), 18899);
+```
+
+`primePowerTriples(5000000)` should return `138932`.
+
+```js
+assert.strictEqual(primePowerTriples(5000000), 138932);
+```
+
+`primePowerTriples(50000000)` should return `1097343`.
+
+```js
+assert.strictEqual(primePowerTriples(50000000), 1097343);
+```
+
+## 87
+
+### --description--
+
+A natural number, `N`, that can be written as the sum and product of a given set of at least two natural numbers, $\\{a_1, a_2, \ldots , a_k\\}$ is called a product-sum number: $N = a_1 + a_2 + \cdots + a_k = a_1 × a_2 × \cdots × a_k$.
+
+For example, 6 = 1 + 2 + 3 = 1 × 2 × 3.
+
+For a given set of size, `k`, we shall call the smallest N with this property a minimal product-sum number. The minimal product-sum numbers for sets of size, `k` = 2, 3, 4, 5, and 6 are as follows.
+
+
+ k=2: 4 = 2 × 2 = 2 + 2
+ k=3: 6 = 1 × 2 × 3 = 1 + 2 + 3
+ k=4: 8 = 1 × 1 × 2 × 4 = 1 + 1 + 2 + 4
+ k=5: 8 = 1 × 1 × 2 × 2 × 2 = 1 + 1 + 2 + 2 + 2
+ k=6: 12 = 1 × 1 × 1 × 1 × 2 × 6 = 1 + 1 + 1 + 1 + 2 + 6
+
+
+Hence for 2 ≤ `k` ≤ 6, the sum of all the minimal product-sum numbers is 4 + 6 + 8 + 12 = 30; note that `8` is only counted once in the sum.
+
+In fact, as the complete set of minimal product-sum numbers for 2 ≤ `k` ≤ 12 is $\\{4, 6, 8, 12, 15, 16\\}$, the sum is `61`.
+
+What is the sum of all the minimal product-sum numbers for 2 ≤ `k` ≤ `limit`?
+
+### --tests--
+
+`productSumNumbers(6)` should return a number.
+
+```js
+assert(typeof productSumNumbers(6) === 'number');
+```
+
+`productSumNumbers(6)` should return `30`.
+
+```js
+assert.strictEqual(productSumNumbers(6), 30);
+```
+
+`productSumNumbers(12)` should return `61`.
+
+```js
+assert.strictEqual(productSumNumbers(12), 61);
+```
+
+`productSumNumbers(300)` should return `12686`.
+
+```js
+assert.strictEqual(productSumNumbers(300), 12686);
+```
+
+`productSumNumbers(6000)` should return `2125990`.
+
+```js
+assert.strictEqual(productSumNumbers(6000), 2125990);
+```
+
+`productSumNumbers(12000)` should return `7587457`.
+
+```js
+assert.strictEqual(productSumNumbers(12000), 7587457);
+```
+
+## 88
+
+### --description--
+
+For a number written in Roman numerals to be considered valid there are basic rules which must be followed. Even though the rules allow some numbers to be expressed in more than one way there is always a *best* way of writing a particular number.
+
+- Numerals must be arranged in descending order of size.
+- M, C, and X cannot be equaled or exceeded by smaller denominations.
+- D, L, and V can each only appear once.
+
+In addition to the three rules given above, if subtractive combinations are used then the following four rules must be followed.
+
+- Only one I, X, and C can be used as the leading numeral in part of a subtractive pair.
+- I can only be placed before V and X.
+- X can only be placed before L and C.
+- C can only be placed before D and M.
+
+For example, it would appear that there are at least six ways of writing the number sixteen:
+
+
+ IIIIIIIIIIIIIIII
+ VIIIIIIIIIII
+ VVIIIIII
+ XIIIIII
+ VVVI
+ XVI
+
+
+However, according to the rules only XIIIIII and XVI are valid, and the last example is considered to be the most efficient, as it uses the least number of numerals.
+
+The array, `roman`, will contain numbers written with valid, but not necessarily minimal, Roman numerals.
+
+Find the number of characters saved by writing each of these in their minimal form.
+
+**Note:** You can assume that all the Roman numerals in the array contain no more than four consecutive identical units.
+
+### --tests--
+
+`romanNumerals(testNumerals1)` should return a number.
+
+```js
+assert(typeof romanNumerals(_testNumerals1) === 'number');
+```
+
+`romanNumerals(testNumerals1)` should return `19`.
+
+```js
+assert.strictEqual(romanNumerals(_testNumerals1), 19);
+```
+
+`romanNumerals(testNumerals2)` should return `743`.
+
+```js
+assert.strictEqual(romanNumerals(_testNumerals2), 743);
+```
+
+## 89
+
+### --description--
+
+Each of the six faces on a cube has a different digit (0 to 9) written on it; the same is done to a second cube. By placing the two cubes side-by-side in different positions we can form a variety of 2-digit numbers.
+
+For example, the square number 64 could be formed:
+
+
+
+In fact, by carefully choosing the digits on both cubes it is possible to display all of the square numbers below one-hundred: 01, 04, 09, 16, 25, 36, 49, 64, and 81.
+
+For example, one way this can be achieved is by placing {0, 5, 6, 7, 8, 9} on one cube and {1, 2, 3, 4, 8, 9} on the other cube.
+
+However, for this problem we shall allow the 6 or 9 to be turned upside-down so that an arrangement like {0, 5, 6, 7, 8, 9} and {1, 2, 3, 4, 6, 7} allows for all nine square numbers to be displayed; otherwise it would be impossible to obtain 09.
+
+In determining a distinct arrangement we are interested in the digits on each cube, not the order.
+
+
+ {1, 2, 3, 4, 5, 6} is equivalent to {3, 6, 4, 1, 2, 5}
+ {1, 2, 3, 4, 5, 6} is distinct from {1, 2, 3, 4, 5, 9}
+
+
+But because we are allowing 6 and 9 to be reversed, the two distinct sets in the last example both represent the extended set {1, 2, 3, 4, 5, 6, 9} for the purpose of forming 2-digit numbers.
+
+How many distinct arrangements of the two cubes allow for all of the square numbers to be displayed?
+
+### --tests--
+
+`cubeDigitPairs()` should return a number.
+
+```js
+assert(typeof cubeDigitPairs() === 'number');
+```
+
+`cubeDigitPairs()` should return 1217.
+
+```js
+assert.strictEqual(cubeDigitPairs(), 1217);
+```
+
+## 90
+
+### --description--
+
+The points ${P}(x_1, y_1)$ and ${Q}(x_2, y_2)$ are plotted at integer coordinates and are joined to the origin, ${O}(0, 0)$, to form ${\Delta}OPQ$.
+
+
+
+There are exactly fourteen triangles containing a right angle that can be formed when each coordinate lies between 0 and 2 inclusive; that is, $0 ≤ x_1, y_1, x_2, y_2 ≤ 2$.
+
+
+
+Given that $0 ≤ x_1, y_1, x_2, y_2 ≤ limit$, how many right triangles can be formed?
+
+### --tests--
+
+`rightTrianglesIntCoords(2)` should return a number.
+
+```js
+assert(typeof rightTrianglesIntCoords(2) === 'number');
+```
+
+`rightTrianglesIntCoords(2)` should return `14`.
+
+```js
+assert.strictEqual(rightTrianglesIntCoords(2), 14);
+```
+
+`rightTrianglesIntCoords(10)` should return `448`.
+
+```js
+assert.strictEqual(rightTrianglesIntCoords(10), 448);
+```
+
+`rightTrianglesIntCoords(25)` should return `3207`.
+
+```js
+assert.strictEqual(rightTrianglesIntCoords(25), 3207);
+```
+
+`rightTrianglesIntCoords(50)` should return `14234`.
+
+```js
+assert.strictEqual(rightTrianglesIntCoords(50), 14234);
+```
+
+## 91
+
+### --description--
+
+A number chain is created by continuously adding the square of the digits in a number to form a new number until it has been seen before.
+
+For example,
+
+$$\begin{align}
+ & 44 → 32 → 13 → 10 → \boldsymbol{1} → \boldsymbol{1}\\\\
+ & 85 → \boldsymbol{89} → 145 → 42 → 20 → 4 → 16 → 37 → 58 → \boldsymbol{89}\\\\
+\end{align}$$
+
+Therefore any chain that arrives at 1 or 89 will become stuck in an endless loop. What is most amazing is that EVERY starting number will eventually arrive at 1 or 89.
+
+How many starting numbers below `limit` will arrive at 89?
+
+### --tests--
+
+`squareDigitChains(100)` should return a number.
+
+```js
+assert(typeof squareDigitChains(100) === 'number');
+```
+
+`squareDigitChains(100)` should return `80`.
+
+```js
+assert.strictEqual(squareDigitChains(100), 80);
+```
+
+`squareDigitChains(1000)` should return `857`.
+
+```js
+assert.strictEqual(squareDigitChains(1000), 857);
+```
+
+`squareDigitChains(100000)` should return `85623`.
+
+```js
+assert.strictEqual(squareDigitChains(100000), 85623);
+```
+
+`squareDigitChains(10000000)` should return `8581146`.
+
+```js
+assert.strictEqual(squareDigitChains(10000000), 8581146);
+```
+
+## 92
+
+### --description--
+
+By using each of the digits from the set, {1, 2, 3, 4}, exactly once, and making use of the four arithmetic operations (+, −, \*, /) and brackets/parentheses, it is possible to form different positive integer targets.
+
+For example,
+
+
+ 8 = (4 * (1 + 3)) / 2
+ 14 = 4 * (3 + 1 / 2)
+ 19 = 4 * (2 + 3) − 1
+ 36 = 3 * 4 * (2 + 1)
+
+
+Note that concatenations of the digits, like 12 + 34, are not allowed.
+
+Using the set, {1, 2, 3, 4}, it is possible to obtain thirty-one different target numbers of which 36 is the maximum, and each of the numbers 1 to 28 can be obtained before encountering the first non-expressible number.
+
+Find the set of four distinct digits, `a` < `b` < `c` < `d`, for which the longest set of consecutive positive integers, 1 to `n`, can be obtained, giving your answer as a string: `abcd`.
+
+### --tests--
+
+`arithmeticExpressions()` should return a number.
+
+```js
+assert(typeof arithmeticExpressions() === 'number');
+```
+
+`arithmeticExpressions()` should return 1258.
+
+```js
+assert.strictEqual(arithmeticExpressions(), 1258);
+```
+
+## 93
+
+### --description--
+
+It is easily proved that no equilateral triangle exists with integral length sides and integral area. However, the almost equilateral triangle 5-5-6 has an area of 12 square units.
+
+We shall define an almost equilateral triangle to be a triangle for which two sides are equal and the third differs by no more than one unit.
+
+Find the sum of the perimeters of all almost equilateral triangles with integral side lengths and area and whose perimeters do not exceed `limit`.
+
+### --tests--
+
+`almostEquilateralTriangles(50)` should return a number.
+
+```js
+assert(typeof almostEquilateralTriangles(50) === 'number');
+```
+
+`almostEquilateralTriangles(50)` should return `66`.
+
+```js
+assert.strictEqual(almostEquilateralTriangles(50), 66);
+```
+
+`almostEquilateralTriangles(10000)` should return `3688`.
+
+```js
+assert.strictEqual(almostEquilateralTriangles(10000), 3688);
+```
+
+`almostEquilateralTriangles(10000000)` should return `9973078`.
+
+```js
+assert.strictEqual(almostEquilateralTriangles(10000000), 9973078);
+```
+
+`almostEquilateralTriangles(1000000000)` should return `518408346`.
+
+```js
+assert.strictEqual(almostEquilateralTriangles(1000000000), 518408346);
+```
+
+## 94
+
+### --description--
+
+The proper divisors of a number are all the divisors excluding the number itself. For example, the proper divisors of 28 are 1, 2, 4, 7, and 14. As the sum of these divisors is equal to 28, we call it a perfect number.
+
+Interestingly the sum of the proper divisors of 220 is 284 and the sum of the proper divisors of 284 is 220, forming a chain of two numbers. For this reason, 220 and 284 are called an amicable pair.
+
+Perhaps less well known are longer chains. For example, starting with 12496, we form a chain of five numbers:
+
+$$
+ 12496 → 14288 → 15472 → 14536 → 14264 \\,(→ 12496 → \cdots)
+$$
+
+Since this chain returns to its starting point, it is called an amicable chain.
+
+Find the smallest member of the longest amicable chain with no element exceeding `limit`.
+
+### --tests--
+
+`amicableChains(300)` should return a number.
+
+```js
+assert(typeof amicableChains(300) === 'number');
+```
+
+`amicableChains(300)` should return `220`.
+
+```js
+assert.strictEqual(amicableChains(300), 220);
+```
+
+`amicableChains(15000)` should return `220`.
+
+```js
+assert.strictEqual(amicableChains(15000), 220);
+```
+
+`amicableChains(100000)` should return `12496`.
+
+```js
+assert.strictEqual(amicableChains(100000), 12496);
+```
+
+`amicableChains(1000000)` should return `14316`.
+
+```js
+assert.strictEqual(amicableChains(1000000), 14316);
+```
+
+## 95
+
+### --description--
+
+Su Doku (Japanese meaning *number place*) is the name given to a popular puzzle concept. Its origin is unclear, but credit must be attributed to Leonhard Euler who invented a similar, and much more difficult, puzzle idea called Latin Squares. The objective of Su Doku puzzles, however, is to replace the blanks (or zeros) in a 9 by 9 grid in such that each row, column, and 3 by 3 box contains each of the digits 1 to 9. Below is an example of a typical starting puzzle grid and its solution grid.
+
+
+
+
+
+
+
+
+
+
+ 0 0 3 9 0 0 0 0 1
+ |
+
+ 0 2 0 3 0 5 8 0 6
+ |
+
+ 6 0 0 0 0 1 4 0 0
+ |
+
+
+
+ 0 0 8 7 0 0 0 0 6
+ |
+
+ 1 0 2 0 0 0 7 0 8
+ |
+
+ 9 0 0 0 0 8 2 0 0
+ |
+
+
+
+ 0 0 2 8 0 0 0 0 5
+ |
+
+ 6 0 9 2 0 3 0 1 0
+ |
+
+ 5 0 0 0 0 9 3 0 0
+ |
+
+
+
+ |
+
+
+ |
+
+
+
+
+
+ 4 8 3 9 6 7 2 5 1
+ |
+
+ 9 2 1 3 4 5 8 7 6
+ |
+
+ 6 5 7 8 2 1 4 9 3
+ |
+
+
+
+ 5 4 8 7 2 9 1 3 6
+ |
+
+ 1 3 2 5 6 4 7 9 8
+ |
+
+ 9 7 6 1 3 8 2 4 5
+ |
+
+
+
+ 3 7 2 8 1 4 6 9 5
+ |
+
+ 6 8 9 2 5 3 4 1 7
+ |
+
+ 5 1 4 7 6 9 3 8 2
+ |
+
+
+
+ |
+
+
+
+
+
+A well constructed Su Doku puzzle has a unique solution and can be solved by logic, although it may be necessary to employ "guess and test" methods in order to eliminate options (there is much contested opinion over this). The complexity of the search determines the difficulty of the puzzle; the example above is considered easy because it can be solved by straight forward direct deduction.
+
+The `puzzlesArr` array contains different Su Doku puzzle strings ranging in difficulty, but all with unique solutions.
+
+By solving all puzzles in `puzzlesArr`, find the sum of the 3-digit numbers found in the top left corner of each solution grid; for example, 483 is the 3-digit number found in the top left corner of the solution grid above.
+
+### --tests--
+
+`suDoku(testPuzzles1)` should return a number.
+
+```js
+assert(typeof suDoku(_testPuzzles1) === 'number');
+```
+
+`suDoku(testPuzzles1)` should return `1190`.
+
+```js
+assert.strictEqual(suDoku(_testPuzzles1), 1190);
+```
+
+`suDoku(testPuzzles2)` should return `24702`.
+
+```js
+assert.strictEqual(suDoku(_testPuzzles2), 24702);
+```
+
+## 96
+
+### --description--
+
+The first known prime found to exceed one million digits was discovered in 1999, and is a Mersenne prime of the form $2^{6972593} − 1$; it contains exactly 2,098,960 digits. Subsequently other Mersenne primes, of the form $2^p − 1$, have been found which contain more digits.
+
+However, in 2004 there was found a massive non-Mersenne prime which contains 2,357,207 digits: $28433 × 2^{7830457} + 1$.
+
+Find the last ten digits of that non-Mersenne prime in the form $multiplier × 2^{power} + 1$.
+
+### --tests--
+
+`largeNonMersennePrime(19, 6833086)` should return a string.
+
+```js
+assert(typeof largeNonMersennePrime(19, 6833086) === 'string');
+```
+
+`largeNonMersennePrime(19, 6833086)` should return the string `3637590017`.
+
+```js
+assert.strictEqual(largeNonMersennePrime(19, 6833086), '3637590017');
+```
+
+`largeNonMersennePrime(27, 7046834)` should return the string `0130771969`.
+
+```js
+assert.strictEqual(largeNonMersennePrime(27, 7046834), '0130771969');
+```
+
+`largeNonMersennePrime(6679881, 6679881)` should return the string `4455386113`.
+
+```js
+assert.strictEqual(largeNonMersennePrime(6679881, 6679881), '4455386113');
+```
+
+`largeNonMersennePrime(28433, 7830457)` should return the string `8739992577`.
+
+```js
+assert.strictEqual(largeNonMersennePrime(28433, 7830457), '8739992577');
+```
+
+## 97
+
+### --description--
+
+By replacing each of the letters in the word CARE with 1, 2, 9, and 6 respectively, we form a square number: $1296 = 36^2$. What is remarkable is that, by using the same digital substitutions, the anagram, RACE, also forms a square number: $9216 = 96^2$. We shall call CARE (and RACE) a square anagram word pair and specify further that leading zeroes are not permitted, neither may a different letter have the same digital value as another letter.
+
+Using the `words` array, find all the square anagram word pairs (a palindromic word is NOT considered to be an anagram of itself).
+
+What is the largest square number formed by any member of such a pair?
+
+**Note:** All anagrams formed must be contained in the given `words` array.
+
+### --tests--
+
+`anagramicSquares(['CARE', 'RACE'])` should return a number.
+
+```js
+assert(typeof anagramicSquares(['CARE', 'RACE']) === 'number');
+```
+
+`anagramicSquares(['CARE', 'RACE'])` should return `9216`.
+
+```js
+assert.strictEqual(anagramicSquares(['CARE', 'RACE']), 9216);
+```
+
+`anagramicSquares(testWords1)` should return `4761`.
+
+```js
+assert.strictEqual(anagramicSquares(_testWords1), 4761);
+```
+
+`anagramicSquares(testWords2)` should return `18769`.
+
+```js
+assert.strictEqual(anagramicSquares(_testWords2), 18769);
+```
+
+## 98
+
+### --description--
+
+Comparing two numbers written in index form like $2^{11}$ and $3^7$ is not difficult, as any calculator would confirm that $2^{11} = 2048 < 3^7 = 2187$.
+
+However, confirming that $632382^{518061} < 519432^{525806}$ would be much more difficult, as both numbers contain over three million digits.
+
+Using the 2D `baseExp` array of base/exponent pairs, determine pair with the greatest numerical value and return it.
+
+### --tests--
+
+`largestExponential(testArray1)` should return an array.
+
+```js
+assert(Array.isArray(largestExponential(_testArray1)));
+```
+
+`largestExponential(testArray1)` should return `[840237, 507276]`.
+
+```js
+assert.deepEqual(largestExponential(_testArray1), [840237, 507276]);
+```
+
+`largestExponential(testArray2)` should return `[895447, 504922]`.
+
+```js
+assert.deepEqual(largestExponential(_testArray2), [895447, 504922]);
+```
+
+## 99
+
+### --description--
+
+If a box contains twenty-one colored discs, composed of fifteen blue discs and six red discs, and two discs were taken at random, it can be seen that the probability of taking two blue discs.
+
+$${P(BB)} = \frac{15}{21}×\frac{14}{20} = \frac{1}{2}$$
+
+The next such arrangement, for which there is exactly a 50% chance of taking two blue discs at random, is a box containing eighty-five blue discs and thirty-five red discs.
+
+By finding the first arrangement to contain over `limit` discs in total, determine the number of blue discs that the box would contain.
+
+### --tests--
+
+`arrangedProbability(20)` should return a number.
+
+```js
+assert(typeof arrangedProbability(10) === 'number');
+```
+
+`arrangedProbability(20)` should return `15`.
+
+```js
+assert.strictEqual(arrangedProbability(20), 15);
+```
+
+`arrangedProbability(100)` should return `85`.
+
+```js
+assert.strictEqual(arrangedProbability(100), 85);
+```
+
+`arrangedProbability(100000)` should return `97513`.
+
+```js
+assert.strictEqual(arrangedProbability(100000), 97513);
+```
+
+`arrangedProbability(1000000000)` should return `3822685023`.
+
+```js
+assert.strictEqual(arrangedProbability(1000000000), 3822685023);
+```
+
+`arrangedProbability(1000000000000)` should return `756872327473`.
+
+```js
+assert.strictEqual(arrangedProbability(1000000000000), 756872327473);
+```
+
+## --fcc-end--
+
\ No newline at end of file
diff --git a/curriculum/locales/english/project-euler-problems-101-to-200.md b/curriculum/locales/english/project-euler-problems-101-to-200.md
new file mode 100644
index 0000000..f865863
--- /dev/null
+++ b/curriculum/locales/english/project-euler-problems-101-to-200.md
@@ -0,0 +1,2787 @@
+# Project Euler in Rust: 101 to 200
+
+Complete the freeCodeCamp Project Euler problems in the Rust programming language using WebAssembly.
+
+## 0
+
+### --description--
+
+If we are presented with the first k terms of a sequence it is impossible to say with certainty the value of the next term, as there are infinitely many polynomial functions that can model the sequence.
+
+As an example, let us consider the sequence of cube numbers. This is defined by the generating function, $u_n = n^3: 1, 8, 27, 64, 125, 216, \ldots$
+
+Suppose we were only given the first two terms of this sequence. Working on the principle that "simple is best" we should assume a linear relationship and predict the next term to be 15 (common difference 7). Even if we were presented with the first three terms, by the same principle of simplicity, a quadratic relationship should be assumed.
+
+We shall define $OP(k, n)$ to be the $n^{th}$ term of the optimum polynomial generating function for the first k terms of a sequence. It should be clear that $OP(k, n)$ will accurately generate the terms of the sequence for $n ≤ k$, and potentially the first incorrect term (FIT) will be $OP(k, k+1)$; in which case we shall call it a bad OP (BOP).
+
+As a basis, if we were only given the first term of sequence, it would be most sensible to assume constancy; that is, for $n ≥ 2, OP(1, n) = u_1$.
+
+Hence we obtain the following OPs for the cubic sequence:
+
+$$\begin{array}{ll}
+ OP(1, n) = 1 & 1, {\color{red}1}, 1, 1, \ldots \\\\
+ OP(2, n) = 7n−6 & 1, 8, {\color{red}{15}}, \ldots \\\\
+ OP(3, n) = 6n^2−11n+6 & 1, 8, 27, {\color{red}{58}}, \ldots \\\\
+ OP(4, n) = n^3 & 1, 8, 27, 64, 125, \ldots
+\end{array}$$
+
+Clearly no BOPs exist for k ≥ 4. By considering the sum of FITs generated by the BOPs (indicated in $\color{red}{red}$ above), we obtain 1 + 15 + 58 = 74. Consider the following tenth degree polynomial generating function:
+
+$$u_n = 1 − n + n^2 − n^3 + n^4 − n^5 + n^6 − n^7 + n^8 − n^9 + n^{10}$$
+
+Find the sum of FITs for the BOPs.
+
+### --tests--
+
+`optimumPolynomial()` should return `37076114526`.
+
+```js
+assert.strictEqual(optimumPolynomial(), 37076114526);
+```
+
+## 1
+
+### --description--
+
+Three distinct points are plotted at random on a Cartesian plane, for which -1000 ≤ x, y ≤ 1000, such that a triangle is formed.
+
+Consider the following two triangles:
+
+```js
+const exampleTriangles = [
+ [[-340, 495], [-153, -910], [835, -947]],
+ [[-175, 41], [-421, -714], [574, -645]]
+];
+```
+
+It can be verified that first triangle contains the origin, whereas second triangle does not.
+
+Using the `triangles` array containing coordinates of triangles, find the number of triangles for which the interior contains the origin.
+
+### --tests--
+
+`triangleContainment(exampleTriangles)` should return a number.
+
+```js
+assert(typeof triangleContainment(_exampleTriangles) === 'number');
+```
+
+`triangleContainment(exampleTriangles)` should return `1`.
+
+```js
+assert.strictEqual(triangleContainment(_exampleTriangles), 1);
+```
+
+`triangleContainment(testTriangles1)` should return `19`.
+
+```js
+assert.strictEqual(triangleContainment(_testTriangles1), 19);
+```
+
+`triangleContainment(testTriangles2)` should return `228`.
+
+```js
+assert.strictEqual(triangleContainment(_testTriangles2), 228);
+```
+
+## 2
+
+### --description--
+
+Let $S(A)$ represent the sum of elements in set A of size n. We shall call it a special sum set if for any two non-empty disjoint subsets, B and C, the following properties are true:
+
+1. $S(B) ≠ S(C)$; that is, sums of subsets cannot be equal.
+2. If B contains more elements than C then $S(B) > S(C)$.
+
+If $S(A)$ is minimised for a given n, we shall call it an optimum special sum set. The first five optimum special sum sets are given below.
+
+$$\begin{align}
+ & n = 1: \\{1\\} \\\\
+ & n = 2: \\{1, 2\\} \\\\
+ & n = 3: \\{2, 3, 4\\} \\\\
+ & n = 4: \\{3, 5, 6, 7\\} \\\\
+ & n = 5: \\{6, 9, 11, 12, 13\\} \\\\
+\end{align}$$
+
+It seems that for a given optimum set, $A = \\{a_1, a_2, \ldots, a_n\\}$, the next optimum set is of the form $B = \\{b, a_1 + b, a_2 + b, \ldots, a_n + b\\}$, where b is the "middle" element on the previous row.
+
+By applying this "rule" we would expect the optimum set for $n = 6$ to be $A = \\{11, 17, 20, 22, 23, 24\\}$, with $S(A) = 117$. However, this is not the optimum set, as we have merely applied an algorithm to provide a near optimum set. The optimum set for $n = 6$ is $A = \\{11, 18, 19, 20, 22, 25\\}$, with $S(A) = 115$ and corresponding set string: `111819202225`.
+
+Given that A is an optimum special sum set for $n = 7$, find its set string.
+
+**Note:** This problem is related to Problem 105 and Problem 106.
+
+### --tests--
+
+`optimumSpecialSumSet()` should return the string `20313839404245`.
+
+```js
+assert.strictEqual(optimumSpecialSumSet(), '20313839404245');
+```
+
+## 3
+
+### --description--
+
+The Fibonacci sequence is defined by the recurrence relation:
+
+$F_n = F_{n − 1} + F_{n − 2}$, where $F_1 = 1$ and $F_2 = 1$
+
+It turns out that $F_{541}$, which contains 113 digits, is the first Fibonacci number for which the last nine digits are 1 - 9 pandigital (contain all the digits 1 to 9, but not necessarily in order). And $F_{2749}$, which contains 575 digits, is the first Fibonacci number for which the first nine digits are 1 - 9 pandigital.
+
+Given that $F_k$ is the first Fibonacci number for which the first nine digits AND the last nine digits are 1 - 9 pandigital, find `k`.
+
+### --tests--
+
+`pandigitalFibonacciEnds()` should return `329468`.
+
+```js
+assert.strictEqual(pandigitalFibonacciEnds(), 329468);
+```
+
+## 4
+
+### --description--
+
+Let $S(A)$ represent the sum of elements in set A of size n. We shall call it a special sum set if for any two non-empty disjoint subsets, B and C, the following properties are true:
+
+1. $S(B) ≠ S(C)$; that is, sums of subsets cannot be equal.
+2. If B contains more elements than C then $S(B) > S(C)$.
+
+For example, {81, 88, 75, 42, 87, 84, 86, 65} is not a special sum set because 65 + 87 + 88 = 75 + 81 + 84, whereas {157, 150, 164, 119, 79, 159, 161, 139, 158} satisfies both rules for all possible subset pair combinations and $S(A) = 1286$.
+
+Using `sets`, an array with one-hundred sets, containing seven to twelve elements (the two examples given above are the first two sets), identify all the special sum sets, $A_1, A_2, \ldots, A_k$, and find the value of $(A_1) + S(A_2) + \cdots + S(A_k)$.
+
+**Note:** This problem is related to Problem 103 and Problem 106.
+
+### --tests--
+
+`testingSpecialSubsetSums(testSets)` should return `73702`.
+
+```js
+assert.strictEqual(testingSpecialSubsetSums(_testSets), 73702);
+```
+
+## 5
+
+### --description--
+
+Let $S(A)$ represent the sum of elements in set A of size n. We shall call it a special sum set if for any two non-empty disjoint subsets, B and C, the following properties are true:
+
+1. $S(B) ≠ S(C)$; that is, sums of subsets cannot be equal.
+2. If B contains more elements than C then $S(B) > S(C)$.
+
+For this problem we shall assume that a given set contains n strictly increasing elements and it already satisfies the second rule.
+
+Surprisingly, out of the 25 possible subset pairs that can be obtained from a set for which n = 4, only 1 of these pairs need to be tested for equality (first rule). Similarly, when n = 7, only 70 out of the 966 subset pairs need to be tested.
+
+For n = 12, how many of the 261625 subset pairs that can be obtained need to be tested for equality?
+
+**Note:** This problem is related to Problem 103 and Problem 105.
+
+### --tests--
+
+`subsetSumsMetaTesting()` should return `21384`.
+
+```js
+assert.strictEqual(subsetSumsMetaTesting(), 21384);
+```
+
+## 6
+
+### --description--
+
+The following undirected network consists of seven vertices and twelve edges with a total weight of 243.
+
+
+
+The same network can be represented by the matrix below.
+
+| | A | B | C | D | E | F | G |
+|---|----|----|----|----|----|----|----|
+| A | - | 16 | 12 | 21 | - | - | - |
+| B | 16 | - | - | 17 | 20 | - | - |
+| C | 12 | - | - | 28 | - | 31 | - |
+| D | 21 | 17 | 28 | - | 18 | 19 | 23 |
+| E | - | 20 | - | 18 | - | - | 11 |
+| F | - | - | 31 | 19 | - | - | 27 |
+| G | - | - | - | 23 | 11 | 27 | - |
+
+
+However, it is possible to optimise the network by removing some edges and still ensure that all points on the network remain connected. The network which achieves the maximum saving is shown below. It has a weight of 93, representing a saving of 243 − 93 = 150 from the original network.
+
+
+
+Using `network`, an 2D array representing network in matrix form, find the maximum saving which can be achieved by removing redundant edges whilst ensuring that the network remains connected. Vertices not having connection will be represented with `-1`.
+
+### --tests--
+
+`minimalNetwork(testNetwork)` should return `259679`.
+
+```js
+assert.strictEqual(minimalNetwork(_testNetwork), 259679);
+```
+
+## 7
+
+### --description--
+
+In the following equation x, y, and n are positive integers.
+
+$$\frac{1}{x} + \frac{1}{y} = \frac{1}{n}$$
+
+For `n` = 4 there are exactly three distinct solutions:
+
+$$\begin{align}
+ & \frac{1}{5} + \frac{1}{20} = \frac{1}{4}\\\\
+ \\\\
+ & \frac{1}{6} + \frac{1}{12} = \frac{1}{4}\\\\
+ \\\\
+ & \frac{1}{8} + \frac{1}{8} = \frac{1}{4}
+\end{align}$$
+
+What is the least value of `n` for which the number of distinct solutions exceeds one-thousand?
+
+### --tests--
+
+`diophantineOne()` should return `180180`.
+
+```js
+assert.strictEqual(diophantineOne(), 180180);
+```
+
+## 8
+
+### --description--
+
+In the game of darts a player throws three darts at a target board which is split into twenty equal sized sections numbered one to twenty.
+
+
+
+The score of a dart is determined by the number of the region that the dart lands in. A dart landing outside the red/green outer ring scores zero. The black and cream regions inside this ring represent single scores. However, the red/green outer ring and middle ring score double and treble scores respectively.
+
+At the center of the board are two concentric circles called the bull region, or bulls-eye. The outer bull is worth 25 points and the inner bull is a double, worth 50 points.
+
+There are many variations of rules but in the most popular game the players will begin with a score of 301 or 501 and the first player to reduce their running total to zero is a winner. However, it is normal to play a "doubles out" system, which means that the player must land a double (including the double bulls-eye at the center of the board) on their final dart to win; any other dart that would reduce their running total to one or lower means the score for that set of three darts is "bust".
+
+When a player is able to finish on their current score it is called a "checkout" and the highest checkout is 170: T20 T20 D25 (two treble 20s and double bull). There are exactly eleven distinct ways to checkout on a score of 6:
+
+$$\begin{array}
+ \text{D3} & & \\\\
+ D1 & D2 & \\\\
+ S2 & D2 & \\\\
+ D2 & D1 & \\\\
+ S4 & D1 & \\\\
+ S1 & S1 & D2 \\\\
+ S1 & T1 & D1 \\\\
+ S1 & S3 & D1 \\\\
+ D1 & D1 & D1 \\\\
+ D1 & S2 & D1 \\\\
+ S2 & S2 & D1
+\end{array}$$
+
+Note that D1 D2 is considered different from D2 D1 as they finish on different doubles. However, the combination S1 T1 D1 is considered the same as T1 S1 D1. In addition, we shall not include misses in considering combinations; for example, D3 is the same as 0 D3 and 0 0 D3. Incredibly there are 42336 distinct ways of checking out in total. How many distinct ways can a player checkout with a score less than 100?
+
+### --tests--
+
+`darts()` should return `38182`.
+
+```js
+assert.strictEqual(darts(), 38182);
+```
+
+## 9
+
+### --description--
+
+In the following equation x, y, and n are positive integers.
+
+$$\frac{1}{x} + \frac{1}{y} = \frac{1}{n}$$
+
+It can be verified that when `n` = 1260 there are 113 distinct solutions and this is the least value of `n` for which the total number of distinct solutions exceeds one hundred.
+
+What is the least value of `n` for which the number of distinct solutions exceeds four million?
+
+**Note:** This problem is a much more difficult version of Problem 108 and as it is well beyond the limitations of a brute force approach it requires a clever implementation.
+
+### --tests--
+
+`diophantineTwo()` should return `9350130049860600`.
+
+```js
+assert.strictEqual(diophantineTwo(), 9350130049860600);
+```
+
+## 10
+
+### --description--
+
+Considering 4-digit primes containing repeated digits it is clear that they cannot all be the same: 1111 is divisible by 11, 2222 is divisible by 22, and so on. But there are nine 4-digit primes containing three ones:
+
+$$1117, 1151, 1171, 1181, 1511, 1811, 2111, 4111, 8111$$
+
+We shall say that $M(n, d)$ represents the maximum number of repeated digits for an n-digit prime where d is the repeated digit, $N(n, d)$ represents the number of such primes, and $S(n, d)$ represents the sum of these primes.
+
+So $M(4, 1) = 3$ is the maximum number of repeated digits for a 4-digit prime where one is the repeated digit, there are $N(4, 1) = 9$ such primes, and the sum of these primes is $S(4, 1) = 22275$. It turns out that for d = 0, it is only possible to have $M(4, 0) = 2$ repeated digits, but there are $N(4, 0) = 13$ such cases.
+
+In the same way we obtain the following results for 4-digit primes.
+
+| Digit, d | $M(4, d)$ | $N(4, d)$ | $S(4, d)$ |
+|----------|-----------|-----------|-----------|
+| 0 | 2 | 13 | 67061 |
+| 1 | 3 | 9 | 22275 |
+| 2 | 3 | 1 | 2221 |
+| 3 | 3 | 12 | 46214 |
+| 4 | 3 | 2 | 8888 |
+| 5 | 3 | 1 | 5557 |
+| 6 | 3 | 1 | 6661 |
+| 7 | 3 | 9 | 57863 |
+| 8 | 3 | 1 | 8887 |
+| 9 | 3 | 7 | 48073 |
+
+For d = 0 to 9, the sum of all $S(4, d)$ is 273700. Find the sum of all $S(10, d)$.
+
+### --tests--
+
+`primesWithRuns()` should return `612407567715`.
+
+```js
+assert.strictEqual(primesWithRuns(), 612407567715);
+```
+
+## 11
+
+### --description--
+
+Working from left-to-right if no digit is exceeded by the digit to its left it is called an increasing number; for example, 134468.
+
+Similarly if no digit is exceeded by the digit to its right it is called a decreasing number; for example, 66420.
+
+We shall call a positive integer that is neither increasing nor decreasing a "bouncy" number; for example, 155349.
+
+Clearly there cannot be any bouncy numbers below one-hundred, but just over half of the numbers below one-thousand (525) are bouncy. In fact, the least number for which the proportion of bouncy numbers first reaches 50% is 538.
+
+Surprisingly, bouncy numbers become more and more common and by the time we reach 21780 the proportion of bouncy numbers is equal to 90%.
+
+Find the least number for which the proportion of bouncy numbers is exactly 99%.
+
+### --tests--
+
+`bouncyNumbers()` should return `1587000`.
+
+```js
+assert.strictEqual(bouncyNumbers(), 1587000);
+```
+
+## 12
+
+### --description--
+
+Working from left-to-right if no digit is exceeded by the digit to its left it is called an increasing number; for example, 134468.
+
+Similarly if no digit is exceeded by the digit to its right it is called a decreasing number; for example, 66420.
+
+We shall call a positive integer that is neither increasing nor decreasing a "bouncy" number; for example, 155349.
+
+As n increases, the proportion of bouncy numbers below n increases such that there are only 12951 numbers below one-million that are not bouncy and only 277032 non-bouncy numbers below ${10}^{10}$.
+
+How many numbers below a googol (${10}^{100}$) are not bouncy?
+
+### --tests--
+
+`nonBouncyNumbers()` should return `51161058134250`.
+
+```js
+assert.strictEqual(nonBouncyNumbers(), 51161058134250);
+```
+
+## 13
+
+### --description--
+
+A row measuring seven units in length has red blocks with a minimum length of three units placed on it, such that any two red blocks (which are allowed to be different lengths) are separated by at least one black square. There are exactly seventeen ways of doing this.
+
+
+
+How many ways can a row measuring fifty units in length be filled?
+
+**Note:** Although the example above does not lend itself to the possibility, in general it is permitted to mix block sizes. For example, on a row measuring eight units in length you could use red (3), black (1), and red (4).
+
+### --tests--
+
+`countingBlockOne()` should return `16475640049`.
+
+```js
+assert.strictEqual(countingBlockOne(), 16475640049);
+```
+
+## 14
+
+### --description--
+
+A row measuring `n` units in length has red blocks with a minimum length of `m` units placed on it, such that any two red blocks (which are allowed to be different lengths) are separated by at least one black square.
+
+Let the fill-count function, $F(m, n)$, represent the number of ways that a row can be filled.
+
+For example, $F(3, 29) = 673135$ and $F(3, 30) = 1089155$.
+
+That is, for m = 3, it can be seen that n = 30 is the smallest value for which the fill-count function first exceeds one million.
+
+In the same way, for m = 10, it can be verified that $F(10, 56) = 880711$ and $F(10, 57) = 1148904$, so n = 57 is the least value for which the fill-count function first exceeds one million.
+
+For m = 50, find the least value of `n` for which the fill-count function first exceeds one million.
+
+**Note:** This is a more difficult version of Problem 114.
+
+### --tests--
+
+`countingBlockTwo()` should return `168`.
+
+```js
+assert.strictEqual(countingBlockTwo(), 168);
+```
+
+## 15
+
+### --description--
+
+A row of five black square tiles is to have a number of its tiles replaced with coloured oblong tiles chosen from red (length two), green (length three), or blue (length four).
+
+If red tiles are chosen there are exactly seven ways this can be done.
+
+
+
+If green tiles are chosen there are three ways.
+
+
+
+And if blue tiles are chosen there are two ways.
+
+
+
+Assuming that colors cannot be mixed there are 7 + 3 + 2 = 12 ways of replacing the black tiles in a row measuring five units in length. How many different ways can the black tiles in a row measuring fifty units in length be replaced if colors cannot be mixed and at least one colored tile must be used?
+
+**Note:** This is related to Problem 117.
+
+### --tests--
+
+`redGreenBlueOne()` should return `20492570929`.
+
+```js
+assert.strictEqual(redGreenBlueOne(), 20492570929);
+```
+
+## 16
+
+### --description--
+
+Using a combination of black square tiles and oblong tiles chosen from: red tiles measuring two units, green tiles measuring three units, and blue tiles measuring four units, it is possible to tile a row measuring five units in length in exactly fifteen different ways.
+
+
+
+How many ways can a row measuring fifty units in length be tiled?
+
+**Note**: This is related to Problem 116.
+
+### --tests--
+
+`redGreenBlueTilesTwo()` should return `100808458960497`.
+
+```js
+assert.strictEqual(redGreenBlueTilesTwo(), 100808458960497);
+```
+
+## 17
+
+### --description--
+
+Using all of the digits 1 through 9 and concatenating them freely to form decimal integers, different sets can be formed. Interestingly with the set $\\{2, 5, 47, 89, 631\\}$, all of the elements belonging to it are prime.
+
+How many distinct sets containing each of the digits one through nine exactly once contain only prime elements?
+
+### --tests--
+
+`pandigitalPrimeSets()` should return `44680`.
+
+```js
+assert.strictEqual(pandigitalPrimeSets(), 44680);
+```
+
+## 18
+
+### --description--
+
+The number 512 is interesting because it is equal to the sum of its digits raised to some power: $5 + 1 + 2 = 8$, and $8^3 = 512$. Another example of a number with this property is $614656 = 28^4$.
+
+We shall define $a_n$ to be the $n-th$ term of this sequence and insist that a number must contain at least two digits to have a sum.
+
+You are given that $a_2 = 512$ and $a_{10} = 614656$.
+
+Find $a_{30}$.
+
+### --tests--
+
+`digitPowerSum()` should return `248155780267521`.
+
+```js
+assert.strictEqual(digitPowerSum(), 248155780267521);
+```
+
+## 19
+
+### --description--
+
+Let `r` be the remainder when ${(a − 1)}^n + {(a + 1)}^n$ is divided by $a^2$.
+
+For example, if $a = 7$ and $n = 3$, then $r = 42: 6^3 + 8^3 = 728 ≡ 42 \\ \text{mod}\\ 49$. And as `n` varies, so too will `r`, but for $a = 7$ it turns out that $r_{max} = 42$.
+
+For $3 ≤ a ≤ 1000$, find $\sum{r}_{max}$.
+
+### --tests--
+
+`squareRemainders()` should return `333082500`.
+
+```js
+assert.strictEqual(squareRemainders(), 333082500);
+```
+
+## 20
+
+### --description--
+
+A bag contains one red disc and one blue disc. In a game of chance a player takes a disc at random and its colour is noted. After each turn the disc is returned to the bag, an extra red disc is added, and another disc is taken at random.
+
+The player pays £1 to play and wins if they have taken more blue discs than red discs at the end of the game.
+
+If the game is played for four turns, the probability of a player winning is exactly 11/120, and so the maximum prize fund the banker should allocate for winning in this game would be £10 before they would expect to incur a loss. Note that any payout will be a whole number of pounds and also includes the original £1 paid to play the game, so in the example given the player actually wins £9.
+
+Find the maximum prize fund that should be allocated to a single game in which fifteen turns are played.
+
+### --tests--
+
+`discGamePrize()` should return `2269`.
+
+```js
+assert.strictEqual(discGamePrize(), 2269);
+```
+
+## 21
+
+### --description--
+
+The most naive way of computing $n^{15}$ requires fourteen multiplications:
+
+$$n × n × \ldots × n = n^{15}$$
+
+But using a "binary" method you can compute it in six multiplications:
+
+$$\begin{align}
+ & n × n = n^2\\\\
+ & n^2 × n^2 = n^4\\\\
+ & n^4 × n^4 = n^8\\\\
+ & n^8 × n^4 = n^{12}\\\\
+ & n^{12} × n^2 = n^{14}\\\\
+ & n^{14} × n = n^{15}
+\end{align}$$
+
+However it is yet possible to compute it in only five multiplications:
+
+$$\begin{align}
+ & n × n = n^2\\\\
+ & n^2 × n = n^3\\\\
+ & n^3 × n^3 = n^6\\\\
+ & n^6 × n^6 = n^{12}\\\\
+ & n^{12} × n^3 = n^{15}
+\end{align}$$
+
+We shall define $m(k)$ to be the minimum number of multiplications to compute $n^k$; for example $m(15) = 5$.
+
+For $1 ≤ k ≤ 200$, find $\sum{m(k)}$.
+
+### --tests--
+
+`efficientExponentiation()` should return `1582`.
+
+```js
+assert.strictEqual(efficientExponentiation(), 1582);
+```
+
+## 22
+
+### --description--
+
+Let $p_n$ be the $n$th prime: 2, 3, 5, 7, 11, ..., and let $r$ be the remainder when ${(p_n−1)}^n + {(p_n+1)}^n$ is divided by ${p_n}^2$.
+
+For example, when $n = 3, p_3 = 5$, and $4^3 + 6^3 = 280 ≡ 5\\ mod\\ 25$.
+
+The least value of $n$ for which the remainder first exceeds $10^9$ is 7037.
+
+Find the least value of $n$ for which the remainder first exceeds $10^{10}$.
+
+### --tests--
+
+`primeSquareRemainders()` should return `21035`.
+
+```js
+assert.strictEqual(primeSquareRemainders(), 21035);
+```
+
+## 23
+
+### --description--
+
+The radical of $n$, $rad(n)$, is the product of the distinct prime factors of $n$. For example, $504 = 2^3 × 3^2 × 7$, so $rad(504) = 2 × 3 × 7 = 42$.
+
+If we calculate $rad(n)$ for $1 ≤ n ≤ 10$, then sort them on $rad(n)$, and sorting on $n$ if the radical values are equal, we get:
+
+
+
+
+
+ $Unsorted$ |
+ |
+ $Sorted$ |
+
+
+ $n$ |
+ $rad(n)$ |
+ |
+ $n$ |
+ $rad(n)$ |
+ $k$ |
+
+
+ 1 |
+ 1 |
+ |
+ 1 |
+ 1 |
+ 1 |
+
+
+ 2 |
+ 2 |
+ |
+ 2 |
+ 2 |
+ 2 |
+
+
+ 3 |
+ 3 |
+ |
+ 4 |
+ 2 |
+ 3 |
+
+
+ 4 |
+ 2 |
+ |
+ 8 |
+ 2 |
+ 4 |
+
+
+ 5 |
+ 5 |
+ |
+ 3 |
+ 3 |
+ 5 |
+
+
+ 6 |
+ 6 |
+ |
+ 9 |
+ 3 |
+ 6 |
+
+
+ 7 |
+ 7 |
+ |
+ 5 |
+ 5 |
+ 7 |
+
+
+ 8 |
+ 2 |
+ |
+ 6 |
+ 6 |
+ 8 |
+
+
+ 9 |
+ 3 |
+ |
+ 7 |
+ 7 |
+ 9 |
+
+
+ 10 |
+ 10 |
+ |
+ 10 |
+ 10 |
+ 10 |
+
+
+
+
+
+Let $E(k)$ be the $k$th element in the sorted $n$ column; for example, $E(4) = 8$ and $E(6) = 9$. If $rad(n)$ is sorted for $1 ≤ n ≤ 100000$, find $E(10000)$.
+
+### --tests--
+
+`orderedRadicals()` should return `21417`.
+
+```js
+assert.strictEqual(orderedRadicals(), 21417);
+```
+
+## 24
+
+### --description--
+
+The palindromic number 595 is interesting because it can be written as the sum of consecutive squares: $6^2 + 7^2 + 8^2 + 9^2 + 10^2 + 11^2 + 12^2$.
+
+There are exactly eleven palindromes below one-thousand that can be written as consecutive square sums, and the sum of these palindromes is 4164. Note that $1 = 0^2 + 1^2$ has not been included as this problem is concerned with the squares of positive integers.
+
+Find the sum of all the numbers less than the `limit` that are both palindromic and can be written as the sum of consecutive squares.
+
+### --tests--
+`palindromicSums(100000000)` should return `2906969179`.
+
+```js
+
+assert.strictEqual(palindromicSums(100000000), 2906969179);
+
+```
+
+`palindromicSums(100)` should return `137`.
+
+```js
+assert.strictEqual(palindromicSums(100), 137);
+```
+
+`palindromicSums(1000)` should return `4164`.
+
+```js
+assert.strictEqual(palindromicSums(1000),4164);
+```
+
+## 25
+
+### --description--
+
+The minimum number of cubes to cover every visible face on a cuboid measuring 3 x 2 x 1 is twenty-two.
+
+
+
+If we add a second layer to this solid it would require forty-six cubes to cover every visible face, the third layer would require seventy-eight cubes, and the fourth layer would require one-hundred and eighteen cubes to cover every visible face.
+
+However, the first layer on a cuboid measuring 5 x 1 x 1 also requires twenty-two cubes; similarly, the first layer on cuboids measuring 5 x 3 x 1, 7 x 2 x 1, and 11 x 1 x 1 all contain forty-six cubes.
+
+We shall define $C(n)$ to represent the number of cuboids that contain $n$ cubes in one of its layers. So $C(22) = 2$, $C(46) = 4$, $C(78) = 5$, and $C(118) = 8$.
+
+It turns out that 154 is the least value of $n$ for which $C(n) = 10$.
+
+Find the least value of $n$ for which $C(n) = 1000$.
+
+### --tests--
+
+`cuboidLayers()` should return `18522`.
+
+```js
+assert.strictEqual(cuboidLayers(), 18522);
+```
+
+## 26
+
+### --description--
+
+The radical of $n$, $rad(n)$, is the product of distinct prime factors of $n$. For example, $504 = 2^3 × 3^2 × 7$, so $rad(504) = 2 × 3 × 7 = 42$.
+
+We shall define the triplet of positive integers (a, b, c) to be an abc-hit if:
+
+1. $GCD(a, b) = GCD(a, c) = GCD(b, c) = 1$
+2. $a < b$
+3. $a + b = c$
+4. $rad(abc) < c$
+
+For example, (5, 27, 32) is an abc-hit, because:
+
+1. $GCD(5, 27) = GCD(5, 32) = GCD(27, 32) = 1$
+2. $5 < 27$
+3. $5 + 27 = 32$
+4. $rad(4320) = 30 < 32$
+
+It turns out that abc-hits are quite rare and there are only thirty-one abc-hits for $c < 1000$, with $\sum{c} = 12523$.
+
+Find $\sum{c}$ for $c < 120000$.
+
+### --tests--
+
+`abcHits()` should return `18407904`.
+
+```js
+assert.strictEqual(abcHits(), 18407904);
+```
+
+## 27
+
+### --description--
+
+A hexagonal tile with number 1 is surrounded by a ring of six hexagonal tiles, starting at "12 o'clock" and numbering the tiles 2 to 7 in an anti-clockwise direction.
+
+New rings are added in the same fashion, with the next rings being numbered 8 to 19, 20 to 37, 38 to 61, and so on. The diagram below shows the first three rings.
+
+
+
+By finding the difference between tile $n$ and each of its six neighbours we shall define $PD(n)$ to be the number of those differences which are prime.
+
+For example, working clockwise around tile 8 the differences are 12, 29, 11, 6, 1, and 13. So $PD(8) = 3$.
+
+In the same way, the differences around tile 17 are 1, 17, 16, 1, 11, and 10, hence $PD(17) = 2$.
+
+It can be shown that the maximum value of $PD(n)$ is $3$.
+
+If all of the tiles for which $PD(n) = 3$ are listed in ascending order to form a sequence, the 10th tile would be 271.
+
+Find the 2000th tile in this sequence.
+
+### --tests--
+
+`hexagonalTile(10)` should return `271`.
+
+```js
+assert.strictEqual(hexagonalTile(10), 271);
+```
+
+`hexagonalTile(2000)` should return `14516824220`.
+
+```js
+assert.strictEqual(hexagonalTile(2000), 14516824220);
+```
+
+## 28
+
+### --description--
+
+A number consisting entirely of ones is called a repunit. We shall define $R(k)$ to be a repunit of length $k$; for example, $R(6) = 111111$.
+
+Given that $n$ is a positive integer and $GCD(n, 10) = 1$, it can be shown that there always exists a value, $k$, for which $R(k)$ is divisible by $n$, and let $A(n)$ be the least such value of $k$; for example, $A(7) = 6$ and $A(41) = 5$.
+
+The least value of $n$ for which $A(n)$ first exceeds ten is 17.
+
+Find the least value of $n$ for which $A(n)$ first exceeds one-million.
+
+### --tests--
+
+`repunitDivisibility()` should return `1000023`.
+
+```js
+assert.strictEqual(repunitDivisibility(), 1000023);
+```
+
+## 29
+
+### --description--
+
+A number consisting entirely of ones is called a repunit. We shall define $R(k)$ to be a repunit of length $k$; for example, $R(6) = 111111$.
+
+Given that $n$ is a positive integer and $GCD(n, 10) = 1$, it can be shown that there always exists a value, $k$, for which $R(k)$ is divisible by $n$, and let $A(n)$ be the least such value of $k$; for example, $A(7) = 6$ and $A(41) = 5$.
+
+You are given that for all primes, $p > 5$, that $p − 1$ is divisible by $A(p)$. For example, when $p = 41, A(41) = 5$, and 40 is divisible by 5.
+
+However, there are rare composite values for which this is also true; the first five examples being 91, 259, 451, 481, and 703.
+
+Find the sum of the first twenty-five composite values of $n$ for which $GCD(n, 10) = 1$ and $n − 1$ is divisible by $A(n)$.
+
+### --tests--
+
+`compositeRepunit()` should return `149253`.
+
+```js
+assert.strictEqual(compositeRepunit(), 149253);
+```
+
+## 30
+
+### --description--
+
+There are some prime values, $p$, for which there exists a positive integer, $n$, such that the expression $n^3 + n^{2}p$ is a perfect cube.
+
+For example, when $p = 19,\\ 8^3 + 8^2 × 19 = {12}^3$.
+
+What is perhaps most surprising is that the value of $n$ is unique for each prime with this property, and there are only four such primes below one hundred.
+
+How many primes below one million have this remarkable property?
+
+### --tests--
+
+`primeCubePartnership()` should return `173`.
+
+```js
+assert.strictEqual(primeCubePartnership(), 173);
+```
+
+## 31
+
+### --description--
+
+A number consisting entirely of ones is called a repunit. We shall define $R(k)$ to be a repunit of length $k$.
+
+For example, $R(10) = 1111111111 = 11 × 41 × 271 × 9091$, and the sum of these prime factors is 9414.
+
+Find the sum of the first forty prime factors of $R({10}^9)$.
+
+### --tests--
+
+`largeRepunitFactors()` should return `843296`.
+
+```js
+assert.strictEqual(largeRepunitFactors(), 843296);
+```
+
+## 32
+
+### --description--
+
+A number consisting entirely of ones is called a repunit. We shall define $R(k)$ to be a repunit of length $k$; for example, $R(6) = 111111$.
+
+Let us consider repunits of the form $R({10}^n)$.
+
+Although $R(10)$, $R(100)$, or $R(1000)$ are not divisible by 17, $R(10000)$ is divisible by 17. Yet there is no value of n for which $R({10}^n)$ will divide by 19. Remarkably, 11, 17, 41, and 73 are the only four primes below one-hundred that can be a factor of $R({10}^n)$.
+
+Find the sum of all the primes below one-hundred thousand that will never be a factor of $R({10}^n)$.
+
+### --tests--
+
+`repunitNonfactors()` should return `453647705`.
+
+```js
+assert.strictEqual(repunitNonfactors(), 453647705);
+```
+
+## 33
+
+### --description--
+
+Consider the consecutive primes $p_1 = 19$ and $p_2 = 23$. It can be verified that 1219 is the smallest number such that the last digits are formed by $p_1$ whilst also being divisible by $p_2$.
+
+In fact, with the exception of $p_1 = 3$ and $p_2 = 5$, for every pair of consecutive primes, $p_2 > p_1$, there exist values of $n$ for which the last digits are formed by $p_1$ and $n$ is divisible by $p_2$. Let $S$ be the smallest of these values of $n$.
+
+Find $\sum{S}$ for every pair of consecutive primes with $5 ≤ p_1 ≤ 1000000$.
+
+### --tests--
+
+`primePairConnection()` should return `18613426663617120`.
+
+```js
+assert.strictEqual(primePairConnection(), 18613426663617120);
+```
+
+## 34
+
+### --description--
+
+Given the positive integers, $x$, $y$, and $z$, are consecutive terms of an arithmetic progression, the least value of the positive integer, $n$, for which the equation, $x^2 − y^2 − z^2 = n$, has exactly two solutions is $n = 27$:
+
+$$34^2 − 27^2 − 20^2 = 12^2 − 9^2 − 6^2 = 27$$
+
+It turns out that $n = 1155$ is the least value which has exactly ten solutions.
+
+How many values of $n$ less than one million have exactly ten distinct solutions?
+
+### --tests--
+
+`sameDifferences()` should return `4989`.
+
+```js
+assert.strictEqual(sameDifferences(), 4989);
+```
+
+## 35
+
+### --description--
+
+The positive integers, $x$, $y$, and $z$, are consecutive terms of an arithmetic progression. Given that $n$ is a positive integer, the equation, $x^2 − y^2 − z^2 = n$, has exactly one solution when $n = 20$:
+
+$$13^2 − 10^2 − 7^2 = 20$$
+
+In fact, there are twenty-five values of $n$ below one hundred for which the equation has a unique solution.
+
+How many values of $n$ less than fifty million have exactly one solution?
+
+### --tests--
+
+`singletonDifference()` should return `2544559`.
+
+```js
+assert.strictEqual(singletonDifference(), 2544559);
+```
+
+## 36
+
+### --description--
+
+Consider the infinite polynomial series $A_{F}(x) = xF_1 + x^2F_2 + x^3F_3 + \ldots$, where $F_k$ is the $k$th term in the Fibonacci sequence: $1, 1, 2, 3, 5, 8, \ldots$; that is, $F_k = F_{k − 1} + F_{k − 2}, F_1 = 1$ and $F_2 = 1$.
+
+For this problem we shall be interested in values of $x$ for which $A_{F}(x)$ is a positive integer.
+
+Surprisingly
+
+$$\begin{align}
+A_F(\frac{1}{2}) & = (\frac{1}{2}) × 1 + {(\frac{1}{2})}^2 × 1 + {(\frac{1}{2})}^3 × 2 + {(\frac{1}{2})}^4 × 3 + {(\frac{1}{2})}^5 × 5 + \cdots \\\\
+ & = \frac{1}{2} + \frac{1}{4} + \frac{2}{8} + \frac{3}{16} + \frac{5}{32} + \cdots \\\\
+ & = 2
+\end{align}$$
+
+The corresponding values of $x$ for the first five natural numbers are shown below.
+
+| $x$ | $A_F(x)$ |
+|---------------------------|----------|
+| $\sqrt{2} − 1$ | $1$ |
+| $\frac{1}{2}$ | $2$ |
+| $\frac{\sqrt{13} − 2}{3}$ | $3$ |
+| $\frac{\sqrt{89} − 5}{8}$ | $4$ |
+| $\frac{\sqrt{34} − 3}{5}$ | $5$ |
+
+We shall call $A_F(x)$ a golden nugget if $x$ is rational, because they become increasingly rarer; for example, the 10th golden nugget is 74049690.
+
+Find the 15th golden nugget.
+
+### --tests--
+
+`goldenNugget()` should return `1120149658760`.
+
+```js
+assert.strictEqual(goldenNugget(), 1120149658760);
+```
+
+## 37
+
+### --description--
+
+Consider the isosceles triangle with base length, $b = 16$, and legs, $L = 17$.
+
+
+
+By using the Pythagorean theorem, it can be seen that the height of the triangle, $h = \sqrt{{17}^2 − 8^2} = 15$, which is one less than the base length.
+
+With $b = 272$ and $L = 305$, we get $h = 273$, which is one more than the base length, and this is the second smallest isosceles triangle with the property that $h = b ± 1$.
+
+Find $\sum{L}$ for the twelve smallest isosceles triangles for which $h = b ± 1$ and $b$, $L$ are positive integers.
+
+### --tests--
+
+`isoscelesTriangles()` should return `1118049290473932`.
+
+```js
+assert.strictEqual(isoscelesTriangles(), 1118049290473932);
+```
+
+## 38
+
+### --description--
+
+Let (a, b, c) represent the three sides of a right angle triangle with integral length sides. It is possible to place four such triangles together to form a square with length c.
+
+For example, (3, 4, 5) triangles can be placed together to form a 5 by 5 square with a 1 by 1 hole in the middle and it can be seen that the 5 by 5 square can be tiled with twenty-five 1 by 1 squares.
+
+
+
+However, if (5, 12, 13) triangles were used, the hole would measure 7 by 7. These 7 by 7 squares could not be used to tile the 13 by 13 square.
+
+Given that the perimeter of the right triangle is less than one-hundred million, how many Pythagorean triangles would allow such a tiling to occur?
+
+### --tests--
+
+`pythagoreanTiles()` should return `10057761`.
+
+```js
+assert.strictEqual(pythagoreanTiles(), 10057761);
+```
+
+## 39
+
+### --description--
+
+Consider the infinite polynomial series $A_G(x) = xG_1 + x^2G_2 + x^3G_3 + \cdots$, where $G_k$ is the $k$th term of the second order recurrence relation $G_k = G_{k − 1} + G_{k − 2}, G_1 = 1$ and $G_2 = 4$; that is, $1, 4, 5, 9, 14, 23, \ldots$.
+
+For this problem we shall be concerned with values of $x$ for which $A_G(x)$ is a positive integer.
+
+The corresponding values of $x$ for the first five natural numbers are shown below.
+
+| $x$ | $A_G(x)$ |
+|-----------------------------|----------|
+| $\frac{\sqrt{5} − 1}{4}$ | $1$ |
+| $\frac{2}{5}$ | $2$ |
+| $\frac{\sqrt{22} − 2}{6}$ | $3$ |
+| $\frac{\sqrt{137} − 5}{14}$ | $4$ |
+| $\frac{1}{2}$ | $5$ |
+
+We shall call $A_G(x)$ a golden nugget if $x$ is rational because they become increasingly rarer; for example, the 20th golden nugget is 211345365. Find the sum of the first thirty golden nuggets.
+
+### --tests--
+
+`modifiedGoldenNuggets()` should return `5673835352990`
+
+```js
+assert.strictEqual(modifiedGoldenNuggets(), 5673835352990);
+```
+
+## 40
+
+### --description--
+
+A positive integer, $n$, is divided by $d$ and the quotient and remainder are $q$ and $r$ respectively. In addition $d$, $q$, and $r$ are consecutive positive integer terms in a geometric sequence, but not necessarily in that order.
+
+For example, 58 divided by 6 has a quotient of 9 and a remainder of 4. It can also be seen that 4, 6, 9 are consecutive terms in a geometric sequence (common ratio $\frac{3}{2}$).
+
+We will call such numbers, $n$, progressive.
+
+Some progressive numbers, such as 9 and 10404 = ${102}^2$, also happen to be perfect squares. The sum of all progressive perfect squares below one hundred thousand is 124657.
+
+Find the sum of all progressive perfect squares below one trillion (${10}^{12}$).
+
+### --tests--
+
+`progressivePerfectSquares()` should return `878454337159`.
+
+```js
+assert.strictEqual(progressivePerfectSquares(), 878454337159);
+```
+
+## 41
+
+### --description--
+
+Find the smallest $x + y + z$ with integers $x > y > z > 0$ such that $x + y$, $x − y$, $x + z$, $x − z$, $y + z$, $y − z$ are all perfect squares.
+
+### --tests--
+
+`perfectSquareCollection()` should return `1006193`.
+
+```js
+assert.strictEqual(perfectSquareCollection(), 1006193);
+```
+
+## 42
+
+### --description--
+
+Let ABC be a triangle with all interior angles being less than 120 degrees. Let X be any point inside the triangle and let $XA = p$, $XC = q$, and $XB = r$.
+
+Fermat challenged Torricelli to find the position of X such that p + q + r was minimised.
+
+Torricelli was able to prove that if equilateral triangles AOB, BNC and AMC are constructed on each side of triangle ABC, the circumscribed circles of AOB, BNC, and AMC will intersect at a single point, T, inside the triangle. Moreover he proved that T, called the Torricelli/Fermat point, minimises $p + q + r$. Even more remarkable, it can be shown that when the sum is minimised, $AN = BM = CO = p + q + r$ and that AN, BM and CO also intersect at T.
+
+
+
+If the sum is minimised and a, b, c, p, q and r are all positive integers we shall call triangle ABC a Torricelli triangle. For example, $a = 399$, $b = 455$, $c = 511$ is an example of a Torricelli triangle, with $p + q + r = 784$. Find the sum of all distinct values of $p + q + r ≤ 120000$ for Torricelli triangles.
+
+### --tests--
+
+`sumTorricelliTriangles()` should return `30758397`.
+
+```js
+assert.strictEqual(sumTorricelliTriangles(), 30758397);
+```
+
+## 43
+
+### --description--
+
+In laser physics, a "white cell" is a mirror system that acts as a delay line for the laser beam. The beam enters the cell, bounces around on the mirrors, and eventually works its way back out.
+
+The specific white cell we will be considering is an ellipse with the equation $4{x}^2 + y^2 = 100$
+
+The section corresponding to $−0.01 ≤ x ≤ +0.01$ at the top is missing, allowing the light to enter and exit through the hole.
+
+
+
+
+
+
+The light beam in this problem starts at the point (0.0, 10.1) just outside the white cell, and the beam first impacts the mirror at (1.4, -9.6).
+
+Each time the laser beam hits the surface of the ellipse, it follows the usual law of reflection "angle of incidence equals angle of reflection." That is, both the incident and reflected beams make the same angle with the normal line at the point of incidence.
+
+In the figure on the left, the red line shows the first two points of contact between the laser beam and the wall of the white cell; the blue line shows the line tangent to the ellipse at the point of incidence of the first bounce.
+
+The slope m of the tangent line at any point (x, y) of the given ellipse is: $m = −4 × \frac{x}{y}$
+
+The normal line is perpendicular to this tangent line at the point of incidence.
+
+The animation on the right shows the first 10 reflections of the beam.
+
+How many times does the beam hit the internal surface of the white cell before exiting?
+
+### --tests--
+
+`laserBeamReflections()` should return `354`.
+
+```js
+assert.strictEqual(laserBeamReflections(), 354);
+```
+
+## 44
+
+### --description--
+
+Some positive integers $n$ have the property that the sum [ $n + reverse(n)$ ] consists entirely of odd (decimal) digits. For instance, $36 + 63 = 99$ and $409 + 904 = 1313$. We will call such numbers reversible; so 36, 63, 409, and 904 are reversible. Leading zeroes are not allowed in either $n$ or $reverse(n)$.
+
+There are 120 reversible numbers below one-thousand.
+
+How many reversible numbers are there below one-billion (${10}^9$)?
+
+### --tests--
+
+`reversibleNumbers()` should return `608720`.
+
+```js
+assert.strictEqual(reversibleNumbers(), 608720);
+```
+
+## 45
+
+### --description--
+
+The smallest positive integer $n$ for which the numbers $n^2 + 1$, $n^2 + 3$, $n^2 + 7$, $n^2 + 9$, $n^2 + 13$, and $n^2 + 27$ are consecutive primes is 10. The sum of all such integers $n$ below one-million is 1242490.
+
+What is the sum of all such integers $n$ below 150 million?
+
+### --tests--
+
+`primePattern()` should return `676333270`.
+
+```js
+assert.strictEqual(primePattern(), 676333270);
+```
+
+## 46
+
+### --description--
+
+In a 3x2 cross-hatched grid, a total of 37 different rectangles could be situated within that grid as indicated in the sketch.
+
+
+
+There are 5 grids smaller than 3x2, vertical and horizontal dimensions being important, i.e. 1x1, 2x1, 3x1, 1x2 and 2x2. If each of them is cross-hatched, the following number of different rectangles could be situated within those smaller grids:
+
+$$\begin{array}{|c|c|}
+\hline
+ 1 \times 1 & 1 \\\\ \hline
+ 2 \times 1 & 4 \\\\ \hline
+ 3 \times 1 & 8 \\\\ \hline
+ 1 \times 2 & 4 \\\\ \hline
+ 2 \times 2 & 18 \\\\ \hline
+\end{array}$$
+
+Adding those to the 37 of the 3x2 grid, a total of 72 different rectangles could be situated within 3x2 and smaller grids.
+
+How many different rectangles could be situated within 47x43 and smaller grids?
+
+### --tests--
+
+`crossHatchedRectangles()` should return `846910284`.
+
+```js
+assert.strictEqual(crossHatchedRectangles(), 846910284);
+```
+
+## 47
+
+### --description--
+
+We can easily verify that none of the entries in the first seven rows of Pascal's triangle are divisible by 7:
+
+```markup
+ 1
+ 1 1
+ 1 2 1
+ 1 3 3 1
+ 1 4 6 4 1
+ 1 5 10 10 5 1
+1 6 15 20 15 6 1
+```
+
+However, if we check the first one hundred rows, we will find that only 2361 of the 5050 entries are not divisible by 7.
+
+# --instructions--
+
+Find the number of entries which are not divisible by 7 in the first one billion (${10}^9$) rows of Pascal's triangle.
+
+### --tests--
+
+`entriesOfPascalsTriangle()` should return `2129970655314432`.
+
+```js
+assert.strictEqual(entriesOfPascalsTriangle(), 2129970655314432);
+```
+
+## 48
+
+### --description--
+
+Looking at the table below, it is easy to verify that the maximum possible sum of adjacent numbers in any direction (horizontal, vertical, diagonal or anti-diagonal) is $16 (= 8 + 7 + 1)$.
+
+$$\begin{array}{|r|r|r|r|}
+ \hline
+ −2 & 5 & 3 & 2 \\\\ \hline
+ 9 & −6 & 5 & 1 \\\\ \hline
+ 3 & 2 & 7 & 3 \\\\ \hline
+ −1 & 8 & −4 & 8 \\\\ \hline
+\end{array}$$
+
+Now, let us repeat the search, but on a much larger scale:
+
+First, generate four million pseudo-random numbers using a specific form of what is known as a "Lagged Fibonacci Generator":
+
+For $1 ≤ k ≤ 55$, $s_k = (100003 − 200003k + 300007{k}^3) \\ (modulo\\ 1000000) − 500000$.
+
+For $56 ≤ k ≤ 4000000$, $s_k = (s_{k − 24} + s_{k − 55} + 1000000) \\ (modulo\\ 1000000) − 500000$.
+
+Thus, $s_{10} = −393027$ and $s_{100} = 86613$.
+
+The terms of $s$ are then arranged in a 2000×2000 table, using the first 2000 numbers to fill the first row (sequentially), the next 2000 numbers to fill the second row, and so on.
+
+Finally, find the greatest sum of (any number of) adjacent entries in any direction (horizontal, vertical, diagonal or anti-diagonal).
+
+### --tests--
+
+`maximumSubSequence()` should return `52852124`.
+
+```js
+assert.strictEqual(maximumSubSequence(), 52852124);
+```
+
+## 49
+
+### --description--
+
+In a triangular array of positive and negative integers, we wish to find a sub-triangle such that the sum of the numbers it contains is the smallest possible.
+
+In the example below, it can be easily verified that the marked triangle satisfies this condition having a sum of −42.
+
+
+
+We wish to make such a triangular array with one thousand rows, so we generate 500500 pseudo-random numbers $s_k$ in the range $±2^{19}$, using a type of random number generator (known as a Linear Congruential Generator) as follows:
+
+$$\begin{align}
+ t := & \\ 0\\\\
+ \text{for}\\ & k = 1\\ \text{up to}\\ k = 500500:\\\\
+ & t := (615949 × t + 797807)\\ \text{modulo}\\ 2^{20}\\\\
+ & s_k := t − 219\\\\
+\end{align}$$
+
+Thus: $s_1 = 273519$, $s_2 = −153582$, $s_3 = 450905$ etc.
+
+Our triangular array is then formed using the pseudo-random numbers thus:
+
+$$
+s_1 \\\\
+s_2\\;s_3 \\\\
+s_4\\; s_5\\; s_6 \\\\
+s_7\\; s_8\\; s_9\\; s_{10} \\\\
+\ldots
+$$
+
+Sub-triangles can start at any element of the array and extend down as far as we like (taking-in the two elements directly below it from the next row, the three elements directly below from the row after that, and so on).
+
+The "sum of a sub-triangle" is defined as the sum of all the elements it contains.
+
+Find the smallest possible sub-triangle sum.
+
+### --tests--
+
+`smallestSubTriangleSum()` should return `-271248680`.
+
+```js
+assert.strictEqual(smallestSubTriangleSum(), -271248680);
+```
+
+## 50
+
+### --description--
+
+A printing shop runs 16 batches (jobs) every week and each batch requires a sheet of special colour-proofing paper of size A5.
+
+Every Monday morning, the foreman opens a new envelope, containing a large sheet of the special paper with size A1.
+
+He proceeds to cut it in half, thus getting two sheets of size A2. Then he cuts one of them in half to get two sheets of size A3 and so on until he obtains the A5-size sheet needed for the first batch of the week.
+
+All the unused sheets are placed back in the envelope.
+
+
+
+At the beginning of each subsequent batch, he takes one sheet of paper from the envelope at random. If it is of size A5, he uses it. If it is larger, he repeats the 'cut-in-half' procedure until he has what he needs, and any remaining sheets are always placed back in the envelope.
+
+Excluding the first and last batch of the week, find the expected number of times (during each week) that the foreman finds a single sheet of paper in the envelope.
+
+Give your answer rounded to six decimal places using the format `x.xxxxxx`.
+
+### --tests--
+
+`expectedValueProblem()` should return `0.464399`.
+
+```js
+assert.strictEqual(expectedValueProblem(), 0.464399);
+```
+
+## 51
+
+### --description--
+
+There are several ways to write the number $\frac{1}{2}$ as a sum of inverse squares using distinct integers.
+
+For instance, the numbers {2,3,4,5,7,12,15,20,28,35} can be used:
+
+$$\frac{1}{2} = \frac{1}{2^2} + \frac{1}{3^2} + \frac{1}{4^2} + \frac{1}{5^2} + \frac{1}{7^2} + \frac{1}{{12}^2} + \frac{1}{{15}^2} + \frac{1}{{20}^2} + \frac{1}{{28}^2} + \frac{1}{{35}^2}$$
+
+In fact, only using integers between 2 and 45 inclusive, there are exactly three ways to do it, the remaining two being: {2,3,4,6,7,9,10,20,28,35,36,45} and {2,3,4,6,7,9,12,15,28,30,35,36,45}.
+
+How many ways are there to write the number $\frac{1}{2}$ as a sum of inverse squares using distinct integers between 2 and 80 inclusive?
+
+### --tests--
+
+`sumInverseSquares()` should return `301`.
+
+```js
+assert.strictEqual(sumInverseSquares(), 301);
+```
+
+## 52
+
+### --description--
+
+As we all know the equation $x^2 = -1$ has no solutions for real $x$.
+
+If we however introduce the imaginary number $i$ this equation has two solutions: $x = i$ and $x = -i$.
+
+If we go a step further the equation ${(x - 3)}^2 = -4$ has two complex solutions: $x = 3 + 2i$ and $x = 3 - 2i$, which are called each others' complex conjugate.
+
+Numbers of the form $a + bi$ are called complex numbers.
+
+In general $a + bi$ and $a − bi$ are each other's complex conjugate. A Gaussian Integer is a complex number $a + bi$ such that both $a$ and $b$ are integers.
+
+The regular integers are also Gaussian integers (with $b = 0$).
+
+To distinguish them from Gaussian integers with $b ≠ 0$ we call such integers "rational integers."
+
+A Gaussian integer is called a divisor of a rational integer $n$ if the result is also a Gaussian integer.
+
+If for example we divide 5 by $1 + 2i$ we can simplify in the following manner:
+
+Multiply numerator and denominator by the complex conjugate of $1 + 2i$: $1 − 2i$.
+
+The result is:
+
+$$\frac{5}{1 + 2i} = \frac{5}{1 + 2i} \frac{1 - 2i}{1 - 2i} = \frac{5(1 - 2i)}{1 - {(2i)}^2} = \frac{5(1 - 2i)}{1 - (-4)} = \frac{5(1 - 2i)}{5} = 1 - 2i$$
+
+So $1 + 2i$ is a divisor of 5.
+
+Note that $1 + i$ is not a divisor of 5 because:
+
+$$\frac{5}{1 + i} = \frac{5}{2} - \frac{5}{2}i$$
+
+Note also that if the Gaussian Integer ($a + bi$) is a divisor of a rational integer $n$, then its complex conjugate ($a − bi$) is also a divisor of $n$. In fact, 5 has six divisors such that the real part is positive: {1, 1 + 2i, 1 − 2i, 2 + i, 2 − i, 5}.
+
+The following is a table of all of the divisors for the first five positive rational integers:
+
+| n | Gaussian integer divisors with positive real part | Sum s(n) of these divisors |
+|---|---------------------------------------------------|----------------------------|
+| 1 | 1 | 1 |
+| 2 | 1, 1 + i, 1 - i, 2 | 5 |
+| 3 | 1, 3 | 4 |
+| 4 | 1, 1 + i, 1 - i, 2, 2 + 2i, 2 - 2i, 4 | 13 |
+| 5 | 1, 1 + 2i, 1 - 2i, 2 + i, 2 - i, 5 | 12 |
+
+For divisors with positive real parts, then, we have: $\displaystyle\sum_{n=1}^5 s(n) = 35$.
+
+For $1 ≤ n ≤ {10}^5$, $\displaystyle\sum_{n = 1}^{{10}^5} s(n) = 17924657155$.
+
+What is $\displaystyle\sum_{n=1}^{{10}^8} s(n)$?
+
+### --tests--
+
+`sumGaussianIntegers()` should return `17971254122360636`.
+
+```js
+assert.strictEqual(sumGaussianIntegers(), 17971254122360636);
+```
+
+## 53
+
+### --description--
+
+A triangular pyramid is constructed using spherical balls so that each ball rests on exactly three balls of the next lower level.
+
+
+
+Then, we calculate the number of paths leading from the apex to each position: A path starts at the apex and progresses downwards to any of the three spheres directly below the current position. Consequently, the number of paths to reach a certain position is the sum of the numbers immediately above it (depending on the position, there are up to three numbers above it).
+
+The result is Pascal's pyramid and the numbers at each level n are the coefficients of the trinomial expansion ${(x + y + z)}^n$.
+
+How many coefficients in the expansion of ${(x + y + z)}^{200000}$ are multiples of ${10}^{12}$?
+
+### --tests--
+
+`pascalsPyramid()` should return `479742450`.
+
+```js
+assert.strictEqual(pascalsPyramid(), 479742450);
+```
+
+## 54
+
+### --description--
+
+An electric circuit uses exclusively identical capacitors of the same value C.
+
+The capacitors can be connected in series or in parallel to form sub-units, which can then be connected in series or in parallel with other capacitors or other sub-units to form larger sub-units, and so on up to a final circuit.
+
+Using this simple procedure and up to n identical capacitors, we can make circuits having a range of different total capacitances. For example, using up to $n = 3$ capacitors of $60 μF$ each, we can obtain the following 7 distinct total capacitance values:
+
+
+
+If we denote by $D(n)$ the number of distinct total capacitance values we can obtain when using up to $n$ equal-valued capacitors and the simple procedure described above, we have: $D(1) = 1, D(2) = 3, D(3)=7, \ldots$
+
+Find $D(18)$.
+
+Reminder: When connecting capacitors $C_1$, $C_2$ etc in parallel, the total capacitance is $C_T = C_1 + C_2 + \cdots$, whereas when connecting them in series, the overall capacitance is given by: $\frac{1}{C_T} = \frac{1}{C_1} + \frac{1}{C_2} + \cdots$.
+
+### --tests--
+
+`capacitanceValues()` should return `3857447`.
+
+```js
+assert.strictEqual(capacitanceValues(), 3857447);
+```
+
+## 55
+
+### --description--
+
+Starting from zero the natural numbers are written down in base 10 like this:
+
+0 1 2 3 4 5 6 7 8 9 10 11 12....
+
+Consider the digit $d = 1$. After we write down each number n, we will update the number of ones that have occurred and call this number $f(n, 1)$. The first values for $f(n, 1)$, then, are as follows:
+
+| $n$ | $f(n, 1)$ |
+|-----|-----------|
+| 0 | 0 |
+| 1 | 1 |
+| 2 | 1 |
+| 3 | 1 |
+| 4 | 1 |
+| 5 | 1 |
+| 6 | 1 |
+| 7 | 1 |
+| 8 | 1 |
+| 9 | 1 |
+| 10 | 2 |
+| 11 | 4 |
+| 12 | 5 |
+
+Note that $f(n, 1)$ never equals 3.
+
+So the first two solutions of the equation $f(n, 1) = n$ are $n = 0$ and $n = 1$. The next solution is $n = 199981$. In the same manner the function $f(n, d)$ gives the total number of digits d that have been written down after the number $n$ has been written.
+
+In fact, for every digit $d ≠ 0$, 0 is the first solution of the equation $f(n, d) = n$. Let $s(d)$ be the sum of all the solutions for which $f(n, d) = n$.
+
+You are given that $s(1) = 22786974071$. Find $\sum{s(d)}$ for $1 ≤ d ≤ 9$.
+
+Note: if, for some $n$, $f(n, d) = n$ for more than one value of $d$ this value of $n$ is counted again for every value of $d$ for which $f(n, d) = n$.
+
+### --tests--
+
+`countingDigits()` should return `21295121502550`.
+
+```js
+assert.strictEqual(countingDigits(), 21295121502550);
+```
+
+## 56
+
+### --description--
+
+Consider the diophantine equation $\frac{1}{a} + \frac{1}{b} = \frac{p}{{10}^n}$ with $a$, $b$, $p$, $n$ positive integers and $a ≤ b$.
+
+For $n = 1$ this equation has 20 solutions that are listed below:
+
+$$\begin{array}{lllll}
+ \frac{1}{1} + \frac{1}{1} = \frac{20}{10} & \frac{1}{1} + \frac{1}{2} = \frac{15}{10}
+& \frac{1}{1} + \frac{1}{5} = \frac{12}{10} & \frac{1}{1} + \frac{1}{10} = \frac{11}{10}
+& \frac{1}{2} + \frac{1}{2} = \frac{10}{10} \\\\
+ \frac{1}{2} + \frac{1}{5} = \frac{7}{10} & \frac{1}{2} + \frac{1}{10} = \frac{6}{10}
+& \frac{1}{3} + \frac{1}{6} = \frac{5}{10} & \frac{1}{3} + \frac{1}{15} = \frac{4}{10}
+& \frac{1}{4} + \frac{1}{4} = \frac{5}{10} \\\\
+ \frac{1}{4} + \frac{1}{4} = \frac{5}{10} & \frac{1}{5} + \frac{1}{5} = \frac{4}{10}
+& \frac{1}{5} + \frac{1}{10} = \frac{3}{10} & \frac{1}{6} + \frac{1}{30} = \frac{2}{10}
+& \frac{1}{10} + \frac{1}{10} = \frac{2}{10} \\\\
+ \frac{1}{11} + \frac{1}{110} = \frac{1}{10} & \frac{1}{12} + \frac{1}{60} = \frac{1}{10}
+& \frac{1}{14} + \frac{1}{35} = \frac{1}{10} & \frac{1}{15} + \frac{1}{30} = \frac{1}{10}
+& \frac{1}{20} + \frac{1}{20} = \frac{1}{10}
+\end{array}$$
+
+How many solutions has this equation for $1 ≤ n ≤ 9$?
+
+### --tests--
+
+`diophantineEquation()` should return `53490`.
+
+```js
+assert.strictEqual(diophantineEquation(), 53490);
+```
+
+## 57
+
+### --description--
+
+Taking three different letters from the 26 letters of the alphabet, character strings of length three can be formed.
+
+Examples are 'abc', 'hat' and 'zyx'.
+
+When we study these three examples we see that for 'abc' two characters come lexicographically after its neighbour to the left.
+
+For 'hat' there is exactly one character that comes lexicographically after its neighbour to the left. For 'zyx' there are zero characters that come lexicographically after its neighbour to the left.
+
+In all there are 10400 strings of length 3 for which exactly one character comes lexicographically after its neighbour to the left.
+
+We now consider strings of $n ≤ 26$ different characters from the alphabet.
+
+For every $n$, $p(n)$ is the number of strings of length $n$ for which exactly one character comes lexicographically after its neighbour to the left.
+
+What is the maximum value of $p(n)$?
+
+### --tests--
+
+`lexicographicNeighbours()` should return `409511334375`.
+
+```js
+assert.strictEqual(lexicographicNeighbours(), 409511334375);
+```
+
+## 58
+
+### --description--
+
+A composite number can be factored many different ways.
+
+For instance, not including multiplication by one, 24 can be factored in 7 distinct ways:
+
+$$\begin{align}
+ & 24 = 2 \times 2 \times 2 \times 3\\\\
+ & 24 = 2 \times 3 \times 4 \\\\
+ & 24 = 2 \times 2 \times 6 \\\\
+ & 24 = 4 \times 6 \\\\
+ & 24 = 3 \times 8 \\\\
+ & 24 = 2 \times 12 \\\\
+ & 24 = 24
+\end{align}$$
+
+Recall that the digital root of a number, in base 10, is found by adding together the digits of that number, and repeating that process until a number arrives at less than 10. Thus the digital root of 467 is 8.
+
+We shall call a Digital Root Sum (DRS) the sum of the digital roots of the individual factors of our number. The chart below demonstrates all of the DRS values for 24.
+
+| Factorisation | Digital Root Sum |
+|---------------|------------------|
+| 2x2x2x3 | 9 |
+| 2x3x4 | 9 |
+| 2x2x6 | 10 |
+| 4x6 | 10 |
+| 3x8 | 11 |
+| 2x12 | 5 |
+| 24 | 6 |
+
+The maximum Digital Root Sum of 24 is 11. The function $mdrs(n)$ gives the maximum Digital Root Sum of $n$. So $mdrs(24) = 11$.
+
+Find $\sum{mdrs(n)}$ for $1 < n < 1,000,000$.
+
+### --tests--
+
+`euler159()` should return `14489159`.
+
+```js
+assert.strictEqual(euler159(), 14489159);
+```
+
+## 59
+
+### --description--
+
+For any $N$, let $f(N)$ be the last five digits before the trailing zeroes in $N!$.
+
+For example,
+
+$$\begin{align}
+ & 9! = 362880 \\; \text{so} \\; f(9) = 36288 \\\\
+ & 10! = 3628800 \\; \text{so} \\; f(10) = 36288 \\\\
+ & 20! = 2432902008176640000 \\; \text{so} \\; f(20) = 17664
+\end{align}$$
+
+Find $f(1,000,000,000,000)$
+
+### --tests--
+
+`factorialTrailingDigits()` should return `16576`.
+
+```js
+assert.strictEqual(factorialTrailingDigits(), 16576);
+```
+
+## 60
+
+### --description--
+
+A triomino is a shape consisting of three squares joined via the edges.
+
+There are two basic forms:
+
+
+
+If all possible orientations are taken into account there are six:
+
+
+
+Any n by m grid for which nxm is divisible by 3 can be tiled with triominoes. If we consider tilings that can be obtained by reflection or rotation from another tiling as different there are 41 ways a 2 by 9 grid can be tiled with triominoes:
+
+
+
+In how many ways can a 9 by 12 grid be tiled in this way by triominoes?
+
+### --tests--
+
+`triominoes()` should return `20574308184277972`.
+
+```js
+assert.strictEqual(triominoes(), 20574308184277972);
+```
+
+## 61
+
+### --description--
+
+In the hexadecimal number system numbers are represented using 16 different digits:
+
+$$0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F$$
+
+The hexadecimal number AF when written in the decimal number system equals $10 \times 16 + 15 = 175$.
+
+In the 3-digit hexadecimal numbers 10A, 1A0, A10, and A01 the digits 0,1 and A are all present.
+
+Like numbers written in base ten we write hexadecimal numbers without leading zeroes.
+
+How many hexadecimal numbers containing at most sixteen hexadecimal digits exist with all of the digits 0,1, and A present at least once?
+
+Give your answer with hexadecimal number as a string.
+
+**Note:** (A,B,C,D,E and F in upper case, without any leading or trailing code that marks the number as hexadecimal and without leading zeroes , e.g. 1A3F and not: 1a3f and not 0x1a3f and not $1A3F and not #1A3F and not 0000001A3F)
+
+### --tests--
+
+`hexadecimalNumbers()` should return a string.
+
+```js
+assert(typeof hexadecimalNumbers() === 'string');
+```
+
+`hexadecimalNumbers()` should return the string `3D58725572C62302`.
+
+```js
+assert.strictEqual(hexadecimalNumbers(), '3D58725572C62302');
+```
+
+## 62
+
+### --description--
+
+Consider an equilateral triangle in which straight lines are drawn from each vertex to the middle of the opposite side, such as in the size 1 triangle in the sketch below.
+
+
+
+Sixteen triangles of either different shape or size or orientation or location can now be observed in that triangle. Using size 1 triangles as building blocks, larger triangles can be formed, such as the size 2 triangle in the above sketch. One-hundred and four triangles of either different shape or size or orientation or location can now be observed in that size 2 triangle.
+
+It can be observed that the size 2 triangle contains 4 size 1 triangle building blocks. A size 3 triangle would contain 9 size 1 triangle building blocks and a size $n$ triangle would thus contain $n^2$ size 1 triangle building blocks.
+
+If we denote $T(n)$ as the number of triangles present in a triangle of size $n$, then
+
+$$\begin{align}
+ & T(1) = 16 \\\\
+ & T(2) = 104
+\end{align}$$
+
+Find $T(36)$.
+
+### --tests--
+
+`crossHatchedTriangles()` should return `343047`.
+
+```js
+assert.strictEqual(crossHatchedTriangles(), 343047);
+```
+
+## 63
+
+### --description--
+
+How many 20 digit numbers $n$ (without any leading zero) exist such that no three consecutive digits of $n$ have a sum greater than 9?
+
+### --tests--
+
+`consecutiveDigitsSum()` should return `378158756814587`.
+
+```js
+assert.strictEqual(consecutiveDigitsSum(), 378158756814587);
+```
+
+## 64
+
+### --description--
+
+A segment is uniquely defined by its two endpoints. By considering two line segments in plane geometry there are three possibilities: the segments have zero points, one point, or infinitely many points in common.
+
+Moreover when two segments have exactly one point in common it might be the case that that common point is an endpoint of either one of the segments or of both. If a common point of two segments is not an endpoint of either of the segments it is an interior point of both segments.
+
+We will call a common point $T$ of two segments $L_1$ and $L_2$ a true intersection point of $L_1$ and $L_2$ if $T$ is the only common point of $L_1$ and $L_2$ and $T$ is an interior point of both segments.
+
+Consider the three segments $L_1$, $L_2$, and $L_3$:
+
+$$\begin{align}
+ & L_1: (27, 44) \\;\text{to}\\; (12, 32) \\\\
+ & L_2: (46, 53) \\;\text{to}\\; (17, 62) \\\\
+ & L_3: (46, 70) \\;\text{to}\\; (22, 40) \\\\
+\end{align}$$
+
+It can be verified that line segments $L_2$ and $L_3$ have a true intersection point. We note that as the one of the end points of $L_3$: (22, 40) lies on $L_1$ this is not considered to be a true point of intersection. $L_1$ and $L_2$ have no common point. So among the three line segments, we find one true intersection point.
+
+Now let us do the same for 5000 line segments. To this end, we generate 20000 numbers using the so-called "Blum Blum Shub" pseudo-random number generator.
+
+$$\begin{align}
+ & s_0 = 290797 \\\\
+ & s_{n + 1} = s_n × s_n (\text{modulo}\\; 50515093) \\\\
+ & t_n = s_n (\text{modulo}\\; 500) \\\\
+\end{align}$$
+
+To create each line segment, we use four consecutive numbers $t_n$. That is, the first line segment is given by:
+
+($_t$1, $t_2$) to ($t_3$, $t_4$)
+
+The first four numbers computed according to the above generator should be: 27, 144, 12 and 232. The first segment would thus be (27, 144) to (12, 232).
+
+How many distinct true intersection points are found among the 5000 line segments?
+
+### --tests--
+
+`distinctIntersections()` should return `2868868`.
+
+```js
+assert.strictEqual(distinctIntersections(), 2868868);
+```
+
+## 65
+
+### --description--
+
+A 4x4 grid is filled with digits $d$, $0 ≤ d ≤ 9$.
+
+It can be seen that in the grid
+
+$$\begin{array}{}
+ 6 & 3 & 3 & 0 \\\\
+ 5 & 0 & 4 & 3 \\\\
+ 0 & 7 & 1 & 4 \\\\
+ 1 & 2 & 4 & 5
+\end{array}$$
+
+the sum of each row and each column has the value 12. Moreover the sum of each diagonal is also 12.
+
+In how many ways can you fill a 4x4 grid with the digits $d$, $0 ≤ d ≤ 9$ so that each row, each column, and both diagonals have the same sum?
+
+### --tests--
+
+`crissCross()` should return `7130034`.
+
+```js
+assert.strictEqual(crissCross(), 7130034);
+```
+
+## 66
+
+### --description--
+
+For two positive integers $a$ and $b$, the Ulam sequence $U(a,b)$ is defined by ${U{(a,b)}\_1} = a$, ${U{(a,b)}\_2} = b$ and for $k > 2$, ${U{(a,b)}\_k}$ is the smallest integer greater than ${U{(a,b)}\_{(k-1)}}$ which can be written in exactly one way as the sum of two distinct previous members of $U(a,b)$.
+
+For example, the sequence $U(1,2)$ begins with
+
+$$1, 2, 3 = 1 + 2, 4 = 1 + 3, 6 = 2 + 4, 8 = 2 + 6, 11 = 3 + 8$$
+
+5 does not belong to it because $5 = 1 + 4 = 2 + 3$ has two representations as the sum of two previous members, likewise $7 = 1 + 6 = 3 + 4$.
+
+Find $\sum {U(2, 2n + 1)_k}$ for $2 ≤ n ≤ 10$, where $k = {10}^{11}$.
+
+### --tests--
+
+`ulamSequences()` should return `3916160068885`.
+
+```js
+assert.strictEqual(ulamSequences(), 3916160068885);
+```
+
+## 67
+
+### --description--
+
+Consider the number 142857. We can right-rotate this number by moving the last digit (7) to the front of it, giving us 714285.
+
+It can be verified that $714285 = 5 × 142857$.
+
+This demonstrates an unusual property of 142857: it is a divisor of its right-rotation.
+
+For integer number of digits $a$ and $b$, find the last 5 digits of the sum of all integers $n$, $10^a < n < 10^b$, that have this property.
+
+### --tests--
+
+`numberRotations(2, 10)` should return `98311`.
+
+```js
+assert.strictEqual(numberRotations(2, 10), 98311);
+```
+
+`numberRotations(2, 100)` should return `59206`.
+
+```js
+assert.strictEqual(numberRotations(2, 100), 59206);
+```
+
+## 68
+
+### --description--
+
+Define $f(0)=1$ and $f(n)$ to be the number of different ways $n$ can be expressed as a sum of integer powers of 2 using each power no more than twice.
+
+For example, $f(10)=5$ since there are five different ways to express 10:
+
+$$\begin{align}
+ & 1 + 1 + 8 \\\\
+ & 1 + 1 + 4 + 4 \\\\
+ & 1 + 1 + 2 + 2 + 4 \\\\
+ & 2 + 4 + 4 \\\\
+ & 2 + 8
+\end{align}$$
+
+What is $f({10}^{25})$?
+
+### --tests--
+
+`numberOfWaysToExpress()` should return `178653872807`.
+
+```js
+assert.strictEqual(numberOfWaysToExpress(), 178653872807);
+```
+
+## 69
+
+### --description--
+
+Take the number 6 and multiply it by each of 1273 and 9854:
+
+$$\begin{align}
+ & 6 × 1273 = 7638 \\\\
+ & 6 × 9854 = 59124 \\\\
+\end{align}$$
+
+By concatenating these products we get the 1 to 9 pandigital 763859124. We will call 763859124 the "concatenated product of 6 and (1273, 9854)". Notice too, that the concatenation of the input numbers, 612739854, is also 1 to 9 pandigital.
+
+The same can be done for 0 to 9 pandigital numbers.
+
+What is the largest 0 to 9 pandigital 10-digit concatenated product of an integer with two or more other integers, such that the concatenation of the input numbers is also a 0 to 9 pandigital 10-digit number?
+
+### --tests--
+
+`largestPandigital()` should return `9857164023`.
+
+```js
+assert.strictEqual(largestPandigital(), 9857164023);
+```
+
+## 70
+
+### --description--
+
+For a positive integer $n$, let $f(n)$ be the sum of the squares of the digits (in base 10) of $n$, e.g.
+
+$$\begin{align}
+ & f(3) = 3^2 = 9 \\\\
+ & f(25) = 2^2 + 5^2 = 4 + 25 = 29 \\\\
+ & f(442) = 4^2 + 4^2 + 2^2 = 16 + 16 + 4 = 36 \\\\
+\end{align}$$
+
+Find the last nine digits of the sum of all $n$, $0 < n < {10}^{20}$, such that $f(n)$ is a perfect square.
+
+### --tests--
+
+`lastDigitsSumOfPerfectSquare()` should return `142989277`.
+
+```js
+assert.strictEqual(lastDigitsSumOfPerfectSquare(), 142989277);
+```
+
+## 71
+
+### --description--
+
+How many 18-digit numbers $n$ (without leading zeros) are there such that no digit occurs more than three times in $n$?
+
+### --tests--
+
+`numbersWithRepeatedDigits()` should return `227485267000992000`.
+
+```js
+assert.strictEqual(numbersWithRepeatedDigits(), 227485267000992000);
+```
+
+## 72
+
+### --description--
+
+We shall define a square lamina to be a square outline with a square "hole" so that the shape possesses vertical and horizontal symmetry. For example, using exactly thirty-two square tiles we can form two different square laminae:
+
+
+
+With one-hundred tiles, and not necessarily using all of the tiles at one time, it is possible to form forty-one different square laminae. Using up to one million tiles how many different square laminae can be formed?
+
+### --tests--
+
+`differentHollowSquareLaminae()` should return `1572729`.
+
+```js
+assert.strictEqual(differentHollowSquareLaminae(), 1572729);
+```
+
+## 73
+
+### --description--
+
+We shall define a square lamina to be a square outline with a square "hole" so that the shape possesses vertical and horizontal symmetry.
+
+Given eight tiles it is possible to form a lamina in only one way: 3x3 square with a 1x1 hole in the middle. However, using thirty-two tiles it is possible to form two distinct laminae.
+
+
+
+If $t$ represents the number of tiles used, we shall say that $t = 8$ is type $L(1)$ and $t = 32$ is type $L(2)$.
+
+Let $N(n)$ be the number of $t ≤ 1000000$ such that $t$ is type $L(n)$; for example, $N(15) = 832$.
+
+What is $\sum N(n)$ for $1 ≤ n ≤ 10$?
+
+### --tests--
+
+`hollowSquareLaminaeDistinctArrangements()` should return `209566`.
+
+```js
+assert.strictEqual(hollowSquareLaminaeDistinctArrangements(), 209566);
+```
+
+## 74
+
+### --description--
+
+Define $f(0) = 1$ and $f(n)$ to be the number of ways to write $n$ as a sum of powers of 2 where no power occurs more than twice.
+
+For example, $f(10) = 5$ since there are five different ways to express 10:
+
+$$10 = 8 + 2 = 8 + 1 + 1 = 4 + 4 + 2 = 4 + 2 + 2 + 1 + 1 = 4 + 4 + 1 + 1$$
+
+It can be shown that for every fraction $\frac{p}{q}\\; (p>0, q>0)$ there exists at least one integer $n$ such that $\frac{f(n)}{f(n - 1)} = \frac{p}{q}$.
+
+For instance, the smallest $n$ for which $\frac{f(n)}{f(n - 1)} = \frac{13}{17}$ is 241. The binary expansion of 241 is 11110001.
+
+Reading this binary number from the most significant bit to the least significant bit there are 4 one's, 3 zeroes and 1 one. We shall call the string 4,3,1 the Shortened Binary Expansion of 241.
+
+Find the Shortened Binary Expansion of the smallest $n$ for which
+
+$$\frac{f(n)}{f(n - 1)} = \frac{123456789}{987654321}$$
+
+Give your answer as a string with comma separated integers, without any whitespaces.
+
+### --tests--
+
+`shortenedBinaryExpansionOfNumber()` should return a string.
+
+```js
+assert(typeof shortenedBinaryExpansionOfNumber() === 'string');
+```
+
+`shortenedBinaryExpansionOfNumber()` should return the string `1,13717420,8`.
+
+```js
+assert.strictEqual(shortenedBinaryExpansionOfNumber(), '1,13717420,8');
+```
+
+## 75
+
+### --description--
+
+The four right-angled triangles with sides (9,12,15), (12,16,20), (5,12,13) and (12,35,37) all have one of the shorter sides (catheti) equal to 12. It can be shown that no other integer sided right-angled triangle exists with one of the catheti equal to 12.
+
+Find the smallest integer that can be the length of a cathetus of exactly 47547 different integer sided right-angled triangles.
+
+### --tests--
+
+`trianglesSharingCathetus()` should return `96818198400000`.
+
+```js
+assert.strictEqual(trianglesSharingCathetus(), 96818198400000);
+```
+
+## 76
+
+### --description--
+
+Let ABCD be a convex quadrilateral, with diagonals AC and BD. At each vertex the diagonal makes an angle with each of the two sides, creating eight corner angles.
+
+
+
+For example, at vertex A, the two angles are CAD, CAB.
+
+We call such a quadrilateral for which all eight corner angles have integer values when measured in degrees an "integer angled quadrilateral". An example of an integer angled quadrilateral is a square, where all eight corner angles are 45°. Another example is given by DAC = 20°, BAC = 60°, ABD = 50°, CBD = 30°, BCA = 40°, DCA = 30°, CDB = 80°, ADB = 50°.
+
+What is the total number of non-similar integer angled quadrilaterals?
+
+**Note:** In your calculations you may assume that a calculated angle is integral if it is within a tolerance of ${10}^{-9}$ of an integer value.
+
+### --tests--
+
+`integerAngledQuadrilaterals()` should return `129325`.
+
+```js
+assert.strictEqual(integerAngledQuadrilaterals(), 129325);
+```
+
+## 77
+
+### --description--
+
+Consider the number 45656.
+
+It can be seen that each pair of consecutive digits of 45656 has a difference of one.
+
+A number for which every pair of consecutive digits has a difference of one is called a step number.
+
+A pandigital number contains every decimal digit from 0 to 9 at least once.
+
+How many pandigital step numbers less than ${10}^{40}$ are there?
+
+### --tests--
+
+`stepNumbers()` should return `126461847755`.
+
+```js
+assert.strictEqual(stepNumbers(), 126461847755);
+```
+
+## 78
+
+### --description--
+
+Find the number of integers $1 < n < {10}^7$, for which $n$ and $n + 1$ have the same number of positive divisors. For example, 14 has the positive divisors 1, 2, 7, 14 while 15 has 1, 3, 5, 15.
+
+### --tests--
+
+`consecutivePositiveDivisors()` should return `986262`.
+
+```js
+assert.strictEqual(consecutivePositiveDivisors(), 986262);
+```
+
+## 79
+
+### --description--
+
+For any integer $n$, consider the three functions
+
+$$\begin{align}
+ & f_{1,n}(x,y,z) = x^{n + 1} + y^{n + 1} − z^{n + 1}\\\\
+ & f_{2,n}(x,y,z) = (xy + yz + zx) \times (x^{n - 1} + y^{n - 1} − z^{n - 1})\\\\
+ & f_{3,n}(x,y,z) = xyz \times (x^{n - 2} + y^{n - 2} − z^{n - 2})
+\end{align}$$
+
+and their combination
+
+$$\begin{align}
+ & f_n(x,y,z) = f_{1,n}(x,y,z) + f_{2,n}(x,y,z) − f_{3,n}(x,y,z)
+\end{align}$$
+
+We call $(x,y,z)$ a golden triple of order $k$ if $x$, $y$, and $z$ are all rational numbers of the form $\frac{a}{b}$ with $0 < a < b ≤ k$ and there is (at least) one integer $n$, so that $f_n(x,y,z) = 0$.
+
+Let $s(x,y,z) = x + y + z$.
+
+Let $t = \frac{u}{v}$ be the sum of all distinct $s(x,y,z)$ for all golden triples $(x,y,z)$ of order 35. All the $s(x,y,z)$ and $t$ must be in reduced form.
+
+Find $u + v$.
+
+### --tests--
+
+`rationalZeros()` should return `285196020571078980`.
+
+```js
+assert.strictEqual(rationalZeros(), 285196020571078980);
+```
+
+## 80
+
+### --description--
+
+Having three black objects $B$ and one white object $W$ they can be grouped in 7 ways like this:
+
+$$(BBBW)\\;(B,BBW)\\;(B,B,BW)\\;(B,B,B,W)\\;(B,BB,W)\\;(BBB,W)\\;(BB,BW)$$
+
+In how many ways can sixty black objects $B$ and forty white objects $W$ be thus grouped?
+
+### --tests--
+
+`colorsGrouping()` should return `83735848679360670`.
+
+```js
+assert.strictEqual(colorsGrouping(), 83735848679360670);
+```
+
+## 81
+
+### --description--
+
+The RSA encryption is based on the following procedure:
+
+Generate two distinct primes `p` and `q`.
+Compute `n=p*q` and `φ=(p-1)(q-1)`.
+Find an integer `e`, `1 < e < φ`, such that `gcd(e,φ) = 1`
+
+A message in this system is a number in the interval `[0,n-1]`.
+A text to be encrypted is then somehow converted to messages (numbers in the interval `[0,n-1]`).
+To encrypt the text, for each message, `m`, c=me mod n is calculated.
+
+To decrypt the text, the following procedure is needed: calculate `d` such that `ed=1 mod φ`, then for each encrypted message, `c`, calculate m=cd mod n.
+
+There exist values of `e` and `m` such that me mod n = m.
+We call messages `m` for which me mod n=m unconcealed messages.
+
+An issue when choosing `e` is that there should not be too many unconcealed messages.
+For instance, let `p=19` and `q=37`.
+Then `n=19*37=703` and `φ=18*36=648`.
+If we choose `e=181`, then, although `gcd(181,648)=1` it turns out that all possible messages
+m `(0≤m≤n-1)` are unconcealed when calculating me mod n.
+For any valid choice of `e` there exist some unconcealed messages.
+It's important that the number of unconcealed messages is at a minimum.
+
+For any given `p` and `q`, find the sum of all values of `e`, `1 < e < φ(p,q)` and `gcd(e,φ)=1`, so that the number of unconcealed messages for this value of `e` is at a minimum.
+
+### --tests--
+
+`RSAEncryption` should be a function.
+
+```js
+assert(typeof RSAEncryption === 'function')
+```
+
+`RSAEncryption` should return a number.
+
+```js
+assert.strictEqual(typeof RSAEncryption(19, 37), 'number');
+```
+
+`RSAEncryption(19, 37)` should return `17766`.
+
+```js
+assert.strictEqual(RSAEncryption(19, 37), 17766);
+```
+
+`RSAEncryption(283, 409)` should return `466196580`.
+
+```js
+assert.strictEqual(RSAEncryption(283, 409), 466196580);
+```
+
+`RSAEncryption(1009, 3643)` should return `399788195976`.
+
+```js
+assert.strictEqual(RSAEncryption(19, 37), 17766);
+```
+
+## 82
+
+### --description--
+
+Let $N$ be a positive integer and let $N$ be split into $k$ equal parts, $r = \frac{N}{k}$, so that $N = r + r + \cdots + r$.
+
+Let $P$ be the product of these parts, $P = r × r × \cdots × r = r^k$.
+
+For example, if 11 is split into five equal parts, 11 = 2.2 + 2.2 + 2.2 + 2.2 + 2.2, then $P = {2.2}^5 = 51.53632$.
+
+Let $M(N) = P_{max}$ for a given value of $N$.
+
+It turns out that the maximum for $N = 11$ is found by splitting eleven into four equal parts which leads to $P_{max} = {(\frac{11}{4})}^4$; that is, $M(11) = \frac{14641}{256} = 57.19140625$, which is a terminating decimal.
+
+However, for $N = 8$ the maximum is achieved by splitting it into three equal parts, so $M(8) = \frac{512}{27}$, which is a non-terminating decimal.
+
+Let $D(N) = N$ if $M(N)$ is a non-terminating decimal and $D(N) = -N$ if $M(N)$ is a terminating decimal.
+
+For example, $\sum D(N)$ for $5 ≤ N ≤ 100$ is 2438.
+
+Find $\sum D(N)$ for $5 ≤ N ≤ 10000$.
+
+### --tests--
+
+`maximumProductOfParts()` should return `48861552`.
+
+```js
+assert.strictEqual(maximumProductOfParts(), 48861552);
+```
+
+## 83
+
+### --description--
+
+Consider the set $I_r$ of points $(x,y)$ with integer coordinates in the interior of the circle with radius $r$, centered at the origin, i.e. $x^2 + y^2 < r^2$.
+
+For a radius of 2, $I_2$ contains the nine points (0,0), (1,0), (1,1), (0,1), (-1,1), (-1,0), (-1,-1), (0,-1) and (1,-1). There are eight triangles having all three vertices in $I_2$ which contain the origin in the interior. Two of them are shown below, the others are obtained from these by rotation.
+
+
+
+For a radius of 3, there are 360 triangles containing the origin in the interior and having all vertices in $I_3$ and for $I_5$ the number is 10600.
+
+How many triangles are there containing the origin in the interior and having all three vertices in $I_{105}$?
+
+### --tests--
+
+`trianglesContainingOrigin()` should return `1725323624056`.
+
+```js
+assert.strictEqual(trianglesContainingOrigin(), 1725323624056);
+```
+
+## 84
+
+### --description--
+
+The game Number Mind is a variant of the well known game Master Mind.
+
+Instead of coloured pegs, you have to guess a secret sequence of digits. After each guess you're only told in how many places you've guessed the correct digit. So, if the sequence was 1234 and you guessed 2036, you'd be told that you have one correct digit; however, you would NOT be told that you also have another digit in the wrong place.
+
+For instance, given the following guesses for a 5-digit secret sequence,
+
+$$\begin{align}
+ & 90342 ;2\\;\text{correct}\\\\
+ & 70794 ;0\\;\text{correct}\\\\
+ & 39458 ;2\\;\text{correct}\\\\
+ & 34109 ;1\\;\text{correct}\\\\
+ & 51545 ;2\\;\text{correct}\\\\
+ & 12531 ;1\\;\text{correct}
+\end{align}$$
+
+The correct sequence 39542 is unique.
+
+Based on the following guesses,
+
+$$\begin{align}
+ & 5616185650518293 ;2\\;\text{correct}\\\\
+ & 3847439647293047 ;1\\;\text{correct}\\\\
+ & 5855462940810587 ;3\\;\text{correct}\\\\
+ & 9742855507068353 ;3\\;\text{correct}\\\\
+ & 4296849643607543 ;3\\;\text{correct}\\\\
+ & 3174248439465858 ;1\\;\text{correct}\\\\
+ & 4513559094146117 ;2\\;\text{correct}\\\\
+ & 7890971548908067 ;3\\;\text{correct}\\\\
+ & 8157356344118483 ;1\\;\text{correct}\\\\
+ & 2615250744386899 ;2\\;\text{correct}\\\\
+ & 8690095851526254 ;3\\;\text{correct}\\\\
+ & 6375711915077050 ;1\\;\text{correct}\\\\
+ & 6913859173121360 ;1\\;\text{correct}\\\\
+ & 6442889055042768 ;2\\;\text{correct}\\\\
+ & 2321386104303845 ;0\\;\text{correct}\\\\
+ & 2326509471271448 ;2\\;\text{correct}\\\\
+ & 5251583379644322 ;2\\;\text{correct}\\\\
+ & 1748270476758276 ;3\\;\text{correct}\\\\
+ & 4895722652190306 ;1\\;\text{correct}\\\\
+ & 3041631117224635 ;3\\;\text{correct}\\\\
+ & 1841236454324589 ;3\\;\text{correct}\\\\
+ & 2659862637316867 ;2\\;\text{correct}
+\end{align}$$
+
+Find the unique 16-digit secret sequence.
+
+### --tests--
+
+`numberMind()` should return `4640261571849533`.
+
+```js
+assert.strictEqual(numberMind(), 4640261571849533);
+```
+
+## 85
+
+### --description--
+
+Here are the records from a busy telephone system with one million users:
+
+| RecNr | Caller | Called |
+|-------|--------|--------|
+| 1 | 200007 | 100053 |
+| 2 | 600183 | 500439 |
+| 3 | 600863 | 701497 |
+| ... | ... | ... |
+
+The telephone number of the caller and the called number in record $n$ are $Caller(n) = S_{2n - 1}$ and $Called(n) = S_{2n}$ where ${S}_{1,2,3,\ldots}$ come from the "Lagged Fibonacci Generator":
+
+For $1 ≤ k ≤ 55$, $S_k = [100003 - 200003k + 300007{k}^3]\\;(\text{modulo}\\;1000000)$
+
+For $56 ≤ k$, $S_k = [S_{k - 24} + S_{k - 55}]\\;(\text{modulo}\\;1000000)$
+
+If $Caller(n) = Called(n)$ then the user is assumed to have misdialled and the call fails; otherwise the call is successful.
+
+From the start of the records, we say that any pair of users $X$ and $Y$ are friends if $X$ calls $Y$ or vice-versa. Similarly, $X$ is a friend of a friend of $Z$ if $X$ is a friend of $Y$ and $Y$ is a friend of $Z$; and so on for longer chains.
+
+The Prime Minister's phone number is 524287. After how many successful calls, not counting misdials, will 99% of the users (including the PM) be a friend, or a friend of a friend etc., of the Prime Minister?
+
+### --tests--
+
+`connectednessOfANetwork()` should return `2325629`.
+
+```js
+assert.strictEqual(connectednessOfANetwork(), 2325629);
+```
+
+## 86
+
+### --description--
+
+A composite is a number containing at least two prime factors. For example, $15 = 3 × 5; 9 = 3 × 3; 12 = 2 × 2 × 3$.
+
+There are ten composites below thirty containing precisely two, not necessarily distinct, prime factors: 4, 6, 9, 10, 14, 15, 21, 22, 25, 26.
+
+How many composite integers, $n < {10}^8$, have precisely two, not necessarily distinct, prime factors?
+
+### --tests--
+
+`semiPrimes()` should return `17427258`.
+
+```js
+assert.strictEqual(euler187(), 17427258);
+```
+
+## 87
+
+### --description--
+
+The hyperexponentiation or tetration of a number $a$ by a positive integer $b$, denoted by $a↑↑b$ or ${}^ba$, is recursively defined by:
+
+$a↑↑1 = a$,
+
+$a↑↑(k+1) = a^{(a↑↑k)}$.
+
+Thus we have e.g. $3↑↑2 = 3^3 = 27$, hence $3↑↑3 = 3^{27} = 7625597484987$ and $3↑↑4$ is roughly ${10}^{3.6383346400240996 \times {10}^{12}}$. Find the last 8 digits of $1777↑↑1855$.
+
+### --tests--
+
+`hyperexponentation()` should return `95962097`.
+
+```js
+assert.strictEqual(hyperexponentation(), 95962097);
+```
+
+## 88
+
+### --description--
+
+Consider the following configuration of 64 triangles:
+
+
+
+We wish to colour the interior of each triangle with one of three colours: red, green or blue, so that no two neighbouring triangles have the same colour. Such a colouring shall be called valid. Here, two triangles are said to be neighbouring if they share an edge. Note: if they only share a vertex, then they are not neighbours.
+
+For example, here is a valid colouring of the above grid:
+
+
+
+A colouring C' which is obtained from a colouring C by rotation or reflection is considered distinct from C unless the two are identical.
+
+How many distinct valid colourings are there for the above configuration?
+
+### --tests--
+
+`triangularGridColoring()` should return `10834893628237824`.
+
+```js
+assert.strictEqual(triangularGridColoring(), 10834893628237824);
+```
+
+## 89
+
+### --description--
+
+Let $S_m = (x_1, x_2, \ldots, x_m)$ be the $m$-tuple of positive real numbers with $x_1 + x_2 + \cdots + x_m = m$ for which $P_m = x_1 \times {x_2}^2 \times \cdots \times {x_m}^m$ is maximised.
+
+For example, it can be verified that $[P_{10}] = 4112$ ([ ] is the integer part function).
+
+Find $\sum {[P_m]}$ for $2 ≤ m ≤ 15$.
+
+### --tests--
+
+`maximisingWeightedProduct()` should return `371048281`.
+
+```js
+assert.strictEqual(maximisingWeightedProduct(), 371048281);
+```
+
+## 90
+
+### --description--
+
+A particular school offers cash rewards to children with good attendance and punctuality. If they are absent for three consecutive days or late on more than one occasion then they forfeit their prize.
+
+During an n-day period a trinary string is formed for each child consisting of L's (late), O's (on time), and A's (absent).
+
+Although there are eighty-one trinary strings for a 4-day period that can be formed, exactly forty-three strings would lead to a prize:
+
+```markup
+OOOO OOOA OOOL OOAO OOAA OOAL OOLO OOLA OAOO OAOA
+OAOL OAAO OAAL OALO OALA OLOO OLOA OLAO OLAA AOOO
+AOOA AOOL AOAO AOAA AOAL AOLO AOLA AAOO AAOA AAOL
+AALO AALA ALOO ALOA ALAO ALAA LOOO LOOA LOAO LOAA
+LAOO LAOA LAAO
+```
+
+How many "prize" strings exist over a 30-day period?
+
+### --tests--
+
+`prizeStrings()` should return `1918080160`.
+
+```js
+assert.strictEqual(prizeStrings(), 1918080160);
+```
+
+## 91
+
+### --description--
+
+Let $x$ be a real number.
+
+A best approximation to $x$ for the denominator bound $d$ is a rational number $\frac{r}{s}$ in reduced form, with $s ≤ d$, such that any rational number which is closer to $x$ than $\frac{r}{s}$ has a denominator larger than $d$:
+
+$$|\frac{p}{q} - x| < |\frac{r}{s} - x| ⇒ q > d$$
+
+For example, the best approximation to $\sqrt{13}$ for the denominator bound $20$ is $\frac{18}{5}$ and the best approximation to $\sqrt{13}$ for the denominator bound $30$ is $\frac{101}{28}$.
+
+Find the sum of all denominators of the best approximations to $\sqrt{n}$ for the denominator bound ${10}^{12}$, where $n$ is not a perfect square and $1 < n ≤ 100000$.
+
+### --tests--
+
+`bestApproximations()` should return `57060635927998344`.
+
+```js
+assert.strictEqual(bestApproximations(), 57060635927998344);
+```
+
+## 92
+
+### --description--
+
+A positive integer $n$ is called squarefree, if no square of a prime divides $n$, thus 1, 2, 3, 5, 6, 7, 10, 11 are squarefree, but not 4, 8, 9, 12.
+
+How many squarefree numbers are there below $2^{50}$?
+
+### --tests--
+
+`squarefreeNumbers()` should return `684465067343069`.
+
+```js
+assert.strictEqual(squarefreeNumbers(), 684465067343069);
+```
+
+## 93
+
+### --description--
+
+Consider graphs built with the units A:
+
+ and B: , where the units are glued along the vertical edges as in the graph .
+
+A configuration of type $(a,b,c)$ is a graph thus built of $a$ units A and $b$ units B, where the graph's vertices are coloured using up to $c$ colours, so that no two adjacent vertices have the same colour. The compound graph above is an example of a configuration of type $(2,2,6)$, in fact of type $(2,2,c)$ for all $c ≥ 4$
+
+Let $N(a,b,c)$ be the number of configurations of type $(a,b,c)$. For example, $N(1,0,3) = 24$, $N(0,2,4) = 92928$ and $N(2,2,3) = 20736$.
+
+Find the last 8 digits of $N(25,75,1984)$.
+
+### --tests--
+
+`coloredConfigurations()` should return `61190912`.
+
+```js
+assert.strictEqual(coloredConfigurations(), 61190912);
+```
+
+## 94
+
+### --description--
+
+Let's call an integer sided triangle with exactly one angle of 60° a 60° triangle.
+
+Let $r$ be the radius of the inscribed circle of such a 60° triangle.
+
+There are 1234 60° triangles for which $r ≤ 100$.
+
+Let $T(n)$ be the number of 60° triangles for which $r ≤ n$, so $T(100) = 1234$, $T(1000) = 22767$, and $T(10000) = 359912$.
+
+Find $T(1053779)$.
+
+### --tests--
+
+`inscribedCirclesOfTriangles()` should return `75085391`.
+
+```js
+assert.strictEqual(inscribedCirclesOfTriangles(), 75085391);
+```
+
+## 95
+
+### --description--
+
+Build a triangle from all positive integers in the following way:
+
+$$\begin{array}{rrr}
+ & 1 \\\\
+ & \color{red}{2} & \color{red}{3} \\\\
+ & 4 & \color{red}{5} & 6 \\\\
+ & \color{red}{7} & 8 & 9 & 10 \\\\
+ & \color{red}{11} & 12 & \color{red}{13} & 14 & 15 \\\\
+ & 16 & \color{red}{17} & 18 & \color{red}{19} & 20 & 21 \\\\
+ & 22 & \color{red}{23} & 24 & 25 & 26 & 27 & 28 \\\\
+ & \color{red}{29} & 30 & \color{red}{31} & 32 & 33 & 34 & 35 & 36 \\\\
+ & \color{red}{37} & 38 & 39 & 40 & \color{red}{41} & 42 & \color{red}{43} & 44 & 45 \\\\
+ & 46 & \color{red}{47} & 48 & 49 & 50 & 51 & 52 & \color{red}{53} & 54 & 55 \\\\
+ & 56 & 57 & 58 & \color{red}{59} & 60 & \color{red}{61} & 62 & 63 & 64 & 65 & 66 \\\\
+ & \cdots
+\end{array}$$
+
+Each positive integer has up to eight neighbours in the triangle.
+
+A set of three primes is called a prime triplet if one of the three primes has the other two as neighbours in the triangle.
+
+For example, in the second row, the prime numbers 2 and 3 are elements of some prime triplet.
+
+If row 8 is considered, it contains two primes which are elements of some prime triplet, i.e. 29 and 31. If row 9 is considered, it contains only one prime which is an element of some prime triplet: 37.
+
+Define $S(n)$ as the sum of the primes in row $n$ which are elements of any prime triplet. Then $S(8) = 60$ and $S(9) = 37$.
+
+You are given that $S(10000) = 950007619$.
+
+Find $S(5678027) + S(7208785)$.
+
+### --tests--
+
+`primeTriplets()` should return `322303240771079940`.
+
+```js
+assert.strictEqual(primeTriplets(), 322303240771079940);
+```
+
+## 96
+
+### --description--
+
+Given is the function $f(x) = ⌊{2}^{30.403243784 - x^2}⌋ × {10}^{-9}$ ( ⌊ ⌋ is the floor-function), the sequence $u_n$ is defined by $u_0 = -1$ and $u_{n + 1} = f(u_n)$.
+
+Find $u_n + u_{n + 1}$ for $n = {10}^{12}$. Give your answer with 9 digits after the decimal point.
+
+### --tests--
+
+`recursivelyDefinedSequence()` should return `1.710637717`.
+
+```js
+assert.strictEqual(recursivelyDefinedSequence(), 1.710637717);
+```
+
+## 97
+
+### --description--
+
+A best approximation to a real number $x$ for the denominator bound $d$ is a rational number $\frac{r}{s}$ (in reduced form) with $s ≤ d$, so that any rational number $\frac{p}{q}$ which is closer to $x$ than $\frac{r}{s}$ has $q > d$.
+
+Usually the best approximation to a real number is uniquely determined for all denominator bounds. However, there are some exceptions, e.g. $\frac{9}{40}$ has the two best approximations $\frac{1}{4}$ and $\frac{1}{5}$ for the denominator bound $6$. We shall call a real number $x$ ambiguous, if there is at least one denominator bound for which $x$ possesses two best approximations. Clearly, an ambiguous number is necessarily rational.
+
+How many ambiguous numbers $x = \frac{p}{q}$, $0 < x < \frac{1}{100}$, are there whose denominator $q$ does not exceed ${10}^8$?
+
+### --tests--
+
+`ambiguousNumbers()` should return `52374425`.
+
+```js
+assert.strictEqual(ambiguousNumbers(), 52374425);
+```
+
+## 98
+
+### --description--
+
+Three circles of equal radius are placed inside a larger circle such that each pair of circles is tangent to one another and the inner circles do not overlap. There are four uncovered "gaps" which are to be filled iteratively with more tangent circles.
+
+
+
+At each iteration, a maximally sized circle is placed in each gap, which creates more gaps for the next iteration. After 3 iterations (pictured), there are 108 gaps and the fraction of the area which is not covered by circles is 0.06790342, rounded to eight decimal places.
+
+What fraction of the area is not covered by circles after `n` iterations? Give your answer rounded to eight decimal places using the format x.xxxxxxxx .
+
+### --tests--
+
+`iterativeCirclePacking(10)` should return a number.
+
+```js
+assert(typeof iterativeCirclePacking(10) === 'number');
+```
+
+`iterativeCirclePacking(10)` should return `0.00396087`.
+
+```js
+assert.strictEqual(iterativeCirclePacking(10), 0.00396087);
+```
+
+`iterativeCirclePacking(3)` should return `0.06790342`.
+
+```js
+assert.strictEqual(iterativeCirclePacking(3), 0.06790342);
+```
+
+## 99
+
+### --description--
+
+We shall define a sqube to be a number of the form, ${p^2}{q^3}$, where $p$ and $q$ are distinct primes.
+
+For example, $200 = {5^2}{2^3}$ or $120072949 = {{23}^2}{{61}^3}$.
+
+The first five squbes are 72, 108, 200, 392, and 500.
+
+Interestingly, 200 is also the first number for which you cannot change any single digit to make a prime; we shall call such numbers, prime-proof. The next prime-proof sqube which contains the contiguous sub-string `200` is 1992008.
+
+Find the 200th prime-proof sqube containing the contiguous sub-string `200`.
+
+### --tests--
+
+`primeProofSqubeWithSubString()` should return `229161792008`.
+
+```js
+assert.strictEqual(primeProofSqubeWithSubString(), 229161792008);
+```
+
+## --fcc-end--
+
\ No newline at end of file
diff --git a/curriculum/locales/english/project-euler-problems-201-to-300.md b/curriculum/locales/english/project-euler-problems-201-to-300.md
new file mode 100644
index 0000000..92fe35a
--- /dev/null
+++ b/curriculum/locales/english/project-euler-problems-201-to-300.md
@@ -0,0 +1,2594 @@
+# Project Euler in Rust: 201 to 300
+
+Complete the freeCodeCamp Project Euler problems in the Rust programming language using WebAssembly.
+
+## 0
+
+### --description--
+
+For any set $A$ of numbers, let $sum(A)$ be the sum of the elements of $A$.
+
+Consider the set $B = \\{1,3,6,8,10,11\\}$. There are 20 subsets of $B$ containing three elements, and their sums are:
+
+$$\begin{align}
+ & sum(\\{1,3,6\\}) = 10 \\\\
+ & sum(\\{1,3,8\\}) = 12 \\\\
+ & sum(\\{1,3,10\\}) = 14 \\\\
+ & sum(\\{1,3,11\\}) = 15 \\\\
+ & sum(\\{1,6,8\\}) = 15 \\\\
+ & sum(\\{1,6,10\\}) = 17 \\\\
+ & sum(\\{1,6,11\\}) = 18 \\\\
+ & sum(\\{1,8,10\\}) = 19 \\\\
+ & sum(\\{1,8,11\\}) = 20 \\\\
+ & sum(\\{1,10,11\\}) = 22 \\\\
+ & sum(\\{3,6,8\\}) = 17 \\\\
+ & sum(\\{3,6,10\\}) = 19 \\\\
+ & sum(\\{3,6,11\\}) = 20 \\\\
+ & sum(\\{3,8,10\\}) = 21 \\\\
+ & sum(\\{3,8,11\\}) = 22 \\\\
+ & sum(\\{3,10,11\\}) = 24 \\\\
+ & sum(\\{6,8,10\\}) = 24 \\\\
+ & sum(\\{6,8,11\\}) = 25 \\\\
+ & sum(\\{6,10,11\\}) = 27 \\\\
+ & sum(\\{8,10,11\\}) = 29
+\\end{align}$$
+
+Some of these sums occur more than once, others are unique. For a set $A$, let $U(A,k)$ be the set of unique sums of $k$-element subsets of $A$, in our example we find $U(B,3) = \\{10,12,14,18,21,25,27,29\\}$ and $sum(U(B,3)) = 156$.
+
+Now consider the $100$-element set $S = \\{1^2, 2^2, \ldots , {100}^2\\}$. $S$ has $100\\,891\\,344\\,545\\,564\\,193\\,334\\,812\\,497\\,256\\;$ $50$-element subsets.
+
+Determine the sum of all integers which are the sum of exactly one of the $50$-element subsets of $S$, i.e. find $sum(U(S,50))$.
+
+### --tests--
+
+`uniqueSubsetsSum()` should return `115039000`.
+
+```js
+assert.strictEqual(uniqueSubsetsSum(), 115039000);
+```
+
+## 1
+
+### --description--
+
+Three mirrors are arranged in the shape of an equilateral triangle, with their reflective surfaces pointing inwards. There is an infinitesimal gap at each vertex of the triangle through which a laser beam may pass.
+
+Label the vertices $A$, $B$ and $C$. There are 2 ways in which a laser beam may enter vertex $C$, bounce off 11 surfaces, then exit through the same vertex: one way is shown below; the other is the reverse of that.
+
+
+
+There are 80840 ways in which a laser beam may enter vertex $C$, bounce off 1000001 surfaces, then exit through the same vertex.
+
+In how many ways can a laser beam enter at vertex $C$, bounce off 12017639147 surfaces, then exit through the same vertex?
+
+### --tests--
+
+`laserbeam()` should return `1209002624`.
+
+```js
+assert.strictEqual(laserbeam(), 1209002624);
+```
+
+## 2
+
+### --description--
+
+The binomial coefficients $\displaystyle\binom{n}{k}$ can be arranged in triangular form, Pascal's triangle, like this:
+
+$$\begin{array}{ccccccccccccccc}
+ & & & & & & & 1 & & & & & & & \\\\
+ & & & & & & 1 & & 1 & & & & & & \\\\
+ & & & & & 1 & & 2 & & 1 & & & & & \\\\
+ & & & & 1 & & 3 & & 3 & & 1 & & & & \\\\
+ & & & 1 & & 4 & & 6 & & 4 & & 1 & & & \\\\
+ & & 1 & & 5 & & 10 & & 10 & & 5 & & 1 & & \\\\
+ & 1 & & 6 & & 15 & & 20 & & 15 & & 6 & & 1 & \\\\
+ 1 & & 7 & & 21 & & 35 & & 35 & & 21 & & 7 & & 1 \\\\
+ & & & & & & & \ldots
+\end{array}$$
+
+It can be seen that the first eight rows of Pascal's triangle contain twelve distinct numbers: 1, 2, 3, 4, 5, 6, 7, 10, 15, 20, 21 and 35.
+
+A positive integer n is called squarefree if no square of a prime divides n. Of the twelve distinct numbers in the first eight rows of Pascal's triangle, all except 4 and 20 are squarefree. The sum of the distinct squarefree numbers in the first eight rows is 105.
+
+Find the sum of the distinct squarefree numbers in the first 51 rows of Pascal's triangle.
+
+### --tests--
+
+`squarefreeBinomialCoefficients()` should return `34029210557338`.
+
+```js
+assert.strictEqual(squarefreeBinomialCoefficients(), 34029210557338);
+```
+
+## 3
+
+### --description--
+
+A Hamming number is a positive number which has no prime factor larger than 5.
+
+So the first few Hamming numbers are 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15.
+
+There are 1105 Hamming numbers not exceeding ${10}^8$.
+
+We will call a positive number a generalised Hamming number of type $n$, if it has no prime factor larger than $n$. Hence the Hamming numbers are the generalised Hamming numbers of type 5.
+
+How many generalised Hamming numbers of type 100 are there which don't exceed ${10}^9$?
+
+### --tests--
+
+`generalisedHammingNumbers()` should return `2944730`.
+
+```js
+assert.strictEqual(generalisedHammingNumbers(), 2944730);
+```
+
+## 4
+
+### --description--
+
+Peter has nine four-sided (pyramidal) dice, each with faces numbered 1, 2, 3, 4.
+
+Colin has six six-sided (cubic) dice, each with faces numbered 1, 2, 3, 4, 5, 6.
+
+Peter and Colin roll their dice and compare totals: the highest total wins. The result is a draw if the totals are equal.
+
+What is the probability that Pyramidal Pete beats Cubic Colin? Give your answer rounded to seven decimal places in the form 0.abcdefg
+
+### --tests--
+
+`diceGame()` should return `0.5731441`.
+
+```js
+assert.strictEqual(diceGame(), 0.5731441);
+```
+
+## 5
+
+### --description--
+
+Find the unique positive integer whose square has the form 1_2_3_4_5_6_7_8_9_0, where each "_" is a single digit.
+
+### --tests--
+
+`concealedSquare()` should return `1389019170`.
+
+```js
+assert.strictEqual(concealedSquare(), 1389019170);
+```
+
+## 6
+
+### --description--
+
+For some positive integers $k$, there exists an integer partition of the form $4^t = 2^t + k$,
+
+where $4^t$, $2^t$, and $k$ are all positive integers and $t$ is a real number.
+
+The first two such partitions are $4^1 = 2^1 + 2$ and $4^{1.584\\,962\\,5\ldots} = 2^{1.584\\,962\\,5\ldots} + 6$.
+
+Partitions where $t$ is also an integer are called perfect. For any $m ≥ 1$ let $P(m)$ be the proportion of such partitions that are perfect with $k ≤ m$.
+
+Thus $P(6) = \frac{1}{2}$.
+
+In the following table are listed some values of $P(m)$
+
+$$\begin{align}
+ & P(5) = \frac{1}{1} \\\\
+ & P(10) = \frac{1}{2} \\\\
+ & P(15) = \frac{2}{3} \\\\
+ & P(20) = \frac{1}{2} \\\\
+ & P(25) = \frac{1}{2} \\\\
+ & P(30) = \frac{2}{5} \\\\
+ & \ldots \\\\
+ & P(180) = \frac{1}{4} \\\\
+ & P(185) = \frac{3}{13}
+\end{align}$$
+
+Find the smallest $m$ for which $P(m) < \frac{1}{12\\,345}$
+
+### --tests--
+
+`integerPartitionEquations()` should return `44043947822`.
+
+```js
+assert.strictEqual(integerPartitionEquations(), 44043947822);
+```
+
+## 7
+
+### --description--
+
+A robot moves in a series of one-fifth circular arcs (72°), with a free choice of a clockwise or an anticlockwise arc for each step, but no turning on the spot.
+
+One of 70932 possible closed paths of 25 arcs starting northward is
+
+
+
+Given that the robot starts facing North, how many journeys of 70 arcs in length can it take that return it, after the final arc, to its starting position?
+
+**Note:** Any arc may be traversed multiple times.
+
+### --tests--
+
+`robotWalks()` should return `331951449665644800`.
+
+```js
+assert.strictEqual(robotWalks(), 331951449665644800);
+```
+
+## 8
+
+### --description--
+
+A $k$-input binary truth table is a map from $k$ input bits (binary digits, 0 [false] or 1 [true]) to 1 output bit. For example, the $2$-input binary truth tables for the logical $AND$ and $XOR$ functions are:
+
+| x | y | x AND y |
+|---|---|---------|
+| 0 | 0 | 0 |
+| 0 | 1 | 0 |
+| 1 | 0 | 0 |
+| 1 | 1 | 1 |
+
+| x | y | x XOR y |
+|---|---|---------|
+| 0 | 0 | 0 |
+| 0 | 1 | 1 |
+| 1 | 0 | 1 |
+| 1 | 1 | 0 |
+
+How many $6$-input binary truth tables, $τ$, satisfy the formula
+
+$$τ(a, b, c, d, e, f) \\; AND \\; τ(b, c, d, e, f, a \\; XOR \\; (b \\; AND \\; c)) = 0$$
+
+for all $6$-bit inputs ($a$, $b$, $c$, $d$, $e$, $f$)?
+
+### --tests--
+
+`circularLogic()` should return `15964587728784`.
+
+```js
+assert.strictEqual(circularLogic(), 15964587728784);
+```
+
+## 9
+
+### --description--
+
+Consider the set $S(r)$ of points ($x$,$y$) with integer coordinates satisfying $|x| + |y| ≤ r$.
+
+Let $O$ be the point (0,0) and $C$ the point ($\frac{r}{4}$,$\frac{r}{4}$).
+
+Let $N(r)$ be the number of points $B$ in $S(r)$, so that the triangle $OBC$ has an obtuse angle, i.e. the largest angle $α$ satisfies $90°<α<180°$.
+
+So, for example, $N(4)=24$ and $N(8)=100$.
+
+What is $N(1\\,000\\,000\\,000)$?
+
+### --tests--
+
+`obtuseAngledTriangles()` should return `1598174770174689500`.
+
+```js
+assert.strictEqual(obtuseAngledTriangles(), 1598174770174689500);
+```
+
+## 10
+
+### --description--
+
+For a positive integer $n$, let $σ_2(n)$ be the sum of the squares of its divisors. For example,
+
+$$σ_2(10) = 1 + 4 + 25 + 100 = 130$$
+
+Find the sum of all $n$, $0 < n < 64\\,000\\,000$ such that $σ_2(n)$ is a perfect square.
+
+### --tests--
+
+`divisorSquareSum()` should return `1922364685`.
+
+```js
+assert.strictEqual(divisorSquareSum(), 1922364685);
+```
+
+## 11
+
+### --description--
+
+An axis-aligned cuboid, specified by parameters $\{ (x_0,y_0,z_0), (dx,dy,dz) \}$, consists of all points ($X$,$Y$,$Z$) such that $x_0 ≤ X ≤ x_0 + dx$, $y_0 ≤ Y ≤ y_0 + dy$ and $z_0 ≤ Z ≤ z_0 + dz$. The volume of the cuboid is the product, $dx × dy × dz$. The combined volume of a collection of cuboids is the volume of their union and will be less than the sum of the individual volumes if any cuboids overlap.
+
+Let $C_1, \ldots, C_{50000}$ be a collection of 50000 axis-aligned cuboids such that $C_n$ has parameters
+
+$$\begin{align}
+ & x_0 = S_{6n - 5} \\; \text{modulo} \\; 10000 \\\\
+ & y_0 = S_{6n - 4} \\; \text{modulo} \\; 10000 \\\\
+ & z_0 = S_{6n - 3} \\; \text{modulo} \\; 10000 \\\\
+ & dx = 1 + (S_{6n - 2} \\; \text{modulo} \\; 399) \\\\
+ & dy = 1 + (S_{6n - 1} \\; \text{modulo} \\; 399) \\\\
+ & dz = 1 + (S_{6n} \\; \text{modulo} \\; 399) \\\\
+\end{align}$$
+
+where $S_1, \ldots, S_{300000}$ come from the "Lagged Fibonacci Generator":
+
+For $1 ≤ k ≤ 55$, $S_k = [100003 - 200003k + 300007k^3] \\; (modulo \\; 1000000)$
+
+For $56 ≤ k$, $S_k = [S_{k - 24} + S_{k - 55}] \\; (modulo \\; 1000000)$
+
+Thus, $C_1$ has parameters $\{(7,53,183), (94,369,56)\}$, $C_2$ has parameters $\{(2383,3563,5079), (42,212,344)\}$, and so on.
+
+The combined volume of the first 100 cuboids, $C_1, \ldots, C_{100}$, is 723581599.
+
+What is the combined volume of all 50000 cuboids, $C_1, \ldots, C_{50000}$?
+
+### --tests--
+
+`combinedValueOfCuboids()` should return `328968937309`.
+
+```js
+assert.strictEqual(combinedValueOfCuboids(), 328968937309);
+```
+
+## 12
+
+### --description--
+
+A 30×30 grid of squares contains 900 fleas, initially one flea per square.
+
+When a bell is rung, each flea jumps to an adjacent square at random (usually 4 possibilities, except for fleas on the edge of the grid or at the corners).
+
+What is the expected number of unoccupied squares after 50 rings of the bell? Give your answer rounded to six decimal places.
+
+### --tests--
+
+`fleaCircus()` should return `330.721154`.
+
+```js
+assert.strictEqual(fleaCircus(), 330.721154);
+```
+
+## 13
+
+### --description--
+
+Let $φ$ be Euler's totient function, i.e. for a natural number $n$, $φ(n)$ is the number of $k$, $1 ≤ k ≤ n$, for which $gcd(k,n) = 1$.
+
+By iterating $φ$, each positive integer generates a decreasing chain of numbers ending in 1. E.g. if we start with 5 the sequence 5,4,2,1 is generated. Here is a listing of all chains with length 4:
+
+$$\begin{align}
+ 5,4,2,1 & \\\\
+ 7,6,2,1 & \\\\
+ 8,4,2,1 & \\\\
+ 9,6,2,1 & \\\\
+ 10,4,2,1 & \\\\
+ 12,4,2,1 & \\\\
+ 14,6,2,1 & \\\\
+ 18,6,2,1 &
+\end{align}$$
+
+Only two of these chains start with a prime, their sum is 12.
+
+What is the sum of all primes less than $40\\,000\\,000$ which generate a chain of length 25?
+
+### --tests--
+
+`totientChains()` should return `1677366278943`.
+
+```js
+assert.strictEqual(totientChains(), 1677366278943);
+```
+
+## 14
+
+### --description--
+
+Consider the problem of building a wall out of 2×1 and 3×1 bricks (horizontal×vertical dimensions) such that, for extra strength, the gaps between horizontally-adjacent bricks never line up in consecutive layers, i.e. never form a "running crack".
+
+For example, the following 9×3 wall is not acceptable due to the running crack shown in red:
+
+
+
+There are eight ways of forming a crack-free 9×3 wall, written $W(9,3) = 8$.
+
+Calculate $W(32,10)$.
+
+### --tests--
+
+`crackFreeWalls()` should return `806844323190414`.
+
+```js
+assert.strictEqual(crackFreeWalls(), 806844323190414);
+```
+
+## 15
+
+### --description--
+
+Consider numbers $t(n)$ of the form $t(n) = 2n^2 - 1$ with $n > 1$.
+
+The first such numbers are 7, 17, 31, 49, 71, 97, 127 and 161.
+
+It turns out that only $49 = 7 \times 7$ and $161 = 7 \times 23$ are not prime.
+
+For $n ≤ 10000$ there are 2202 numbers $t(n)$ that are prime.
+
+How many numbers $t(n)$ are prime for $n ≤ 50\\,000\\,000$?
+
+### --tests--
+
+`primalityOfNumbers()` should return `5437849`.
+
+```js
+assert.strictEqual(primalityOfNumbers(), 5437849);
+```
+
+## 16
+
+### --description--
+
+A positive integer with $k$ (decimal) digits is called balanced if its first $⌈\frac{k}{2}⌉$ digits sum to the same value as its last $⌈\frac{k}{2}⌉$ digits, where $⌈x⌉$, pronounced ceiling of $x$, is the smallest integer $≥ x$, thus $⌈π⌉ = 4$ and $⌈5⌉ = 5$.
+
+So, for example, all palindromes are balanced, as is 13722.
+
+Let $T(n)$ be the sum of all balanced numbers less than $10^n$.
+
+Thus: $T(1) = 45$, $T(2) = 540$ and $T(5) = 334\\,795\\,890$.
+
+Find $T(47)\\,mod\\,3^{15}$
+
+### --tests--
+
+`balancedNumbers()` should return `6273134`.
+
+```js
+assert.strictEqual(balancedNumbers(), 6273134);
+```
+
+## 17
+
+### --description--
+
+Consider the right-angled triangle with sides $a=7$, $b=24$ and $c=25$.
+
+The area of this triangle is 84, which is divisible by the perfect numbers 6 and 28.
+
+Moreover it is a primitive right-angled triangle as $gcd(a,b) = 1$ and $gcd(b,c) = 1$.
+
+Also $c$ is a perfect square.
+
+We will call a right-angled triangle perfect if:
+
+- it is a primitive right-angled triangle
+- its hypotenuse is a perfect square
+
+We will call a right-angled triangle super-perfect if:
+
+- it is a perfect right-angled triangle
+- its area is a multiple of the perfect numbers 6 and 28.
+
+How many perfect right-angled triangles with $c ≤ {10}^{16}$ exist that are not super-perfect?
+
+### --tests--
+
+`perfectRightAngledTriangles()` should return `0`.
+
+```js
+assert.strictEqual(perfectRightAngledTriangles(), 0);
+```
+
+## 18
+
+### --description--
+
+Let $A$ and $B$ be bit strings (sequences of 0's and 1's).
+
+If $A$ is equal to the leftmost length($A$) bits of $B$, then $A$ is said to be a prefix of $B$.
+
+For example, 00110 is a prefix of 001101001, but not of 00111 or 100110.
+
+A prefix-free code of size $n$ is a collection of $n$ distinct bit strings such that no string is a prefix of any other. For example, this is a prefix-free code of size 6:
+
+$$0000, 0001, 001, 01, 10, 11$$
+
+Now suppose that it costs one penny to transmit a '0' bit, but four pence to transmit a '1'. Then the total cost of the prefix-free code shown above is 35 pence, which happens to be the cheapest possible for the skewed pricing scheme in question. In short, we write $Cost(6) = 35$.
+
+What is $Cost(10^9)$?
+
+### --tests--
+
+`skewCostCoding()` should return `64564225042`.
+
+```js
+assert.strictEqual(skewCostCoding(), 64564225042);
+```
+
+## 19
+
+### --description--
+
+Let $D_0$ be the two-letter string "Fa". For $n ≥ 1$, derive $D_n$ from $D_{n - 1}$ by the string-rewriting rules:
+
+- "a" → "aRbFR"
+- "b" → "LFaLb"
+
+Thus, $D_0$ = "Fa", $D_1$ = "FaRbFR", $D_2$ = "FaRbFRRLFaLbFR", and so on.
+
+These strings can be interpreted as instructions to a computer graphics program, with "F" meaning "draw forward one unit", "L" meaning "turn left 90 degrees", "R" meaning "turn right 90 degrees", and "a" and "b" being ignored. The initial position of the computer cursor is (0,0), pointing up towards (0,1).
+
+Then $D_n$ is an exotic drawing known as the Heighway Dragon of order $n$. For example, $D_{10}$ is shown below; counting each "F" as one step, the highlighted spot at (18,16) is the position reached after 500 steps.
+
+
+
+What is the position of the cursor after ${10}^{12}$ steps in $D_{50}$? Give your answer as a string in the form `x,y` with no spaces.
+
+### --tests--
+
+`heighwayDragon()` should return a string.
+
+```js
+assert(typeof heighwayDragon() === 'string');
+```
+
+`heighwayDragon()` should return the string `139776,963904`.
+
+```js
+assert.strictEqual(heighwayDragon(), '139776,963904');
+```
+
+## 20
+
+### --description--
+
+We shall call a positive integer $A$ an "Alexandrian integer", if there exist integers $p$, $q$, $r$ such that:
+
+$$A = p \times q \times r$$
+
+and
+
+$$\frac{1}{A} = \frac{1}{p} + \frac{1}{q} + \frac{1}{r}$$
+
+
+For example, 630 is an Alexandrian integer ($p = 5$, $q = −7$, $r = −18$). In fact, 630 is the 6th Alexandrian integer, the first 6 Alexandrian integers being: 6, 42, 120, 156, 420 and 630.
+
+Find the 150000th Alexandrian integer.
+
+### --tests--
+
+`alexandrianIntegers()` should return `1884161251122450`.
+
+```js
+assert.strictEqual(alexandrianIntegers(), 1884161251122450);
+```
+
+## 21
+
+### --description--
+
+What is the length of the shortest pipe, of internal radius 50mm, that can fully contain 21 balls of radii 30mm, 31mm, ..., 50mm?
+
+Give your answer in micrometres (${10}^{-6}$ m) rounded to the nearest integer.
+
+### --tests--
+
+`spherePacking()` should return `1590933`.
+
+```js
+assert.strictEqual(spherePacking(), 1590933);
+```
+
+## 22
+
+### --description--
+
+Let us call an integer sided triangle with sides $a ≤ b ≤ c$ barely acute if the sides satisfy $a^2 + b^2 = c^2 + 1$.
+
+How many barely acute triangles are there with perimeter $≤ 25\\,000\\,000$?
+
+### --tests--
+
+`almostRightAngledTrianglesOne()` should return `61614848`.
+
+```js
+assert.strictEqual(almostRightAngledTrianglesOne(), 61614848);
+```
+
+## 23
+
+### --description--
+
+Let us call an integer sided triangle with sides $a ≤ b ≤ c$ barely obtuse if the sides satisfy $a^2 + b^2 = c^2 - 1$.
+
+How many barely obtuse triangles are there with perimeter $≤ 75\\,000\\,000$?
+
+### --tests--
+
+`almostRightAngledTrianglesTwo()` should return `4137330`.
+
+```js
+assert.strictEqual(almostRightAngledTrianglesTwo(), 4137330);
+```
+
+## 24
+
+### --description--
+
+The sequence 1, 1, 1, 3, 5, 9, 17, 31, 57, 105, 193, 355, 653, 1201 ...
+
+is defined by $T_1 = T_2 = T_3 = 1$ and $T_n = T_{n - 1} + T_{n - 2} + T_{n - 3}$.
+
+It can be shown that 27 does not divide any terms of this sequence. In fact, 27 is the first odd number with this property.
+
+Find the ${124}^{\text{th}}$ odd number that does not divide any terms of the above sequence.
+
+### --tests--
+
+`tribonacciNonDivisors()` should return `2009`.
+
+```js
+assert.strictEqual(tribonacciNonDivisors(), 2009);
+```
+
+## 25
+
+### --description--
+
+The blancmange curve is the set of points ($x$,$y$) such that $0 ≤ x ≤ 1$ and $\displaystyle y = \sum_{n = 0}^{\infty} \frac{s(2^nx)}{2^n}$, where $s(x)$ is the distance from $x$ to the nearest integer.
+
+The area under the blancmange curve is equal to $\frac{1}{2}$, shown in pink in the diagram below.
+
+
+
+Let $C$ be the circle with centre ($\frac{1}{4}$,$\frac{1}{2}$) and radius $\frac{1}{4}$, shown in black in the diagram.
+
+What area under the blancmange curve is enclosed by $C$? Give your answer rounded to eight decimal places in the form 0.abcdefgh
+
+### --tests--
+
+`scoopOfBlancmange()` should return `0.11316017`.
+
+```js
+assert.strictEqual(scoopOfBlancmange(), 0.11316017);
+```
+
+## 26
+
+### --description--
+
+"The Chase" is a game played with two dice and an even number of players.
+
+The players sit around a table; the game begins with two opposite players having one die each. On each turn, the two players with a die roll it.
+
+If the player rolls a 1, he passes the die to his neighbour on the left.
+
+If the player rolls a 6, he passes the die to his neighbour on the right.
+
+Otherwise, he keeps the die for the next turn.
+
+The game ends when one player has both dice after they have been rolled and passed; that player has then lost.
+
+In a game with 100 players, what is the expected number of turns the game lasts? Give your answer rounded to ten significant digits.
+
+### --tests--
+
+`theChase()` should return `3780.618622`.
+
+```js
+assert.strictEqual(theChase(), 3780.618622);
+```
+
+## 27
+
+### --description--
+
+Let $S_n$ be the regular $n$-sided polygon – or shape – whose vertices $v_k (k = 1, 2, \ldots, n)$ have coordinates:
+
+$$\begin{align}
+ & x_k = cos(\frac{2k - 1}{n} × 180°) \\\\
+ & y_k = sin(\frac{2k - 1}{n} × 180°)
+\end{align}$$
+
+Each $S_n$ is to be interpreted as a filled shape consisting of all points on the perimeter and in the interior.
+
+The Minkowski sum, $S + T$, of two shapes $S$ and $T$ is the result of adding every point in $S$ to every point in $T$, where point addition is performed coordinate-wise: $(u, v) + (x, y) = (u + x, v + y)$.
+
+For example, the sum of $S_3$ and $S_4$ is the six-sided shape shown in pink below:
+
+
+
+How many sides does $S_{1864} + S_{1865} + \ldots + S_{1909}$ have?
+
+### --tests--
+
+`minkowskiSums()` should return `86226`.
+
+```js
+assert.strictEqual(minkowskiSums(), 86226);
+```
+
+## 28
+
+### --description--
+
+Consider the number 3600. It is very special, because
+
+$$\begin{align}
+ & 3600 = {48}^2 + {36}^2 \\\\
+ & 3600 = {20}^2 + {2×40}^2 \\\\
+ & 3600 = {30}^2 + {3×30}^2 \\\\
+ & 3600 = {45}^2 + {7×15}^2 \\\\
+\end{align}$$
+
+Similarly, we find that $88201 = {99}^2 + {280}^2 = {287}^2 + 2 × {54}^2 = {283}^2 + 3 × {52}^2 = {197}^2 + 7 × {84}^2$.
+
+In 1747, Euler proved which numbers are representable as a sum of two squares. We are interested in the numbers $n$ which admit representations of all of the following four types:
+
+$$\begin{align}
+ & n = {a_1}^2 + {b_1}^2 \\\\
+ & n = {a_2}^2 + 2{b_2}^2 \\\\
+ & n = {a_3}^2 + 3{b_3}^2 \\\\
+ & n = {a_7}^2 + 7{b_7}^2 \\\\
+\end{align}$$
+
+where the $a_k$ and $b_k$ are positive integers.
+
+There are 75373 such numbers that do not exceed ${10}^7$.
+
+How many such numbers are there that do not exceed $2 × {10}^9$?
+
+### --tests--
+
+`representationsUsingSquares()` should return `11325263`.
+
+```js
+assert.strictEqual(representationsUsingSquares(), 11325263);
+```
+
+## 29
+
+### --description--
+
+For any two strings of digits, $A$ and $B$, we define $F_{A,B}$ to be the sequence ($A, B, AB, BAB, ABBAB, \ldots$) in which each term is the concatenation of the previous two.
+
+Further, we define $D_{A,B}(n)$ to be the $n^{\text{th}}$ digit in the first term of $F_{A,B}$ that contains at least $n$ digits.
+
+Example:
+
+Let $A = 1\\,415\\,926\\,535$, $B = 8\\,979\\,323\\,846$. We wish to find $D_{A,B}(35)$, say.
+
+The first few terms of $F_{A,B}$ are:
+
+$$\begin{align}
+ & 1\\,415\\,926\\,535 \\\\
+ & 8\\,979\\,323\\,846 \\\\
+ & 14\\,159\\,265\\,358\\,979\\,323\\,846 \\\\
+ & 897\\,932\\,384\\,614\\,159\\,265\\,358\\,979\\,323\\,846 \\\\
+ & 14\\,159\\,265\\,358\\,979\\,323\\,846\\,897\\,932\\,384\\,614\\,15\color{red}{9}\\,265\\,358\\,979\\,323\\,846
+\end{align}$$
+
+Then $D_{A,B}(35)$ is the ${35}^{\text{th}}$ digit in the fifth term, which is 9.
+
+Now we use for $A$ the first 100 digits of $π$ behind the decimal point:
+
+$$\begin{align}
+ & 14\\,159\\,265\\,358\\,979\\,323\\,846\\,264\\,338\\,327\\,950\\,288\\,419\\,716\\,939\\,937\\,510 \\\\
+ & 58\\,209\\,749\\,445\\,923\\,078\\,164\\,062\\,862\\,089\\,986\\,280\\,348\\,253\\,421\\,170\\,679
+\end{align}$$
+
+and for $B$ the next hundred digits:
+
+$$\begin{align}
+ & 82\\,148\\,086\\,513\\,282\\,306\\,647\\,093\\,844\\,609\\,550\\,582\\,231\\,725\\,359\\,408\\,128 \\\\
+ & 48\\,111\\,745\\,028\\,410\\,270\\,193\\,852\\,110\\,555\\,964\\,462\\,294\\,895\\,493\\,038\\,196
+\end{align}$$
+
+Find $\sum_{n = 0, 1, \ldots, 17} {10}^n × D_{A,B}((127 + 19n) × 7^n)$.
+
+### --tests--
+
+`fibonacciWords()` should return `850481152593119200`.
+
+```js
+assert.strictEqual(fibonacciWords(), 850481152593119200);
+```
+
+## 30
+
+### --description--
+
+The binomial coefficient $\displaystyle\binom{10}{3} = 120$.
+
+$120 = 2^3 × 3 × 5 = 2 × 2 × 2 × 3 × 5$, and $2 + 2 + 2 + 3 + 5 = 14$.
+
+So the sum of the terms in the prime factorisation of $\displaystyle\binom{10}{3}$ is $14$.
+
+Find the sum of the terms in the prime factorisation of $\binom{20\\,000\\,000}{15\\,000\\,000}$.
+
+### --tests--
+
+`primeFactorisation()` should return `7526965179680`.
+
+```js
+assert.strictEqual(primeFactorisation(), 7526965179680);
+```
+
+## 31
+
+### --description--
+
+Two players share an unbiased coin and take it in turns to play "The Race".
+
+On Player 1's turn, he tosses the coin once: if it comes up Heads, he scores one point; if it comes up Tails, he scores nothing.
+
+On Player 2's turn, she chooses a positive integer $T$ and tosses the coin $T$ times: if it comes up all Heads, she scores $2^{T - 1}$ points; otherwise, she scores nothing.
+
+Player 1 goes first. The winner is the first to 100 or more points.
+
+On each turn Player 2 selects the number, $T$, of coin tosses that maximises the probability of her winning.
+
+What is the probability that Player 2 wins?
+
+Give your answer rounded to eight decimal places in the form 0.abcdefgh .
+
+### --tests--
+
+`theRace()` should return `0.83648556`.
+
+```js
+assert.strictEqual(theRace(), 0.83648556);
+```
+
+## 32
+
+### --description--
+
+Let $f(N)$ be the number of points with integer coordinates that are on a circle passing through $(0,0)$, $(N,0)$,$(0,N)$, and $(N,N)$.
+
+It can be shown that $f(10000) = 36$.
+
+What is the sum of all positive integers $N ≤ {10}^{11}$ such that $f(N) = 420$?
+
+### --tests--
+
+`latticePointsOnACircle()` should return `271204031455541300`.
+
+```js
+assert.strictEqual(latticePointsOnACircle(), 271204031455541300);
+```
+
+## 33
+
+### --description--
+
+For an integer $n ≥ 4$, we define the lower prime square root of $n$, denoted by $lps(n)$, as the $\text{largest prime} ≤ \sqrt{n}$ and the upper prime square root of $n$, $ups(n)$, as the $\text{smallest prime} ≥ \sqrt{n}$.
+
+So, for example, $lps(4) = 2 = ups(4)$, $lps(1000) = 31$, $ups(1000) = 37$.
+
+Let us call an integer $n ≥ 4$ semidivisible, if one of $lps(n)$ and $ups(n)$ divides $n$, but not both.
+
+The sum of the semidivisible numbers not exceeding 15 is 30, the numbers are 8, 10 and 12. 15 is not semidivisible because it is a multiple of both $lps(15) = 3$ and $ups(15) = 5$. As a further example, the sum of the 92 semidivisible numbers up to 1000 is 34825.
+
+What is the sum of all semidivisible numbers not exceeding 999966663333?
+
+### --tests--
+
+`semidivisibleNumbers()` should return `1259187438574927000`.
+
+```js
+assert.strictEqual(semidivisibleNumbers(), 1259187438574927000);
+```
+
+## 34
+
+### --description--
+
+Given is the arithmetic-geometric sequence $u(k) = (900 - 3k)r^{k - 1}$.
+
+Let $s(n) = \sum_{k=1 \ldots n} u(k)$.
+
+Find the value of $r$ for which $s(5000) = -600\\,000\\,000\\,000$.
+
+Give your answer rounded to 12 places behind the decimal point.
+
+### --tests--
+
+`arithmeticGeometricSequence()` should return `1.002322108633`.
+
+```js
+assert.strictEqual(arithmeticGeometricSequence(), 1.002322108633);
+```
+
+## 35
+
+### --description--
+
+Suppliers 'A' and 'B' provided the following numbers of products for the luxury hamper market:
+
+| Product | 'A' | 'B' |
+|--------------------|------|------|
+| Beluga Caviar | 5248 | 640 |
+| Christmas Cake | 1312 | 1888 |
+| Gammon Joint | 2624 | 3776 |
+| Vintage Port | 5760 | 3776 |
+| Champagne Truffles | 3936 | 5664 |
+
+Although the suppliers try very hard to ship their goods in perfect condition, there is inevitably some spoilage - i.e. products gone bad.
+
+The suppliers compare their performance using two types of statistic:
+
+- The five per-product spoilage rates for each supplier are equal to the number of products gone bad divided by the number of products supplied, for each of the five products in turn.
+- The overall spoilage rate for each supplier is equal to the total number of products gone bad divided by the total number of products provided by that supplier.
+
+To their surprise, the suppliers found that each of the five per-product spoilage rates was worse (higher) for 'B' than for 'A' by the same factor (ratio of spoilage rates), $m > 1$; and yet, paradoxically, the overall spoilage rate was worse for 'A' than for 'B', also by a factor of $m$.
+
+There are thirty-five $m > 1$ for which this surprising result could have occurred, the smallest of which is $\frac{1476}{1475}$.
+
+What's the largest possible value of $m$? Give your answer as a string with fraction reduced to its lowest terms, in the form `u/v`.
+
+### --tests--
+
+`luxuryHampers()` should return a string.
+
+```js
+assert(typeof luxuryHampers() === 'string');
+```
+
+`luxuryHampers()` should return the string `123/59`.
+
+```js
+assert.strictEqual(luxuryHampers(), '123/59');
+```
+
+## 36
+
+### --description--
+
+Let $T(n)$ be the number of tours over a 4 × $n$ playing board such that:
+
+- The tour starts in the top left corner.
+- The tour consists of moves that are up, down, left, or right one square.
+- The tour visits each square exactly once.
+- The tour ends in the bottom left corner.
+
+The diagram shows one tour over a 4 × 10 board:
+
+
+
+$T(10)$ is 2329. What is $T({10}^{12})$ modulo ${10}^8$?
+
+### --tests--
+
+`toursOnPlayingBoard()` should return `15836928`.
+
+```js
+assert.strictEqual(toursOnPlayingBoard(), 15836928);
+```
+
+## 37
+
+### --description--
+
+Create a sequence of numbers using the "Blum Blum Shub" pseudo-random number generator:
+
+$$
+s_0 = 14025256 \\\\
+s_{n + 1} = {s_n}^2 \\; mod \\; 20\\,300\\,713
+$$
+
+Concatenate these numbers $s_0s_1s_2\ldots$ to create a string $w$ of infinite length. Then, $w = 14025256741014958470038053646\ldots$
+
+For a positive integer $k$, if no substring of $w$ exists with a sum of digits equal to $k$, $p(k)$ is defined to be zero. If at least one substring of $w$ exists with a sum of digits equal to $k$, we define $p(k) = z$, where $z$ is the starting position of the earliest such substring.
+
+For instance:
+
+The substrings 1, 14, 1402, … with respective sums of digits equal to 1, 5, 7, … start at position 1, hence $p(1) = p(5) = p(7) = \ldots = 1$.
+
+The substrings 4, 402, 4025, … with respective sums of digits equal to 4, 6, 11, … start at position 2, hence $p(4) = p(6) = p(11) = \ldots = 2$.
+
+The substrings 02, 0252, … with respective sums of digits equal to 2, 9, … start at position 3, hence $p(2) = p(9) = \ldots = 3$.
+
+Note that substring 025 starting at position 3, has a sum of digits equal to 7, but there was an earlier substring (starting at position 1) with a sum of digits equal to 7, so $p(7) = 1$, not 3.
+
+We can verify that, for $0 < k ≤ {10}^3$, $\sum p(k) = 4742$.
+
+Find $\sum p(k)$, for $0 < k ≤ 2 \times {10}^{15}$.
+
+### --tests--
+
+`infiniteStringTour()` should return `9922545104535660`.
+
+```js
+assert.strictEqual(infiniteStringTour(), 9922545104535660);
+```
+
+## 38
+
+### --description--
+
+A set of disks numbered 1 through 100 are placed in a line in random order.
+
+What is the probability that we have a partial derangement such that exactly 22 prime number discs are found away from their natural positions? (Any number of non-prime disks may also be found in or out of their natural positions.)
+
+Give your answer rounded to 12 places behind the decimal point in the form 0.abcdefghijkl.
+
+### --tests--
+
+`twentyTwoFoolishPrimes()` should return `0.001887854841`.
+
+```js
+assert.strictEqual(twentyTwoFoolishPrimes(), 0.001887854841);
+```
+
+## 39
+
+### --description--
+
+There are 1111 ways in which five 6-sided dice (sides numbered 1 to 6) can be rolled so that the top three sum to 15. Some examples are:
+
+$$\begin{align}
+ & D_1,D_2,D_3,D_4,D_5 = 4,3,6,3,5 \\\\
+ & D_1,D_2,D_3,D_4,D_5 = 4,3,3,5,6 \\\\
+ & D_1,D_2,D_3,D_4,D_5 = 3,3,3,6,6 \\\\
+ & D_1,D_2,D_3,D_4,D_5 = 6,6,3,3,3
+\end{align}$$
+
+In how many ways can twenty 12-sided dice (sides numbered 1 to 12) be rolled so that the top ten sum to 70?
+
+### --tests--
+
+`topDice()` should return `7448717393364182000`.
+
+```js
+assert.strictEqual(topDice(), 7448717393364182000);
+```
+
+## 40
+
+### --description--
+
+For a positive integer $n$, let $σ(n)$ be the sum of all divisors of $n$, so e.g. $σ(6) = 1 + 2 + 3 + 6 = 12$.
+
+A perfect number, as you probably know, is a number with $σ(n) = 2n$.
+
+Let us define the perfection quotient of a positive integer as $p(n) = \frac{σ(n)}{n}$.
+
+Find the sum of all positive integers $n ≤ {10}^{18}$ for which $p(n)$ has the form $k + \frac{1}{2}$, where $k$ is an integer.
+
+### --tests--
+
+`perfectionQuotients()` should return `482316491800641150`.
+
+```js
+assert.strictEqual(perfectionQuotients(), 482316491800641150);
+```
+
+## 41
+
+### --description--
+
+Given the set {1,2,..., $n$}, we define $f(n, k)$ as the number of its $k$-element subsets with an odd sum of elements. For example, $f(5,3) = 4$, since the set {1,2,3,4,5} has four 3-element subsets having an odd sum of elements, i.e.: {1,2,4}, {1,3,5}, {2,3,4} and {2,4,5}.
+
+When all three values $n$, $k$ and $f(n, k)$ are odd, we say that they make an odd-triplet $[n, k, f(n, k)]$.
+
+There are exactly five odd-triplets with $n ≤ 10$, namely: $[1, 1, f(1, 1) = 1]$, $[5, 1, f(5, 1) = 3]$, $[5, 5, f(5, 5) = 1]$, $[9, 1, f(9, 1) = 5]$ and $[9, 9, f(9, 9) = 1]$.
+
+How many odd-triplets are there with $n ≤ {10}^{12}$?
+
+### --tests--
+
+`oddTriplets()` should return `997104142249036700`.
+
+```js
+assert.strictEqual(oddTriplets(), 997104142249036700);
+```
+
+## 42
+
+### --description--
+
+A positive fraction whose numerator is less than its denominator is called a proper fraction.
+
+For any denominator, $d$, there will be $d−1$ proper fractions; for example, with $d = 12$:
+
+$$\frac{1}{12}, \frac{2}{12}, \frac{3}{12}, \frac{4}{12}, \frac{5}{12}, \frac{6}{12}, \frac{7}{12}, \frac{8}{12}, \frac{9}{12}, \frac{10}{12}, \frac{11}{12}$$
+
+We shall call a fraction that cannot be cancelled down a resilient fraction.
+
+Furthermore we shall define the resilience of a denominator, $R(d)$, to be the ratio of its proper fractions that are resilient; for example, $R(12) = \frac{4}{11}$.
+
+In fact, $d = 12$ is the smallest denominator having a resilience $R(d) < \frac{4}{10}$.
+
+Find the smallest denominator $d$, having a resilience $R(d) < \frac{15\\,499}{94\\,744}$.
+
+### --tests--
+
+`resilience()` should return `892371480`.
+
+```js
+assert.strictEqual(resilience(), 892371480);
+```
+
+## 43
+
+### --description--
+
+You probably know the game Fifteen Puzzle. Here, instead of numbered tiles, we have seven red tiles and eight blue tiles.
+
+A move is denoted by the uppercase initial of the direction (Left, Right, Up, Down) in which the tile is slid, e.g. starting from configuration ($S$), by the sequence $LULUR$ we reach the configuration ($E$):
+
+($S$) , ($E$)
+
+For each path, its checksum is calculated by (pseudocode):
+
+$$\begin{align}
+ & \text{checksum} = 0 \\\\
+ & \text{checksum} = (\text{checksum} × 243 + m_1) \\; \text{mod} \\; 100\\,000\\,007 \\\\
+ & \text{checksum} = (\text{checksum} × 243 + m_2) \\; \text{mod} \\; 100\\,000\\,007 \\\\
+ & \ldots \\\\
+ & \text{checksum} = (\text{checksum} × 243 + m_n) \\; \text{mod} \\; 100\\,000\\,007
+\end{align}$$
+
+where $m_k$ is the ASCII value of the $k^{\text{th}}$ letter in the move sequence and the ASCII values for the moves are:
+
+$$\begin{array}{|c|c|}
+ \hline
+ L & 76 \\\\ \hline
+ R & 82 \\\\ \hline
+ U & 85 \\\\ \hline
+ D & 68 \\\\ \hline
+\end{array}$$
+
+For the sequence $LULUR$ given above, the checksum would be 19761398. Now, starting from configuration ($S$), find all shortest ways to reach configuration ($T$).
+
+($S$) , ($T$)
+
+What is the sum of all checksums for the paths having the minimal length?
+
+### --tests--
+
+`sliders()` should return `96356848`.
+
+```js
+assert.strictEqual(sliders(), 96356848);
+```
+
+## 44
+
+### --description--
+
+We shall call a fraction that cannot be cancelled down a resilient fraction.
+
+Furthermore we shall define the resilience of a denominator, $R(d)$, to be the ratio of its proper fractions that are resilient; for example, $R(12) = \frac{4}{11}$.
+
+The resilience of a number $d > 1$ is then $\frac{φ(d)}{d − 1}$ , where $φ$ is Euler's totient function.
+
+We further define the coresilience of a number $n > 1$ as $C(n) = \frac{n − φ(n)}{n − 1}$.
+
+The coresilience of a prime $p$ is $C(p) = \frac{1}{p − 1}$.
+
+Find the sum of all composite integers $1 < n ≤ 2 × {10}^{11}$, for which $C(n)$ is a unit fraction.
+
+### --tests--
+
+`coresilience()` should return `288084712410001`.
+
+```js
+assert.strictEqual(coresilience(), 288084712410001);
+```
+
+## 45
+
+### --description--
+
+A definition for an ellipse is:
+
+Given a circle $c$ with centre $M$ and radius $r$ and a point $G$ such that $d(G, M) < r$, the locus of the points that are equidistant from $c$ and $G$ form an ellipse.
+
+The construction of the points of the ellipse is shown below.
+
+
+
+Given are the points $M(-2000, 1500)$ and $G(8000, 1500)$.
+
+Given is also the circle $c$ with centre $M$ and radius $15\\,000$.
+
+The locus of the points that are equidistant from $G$ and $c$ form an ellipse $e$.
+
+From a point $P$ outside $e$ the two tangents $t_1$ and $t_2$ to the ellipse are drawn.
+
+Let the points where $t_1$ and $t_2$ touch the ellipse be $R$ and $S$.
+
+
+
+For how many lattice points $P$ is angle $RPS$ greater than 45°?
+
+### --tests--
+
+`tangentsToAnEllipse()` should return `810834388`.
+
+```js
+assert.strictEqual(tangentsToAnEllipse(), 810834388);
+```
+
+## 46
+
+### --description--
+
+Consider the region constrained by $1 ≤ x$ and $0 ≤ y ≤ \frac{1}{x}$.
+
+Let $S_1$ be the largest square that can fit under the curve.
+
+Let $S_2$ be the largest square that fits in the remaining area, and so on.
+
+Let the index of $S_n$ be the pair (left, below) indicating the number of squares to the left of $S_n$ and the number of squares below $S_n$.
+
+
+
+The diagram shows some such squares labeled by number.
+
+$S_2$ has one square to its left and none below, so the index of $S_2$ is (1, 0).
+
+It can be seen that the index of $S_{32}$ is (1,1) as is the index of $S_{50}$.
+
+50 is the largest $n$ for which the index of $S_n$ is (1, 1).
+
+What is the largest $n$ for which the index of $S_n$ is (3, 3)?
+
+### --tests--
+
+`squaresUnderAHyperbola()` should return `782252`.
+
+```js
+assert.strictEqual(squaresUnderAHyperbola(), 782252);
+```
+
+## 47
+
+### --description--
+
+The first number $n$ for which $φ(n) = 13!$ is $6\\,227\\,180\\,929$.
+
+Find the ${150\\,000}^{\text{th}}$ such number.
+
+### --tests--
+
+`eulersTotientFunctionEquals()` should return `23507044290`.
+
+```js
+assert.strictEqual(eulersTotientFunctionEquals(), 23507044290);
+```
+
+## 48
+
+### --description--
+
+Let $S = \\{2, 3, 5, \ldots, 4999\\}$ be the set of prime numbers less than 5000.
+
+Find the number of subsets of $S$, the sum of whose elements is a prime number.
+
+Enter the rightmost 16 digits as your answer.
+
+### --tests--
+
+`primeSubsetSums()` should return `9275262564250418`.
+
+```js
+assert.strictEqual(primeSubsetSums(), 9275262564250418);
+```
+
+## 49
+
+### --description--
+
+Find the number of non-empty subsets of $\\{{1}^{1}, {2}^{2}, {3}^{3}, \ldots, {250250}^{250250}\\}$, the sum of whose elements is divisible by 250. Enter the rightmost 16 digits as your answer.
+
+### --tests--
+
+`twoHundredFifty()` should return `1425480602091519`.
+
+```js
+assert.strictEqual(twoHundredFifty(), 1425480602091519);
+```
+
+## 50
+
+### --description--
+
+A triplet of positive integers ($a$,$b$,$c$) is called a Cardano Triplet if it satisfies the condition:
+
+$$\sqrt[3]{a + b \sqrt{c}} + \sqrt[3]{a - b \sqrt{c}} = 1$$
+
+For example, (2,1,5) is a Cardano Triplet.
+
+There exist 149 Cardano Triplets for which $a + b + c ≤ 1000$.
+
+Find how many Cardano Triplets exist such that $a + b + c ≤ 110\\,000\\,000$.
+
+### --tests--
+
+`cardanoTriplets()` should return `18946051`.
+
+```js
+assert.strictEqual(cardanoTriplets(), 18946051);
+```
+
+## 51
+
+### --description--
+
+Given a set of points on a plane, we define a convex hole to be a convex polygon having as vertices any of the given points and not containing any of the given points in its interior (in addition to the vertices, other given points may lie on the perimeter of the polygon).
+
+As an example, the image below shows a set of twenty points and a few such convex holes. The convex hole shown as a red heptagon has an area equal to 1049694.5 square units, which is the highest possible area for a convex hole on the given set of points.
+
+
+
+For our example, we used the first 20 points ($T_{2k − 1}$, $T_{2k}$), for $k = 1, 2, \ldots, 20$, produced with the pseudo-random number generator:
+
+$$\begin{align}
+ S_0 & = 290\\,797 \\\\
+ S_{n+1} & = {S_n}^2 \\; \text{mod} \\; 50\\,515\\,093 \\\\
+ T_n & = (S_n \\; \text{mod} \\; 2000) − 1000
+\end{align}$$
+
+i.e. (527, 144), (−488, 732), (−454, −947), …
+
+What is the maximum area for a convex hole on the set containing the first 500 points in the pseudo-random sequence? Specify your answer including one digit after the decimal point.
+
+### --tests--
+
+`convexHoles()` should return `104924`.
+
+```js
+assert.strictEqual(convexHoles(), 104924);
+```
+
+## 52
+
+### --description--
+
+A small child has a "number caterpillar" consisting of forty jigsaw pieces, each with one number on it, which, when connected together in a line, reveal the numbers 1 to 40 in order.
+
+Every night, the child's father has to pick up the pieces of the caterpillar that have been scattered across the play room. He picks up the pieces at random and places them in the correct order.
+
+As the caterpillar is built up in this way, it forms distinct segments that gradually merge together. The number of segments starts at zero (no pieces placed), generally increases up to about eleven or twelve, then tends to drop again before finishing at a single segment (all pieces placed).
+
+For example:
+
+| Piece Placed | Segments So Far |
+| -------------|-----------------|
+| 12 | 1 |
+| 4 | 2 |
+| 29 | 3 |
+| 6 | 4 |
+| 34 | 5 |
+| 5 | 4 |
+| 35 | 4 |
+| … | … |
+
+Let $M$ be the maximum number of segments encountered during a random tidy-up of the caterpillar. For a caterpillar of ten pieces, the number of possibilities for each $M$ is
+
+| M | Possibilities |
+|---|---------------|
+| 1 | 512 |
+| 2 | 250912 |
+| 3 | 1815264 |
+| 4 | 1418112 |
+| 5 | 144000 |
+
+so the most likely value of $M$ is 3 and the average value is $\frac{385\\,643}{113\\,400} = 3.400732$, rounded to six decimal places.
+
+The most likely value of $M$ for a forty-piece caterpillar is 11; but what is the average value of $M$? Give your answer rounded to six decimal places.
+
+### --tests--
+
+`tidyingUp()` should return `11.492847`.
+
+```js
+assert.strictEqual(tidyingUp(), 11.492847);
+```
+
+## 53
+
+### --description--
+
+Define $f(n)$ as the sum of the factorials of the digits of $n$. For example, $f(342) = 3! + 4! + 2! = 32$.
+
+Define $sf(n)$ as the sum of the digits of $f(n)$. So $sf(342) = 3 + 2 = 5$.
+
+Define $g(i)$ to be the smallest positive integer $n$ such that $sf(n) = i$. Though $sf(342)$ is 5, $sf(25)$ is also 5, and it can be verified that $g(5)$ is 25.
+
+Define $sg(i)$ as the sum of the digits of $g(i)$. So $sg(5) = 2 + 5 = 7$.
+
+Further, it can be verified that $g(20)$ is 267 and $\sum sg(i)$ for $1 ≤ i ≤ 20$ is 156.
+
+What is $\sum sg(i)$ for $1 ≤ i ≤ 150$?
+
+### --tests--
+
+`sumsOfDigitFactorials()` should return `8184523820510`.
+
+```js
+assert.strictEqual(sumsOfDigitFactorials(), 8184523820510);
+```
+
+## 54
+
+### --description--
+
+We define the rounded-square-root of a positive integer $n$ as the square root of $n$ rounded to the nearest integer.
+
+The following procedure (essentially Heron's method adapted to integer arithmetic) finds the rounded-square-root of $n$:
+
+Let $d$ be the number of digits of the number $n$.
+
+If $d$ is odd, set $x_0 = 2 × {10}^{\frac{d - 1}{2}}$.
+
+If $d$ is even, set $x_0 = 7 × {10}^{\frac{d - 2}{2}}$.
+
+Repeat:
+
+$$x_{k + 1} = \left\lfloor\frac{x_k + \left\lceil\frac{n}{x_k}\right\rceil}{2}\right\rfloor$$
+
+until $x_{k + 1} = x_k$.
+
+As an example, let us find the rounded-square-root of $n = 4321$.
+
+$n$ has 4 digits, so $x_0 = 7 × {10}^{\frac{4-2}{2}} = 70$.
+
+$$x_1 = \left\lfloor\frac{70 + \left\lceil\frac{4321}{70}\right\rceil}{2}\right\rfloor = 66 \\\\
+x_2 = \left\lfloor\frac{66 + \left\lceil\frac{4321}{66}\right\rceil}{2}\right\rfloor = 66$$
+
+Since $x_2 = x_1$, we stop here. So, after just two iterations, we have found that the rounded-square-root of 4321 is 66 (the actual square root is 65.7343137…).
+
+The number of iterations required when using this method is surprisingly low. For example, we can find the rounded-square-root of a 5-digit integer ($10\\,000 ≤ n ≤ 99\\,999$) with an average of 3.2102888889 iterations (the average value was rounded to 10 decimal places).
+
+Using the procedure described above, what is the average number of iterations required to find the rounded-square-root of a 14-digit number (${10}^{13} ≤ n < {10}^{14}$)? Give your answer rounded to 10 decimal places.
+
+**Note:** The symbols $⌊x⌋$ and $⌈x⌉$ represent the floor function and ceiling function respectively.
+
+### --tests--
+
+`roundedSquareRoots()` should return `4.447401118`.
+
+```js
+assert.strictEqual(roundedSquareRoots(), 4.447401118);
+```
+
+## 55
+
+### --description--
+
+Tatami are rectangular mats, used to completely cover the floor of a room, without overlap.
+
+Assuming that the only type of available tatami has dimensions 1×2, there are obviously some limitations for the shape and size of the rooms that can be covered.
+
+For this problem, we consider only rectangular rooms with integer dimensions $a$, $b$ and even size $s = a \times b$. We use the term 'size' to denote the floor surface area of the room, and — without loss of generality — we add the condition $a ≤ b$.
+
+There is one rule to follow when laying out tatami: there must be no points where corners of four different mats meet. For example, consider the two arrangements below for a 4×4 room:
+
+
+
+The arrangement on the left is acceptable, whereas the one on the right is not: a red "X" in the middle, marks the point where four tatami meet.
+
+Because of this rule, certain even-sized rooms cannot be covered with tatami: we call them tatami-free rooms. Further, we define $T(s)$ as the number of tatami-free rooms of size $s$.
+
+The smallest tatami-free room has size $s = 70$ and dimensions 7×10. All the other rooms of size $s = 70$ can be covered with tatami; they are: 1×70, 2×35 and 5×14. Hence, $T(70) = 1$.
+
+Similarly, we can verify that $T(1320) = 5$ because there are exactly 5 tatami-free rooms of size $s = 1320$: 20×66, 22×60, 24×55, 30×44 and 33×40. In fact, $s = 1320$ is the smallest room-size $s$ for which $T(s) = 5$.
+
+Find the smallest room-size $s$ for which $T(s) = 200$.
+
+### --tests--
+
+`tatamiFreeRooms()` should return `85765680`.
+
+```js
+assert.strictEqual(tatamiFreeRooms(), 85765680);
+```
+
+## 56
+
+### --description--
+
+Given is an integer sided triangle $ABC$ with sides $a ≤ b ≤ c$ ($AB = c$, $BC = a$ and $AC = b$).
+
+The angular bisectors of the triangle intersect the sides at points $E$, $F$ and $G$ (see picture below).
+
+
+
+The segments $EF$, $EG$ and $FG$ partition the triangle $ABC$ into four smaller triangles: $AEG$, $BFE$, $CGF$ and $EFG$. It can be proven that for each of these four triangles the ratio $\frac{\text{area}(ABC)}{\text{area}(\text{subtriangle})}$ is rational. However, there exist triangles for which some or all of these ratios are integral.
+
+How many triangles $ABC$ with perimeter $≤ 100\\,000\\,000$ exist so that the ratio $\frac{\text{area}(ABC)}{\text{area}(AEG)}$ is integral?
+
+### --tests--
+
+`angularBisectors()` should return `139012411`.
+
+```js
+assert.strictEqual(angularBisectors(), 139012411);
+```
+
+## 57
+
+### --description--
+
+A sequence is defined as:
+
+- $g_k = 1$, for $0 ≤ k ≤ 1999$
+- $g_k = g_{k - 2000} + g_{k - 1999}$, for $k ≥ 2000$.
+
+Find $g_k$ mod 20092010 for $k = {10}^{18}$.
+
+### --tests--
+
+`laggedFibonacciSequence()` should return `12747994`.
+
+```js
+assert.strictEqual(laggedFibonacciSequence(), 12747994);
+```
+
+## 58
+
+### --description--
+
+A positive integer will be called reachable if it can result from an arithmetic expression obeying the following rules:
+
+- Uses the digits 1 through 9, in that order and exactly once each.
+- Any successive digits can be concatenated (for example, using the digits 2, 3 and 4 we obtain the number 234).
+- Only the four usual binary arithmetic operations (addition, subtraction, multiplication and division) are allowed.
+- Each operation can be used any number of times, or not at all.
+- Unary minus is not allowed.
+- Any number of (possibly nested) parentheses may be used to define the order of operations.
+
+For example, 42 is reachable, since $\frac{1}{23} \times ((4 \times 5) - 6) \times (78 - 9) = 42$.
+
+What is the sum of all positive reachable integers?
+
+### --tests--
+
+`reachableNumbers()` should return `20101196798`.
+
+```js
+assert.strictEqual(reachableNumbers(), 20101196798);
+```
+
+## 59
+
+### --description--
+
+A game is played with three piles of stones and two players.
+
+On each player's turn, the player removes one or more stones from the piles. However, if the player takes stones from more than one pile, the same number of stones must be removed from each of the selected piles.
+
+In other words, the player chooses some $N > 0$ and removes:
+
+- $N$ stones from any single pile; or
+- $N$ stones from each of any two piles ($2N$ total); or
+- $N$ stones from each of the three piles ($3N$ total).
+
+The player taking the last stone(s) wins the game.
+
+A winning configuration is one where the first player can force a win.
+
+For example, (0,0,13), (0,11,11) and (5,5,5) are winning configurations because the first player can immediately remove all stones.
+
+A losing configuration is one where the second player can force a win, no matter what the first player does.
+
+For example, (0,1,2) and (1,3,3) are losing configurations: any legal move leaves a winning configuration for the second player.
+
+Consider all losing configurations ($x_i$,$y_i$,$z_i$) where $x_i ≤ y_i ≤ z_i ≤ 100$. We can verify that $\sum (x_i + y_i + z_i) = 173\\,895$ for these.
+
+Find $\sum (x_i + y_i + z_i)$ where ($x_i$,$y_i$,$z_i$) ranges over the losing configurations with $x_i ≤ y_i ≤ z_i ≤ 1000$.
+
+### --tests--
+
+`stoneGame()` should return `167542057`.
+
+```js
+assert.strictEqual(stoneGame(), 167542057);
+```
+
+## 60
+
+### --description--
+
+Let us call a positive integer $k$ a square-pivot, if there is a pair of integers $m > 0$ and $n ≥ k$, such that the sum of the ($m + 1$) consecutive squares up to $k$ equals the sum of the $m$ consecutive squares from ($n + 1$) on:
+
+$${(k - m)}^2 + \ldots + k^2 = {(n + 1)}^2 + \ldots + {(n + m)}^2$$
+
+Some small square-pivots are
+
+$$\begin{align}
+ & \mathbf{4}: 3^2 + \mathbf{4}^2 = 5^2 \\\\
+ & \mathbf{21}: {20}^2 + \mathbf{21}^2 = {29}^2 \\\\
+ & \mathbf{24}: {21}^2 + {22}^2 + {23}^2 + \mathbf{24}^2 = {25}^2 + {26}^2 + {27}^2 \\\\
+ & \mathbf{110}: {108}^2 + {109}^2 + \mathbf{110}^2 = {133}^2 + {134}^2 \\\\
+\end{align}$$
+
+Find the sum of all distinct square-pivots $≤ {10}^{10}$.
+
+### --tests--
+
+`pivotalSquareSums()` should return `238890850232021`.
+
+```js
+assert.strictEqual(pivotalSquareSums(), 238890850232021);
+```
+
+## 61
+
+### --description--
+
+The following equation represents the continuous topography of a mountainous region, giving the elevation $h$ at any point ($x$,$y$):
+
+$$h = \left(5000 - \frac{x^2 + y^2 + xy}{200} + \frac{25(x + y)}{2}\right) \times e^{-\left|\frac{x^2 + y^2}{1\\,000\\,000} - \frac{3(x + y)}{2000} + \frac{7}{10}\right|}$$
+
+A mosquito intends to fly from A(200,200) to B(1400,1400), without leaving the area given by $0 ≤ x$, $y ≤ 1600$.
+
+Because of the intervening mountains, it first rises straight up to a point A', having elevation $f$. Then, while remaining at the same elevation $f$, it flies around any obstacles until it arrives at a point B' directly above B.
+
+First, determine $f_{min}$ which is the minimum constant elevation allowing such a trip from A to B, while remaining in the specified area. Then, find the length of the shortest path between A' and B', while flying at that constant elevation $f_{min}$.
+
+Give that length as your answer, rounded to three decimal places.
+
+**Note:** For convenience, the elevation function shown above is repeated below, in a form suitable for most programming languages: `h=( 5000-0.005*(x*x+y*y+x*y)+12.5*(x+y) )* exp( -abs(0.000001*(x*x+y*y)-0.0015*(x+y)+0.7) )`.
+
+### --tests--
+
+`mountainRange()` should return `2531.205`.
+
+```js
+assert.strictEqual(mountainRange(), 2531.205);
+```
+
+## 62
+
+### --description--
+
+Consider the number 6. The divisors of 6 are: 1,2,3 and 6.
+
+Every number from 1 up to and including 6 can be written as a sum of distinct divisors of 6:
+
+$1 = 1$, $2 = 2$, $3 = 1 + 2$, $4 = 1 + 3$, $5 = 2 + 3$, $6 = 6$.
+
+A number $n$ is called a practical number if every number from 1 up to and including $n$ can be expressed as a sum of distinct divisors of $n$.
+
+A pair of consecutive prime numbers with a difference of six is called a sexy pair (since "sex" is the Latin word for "six"). The first sexy pair is (23, 29).
+
+We may occasionally find a triple-pair, which means three consecutive sexy prime pairs, such that the second member of each pair is the first member of the next pair.
+
+We shall call a number $n$ such that:
+
+- ($n - 9$, $n - 3$), ($n - 3$, $n + 3$), ($n + 3$, $n + 9$) form a triple-pair, and
+- the numbers $n - 8$, $n - 4$, $n$, $n + 4$ and $n + 8$ are all practical,
+
+an engineers’ paradise.
+
+Find the sum of the first four engineers’ paradises.
+
+### --tests--
+
+`engineersDreamComeTrue()` should return `2039506520`.
+
+```js
+assert.strictEqual(engineersDreamComeTrue(), 2039506520);
+```
+
+## 63
+
+### --description--
+
+Consider all the triangles having:
+
+- All their vertices on lattice points.
+- Circumcentre at the origin O.
+- Orthocentre at the point H(5, 0).
+
+There are nine such triangles having a $\text{perimeter} ≤ 50$.
+
+Listed and shown in ascending order of their perimeter, they are:
+
+
+
+
+
+A(-4, 3), B(5, 0), C(4, -3)
+A(4, 3), B(5, 0), C(-4, -3)
+A(-3, 4), B(5, 0), C(3, -4)
+
+A(3, 4), B(5, 0), C(-3, -4)
+A(0, 5), B(5, 0), C(0, -5)
+A(1, 8), B(8, -1), C(-4, -7)
+
+A(8, 1), B(1, -8), C(-4, 7)
+A(2, 9), B(9, -2), C(-6, -7)
+A(9, 2), B(2, -9), C(-6, 7)
+ |
+ |
+
+
+
+
+The sum of their perimeters, rounded to four decimal places, is 291.0089.
+
+Find all such triangles with a $\text{perimeter} ≤ {10}^5$. Enter as your answer the sum of their perimeters rounded to four decimal places.
+
+### --tests--
+
+`triangleCentres()` should return `2816417.1055`.
+
+```js
+assert.strictEqual(triangleCentres(), 2816417.1055);
+```
+
+## 64
+
+### --description--
+
+$2^N$ binary digits can be placed in a circle so that all the $N$-digit clockwise subsequences are distinct.
+
+For $N = 3$, two such circular arrangements are possible, ignoring rotations:
+
+
+
+For the first arrangement, the 3-digit subsequences, in clockwise order, are: 000, 001, 010, 101, 011, 111, 110 and 100.
+
+Each circular arrangement can be encoded as a number by concatenating the binary digits starting with the subsequence of all zeros as the most significant bits and proceeding clockwise. The two arrangements for $N = 3$ are thus represented as 23 and 29:
+
+$${00010111}_2 = 23\\\\
+{00011101}_2 = 29$$
+
+Calling $S(N)$ the sum of the unique numeric representations, we can see that $S(3) = 23 + 29 = 52$.
+
+Find $S(5)$.
+
+### --tests--
+
+`binaryCircles()` should return `209110240768`.
+
+```js
+assert.strictEqual(binaryCircles(), 209110240768);
+```
+
+## 65
+
+### --description--
+
+The divisors of 12 are: 1,2,3,4,6 and 12.
+
+The largest divisor of 12 that does not exceed the square root of 12 is 3.
+
+We shall call the largest divisor of an integer $n$ that does not exceed the square root of $n$ the pseudo square root ($PSR$) of $n$.
+
+It can be seen that $PSR(3102) = 47$.
+
+Let $p$ be the product of the primes below 190. Find $PSR(p)\bmod {10}^{16}$.
+
+### --tests--
+
+`pseudoSquareRoot()` should return `1096883702440585`.
+
+```js
+assert.strictEqual(pseudoSquareRoot(), 1096883702440585);
+```
+
+## 66
+
+### --description--
+
+You are given a unique investment opportunity.
+
+Starting with £1 of capital, you can choose a fixed proportion, $f$, of your capital to bet on a fair coin toss repeatedly for 1000 tosses.
+
+Your return is double your bet for heads and you lose your bet for tails.
+
+For example, if $f = \frac{1}{4}$, for the first toss you bet £0.25, and if heads comes up you win £0.5 and so then have £1.5. You then bet £0.375 and if the second toss is tails, you have £1.125.
+
+Choosing $f$ to maximize your chances of having at least £1,000,000,000 after 1,000 flips, what is the chance that you become a billionaire?
+
+All computations are assumed to be exact (no rounding), but give your answer rounded to 12 digits behind the decimal point in the form 0.abcdefghijkl.
+
+### --tests--
+
+`billionaire()` should return `0.999992836187`.
+
+```js
+assert.strictEqual(billionaire(), 0.999992836187);
+```
+
+## 67
+
+### --description--
+
+It can be verified that there are 23 positive integers less than 1000 that are divisible by at least four distinct primes less than 100.
+
+Find how many positive integers less than ${10}^{16}$ are divisible by at least four distinct primes less than 100.
+
+### --tests--
+
+`fourDistinctPrimeFactors()` should return `785478606870985`.
+
+```js
+assert.strictEqual(fourDistinctPrimeFactors(), 785478606870985);
+```
+
+## 68
+
+### --description--
+
+A root or zero of a polynomial $P(x)$ is a solution to the equation $P(x) = 0$.
+
+Define $P_n$ as the polynomial whose coefficients are the digits of $n$.
+
+For example, $P_{5703}(x) = 5x^3 + 7x^2 + 3$.
+
+We can see that:
+
+- $P_n(0)$ is the last digit of $n$,
+- $P_n(1)$ is the sum of the digits of $n$,
+- $Pn(10)$ is $n$ itself.
+
+Define $Z(k)$ as the number of positive integers, $n$, not exceeding $k$ for which the polynomial $P_n$ has at least one integer root.
+
+It can be verified that $Z(100\\,000)$ is 14696.
+
+What is $Z({10}^{16})$?
+
+### --tests--
+
+`polynomialsWithOneIntegerRoot()` should return `1311109198529286`.
+
+```js
+assert.strictEqual(polynomialsWithOneIntegerRoot(), 1311109198529286);
+```
+
+## 69
+
+### --description--
+
+A square piece of paper with integer dimensions $N×N$ is placed with a corner at the origin and two of its sides along the $x$- and $y$-axes. Then, we cut it up respecting the following rules:
+
+- We only make straight cuts between two points lying on different sides of the square, and having integer coordinates.
+- Two cuts cannot cross, but several cuts can meet at the same border point.
+- Proceed until no more legal cuts can be made.
+
+Counting any reflections or rotations as distinct, we call $C(N)$ the number of ways to cut an $N×N$ square. For example, $C(1) = 2$ and $C(2) = 30$ (shown below).
+
+
+
+What is $C(30)\bmod {10}^8$ ?
+
+### --tests--
+
+`cuttingSquares()` should return `82282080`.
+
+```js
+assert.strictEqual(cuttingSquares(), 82282080);
+```
+
+## 70
+
+### --description--
+
+For a positive number $n$, define $S(n)$ as the sum of the integers $x$, for which $1 < x < n$ and $x^3 \equiv 1\bmod n$.
+
+When $n = 91$, there are 8 possible values for $x$, namely: 9, 16, 22, 29, 53, 74, 79, 81. Thus, $S(91) = 9 + 16 + 22 + 29 + 53 + 74 + 79 + 81 = 363$.
+
+Find $S(13\\,082\\,761\\,331\\,670\\,030)$.
+
+### --tests--
+
+`modularCubesOne()` should return `4617456485273130000`.
+
+```js
+assert.strictEqual(modularCubesOne(), 4617456485273130000);
+```
+
+## 71
+
+### --description--
+
+For a positive number $n$, define $C(n)$ as the number of the integers $x$, for which $1 < x < n$ and $x^3 \equiv 1\bmod n$.
+
+When $n = 91$, there are 8 possible values for $x$, namely: 9, 16, 22, 29, 53, 74, 79, 81. Thus, $C(91) = 8$.
+
+Find the sum of the positive numbers $n ≤ {10}^{11}$ for which $C(n)=242$.
+
+### --tests--
+
+`modularCubesTwo()` should return `8495585919506151000`.
+
+```js
+assert.strictEqual(modularCubesTwo(), 8495585919506151000);
+```
+
+## 72
+
+### --description--
+
+Consider equations of the form: $a^2 + b^2 = N$, $0 ≤ a ≤ b$, $a$, $b$ and $N$ integer.
+
+For $N = 65$ there are two solutions:
+
+$a = 1, b = 8$ and $a = 4, b = 7$.
+
+We call $S(N)$ the sum of the values of $a$ of all solutions of $a^2 + b^2 = N$, $0 ≤ a ≤ b$, $a$, $b$ and $N$ integer.
+
+Thus $S(65) = 1 + 4 = 5$.
+
+Find $\sum S(N)$, for all squarefree $N$ only divisible by primes of the form $4k + 1$ with $4k + 1 < 150$.
+
+### --tests--
+
+`sumOfSquares()` should return `2032447591196869000`.
+
+```js
+assert.strictEqual(sumOfSquares(), 2032447591196869000);
+```
+
+## 73
+
+### --description--
+
+For each integer $p > 1$ coprime to 10 there is a positive divisibility multiplier $m < p$ which preserves divisibility by $p$ for the following function on any positive integer, $n$:
+
+$f(n) = (\text{all but the last digit of} \\; n) + (\text{the last digit of} \\; n) \times m$
+
+That is, if $m$ is the divisibility multiplier for $p$, then $f(n)$ is divisible by $p$ if and only if $n$ is divisible by $p$.
+
+(When $n$ is much larger than $p$, $f(n)$ will be less than $n$ and repeated application of $f$ provides a multiplicative divisibility test for $p$.)
+
+For example, the divisibility multiplier for 113 is 34.
+
+$f(76275) = 7627 + 5 \times 34 = 7797$: 76275 and 7797 are both divisible by 113
+
+$f(12345) = 1234 + 5 \times 34 = 1404$: 12345 and 1404 are both not divisible by 113
+
+The sum of the divisibility multipliers for the primes that are coprime to 10 and less than 1000 is 39517. What is the sum of the divisibility multipliers for the primes that are coprime to 10 and less than ${10}^7$?
+
+### --tests--
+
+`divisibilityMultipliers()` should return `1601912348822`.
+
+```js
+assert.strictEqual(divisibilityMultipliers(), 1601912348822);
+```
+
+## 74
+
+### --description--
+
+Let us define a balanced sculpture of order $n$ as follows:
+
+- A polyomino made up of $n + 1$ tiles known as the blocks ($n$ tiles) and the plinth (remaining tile);
+- the plinth has its centre at position ($x = 0$, $y = 0$);
+- the blocks have $y$-coordinates greater than zero (so the plinth is the unique lowest tile);
+- the centre of mass of all the blocks, combined, has $x$-coordinate equal to zero.
+
+When counting the sculptures, any arrangements which are simply reflections about the $y$-axis, are not counted as distinct. For example, the 18 balanced sculptures of order 6 are shown below; note that each pair of mirror images (about the $y$-axis) is counted as one sculpture:
+
+
+
+There are 964 balanced sculptures of order 10 and 360505 of order 15.
+
+How many balanced sculptures are there of order 18?
+
+### --tests--
+
+`balancedSculptures()` should return `15030564`.
+
+```js
+assert.strictEqual(balancedSculptures(), 15030564);
+```
+
+## 75
+
+### --description--
+
+Consider the triangles with integer sides $a$, $b$ and $c$ with $a ≤ b ≤ c$.
+
+An integer sided triangle $(a,b,c)$ is called primitive if $gcd(a,b,c) = 1$.
+
+How many primitive integer sided triangles exist with a perimeter not exceeding $10\\,000\\,000$?
+
+### --tests--
+
+`primitiveTriangles()` should return `5777137137739633000`.
+
+```js
+assert.strictEqual(primitiveTriangles(), 5777137137739633000);
+```
+
+## 76
+
+### --description--
+
+A modified Collatz sequence of integers is obtained from a starting value $a_1$ in the following way:
+
+$a_{n + 1} = \frac{a_n}{3}$ if $a_n$ is divisible by 3. We shall denote this as a large downward step, "D".
+
+$a_{n + 1} = \frac{4a_n + 2}{3}$ if $a_n$ divided by 3 gives a remainder of 1. We shall denote this as an upward step, "U".
+
+$a_{n + 1} = \frac{2a_n - 1}{3}$ if $a_n$ divided by 3 gives a remainder of 2. We shall denote this as a small downward step, "d".
+
+The sequence terminates when some $a_n = 1$.
+
+Given any integer, we can list out the sequence of steps. For instance if $a_1 = 231$, then the sequence $\\{a_n\\} = \\{231, 77, 51, 17, 11, 7, 10, 14, 9, 3, 1\\}$ corresponds to the steps "DdDddUUdDD".
+
+Of course, there are other sequences that begin with that same sequence "DdDddUUdDD....".
+
+For instance, if $a_1 = 1004064$, then the sequence is DdDddUUdDDDdUDUUUdDdUUDDDUdDD.
+
+In fact, 1004064 is the smallest possible $a_1 > {10}^6$ that begins with the sequence DdDddUUdDD.
+
+What is the smallest $a_1 > {10}^{15}$ that begins with the sequence "UDDDUdddDDUDDddDdDddDDUDDdUUDd"?
+
+### --tests--
+
+`modifiedCollatzSequence()` should return `1125977393124310`.
+
+```js
+assert.strictEqual(modifiedCollatzSequence(), 1125977393124310);
+```
+
+## 77
+
+### --description--
+
+Given the values of integers $1 < a_1 < a_2 < \ldots < a_n$, consider the linear combination $q_1a_1 + q_2a_2 + \ldots + q_na_n = b$, using only integer values $q_k ≥ 0$.
+
+Note that for a given set of $a_k$, it may be that not all values of $b$ are possible. For instance, if $a_1 = 5$ and $a_2 = 7$, there are no $q_1 ≥ 0$ and $q_2 ≥ 0$ such that $b$ could be 1, 2, 3, 4, 6, 8, 9, 11, 13, 16, 18 or 23.
+
+In fact, 23 is the largest impossible value of $b$ for $a_1 = 5$ and $a_2 = 7$. We therefore call $f(5, 7) = 23$. Similarly, it can be shown that $f(6, 10, 15)=29$ and $f(14, 22, 77) = 195$.
+
+Find $\sum f(pq,pr,qr)$, where $p$, $q$ and $r$ are prime numbers and $p < q < r < 5000$.
+
+### --tests--
+
+`linearCombinationOfSemiprimes()` should return `1228215747273908500`.
+
+```js
+assert.strictEqual(linearCombinationOfSemiprimes(), 1228215747273908500);
+```
+
+## 78
+
+### --description--
+
+How many triangles are there with integral sides, at least one integral angle (measured in degrees), and a perimeter that does not exceed ${10}^8$?
+
+### --tests--
+
+`trianglesWithIntegralSidesAndAngle()` should return `416577688`.
+
+```js
+assert.strictEqual(trianglesWithIntegralSidesAndAngle(), 416577688);
+```
+
+## 79
+
+### --description--
+
+A laborious ant walks randomly on a 5x5 grid. The walk starts from the central square. At each step, the ant moves to an adjacent square at random, without leaving the grid; thus there are 2, 3 or 4 possible moves at each step depending on the ant's position.
+
+At the start of the walk, a seed is placed on each square of the lower row. When the ant isn't carrying a seed and reaches a square of the lower row containing a seed, it will start to carry the seed. The ant will drop the seed on the first empty square of the upper row it eventually reaches.
+
+What's the expected number of steps until all seeds have been dropped in the top row? Give your answer rounded to 6 decimal places.
+
+### --tests--
+
+`antAndSeeds()` should return `430.088247`.
+
+```js
+assert.strictEqual(antAndSeeds(), 430.088247);
+```
+
+## 80
+
+### --description--
+
+You are given a pizza (perfect circle) that has been cut into $m·n$ equal pieces and you want to have exactly one topping on each slice.
+
+Let $f(m,n)$ denote the number of ways you can have toppings on the pizza with $m$ different toppings ($m ≥ 2$), using each topping on exactly $n$ slices ($n ≥ 1$). Reflections are considered distinct, rotations are not.
+
+Thus, for instance, $f(2,1) = 1$, $f(2,2) = f(3,1) = 2$ and $f(3,2) = 16$. $f(3,2)$ is shown below:
+
+
+
+Find the sum of all $f(m,n)$ such that $f(m,n) ≤ {10}^{15}$.
+
+### --tests--
+
+`pizzaToppings()` should return `1485776387445623`.
+
+```js
+assert.strictEqual(pizzaToppings(), 1485776387445623);
+```
+
+## 81
+
+### --description--
+
+For non-negative integers $m$, $n$, the Ackermann function $A(m, n)$ is defined as follows:
+
+$$A(m, n) =
+\begin{cases}
+n + 1 & \text{if $m = 0$} \\\\
+A(m - 1, 1) & \text{if $m > 0$ and $n = 0$} \\\\
+A(m - 1, A(m, n - 1)) & \text{if $m > 0$ and $n > 0$}
+\end{cases}$$
+
+For example $A(1, 0) = 2$, $A(2, 2) = 7$ and $A(3, 4) = 125$.
+
+Find $\displaystyle\sum_{n = 0}^6 A(n, n)$ and give your answer mod ${14}^8$.
+
+### --tests--
+
+`ackermanFunction()` should return `1098988351`.
+
+```js
+assert.strictEqual(ackermanFunction(), 1098988351);
+```
+
+## 82
+
+### --description--
+
+Consider the triangle with sides 6, 8 and 10. It can be seen that the perimeter and the area are both equal to 24.
+
+So the $\frac{\text{area}}{\text{perimeter}}$ ratio is equal to 1.
+
+Consider also the triangle with sides 13, 14 and 15. The perimeter equals 42 while the area is equal to 84.
+
+So for this triangle the $\frac{\text{area}}{\text{perimeter}}$ ratio is equal to 2.
+
+Find the sum of the perimeters of all integer sided triangles for which the area/perimeter ratios are equal to positive integers not exceeding 1000.
+
+### --tests--
+
+`integralAreaPerimeterRatio()` should return `28038042525570324`.
+
+```js
+assert.strictEqual(integralAreaPerimeterRatio(), 28038042525570324);
+```
+
+## 83
+
+### --description--
+
+The 3-digit number 376 in the decimal numbering system is an example of numbers with the special property that its square ends with the same digits: ${376}^2 = 141376$. Let's call a number with this property a steady square.
+
+Steady squares can also be observed in other numbering systems. In the base 14 numbering system, the 3-digit number $c37$ is also a steady square: $c37^2 = aa0c37$, and the sum of its digits is $c+3+7=18$ in the same numbering system. The letters $a$, $b$, $c$ and $d$ are used for the 10, 11, 12 and 13 digits respectively, in a manner similar to the hexadecimal numbering system.
+
+For $1 ≤ n ≤ 9$, the sum of the digits of all the $n$-digit steady squares in the base 14 numbering system is $2d8$ (582 decimal). Steady squares with leading 0's are not allowed.
+
+Find the sum of the digits of all the $n$-digit steady squares in the base 14 numbering system for $1 ≤ n ≤ 10000$ (decimal) and give your answer as a string in the base 14 system using lower case letters where necessary.
+
+### --tests--
+
+`steadySquares()` should return a string.
+
+```js
+assert(typeof steadySquares() === 'string');
+```
+
+`steadySquares()` should return the string `5a411d7b`.
+
+```js
+assert.strictEqual(steadySquares(), '5a411d7b');
+```
+
+## 84
+
+### --description--
+
+Albert chooses a positive integer $k$, then two real numbers $a$, $b$ are randomly chosen in the interval [0,1] with uniform distribution.
+
+The square root of the sum ${(ka + 1)}^2 + {(kb + 1)}^2$ is then computed and rounded to the nearest integer. If the result is equal to $k$, he scores $k$ points; otherwise he scores nothing.
+
+For example, if $k = 6$, $a = 0.2$ and $b = 0.85$, then ${(ka + 1)}^2 + {(kb + 1)}^2 = 42.05$. The square root of 42.05 is 6.484... and when rounded to the nearest integer, it becomes 6. This is equal to $k$, so he scores 6 points.
+
+It can be shown that if he plays 10 turns with $k = 1, k = 2, \ldots, k = 10$, the expected value of his total score, rounded to five decimal places, is 10.20914.
+
+If he plays ${10}^5$ turns with $k = 1, k = 2, k = 3, \ldots, k = {10}^5$, what is the expected value of his total score, rounded to five decimal places?
+
+### --tests--
+
+`pythagoreanOdds()` should return `157055.80999`.
+
+```js
+assert.strictEqual(pythagoreanOdds(), 157055.80999);
+```
+
+## 85
+
+### --description--
+
+Barbara is a mathematician and a basketball player. She has found that the probability of scoring a point when shooting from a distance $x$ is exactly ($1 - \frac{x}{q}$), where $q$ is a real constant greater than 50.
+
+During each practice run, she takes shots from distances $x = 1, x = 2, \ldots, x = 50$ and, according to her records, she has precisely a 2 % chance to score a total of exactly 20 points.
+
+Find $q$ and give your answer rounded to 10 decimal places.
+
+### --tests--
+
+`scoringProbabilities()` should return `52.6494571953`.
+
+```js
+assert.strictEqual(scoringProbabilities(), 52.6494571953);
+```
+
+## 86
+
+### --description--
+
+The quadtree encoding allows us to describe a $2^N×2^N$ black and white image as a sequence of bits (0 and 1). Those sequences are to be read from left to right like this:
+
+- the first bit deals with the complete $2^N×2^N$ region;
+- "0" denotes a split:
+ - the current $2^n×2^n$ region is divided into 4 sub-regions of dimension $2^{n - 1}×2^{n - 1}$,
+ - the next bits contains the description of the top left, top right, bottom left and bottom right sub-regions - in that order;
+- "10" indicates that the current region contains only black pixels;
+- "11" indicates that the current region contains only white pixels.
+
+Consider the following 4×4 image (colored marks denote places where a split can occur):
+
+
+
+This image can be described by several sequences, for example : "001010101001011111011010101010", of length 30, or "0100101111101110", of length 16, which is the minimal sequence for this image.
+
+For a positive integer $N$, define $D_N$ as the $2^N×2^N$ image with the following coloring scheme:
+
+- the pixel with coordinates $x = 0$, $y = 0$ corresponds to the bottom left pixel,
+- if ${(x - 2^{N - 1})}^2 + {(y - 2^{N - 1})}^2 ≤ 2^{2N - 2}$ then the pixel is black,
+- otherwise the pixel is white.
+
+What is the length of the minimal sequence describing $D_{24}$?
+
+### --tests--
+
+`quadtreeEncoding()` should return `313135496`.
+
+```js
+assert.strictEqual(quadtreeEncoding(), 313135496);
+```
+
+## 87
+
+### --description--
+
+For any prime $p$ the number $N(p,q)$ is defined by $N(p,q) = \sum_{n=0}^q T_n \times p^n$ with $T_n$ generated by the following random number generator:
+
+$$\begin{align}
+ & S_0 = 290797 \\\\
+ & S_{n + 1} = {S_n}^2\bmod 50\\,515\\,093 \\\\
+ & T_n = S_n\bmod p
+\end{align}$$
+
+Let $Nfac(p,q)$ be the factorial of $N(p,q)$.
+
+Let $NF(p,q)$ be the number of factors $p$ in $Nfac(p,q)$.
+
+You are given that $NF(3,10000) \bmod 3^{20} = 624\\,955\\,285$.
+
+Find $NF(61,{10}^7)\bmod {61}^{10}$.
+
+### --tests--
+
+`enormousFactorial()` should return `605857431263982000`.
+
+```js
+assert.strictEqual(enormousFactorial(), 605857431263982000);
+```
+
+## 88
+
+### --description--
+
+Let $C(x,y)$ be a circle passing through the points ($x$, $y$), ($x$, $y + 1$), ($x + 1$, $y$) and ($x + 1$, $y + 1$).
+
+For positive integers $m$ and $n$, let $E(m,n)$ be a configuration which consists of the $m·n$ circles: { $C(x,y)$: $0 ≤ x < m$, $0 ≤ y < n$, $x$ and $y$ are integers }
+
+An Eulerian cycle on $E(m,n)$ is a closed path that passes through each arc exactly once. Many such paths are possible on $E(m,n)$, but we are only interested in those which are not self-crossing: A non-crossing path just touches itself at lattice points, but it never crosses itself.
+
+The image below shows $E(3,3)$ and an example of an Eulerian non-crossing path.
+
+
+
+Let $L(m,n)$ be the number of Eulerian non-crossing paths on $E(m,n)$. For example, $L(1,2) = 2$, $L(2,2) = 37$ and $L(3,3) = 104290$.
+
+Find $L(6,10)\bmod {10}^{10}$.
+
+### --tests--
+
+`eulerianCycles()` should return `6567944538`.
+
+```js
+assert.strictEqual(eulerianCycles(), 6567944538);
+```
+
+## 89
+
+### --description--
+
+How many integers $0 ≤ n < {10}^{18}$ have the property that the sum of the digits of $n$ equals the sum of digits of $137n$?
+
+### --tests--
+
+`digitalSignature()` should return `20444710234716470`.
+
+```js
+assert.strictEqual(digitalSignature(), 20444710234716470);
+```
+
+## 90
+
+### --description--
+
+A prime number $p$ is called a Panaitopol prime if $p = \frac{x^4 - y^4}{x^3 + y^3}$ for some positive integers $x$ and $y$.
+
+Find how many Panaitopol primes are less than $5 × {10}^{15}$.
+
+### --tests--
+
+`panaitopolPrimes()` should return `4037526`.
+
+```js
+assert.strictEqual(panaitopolPrimes(), 4037526);
+```
+
+## 91
+
+### --description--
+
+We shall define a pythagorean polygon to be a convex polygon with the following properties:
+
+- there are at least three vertices,
+- no three vertices are aligned,
+- each vertex has integer coordinates,
+- each edge has integer length.
+
+For a given integer $n$, define $P(n)$ as the number of distinct pythagorean polygons for which the perimeter is $≤ n$.
+
+Pythagorean polygons should be considered distinct as long as none is a translation of another.
+
+You are given that $P(4) = 1$, $P(30) = 3655$ and $P(60) = 891045$.
+
+Find $P(120)$.
+
+### --tests--
+
+`pythagoreanPolygons()` should return `3600060866`.
+
+```js
+assert.strictEqual(pythagoreanPolygons(), 3600060866);
+```
+
+## 92
+
+### --description--
+
+An even positive integer $N$ will be called admissible, if it is a power of 2 or its distinct prime factors are consecutive primes.
+
+The first twelve admissible numbers are 2, 4, 6, 8, 12, 16, 18, 24, 30, 32, 36, 48.
+
+If $N$ is admissible, the smallest integer $M > 1$ such that $N + M$ is prime, will be called the pseudo-Fortunate number for $N$.
+
+For example, $N = 630$ is admissible since it is even and its distinct prime factors are the consecutive primes 2, 3, 5 and 7. The next prime number after 631 is 641; hence, the pseudo-Fortunate number for 630 is $M = 11$. It can also be seen that the pseudo-Fortunate number for 16 is 3.
+
+Find the sum of all distinct pseudo-Fortunate numbers for admissible numbers $N$ less than ${10}^9$.
+
+### --tests--
+
+`pseudoFortunateNumbers()` should return `2209`.
+
+```js
+assert.strictEqual(pseudoFortunateNumbers(), 2209);
+```
+
+## 93
+
+### --description--
+
+For a positive integer $k$, define $d(k)$ as the sum of the digits of $k$ in its usual decimal representation. Thus $d(42) = 4 + 2 = 6$.
+
+For a positive integer $n$, define $S(n)$ as the number of positive integers $k < {10}^n$ with the following properties:
+
+- $k$ is divisible by 23 and,
+- $d(k) = 23$.
+
+You are given that $S(9) = 263\\,626$ and $S(42) = 6\\,377\\,168\\,878\\,570\\,056$.
+
+Find $S({11}^{12})$ and give your answer $\bmod {10}^9$.
+
+### --tests--
+
+`experience23()` should return `789184709`.
+
+```js
+assert.strictEqual(experience23(), 789184709);
+```
+
+## 94
+
+### --description--
+
+We call the convex area enclosed by two circles a lenticular hole if:
+
+- The centres of both circles are on lattice points.
+- The two circles intersect at two distinct lattice points.
+- The interior of the convex area enclosed by both circles does not contain any lattice points.
+
+Consider the circles:
+
+$$\begin{align}
+ & C_0: x^2 + y^2 = 25 \\\\
+ & C_1: {(x + 4)}^2 + {(y - 4)}^2 = 1 \\\\
+ & C_2: {(x - 12)}^2 + {(y - 4)}^2 = 65
+\end{align}$$
+
+The circles $C_0$, $C_1$ and $C_2$ are drawn in the picture below.
+
+
+
+$C_0$ and $C_1$ form a lenticular hole, as well as $C_0$ and $C_2$.
+
+We call an ordered pair of positive real numbers ($r_1$, $r_2$) a lenticular pair if there exist two circles with radii $r_1$ and $r_2$ that form a lenticular hole. We can verify that ($1$, $5$) and ($5$, $\sqrt{65}$) are the lenticular pairs of the example above.
+
+Let $L(N)$ be the number of distinct lenticular pairs ($r_1$, $r_2$) for which $0 < r_1 ≤ r_2 ≤ N$. We can verify that $L(10) = 30$ and $L(100) = 3442$.
+
+Find $L(100\\,000)$.
+
+### --tests--
+
+`lenticularHoles()` should return `4884650818`.
+
+```js
+assert.strictEqual(lenticularHoles(), 4884650818);
+```
+
+## 95
+
+### --description--
+
+Given is an integer sided triangle $ABC$ with $BC ≤ AC ≤ AB$. $k$ is the angular bisector of angle $ACB$. $m$ is the tangent at $C$ to the circumscribed circle of $ABC$. $n$ is a line parallel to $m$ through $B$.
+
+The intersection of $n$ and $k$ is called $E$.
+
+
+
+How many triangles $ABC$ with a perimeter not exceeding $100\\,000$ exist such that $BE$ has integral length?
+
+### --tests--
+
+`angularBisectorAndTangent()` should return `1137208419`.
+
+```js
+assert.strictEqual(angularBisectorAndTangent(), 1137208419);
+```
+
+## 96
+
+### --description--
+
+Each new term in the Fibonacci sequence is generated by adding the previous two terms.
+
+Starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89.
+
+Every positive integer can be uniquely written as a sum of nonconsecutive terms of the Fibonacci sequence. For example, 100 = 3 + 8 + 89.
+
+Such a sum is called the Zeckendorf representation of the number.
+
+For any integer $n>0$, let $z(n)$ be the number of terms in the Zeckendorf representation of $n$.
+
+Thus, $z(5) = 1$, $z(14) = 2$, $z(100) = 3$ etc.
+
+Also, for $0 < n < {10}^6$, $\sum z(n) = 7\\,894\\,453$.
+
+Find $\sum z(n)$ for $0 < n < {10}^{17}$.
+
+### --tests--
+
+`zeckendorfRepresentation()` should return `2252639041804718000`.
+
+```js
+assert.strictEqual(zeckendorfRepresentation(), 2252639041804718000);
+```
+
+## 97
+
+### --description--
+
+Larry and Robin play a memory game involving of a sequence of random numbers between 1 and 10, inclusive, that are called out one at a time. Each player can remember up to 5 previous numbers. When the called number is in a player's memory, that player is awarded a point. If it's not, the player adds the called number to his memory, removing another number if his memory is full.
+
+Both players start with empty memories. Both players always add new missed numbers to their memory but use a different strategy in deciding which number to remove: Larry's strategy is to remove the number that hasn't been called in the longest time. Robin's strategy is to remove the number that's been in the memory the longest time.
+
+Example game:
+
+| Turn | Called number | Larry's memory | Larry's score | Robin's memory | Robin's score |
+|------|---------------|---------------:|---------------|----------------|---------------|
+| 1 | 1 | 1 | 0 | 1 | 0 |
+| 2 | 2 | 1,2 | 0 | 1,2 | 0 |
+| 3 | 4 | 1,2,4 | 0 | 1,2,4 | 0 |
+| 4 | 6 | 1,2,4,6 | 0 | 1,2,4,6 | 0 |
+| 5 | 1 | 1,2,4,6 | 1 | 1,2,4,6 | 1 |
+| 6 | 8 | 1,2,4,6,8 | 1 | 1,2,4,6,8 | 1 |
+| 7 | 10 | 1,4,6,8,10 | 1 | 2,4,6,8,10 | 1 |
+| 8 | 2 | 1,2,6,8,10 | 1 | 2,4,6,8,10 | 2 |
+| 9 | 4 | 1,2,4,8,10 | 1 | 2,4,6,8,10 | 3 |
+| 10 | 1 | 1,2,4,8,10 | 2 | 1,4,6,8,10 | 3 |
+
+Denoting Larry's score by $L$ and Robin's score by $R$, what is the expected value of $|L - R|$ after 50 turns? Give your answer rounded to eight decimal places using the format x.xxxxxxxx .
+
+### --tests--
+
+`selectiveAmnesia()` should return `1.76882294`.
+
+```js
+assert.strictEqual(selectiveAmnesia(), 1.76882294);
+```
+
+## 98
+
+### --description--
+
+Four points with integer coordinates are selected:
+
+$A(a, 0)$, $B(b, 0)$, $C(0, c)$ and $D(0, d)$, with $0 < a < b$ and $0 < c < d$.
+
+Point $P$, also with integer coordinates, is chosen on the line $AC$ so that the three triangles $ABP$, $CDP$ and $BDP$ are all similar.
+
+
+
+It is easy to prove that the three triangles can be similar, only if $a = c$.
+
+So, given that $a = c$, we are looking for triplets ($a$, $b$, $d$) such that at least one point $P$ (with integer coordinates) exists on $AC$, making the three triangles $ABP$, $CDP$ and $BDP$ all similar.
+
+For example, if $(a, b, d) = (2, 3, 4)$, it can be easily verified that point $P(1, 1)$ satisfies the above condition. Note that the triplets (2,3,4) and (2,4,3) are considered as distinct, although point $P(1, 1)$ is common for both.
+
+If $b + d < 100$, there are 92 distinct triplets ($a$, $b$, $d$) such that point $P$ exists.
+
+If $b + d < 100\\,000$, there are 320471 distinct triplets ($a$, $b$, $d$) such that point $P$ exists.
+
+If $b + d < 100\\,000\\,000$, how many distinct triplets ($a$, $b$, $d$) are there such that point $P$ exists?
+
+### --tests--
+
+`threeSimilarTriangles()` should return `549936643`.
+
+```js
+assert.strictEqual(threeSimilarTriangles(), 549936643);
+```
+
+## 99
+
+### --description--
+
+In a very simplified form, we can consider proteins as strings consisting of hydrophobic (H) and polar (P) elements, e.g. HHPPHHHPHHPH.
+
+For this problem, the orientation of a protein is important; e.g. HPP is considered distinct from PPH. Thus, there are $2^n$ distinct proteins consisting of $n$ elements.
+
+When one encounters these strings in nature, they are always folded in such a way that the number of H-H contact points is as large as possible, since this is energetically advantageous.
+
+As a result, the H-elements tend to accumulate in the inner part, with the P-elements on the outside.
+
+Natural proteins are folded in three dimensions of course, but we will only consider protein folding in two dimensions.
+
+The figure below shows two possible ways that our example protein could be folded (H-H contact points are shown with red dots).
+
+
+
+The folding on the left has only six H-H contact points, thus it would never occur naturally. On the other hand, the folding on the right has nine H-H contact points, which is optimal for this string.
+
+Assuming that H and P elements are equally likely to occur in any position along the string, the average number of H-H contact points in an optimal folding of a random protein string of length 8 turns out to be $\frac{850}{2^8} = 3.3203125$.
+
+What is the average number of H-H contact points in an optimal folding of a random protein string of length 15? Give your answer using as many decimal places as necessary for an exact result.
+
+### --tests--
+
+`proteinFolding()` should return `8.0540771484375`.
+
+```js
+assert.strictEqual(proteinFolding(), 8.0540771484375);
+```
+
+## --fcc-end--
+
\ No newline at end of file
diff --git a/curriculum/locales/english/project-euler-problems-301-to-400.md b/curriculum/locales/english/project-euler-problems-301-to-400.md
new file mode 100644
index 0000000..132a4bf
--- /dev/null
+++ b/curriculum/locales/english/project-euler-problems-301-to-400.md
@@ -0,0 +1,2776 @@
+# Project Euler in Rust: 301 to 400
+
+Complete the freeCodeCamp Project Euler problems in the Rust programming language using WebAssembly.
+
+## 0
+
+### --description--
+
+Nim is a game played with heaps of stones, where two players take it in turn to remove any number of stones from any heap until no stones remain.
+
+We'll consider the three-heap normal-play version of Nim, which works as follows:
+
+- At the start of the game there are three heaps of stones.
+- On his turn the player removes any positive number of stones from any single heap.
+- The first player unable to move (because no stones remain) loses.
+
+If ($n_1$, $n_2$, $n_3$) indicates a Nim position consisting of heaps of size $n_1$, $n_2$ and $n_3$ then there is a simple function $X(n_1,n_2,n_3)$ — that you may look up or attempt to deduce for yourself — that returns:
+
+- zero if, with perfect strategy, the player about to move will eventually lose; or
+- non-zero if, with perfect strategy, the player about to move will eventually win.
+
+For example $X(1, 2, 3) = 0$ because, no matter what the current player does, his opponent can respond with a move that leaves two heaps of equal size, at which point every move by the current player can be mirrored by his opponent until no stones remain; so the current player loses. To illustrate:
+
+- current player moves to (1,2,1)
+- opponent moves to (1,0,1)
+- current player moves to (0,0,1)
+- opponent moves to (0,0,0), and so wins.
+
+For how many positive integers $n ≤ 2^{30}$ does $X(n, 2n, 3n) = 0$?
+
+### --tests--
+
+`nim()` should return `2178309`.
+
+```js
+assert.strictEqual(nim(), 2178309);
+```
+
+## 1
+
+### --description--
+
+A positive integer $n$ is powerful if $p^2$ is a divisor of $n$ for every prime factor $p$ in $n$.
+
+A positive integer $n$ is a perfect power if $n$ can be expressed as a power of another positive integer.
+
+A positive integer $n$ is an Achilles number if $n$ is powerful but not a perfect power. For example, 864 and 1800 are Achilles numbers: $864 = 2^5 \times 3^3$ and $1800 = 2^3 \times 3^2 \times 5^2$.
+
+We shall call a positive integer $S$ a Strong Achilles number if both $S$ and $φ(S)$ are Achilles numbers. $φ$ denotes Euler's totient function.
+
+For example, 864 is a Strong Achilles number: $φ(864) = 288 = 2^5 \times 3^2$. However, 1800 isn't a Strong Achilles number because: $φ(1800) = 480 = 2^5 \times 3^1 \times 5^1$.
+
+There are 7 Strong Achilles numbers below ${10}^4$ and 656 below ${10}^8$.
+
+How many Strong Achilles numbers are there below ${10}^{18}$?
+
+### --tests--
+
+`strongAchillesNumbers()` should return `1170060`.
+
+```js
+assert.strictEqual(strongAchillesNumbers(), 1170060);
+```
+
+## 2
+
+### --description--
+
+For a positive integer $n$, define $f(n)$ as the least positive multiple of $n$ that, written in base 10, uses only digits $≤ 2$.
+
+Thus $f(2) = 2$, $f(3) = 12$, $f(7) = 21$, $f(42) = 210$, $f(89) = 1\\,121\\,222$.
+
+Also, $\displaystyle\sum_{n = 1}^{100} \frac{f(n)}{n} = 11\\,363\\,107$.
+
+Find $\displaystyle\sum_{n = 1}^{10\\,000} \frac{f(n)}{n}$.
+
+### --tests--
+
+`multiplesWithSmallDigits()` should return `1111981904675169`.
+
+```js
+assert.strictEqual(multiplesWithSmallDigits(), 1111981904675169);
+```
+
+## 3
+
+### --description--
+
+For any positive integer $n$ the function $\text{next_prime}(n)$ returns the smallest prime $p$ such that $p > n$.
+
+The sequence $a(n)$ is defined by: $a(1) = \text{next_prime}({10}^{14})$ and $a(n) = \text{next_prime}(a(n - 1))$ for $n > 1$.
+
+The fibonacci sequence $f(n)$ is defined by: $f(0) = 0$, $f(1) = 1$ and $f(n) = f(n - 1) + f(n - 2)$ for $n > 1$.
+
+The sequence $b(n)$ is defined as $f(a(n))$.
+
+Find $\sum b(n)$ for $1≤n≤100\\,000$. Give your answer $\bmod 1\\,234\\,567\\,891\\,011$.
+
+### --tests--
+
+`primonacci()` should return `283988410192`.
+
+```js
+assert.strictEqual(primonacci(), 283988410192);
+```
+
+## 4
+
+### --description--
+
+Let's call $S$ the (infinite) string that is made by concatenating the consecutive positive integers (starting from 1) written down in base 10.
+
+Thus, $S = 1234567891011121314151617181920212223242\ldots$
+
+It's easy to see that any number will show up an infinite number of times in $S$.
+
+Let's call $f(n)$ the starting position of the $n^{\text{th}}$ occurrence of $n$ in $S$. For example, $f(1) = 1$, $f(5) = 81$, $f(12) = 271$ and $f(7780) = 111\\,111\\,365$.
+
+Find $\sum f(3^k) for 1 ≤ k ≤ 13$.
+
+### --tests--
+
+`reflexivePosition()` should return `18174995535140`.
+
+```js
+assert.strictEqual(reflexivePosition(), 18174995535140);
+```
+
+## 5
+
+### --description--
+
+The following game is a classic example of Combinatorial Game Theory:
+
+Two players start with a strip of $n$ white squares and they take alternate turns. On each turn, a player picks two contiguous white squares and paints them black. The first player who cannot make a move loses.
+
+- $n = 1$: No valid moves, so the first player loses automatically.
+- $n = 2$: Only one valid move, after which the second player loses.
+- $n = 3$: Two valid moves, but both leave a situation where the second player loses.
+- $n = 4$: There are three valid moves for the first player; who is able to win the game by painting the two middle squares.
+- $n = 5$: Four valid moves for the first player (shown below in red); but no matter what the player does, the second player (blue) wins.
+
+
+
+So, for $1 ≤ n ≤ 5$, there are 3 values of $n$ for which the first player can force a win.
+
+Similarly, for $1 ≤ n ≤ 50$, there are 40 values of $n$ for which the first player can force a win.
+
+For $1 ≤ n ≤ 1\\,000\\,000$, how many values of $n$ are there for which the first player can force a win?
+
+### --tests--
+
+`paperStripGame()` should return `852938`.
+
+```js
+assert.strictEqual(paperStripGame(), 852938);
+```
+
+## 6
+
+### --description--
+
+$k$ defects are randomly distributed amongst $n$ integrated-circuit chips produced by a factory (any number of defects may be found on a chip and each defect is independent of the other defects).
+
+Let $p(k,n)$ represent the probability that there is a chip with at least 3 defects. For instance $p(3,7) ≈ 0.0204081633$.
+
+Find $p(20\\,000, 1\\,000\\,000)$ and give your answer rounded to 10 decimal places in the form 0.abcdefghij
+
+### --tests--
+
+`chipDefects()` should return `0.7311720251`.
+
+```js
+assert.strictEqual(chipDefects(), 0.7311720251);
+```
+
+## 7
+
+### --description--
+
+A program written in the programming language Fractran consists of a list of fractions.
+
+The internal state of the Fractran Virtual Machine is a positive integer, which is initially set to a seed value. Each iteration of a Fractran program multiplies the state integer by the first fraction in the list which will leave it an integer.
+
+For example, one of the Fractran programs that John Horton Conway wrote for prime-generation consists of the following 14 fractions:
+
+$$\frac{17}{91}, \frac{78}{85}, \frac{19}{51}, \frac{23}{38}, \frac{29}{33}, \frac{77}{29}, \frac{95}{23}, \frac{77}{19}, \frac{1}{17}, \frac{11}{13}, \frac{13}{11}, \frac{15}{2}, \frac{1}{7}, \frac{55}{1}$$
+
+Starting with the seed integer 2, successive iterations of the program produce the sequence:
+
+$$15, 825, 725, 1925, 2275, 425, \ldots, 68, \mathbf{4}, 30, \ldots, 136, \mathbf{8}, 60, \ldots, 544, \mathbf{32}, 240, \ldots$$
+
+The powers of 2 that appear in this sequence are $2^2, 2^3, 2^5, \ldots$.
+
+It can be shown that all the powers of 2 in this sequence have prime exponents and that all the primes appear as exponents of powers of 2, in proper order!
+
+If someone uses the above Fractran program to solve Project Euler Problem 7 (find the ${10001}^{\text{st}}$ prime), how many iterations would be needed until the program produces $2^{10001^{\text{st}}\text{ prime}}$?
+
+### --tests--
+
+`primeGeneratingAutomation()` should return `1539669807660924`.
+
+```js
+assert.strictEqual(primeGeneratingAutomation(), 1539669807660924);
+```
+
+## 8
+
+### --description--
+
+In the classic "Crossing Ladders" problem, we are given the lengths $x$ and $y$ of two ladders resting on the opposite walls of a narrow, level street. We are also given the height $h$ above the street where the two ladders cross and we are asked to find the width of the street ($w$).
+
+
+
+Here, we are only concerned with instances where all four variables are positive integers. For example, if $x = 70$, $y = 119$ and $h = 30$, we can calculate that $w = 56$.
+
+In fact, for integer values $x$, $y$, $h$ and $0 < x < y < 200$, there are only five triplets ($x$, $y$, $h$) producing integer solutions for $w$: (70, 119, 30), (74, 182, 21), (87, 105, 35), (100, 116, 35) and (119, 175, 40).
+
+For integer values $x$, $y$, $h$ and $0 < x < y < 1\\,000\\,000$, how many triplets ($x$, $y$, $h$) produce integer solutions for $w$?
+
+### --tests--
+
+`integerLadders()` should return `210139`.
+
+```js
+assert.strictEqual(integerLadders(), 210139);
+```
+
+## 9
+
+### --description--
+
+Alice and Bob play the game Nim Square.
+
+Nim Square is just like ordinary three-heap normal play Nim, but the players may only remove a square number of stones from a heap.
+
+The number of stones in the three heaps is represented by the ordered triple ($a$, $b$, $c$).
+
+If $0 ≤ a ≤ b ≤ c ≤ 29$ then the number of losing positions for the next player is 1160.
+
+Find the number of losing positions for the next player if $0 ≤ a ≤ b ≤ c ≤ 100\\,000$.
+
+### --tests--
+
+`nimSquare()` should return `2586528661783`.
+
+```js
+assert.strictEqual(nimSquare(), 2586528661783);
+```
+
+## 10
+
+### --description--
+
+$ABCD$ is a convex, integer sided quadrilateral with $1 ≤ AB < BC < CD < AD$.
+
+$BD$ has integer length. $O$ is the midpoint of $BD$. $AO$ has integer length.
+
+We'll call $ABCD$ a biclinic integral quadrilateral if $AO = CO ≤ BO = DO$.
+
+For example, the following quadrilateral is a biclinic integral quadrilateral: $AB = 19$, $BC = 29$, $CD = 37$, $AD = 43$, $BD = 48$ and $AO = CO = 23$.
+
+
+
+Let $B(N)$ be the number of distinct biclinic integral quadrilaterals $ABCD$ that satisfy ${AB}^2 + {BC}^2 + {CD}^2 + {AD}^2 ≤ N$. We can verify that $B(10\\,000) = 49$ and $B(1\\,000\\,000) = 38239$.
+
+Find $B(10\\,000\\,000\\,000)$.
+
+### --tests--
+
+`biclinicIntegralQuadrilaterals()` should return `2466018557`.
+
+```js
+assert.strictEqual(biclinicIntegralQuadrilaterals(), 2466018557);
+```
+
+## 11
+
+### --description--
+
+- A Sierpiński graph of order-1 ($S_1$) is an equilateral triangle.
+- $S_{n + 1}$ is obtained from $S_n$ by positioning three copies of $S_n$ so that every pair of copies has one common corner.
+
+
+
+Let $C(n)$ be the number of cycles that pass exactly once through all the vertices of $S_n$. For example, $C(3) = 8$ because eight such cycles can be drawn on $S_3$, as shown below:
+
+
+
+It can also be verified that:
+
+$$\begin{align}
+ & C(1) = C(2) = 1 \\\\
+ & C(5) = 71\\,328\\,803\\,586\\,048 \\\\
+ & C(10 000)\bmod {10}^8 = 37\\,652\\,224 \\\\
+ & C(10 000)\bmod {13}^8 = 617\\,720\\,485 \\\\
+\end{align}$$
+
+Find $C(C(C(10\\,000)))\bmod {13}^8$.
+
+### --tests--
+
+`pathsOnSierpinskiGraphs()` should return `324681947`.
+
+```js
+assert.strictEqual(pathsOnSierpinskiGraphs(), 324681947);
+```
+
+## 12
+
+### --description--
+
+In a sliding game a counter may slide horizontally or vertically into an empty space. The objective of the game is to move the red counter from the top left corner of a grid to the bottom right corner; the space always starts in the bottom right corner. For example, the following sequence of pictures show how the game can be completed in five moves on a 2 by 2 grid.
+
+
+
+Let $S(m, n)$ represent the minimum number of moves to complete the game on an $m$ by $n$ grid. For example, it can be verified that $S(5, 4) = 25$.
+
+
+
+There are exactly 5482 grids for which $S(m, n) = p^2$, where $p < 100$ is prime.
+
+How many grids does $S(m, n) = p^2$, where $p < {10}^6$ is prime?
+
+### --tests--
+
+`slidingGame()` should return `2057774861813004`.
+
+```js
+assert.strictEqual(slidingGame(), 2057774861813004);
+```
+
+## 13
+
+### --description--
+
+The moon has been opened up, and land can be obtained for free, but there is a catch. You have to build a wall around the land that you stake out, and building a wall on the moon is expensive. Every country has been allotted a 500 m by 500 m square area, but they will possess only that area which they wall in. 251001 posts have been placed in a rectangular grid with 1 meter spacing. The wall must be a closed series of straight lines, each line running from post to post.
+
+The bigger countries of course have built a 2000 m wall enclosing the entire 250 000 $\text{m}^2$ area. The Duchy of Grand Fenwick, has a tighter budget, and has asked you (their Royal Programmer) to compute what shape would get best maximum $\frac{\text{enclosed-area}}{\text{wall-length}}$ ratio.
+
+You have done some preliminary calculations on a sheet of paper. For a 2000 meter wall enclosing the 250 000 $\text{m}^2$ area the $\frac{\text{enclosed-area}}{\text{wall-length}}$ ratio is 125.
+
+Although not allowed, but to get an idea if this is anything better: if you place a circle inside the square area touching the four sides the area will be equal to $π \times {250}^2 \text{m}^2$ and the perimeter will be $π \times 500 \text{m}$, so the $\frac{\text{enclosed-area}}{\text{wall-length}}$ ratio will also be 125.
+
+However, if you cut off from the square four triangles with sides 75 m, 75 m and $75\sqrt{2}$ m the total area becomes 238750 $\text{m}^2$ and the perimeter becomes $1400 + 300\sqrt{2}$ m. So this gives an $\frac{\text{enclosed-area}}{\text{wall-length}}$ ratio of 130.87, which is significantly better.
+
+
+
+Find the maximum $\frac{\text{enclosed-area}}{\text{wall-length}}$ ratio. Give your answer rounded to 8 places behind the decimal point in the form abc.defghijk.
+
+### --tests--
+
+`theMouseOnTheMoon()` should return `132.52756426`.
+
+```js
+assert.strictEqual(theMouseOnTheMoon(), 132.52756426);
+```
+
+## 14
+
+### --description--
+
+
+
+Sam and Max are asked to transform two digital clocks into two "digital root" clocks.
+
+A digital root clock is a digital clock that calculates digital roots step by step.
+
+When a clock is fed a number, it will show it and then it will start the calculation, showing all the intermediate values until it gets to the result. For example, if the clock is fed the number 137, it will show: `137` → `11` → `2` and then it will go black, waiting for the next number.
+
+Every digital number consists of some light segments: three horizontal (top, middle, bottom) and four vertical (top-left, top-right, bottom-left, bottom-right). Number `1` is made of vertical top-right and bottom-right, number `4` is made by middle horizontal and vertical top-left, top-right and bottom-right. Number `8` lights them all.
+
+The clocks consume energy only when segments are turned on/off. To turn on a `2` will cost 5 transitions, while a `7` will cost only 4 transitions.
+
+Sam and Max built two different clocks.
+
+Sam's clock is fed e.g. number 137: the clock shows `137`, then the panel is turned off, then the next number (`11`) is turned on, then the panel is turned off again and finally the last number (`2`) is turned on and, after some time, off.
+
+For the example, with number 137, Sam's clock requires:
+
+- `137`: $(2 + 5 + 4) × 2 = 22$ transitions (`137` on/off).
+- `11`: $(2 + 2) × 2 = 8$ transitions (`11` on/off).
+- `2`: $(5) × 2 = 10$ transitions (`2` on/off).
+
+For a grand total of 40 transitions.
+
+Max's clock works differently. Instead of turning off the whole panel, it is smart enough to turn off only those segments that won't be needed for the next number.
+
+For number 137, Max's clock requires:
+
+- `137` : $2 + 5 + 4 = 11$ transitions (`137` on), $7$ transitions (to turn off the segments that are not needed for number `11`).
+- `11` : $0$ transitions (number `11` is already turned on correctly), $3$ transitions (to turn off the first `1` and the bottom part of the second `1`; the top part is common with number `2`).
+- `2` : $4$ transitions (to turn on the remaining segments in order to get a `2`), $5$ transitions (to turn off number `2`).
+
+For a grand total of 30 transitions.
+
+Of course, Max's clock consumes less power than Sam's one. The two clocks are fed all the prime numbers between $A = {10}^7$ and $B = 2 × {10}^7$. Find the difference between the total number of transitions needed by Sam's clock and that needed by Max's one.
+
+### --tests--
+
+`digitalRootClocks()` should return `13625242`.
+
+```js
+assert.strictEqual(digitalRootClocks(), 13625242);
+```
+
+## 15
+
+### --description--
+
+Let $p = p_1 p_2 p_3 \ldots$ be an infinite sequence of random digits, selected from {0,1,2,3,4,5,6,7,8,9} with equal probability.
+
+It can be seen that $p$ corresponds to the real number $0.p_1 p_2 p_3 \ldots$.
+
+It can also be seen that choosing a random real number from the interval [0,1) is equivalent to choosing an infinite sequence of random digits selected from {0,1,2,3,4,5,6,7,8,9} with equal probability.
+
+For any positive integer $n$ with $d$ decimal digits, let $k$ be the smallest index such that $p_k, p_{k + 1}, \ldots p_{k + d - 1}$ are the decimal digits of $n$, in the same order.
+
+Also, let $g(n)$ be the expected value of $k$; it can be proven that $g(n)$ is always finite and, interestingly, always an integer number.
+
+For example, if $n = 535$, then
+
+for $p = 31415926\mathbf{535}897\ldots$, we get $k = 9$
+
+for $p = 35528714365004956000049084876408468\mathbf{535}4\ldots$, we get $k = 36$
+
+etc and we find that $g(535) = 1008$.
+
+Given that $\displaystyle\sum_{n = 2}^{999} g\left(\left\lfloor\frac{{10}^6}{n}\right\rfloor\right) = 27280188$, find $\displaystyle\sum_{n = 2}^{999\\,999} g\left(\left\lfloor\frac{{10}^{16}}{n}\right\rfloor\right)$.
+
+**Note:** $\lfloor x\rfloor$ represents the floor function.
+
+### --tests--
+
+`numbersInDecimalExpansion()` should return `542934735751917760`.
+
+```js
+assert.strictEqual(numbersInDecimalExpansion(), 542934735751917760);
+```
+
+## 16
+
+### --description--
+
+A firecracker explodes at a height of 100 m above level ground. It breaks into a large number of very small fragments, which move in every direction; all of them have the same initial velocity of 20 $\frac{\text{m}}{\text{s}}$.
+
+We assume that the fragments move without air resistance, in a uniform gravitational field with $g=9.81 \frac{\text{m}}{\text{s}^2}$.
+
+Find the volume (in $\text{m}^3$) of the region through which the fragments move before reaching the ground. Give your answer rounded to four decimal places.
+
+### --tests--
+
+`firecracker()` should return `1856532.8455`.
+
+```js
+assert.strictEqual(firecracker(), 1856532.8455);
+```
+
+## 17
+
+### --description--
+
+Consider the real number $\sqrt{2} + \sqrt{3}$.
+
+When we calculate the even powers of $\sqrt{2} + \sqrt{3}$ we get:
+
+$$\begin{align}
+ & {(\sqrt{2} + \sqrt{3})}^2 = 9.898979485566356\ldots \\\\
+ & {(\sqrt{2} + \sqrt{3})}^4 = 97.98979485566356\ldots \\\\
+ & {(\sqrt{2} + \sqrt{3})}^6 = 969.998969071069263\ldots \\\\
+ & {(\sqrt{2} + \sqrt{3})}^8 = 9601.99989585502907\ldots \\\\
+ & {(\sqrt{2} + \sqrt{3})}^{10} = 95049.999989479221\ldots \\\\
+ & {(\sqrt{2} + \sqrt{3})}^{12} = 940897.9999989371855\ldots \\\\
+ & {(\sqrt{2} + \sqrt{3})}^{14} = 9313929.99999989263\ldots \\\\
+ & {(\sqrt{2} + \sqrt{3})}^{16} = 92198401.99999998915\ldots \\\\
+\end{align}$$
+
+It looks like that the number of consecutive nines at the beginning of the fractional part of these powers is non-decreasing. In fact it can be proven that the fractional part of ${(\sqrt{2} + \sqrt{3})}^{2n}$ approaches 1 for large $n$.
+
+Consider all real numbers of the form $\sqrt{p} + \sqrt{q}$ with $p$ and $q$ positive integers and $p < q$, such that the fractional part of ${(\sqrt{p} + \sqrt{q})}^{2n}$ approaches 1 for large $n$.
+
+Let $C(p,q,n)$ be the number of consecutive nines at the beginning of the fractional part of ${(\sqrt{p} + \sqrt{q})}^{2n}$.
+
+Let $N(p,q)$ be the minimal value of $n$ such that $C(p,q,n) ≥ 2011$.
+
+Find $\sum N(p,q)$ for $p + q ≤ 2011$.
+
+### --tests--
+
+`twoThousandElevenNines()` should return `709313889`.
+
+```js
+assert.strictEqual(twoThousandElevenNines(), 709313889);
+```
+
+## 18
+
+### --description--
+
+Let $x_1, x_2, \ldots, x_n$ be a sequence of length $n$ such that:
+
+- $x_1 = 2$
+- for all $1 < i ≤ n : x_{i - 1} < x_i$
+- for all $i$ and $j$ with $1 ≤ i, j ≤ n : {(x_i)}^j < {(x_j + 1)}^i$
+
+There are only five such sequences of length 2, namely: {2,4}, {2,5}, {2,6}, {2,7} and {2,8}. There are 293 such sequences of length 5; three examples are given below: {2,5,11,25,55}, {2,6,14,36,88}, {2,8,22,64,181}.
+
+Let $t(n)$ denote the number of such sequences of length $n$. You are given that $t(10) = 86195$ and $t(20) = 5227991891$.
+
+Find $t({10}^{10})$ and give your answer modulo $10^9$.
+
+### --tests--
+
+`boundedSequences()` should return `268457129`.
+
+```js
+assert.strictEqual(boundedSequences(), 268457129);
+```
+
+## 19
+
+### --description--
+
+Let $N(i)$ be the smallest integer $n$ such that $n!$ is divisible by $(i!)^{1234567890}$
+
+Let $S(u) = \sum N(i)$ for $10 ≤ i ≤ u$.
+
+$S(1000)=614\\,538\\,266\\,565\\,663$.
+
+Find $S(1\\,000\\,000)\bmod {10}^{18}$.
+
+### --tests--
+
+`divisibleByHugeInteger()` should return `278157919195482660`.
+
+```js
+assert.strictEqual(divisibleByHugeInteger(), 278157919195482660);
+```
+
+## 20
+
+### --description--
+
+A horizontal row comprising of $2n + 1$ squares has $n$ red counters placed at one end and $n$ blue counters at the other end, being separated by a single empty square in the center. For example, when $n = 3$.
+
+
+
+A counter can move from one square to the next (slide) or can jump over another counter (hop) as long as the square next to that counter is unoccupied.
+
+
+
+Let $M(n)$ represent the minimum number of moves/actions to completely reverse the positions of the colored counters; that is, move all the red counters to the right and all the blue counters to the left.
+
+It can be verified $M(3) = 15$, which also happens to be a triangle number.
+
+If we create a sequence based on the values of n for which $M(n)$ is a triangle number then the first five terms would be: 1, 3, 10, 22, and 63, and their sum would be 99.
+
+Find the sum of the first forty terms of this sequence.
+
+### --tests--
+
+`swappingCounters()` should return `2470433131948040`.
+
+```js
+assert.strictEqual(swappingCounters(), 2470433131948040);
+```
+
+## 21
+
+### --description--
+
+Let $T(m, n)$ be the number of the binomial coefficients ${}^iC_n$ that are divisible by 10 for $n ≤ i < m$ ($i$, $m$ and $n$ are positive integers).
+
+You are given that $T({10}^9, {10}^7 - 10) = 989\\,697\\,000$.
+
+Find $T({10}^{18}, {10}^{12} - 10)$.
+
+### --tests--
+
+`binomialCoefficientsDivisibleBy10()` should return `999998760323314000`.
+
+```js
+assert.strictEqual(binomialCoefficientsDivisibleBy10(), 999998760323314000);
+```
+
+## 22
+
+### --description--
+
+Let $y_0, y_1, y_2, \ldots$ be a sequence of random unsigned 32 bit integers (i.e. $0 ≤ y_i < 2^{32}$, every value equally likely).
+
+For the sequence $x_i$ the following recursion is given:
+
+- $x_0 = 0$ and
+- $x_i = x_{i - 1} \mathbf{|} y_{i - 1}$, for $i > 0$. ($\mathbf{|}$ is the bitwise-OR operator)
+
+It can be seen that eventually there will be an index $N$ such that $x_i = 2^{32} - 1$ (a bit-pattern of all ones) for all $i ≥ N$.
+
+Find the expected value of $N$. Give your answer rounded to 10 digits after the decimal point.
+
+### --tests--
+
+`bitwiseOrOnRandomIntegers()` should return `6.3551758451`.
+
+```js
+assert.strictEqual(bitwiseOrOnRandomIntegers(), 6.3551758451);
+```
+
+## 23
+
+### --description--
+
+Let $f(n)$ represent the number of ways one can fill a $3×3×n$ tower with blocks of $2×1×1$. You're allowed to rotate the blocks in any way you like; however, rotations, reflections etc of the tower itself are counted as distinct.
+
+For example (with $q = 100\\,000\\,007$):
+
+$$\begin{align}
+ & f(2) = 229, \\\\
+ & f(4) = 117\\,805, \\\\
+ & f(10)\bmod q = 96\\,149\\,360, \\\\
+ & f({10}^3)\bmod q = 24\\,806\\,056, \\\\
+ & f({10}^6)\bmod q = 30\\,808\\,124.
+\end{align}$$
+
+Find $f({10}^{10000})\bmod 100\\,000\\,007$.
+
+### --tests--
+
+`buildingTower()` should return `96972774`.
+
+```js
+assert.strictEqual(buildingTower(), 96972774);
+```
+
+## 24
+
+### --description--
+
+A game is played with two piles of stones and two players. On each player's turn, the player may remove a number of stones from the larger pile. The number of stones removes must be a positive multiple of the number of stones in the smaller pile.
+
+E.g., let the ordered pair (6,14) describe a configuration with 6 stones in the smaller pile and 14 stones in the larger pile, then the first player can remove 6 or 12 stones from the larger pile.
+
+The player taking all the stones from a pile wins the game.
+
+A winning configuration is one where the first player can force a win. For example, (1,5), (2,6) and (3,12) are winning configurations because the first player can immediately remove all stones in the second pile.
+
+A losing configuration is one where the second player can force a win, no matter what the first player does. For example, (2,3) and (3,4) are losing configurations: any legal move leaves a winning configuration for the second player.
+
+Define $S(N)$ as the sum of ($x_i + y_i$) for all losing configurations ($x_i$, $y_i$), $0 < x_i < y_i ≤ N$. We can verify that $S(10) = 211$ and $S({10}^4) = 230\\,312\\,207\\,313$.
+
+Find $S({10}^{16})\bmod 7^{10}$.
+
+### --tests--
+
+`stoneGameTwo()` should return `54672965`.
+
+```js
+assert.strictEqual(stoneGameTwo(), 54672965);
+```
+
+## 25
+
+### --description--
+
+Let $a_n$ be a sequence recursively defined by: $a_1 = 1$, $\displaystyle a_n = \left(\sum_{k = 1}^{n - 1} k \times a_k\right)\bmod n$.
+
+So the first 10 elements of $a_n$ are: 1, 1, 0, 3, 0, 3, 5, 4, 1, 9.
+
+Let $f(N, M)$ represent the number of pairs $(p, q)$ such that:
+
+$$ 1 \le p \le q \le N \\; \text{and} \\; \left(\sum_{i = p}^q a_i\right)\bmod M = 0$$
+
+It can be seen that $f(10, 10) = 4$ with the pairs (3,3), (5,5), (7,9) and (9,10).
+
+You are also given that $f({10}^4, {10}^3) = 97\\,158$.
+
+Find $f({10}^{12}, {10}^6)$.
+
+### --tests--
+
+`moduloSummations()` should return `1966666166408794400`.
+
+```js
+assert.strictEqual(moduloSummations(), 1966666166408794400);
+```
+
+## 26
+
+### --description--
+
+A series of three rooms are connected to each other by automatic doors.
+
+
+
+Each door is operated by a security card. Once you enter a room, the door automatically closes, and that security card cannot be used again. A machine will dispense an unlimited number of cards at the start, but each room (including the starting room) contains scanners. If they detect that you are holding more than three security cards or if they detect an unattended security card on the floor, then all the doors will become permanently locked. However, each room contains a box where you may safely store any number of security cards for use at a later stage.
+
+If you simply tried to travel through the rooms one at a time then as you entered room 3 you would have used all three cards and would be trapped in that room forever!
+
+However, if you make use of the storage boxes, then escape is possible. For example, you could enter room 1 using your first card, place one card in the storage box, and use your third card to exit the room back to the start. Then after collecting three more cards from the dispensing machine you could use one to enter room 1 and collect the card you placed in the box a moment ago. You now have three cards again and will be able to travel through the remaining three doors. This method allows you to travel through all three rooms using six security cards in total.
+
+It is possible to travel through six rooms using a total of 123 security cards while carrying a maximum of 3 cards.
+
+Let $C$ be the maximum number of cards which can be carried at any time.
+
+Let $R$ be the number of rooms to travel through.
+
+Let $M(C, R)$ be the minimum number of cards required from the dispensing machine to travel through $R$ rooms carrying up to a maximum of $C$ cards at any time.
+
+For example, $M(3, 6) = 123$ and $M(4, 6) = 23$.
+
+And, $\sum M(C, 6) = 146$ for $3 ≤ C ≤ 4$.
+
+You are given that $\sum M(C, 10) = 10382$ for $3 ≤ C ≤ 10$.
+
+Find $\sum M(C, 30)$ for $3 ≤ C ≤ 40$.
+
+### --tests--
+
+`roomsOfDoom()` should return `34315549139516`.
+
+```js
+assert.strictEqual(roomsOfDoom(), 34315549139516);
+```
+
+## 27
+
+### --description--
+
+We are trying to find a hidden number selected from the set of integers {1, 2, ..., $n$} by asking questions. Each number (question) we ask, has a cost equal to the number asked and we get one of three possible answers:
+
+- "Your guess is lower than the hidden number", or
+- "Yes, that's it!", or
+- "Your guess is higher than the hidden number".
+
+Given the value of $n$, an optimal strategy minimizes the total cost (i.e. the sum of all the questions asked) for the worst possible case. E.g.
+
+If $n = 3$, the best we can do is obviously to ask the number "2". The answer will immediately lead us to find the hidden number (at a total cost = 2).
+
+If $n = 8$, we might decide to use a "binary search" type of strategy: Our first question would be "4" and if the hidden number is higher than 4 we will need one or two additional questions. Let our second question be "6". If the hidden number is still higher than 6, we will need a third question in order to discriminate between 7 and 8. Thus, our third question will be "7" and the total cost for this worst-case scenario will be $4 + 6 + 7 = \mathbf{\color{red}{17}}$.
+
+We can improve considerably the worst-case cost for $n = 8$, by asking "5" as our first question. If we are told that the hidden number is higher than 5, our second question will be "7", then we'll know for certain what the hidden number is (for a total cost of $5 + 7 = \mathbf{\color{blue}{12}}$). If we are told that the hidden number is lower than 5, our second question will be "3" and if the hidden number is lower than 3 our third question will be "1", giving a total cost of $5 + 3 + 1 = \mathbf{\color{blue}{9}}$. Since $\mathbf{\color{blue}{12 > 9}}$, the worst-case cost for this strategy is 12. That's better than what we achieved previously with the "binary search" strategy; it is also better than or equal to any other strategy. So, in fact, we have just described an optimal strategy for $n = 8$.
+
+Let $C(n)$ be the worst-case cost achieved by an optimal strategy for $n$, as described above. Thus $C(1) = 0$, $C(2) = 1$, $C(3) = 2$ and $C(8) = 12$.
+
+Similarly, $C(100) = 400$ and $\displaystyle\sum_{n = 1}^{100} C(n) = 17575$.
+
+Find $\displaystyle\sum_{n = 1}^{200\\,000} C(n)$.
+
+### --tests--
+
+`lowestCostSearch()` should return `260511850222`.
+
+```js
+assert.strictEqual(lowestCostSearch(), 260511850222);
+```
+
+## 28
+
+### --description--
+
+Susan has a prime frog.
+
+Her frog is jumping around over 500 squares numbered 1 to 500.
+
+He can only jump one square to the left or to the right, with equal probability, and he cannot jump outside the range [1;500]. (if it lands at either end, it automatically jumps to the only available square on the next move.)
+
+When he is on a square with a prime number on it, he croaks 'P' (PRIME) with probability $\frac{2}{3}$ or 'N' (NOT PRIME) with probability $\frac{1}{3}$ just before jumping to the next square. When he is on a square with a number on it that is not a prime he croaks 'P' with probability $\frac{1}{3}$ or 'N' with probability $\frac{2}{3}$ just before jumping to the next square.
+
+Given that the frog's starting position is random with the same probability for every square, and given that she listens to his first 15 croaks, what is the probability that she hears the sequence PPPPNNPPPNPPNPN?
+
+Give your answer as a string as a fraction `p/q` in reduced form.
+
+### --tests--
+
+`primeFrog()` should return a string.
+
+```js
+assert(typeof primeFrog() === 'string');
+```
+
+`primeFrog()` should return the string `199740353/29386561536000`.
+
+```js
+assert.strictEqual(primeFrog(), '199740353/29386561536000');
+```
+
+## 29
+
+### --description--
+
+An infinite sequence of real numbers $a(n)$ is defined for all integers $n$ as follows:
+
+$$ a(n) =
+\begin{cases}
+1 & n < 0 \\\\
+\displaystyle \sum_{i = 1}^{\infty} \frac{a(n - 1)}{i!} & n \ge 0
+\end{cases}
+$$
+
+For example,
+
+$$\begin{align}
+ & a(0) = \frac{1}{1!} + \frac{1}{2!} + \frac{1}{3!} + \ldots = e − 1 \\\\
+ & a(1) = \frac{e − 1}{1!} + \frac{1}{2!} + \frac{1}{3!} + \ldots = 2e − 3 \\\\
+ & a(2) = \frac{2e − 3}{1!} + \frac{e − 1}{2!} + \frac{1}{3!} + \ldots = \frac{7}{2} e − 6
+\end{align}$$
+
+with $e = 2.7182818\ldots$ being Euler's constant.
+
+It can be shown that $a(n)$ is of the form $\displaystyle\frac{A(n)e + B(n)}{n!}$ for integers $A(n)$ and $B(n)$.
+
+For example $\displaystyle a(10) = \frac{328161643e − 652694486}{10!}$.
+
+Find $A({10}^9)$ + $B({10}^9)$ and give your answer $\bmod 77\\,777\\,777$.
+
+### --tests--
+
+`eulersNumber()` should return `15955822`.
+
+```js
+assert.strictEqual(eulersNumber(), 15955822);
+```
+
+## 30
+
+### --description--
+
+N×N disks are placed on a square game board. Each disk has a black side and white side.
+
+At each turn, you may choose a disk and flip all the disks in the same row and the same column as this disk: thus $2 × N - 1$ disks are flipped. The game ends when all disks show their white side. The following example shows a game on a 5×5 board.
+
+
+
+It can be proven that 3 is the minimal number of turns to finish this game.
+
+The bottom left disk on the $N×N$ board has coordinates (0, 0); the bottom right disk has coordinates ($N - 1$,$0$) and the top left disk has coordinates ($0$,$N - 1$).
+
+Let $C_N$ be the following configuration of a board with $N × N$ disks: A disk at ($x$, $y$) satisfying $N - 1 \le \sqrt{x^2 + y^2} \lt N$, shows its black side; otherwise, it shows its white side. $C_5$ is shown above.
+
+Let $T(N)$ be the minimal number of turns to finish a game starting from configuration $C_N$ or 0 if configuration $C_N$ is unsolvable. We have shown that $T(5) = 3$. You are also given that $T(10) = 29$ and $T(1\\,000) = 395\\,253$.
+
+Find $\displaystyle \sum_{i = 3}^{31} T(2^i - i)$.
+
+### --tests--
+
+`crossFlips()` should return `467178235146843500`.
+
+```js
+assert.strictEqual(crossFlips(), 467178235146843500);
+```
+
+## 31
+
+### --description--
+
+A spherical triangle is a figure formed on the surface of a sphere by three great circular arcs intersecting pairwise in three vertices.
+
+
+
+Let $C(r)$ be the sphere with the centre (0,0,0) and radius $r$.
+
+Let $Z(r)$ be the set of points on the surface of $C(r)$ with integer coordinates.
+
+Let $T(r)$ be the set of spherical triangles with vertices in $Z(r)$. Degenerate spherical triangles, formed by three points on the same great arc, are not included in $T(r)$.
+
+Let $A(r)$ be the area of the smallest spherical triangle in $T(r)$.
+
+For example $A(14)$ is 3.294040 rounded to six decimal places.
+
+Find $\displaystyle \sum_{r = 1}^{50} A(r)$. Give your answer rounded to six decimal places.
+
+### --tests--
+
+`sphericalTriangles()` should return `2717.751525`.
+
+```js
+assert.strictEqual(sphericalTriangles(), 2717.751525);
+```
+
+## 32
+
+### --description--
+
+All positive integers can be partitioned in such a way that each and every term of the partition can be expressed as $2^i \times 3^j$, where $i, j ≥ 0$.
+
+Let's consider only those such partitions where none of the terms can divide any of the other terms. For example, the partition of $17 = 2 + 6 + 9 = (2^1 \times 3^0 + 2^1 \times 3^1 + 2^0 \times 3^2)$ would not be valid since 2 can divide 6. Neither would the partition $17 = 16 + 1 = (2^4 \times 3^0 + 2^0 \times 3^0)$ since 1 can divide 16. The only valid partition of 17 would be $8 + 9 = (2^3 \times 3^0 + 2^0 \times 3^2)$.
+
+Many integers have more than one valid partition, the first being 11 having the following two partitions.
+
+$$\begin{align}
+ & 11 = 2 + 9 = (2^1 \times 3^0 + 2^0 \times 3^2) \\\\
+ & 11 = 8 + 3 = (2^3 \times 3^0 + 2^0 \times 3^1)
+\end{align}$$
+
+Let's define $P(n)$ as the number of valid partitions of $n$. For example, $P(11) = 2$.
+
+Let's consider only the prime integers $q$ which would have a single valid partition such as $P(17)$.
+
+The sum of the primes $q <100$ such that $P(q) = 1$ equals 233.
+
+Find the sum of the primes $q < 1\\,000\\,000$ such that $P(q) = 1$.
+
+### --tests--
+
+`specialPartitions()` should return `3053105`.
+
+```js
+assert.strictEqual(specialPartitions(), 3053105);
+```
+
+## 33
+
+### --description--
+
+In Plato's heaven, there exist an infinite number of bowls in a straight line. Each bowl either contains some or none of a finite number of beans. A child plays a game, which allows only one kind of move: removing two beans from any bowl, and putting one in each of the two adjacent bowls. The game ends when each bowl contains either one or no beans.
+
+For example, consider two adjacent bowls containing 2 and 3 beans respectively, all other bowls being empty. The following eight moves will finish the game:
+
+
+
+You are given the following sequences:
+
+$$\begin{align}
+ & t_0 = 123456, \\\\
+ & t_i = \begin{cases}
+ \frac{t_{i - 1}}{2}, & \text{if $t_{i - 1}$ is even} \\\\
+ \left\lfloor\frac{t_{i - 1}}{2}\right\rfloor \oplus 926252, & \text{if $t_{i - 1}$ is odd}
+ \end{cases} \\\\
+ & \qquad \text{where $⌊x⌋$ is the floor function and $\oplus$ is the bitwise XOR operator.} \\\\
+ & b_i = (t_i\bmod 2^{11}) + 1.
+\end{align}$$
+
+The first two terms of the last sequence are $b_1 = 289$ and $b_2 = 145$. If we start with $b_1$ and $b_2$ beans in two adjacent bowls, 3419100 moves would be required to finish the game.
+
+Consider now 1500 adjacent bowls containing $b_1, b_2, \ldots, b_{1500}$ beans respectively, all other bowls being empty. Find how many moves it takes before the game ends.
+
+### --tests--
+
+`spillingTheBeans()` should return `150320021261690850`.
+
+```js
+assert.strictEqual(spillingTheBeans(), 150320021261690850);
+```
+
+## 34
+
+### --description--
+
+Whenever Peter feels bored, he places some bowls, containing one bean each, in a circle. After this, he takes all the beans out of a certain bowl and drops them one by one in the bowls going clockwise. He repeats this, starting from the bowl he dropped the last bean in, until the initial situation appears again. For example with 5 bowls he acts as follows:
+
+
+
+So with 5 bowls it takes Peter 15 moves to return to the initial situation.
+
+Let $M(x)$ represent the number of moves required to return to the initial situation, starting with $x$ bowls. Thus, $M(5) = 15$. It can also be verified that $M(100) = 10920$.
+
+Find $\displaystyle\sum_{k = 0}^{{10}^{18}} M(2^k + 1)$. Give your answer modulo $7^9$.
+
+### --tests--
+
+`gatheringTheBeans()` should return `5032316`.
+
+```js
+assert.strictEqual(gatheringTheBeans(), 5032316);
+```
+
+## 35
+
+### --description--
+
+A train is used to transport four carriages in the order: $ABCD$. However, sometimes when the train arrives to collect the carriages they are not in the correct order.
+
+To rearrange the carriages, they are all shunted onto a large rotating turntable. After the carriages are uncoupled at a specific point, the train moves off the turntable pulling the carriages still attached with it. The remaining carriages are rotated 180°. All of the carriages are then rejoined and this process is repeated as often as necessary in order to obtain the least number of uses of the turntable.
+
+Some arrangements, such as $ADCB$, can be solved easily: the carriages are separated between $A$ and $D$, and after $DCB$ are rotated the correct order has been achieved.
+
+However, Simple Simon, the train driver, is not known for his efficiency, so he always solves the problem by initially getting carriage $A$ in the correct place, then carriage $B$, and so on.
+
+Using four carriages, the worst possible arrangements for Simon, which we shall call maximix arrangements, are $DACB$ and $DBAC$; each requiring him five rotations (although, using the most efficient approach, they could be solved using just three rotations). The process he uses for $DACB$ is shown below.
+
+
+
+It can be verified that there are 24 maximix arrangements for six carriages, of which the tenth lexicographic maximix arrangement is $DFAECB$.
+
+Find the ${2011}^{\text{th}}$ lexicographic maximix arrangement for eleven carriages.
+
+### --tests--
+
+`maximixArrangements()` should return a string.
+
+```js
+assert(typeof maximixArrangements() === 'string');
+```
+
+`maximixArrangements()` should return the string `CAGBIHEFJDK`.
+
+```js
+assert.strictEqual(maximixArrangements(), 'CAGBIHEFJDK');
+```
+
+## 36
+
+### --description--
+
+Let $\\{a_1, a_2, \ldots, a_n\\}$ be an integer sequence of length $n$ such that:
+
+- $a_1 = 6$
+- for all $1 ≤ i < n$ : $φ(a_i) < φ(a_{i + 1}) < a_i < a_{i + 1}$
+
+$φ$ denotes Euler's totient function.
+
+Let $S(N)$ be the number of such sequences with $a_n ≤ N$.
+
+For example, $S(10) = 4$: {6}, {6, 8}, {6, 8, 9} and {6, 10}.
+
+We can verify that $S(100) = 482\\,073\\,668$ and $S(10\\,000)\bmod {10}^8 = 73\\,808\\,307$.
+
+Find $S(20\\,000\\,000)\bmod {10}^8$.
+
+
+### --tests--
+
+`totientStairstepSequences()` should return `85068035`.
+
+```js
+assert.strictEqual(totientStairstepSequences(), 85068035);
+```
+
+## 37
+
+### --description--
+
+A rectangular sheet of grid paper with integer dimensions $w$ × $h$ is given. Its grid spacing is 1.
+
+When we cut the sheet along the grid lines into two pieces and rearrange those pieces without overlap, we can make new rectangles with different dimensions.
+
+For example, from a sheet with dimensions 9 × 4, we can make rectangles with dimensions 18 × 2, 12 × 3 and 6 × 6 by cutting and rearranging as below:
+
+
+
+Similarly, from a sheet with dimensions 9 × 8, we can make rectangles with dimensions 18 × 4 and 12 × 6.
+
+For a pair $w$ and $h$, let $F(w, h)$ be the number of distinct rectangles that can be made from a sheet with dimensions $w$ × $h$. For example, $F(2, 1) = 0$, $F(2, 2) = 1$, $F(9, 4) = 3$ and $F(9, 8) = 2$. Note that rectangles congruent to the initial one are not counted in $F(w, h)$. Note also that rectangles with dimensions $w$ × $h$ and dimensions $h$ × $w$ are not considered distinct.
+
+For an integer $N$, let $G(N)$ be the sum of $F(w, h)$ for all pairs $w$ and $h$ which satisfy $0 < h ≤ w ≤ N$. We can verify that $G(10) = 55$, $G({10}^3) = 971\\,745$ and $G({10}^5) = 9\\,992\\,617\\,687$.
+
+Find $G({10}^{12})$. Give your answer modulo ${10}^8$.
+
+### --tests--
+
+`cuttingRectangularGridPaper()` should return `15614292`.
+
+```js
+assert.strictEqual(cuttingRectangularGridPaper(), 15614292);
+```
+
+## 38
+
+### --description--
+
+"And he came towards a valley, through which ran a river; and the borders of the valley were wooded, and on each side of the river were level meadows. And on one side of the river he saw a flock of white sheep, and on the other a flock of black sheep. And whenever one of the white sheep bleated, one of the black sheep would cross over and become white; and when one of the black sheep bleated, one of the white sheep would cross over and become black." - Peredur the Son of Evrawc
+
+Initially, each flock consists of $n$ sheep. Each sheep (regardless of color) is equally likely to be the next sheep to bleat. After a sheep has bleated and a sheep from the other flock has crossed over, Peredur may remove a number of white sheep in order to maximize the expected final number of black sheep. Let $E(n)$ be the expected final number of black sheep if Peredur uses an optimal strategy.
+
+You are given that $E(5) = 6.871346$ rounded to 6 places behind the decimal point.
+
+Find $E(10\\,000)$ and give your answer rounded to 6 places behind the decimal point.
+
+### --tests--
+
+`peredurFabEfrawg()` should return `19823.542204`.
+
+```js
+assert.strictEqual(peredurFabEfrawg(), 19823.542204);
+```
+
+## 39
+
+### --description--
+
+For fixed integers $a$, $b$, $c$, define the crazy function $F(n)$ as follows:
+
+$$\begin{align}
+ & F(n) = n - c \\;\text{ for all } n > b \\\\
+ & F(n) = F(a + F(a + F(a + F(a + n)))) \\;\text{ for all } n ≤ b.
+\end{align}$$
+
+Also, define $S(a, b, c) = \displaystyle\sum_{n = 0}^b F(n)$.
+
+For example, if $a = 50$, $b = 2000$ and $c = 40$, then $F(0) = 3240$ and $F(2000) = 2040$. Also, $S(50, 2000, 40) = 5\\,204\\,240$.
+
+Find the last 9 digits of $S({21}^7, 7^{21}, {12}^7)$.
+
+### --tests--
+
+`crazyFunction()` should return `291504964`.
+
+```js
+assert.strictEqual(crazyFunction(), 291504964);
+```
+
+## 40
+
+### --description--
+
+The Golomb's self-describing sequence ($G(n)$) is the only nondecreasing sequence of natural numbers such that $n$ appears exactly $G(n)$ times in the sequence. The values of $G(n)$ for the first few $n$ are
+
+$$\begin{array}{c}
+ n & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & \ldots \\\\
+ G(n) & 1 & 2 & 2 & 3 & 3 & 4 & 4 & 4 & 5 & 5 & 5 & 6 & 6 & 6 & 6 & \ldots
+\end{array}$$
+
+You are given that $G({10}^3) = 86$, $G({10}^6) = 6137$.
+
+You are also given that $\sum G(n^3) = 153\\,506\\,976$ for $1 ≤ n < {10}^3$.
+
+Find $\sum G(n^3)$ for $1 ≤ n < {10}^6$.
+
+### --tests--
+
+`golombsSequence()` should return `56098610614277016`.
+
+```js
+assert.strictEqual(golombsSequence(), 56098610614277016);
+```
+
+## 41
+
+### --description--
+
+Consider the number 50.
+
+${50}^2 = 2500 = 2^2 × 5^4$, so $φ(2500) = 2 × 4 × 5^3 = 8 × 5^3 = 2^3 × 5^3$. $φ$ denotes Euler's totient function.
+
+So 2500 is a square and $φ(2500)$ is a cube.
+
+Find the sum of all numbers $n$, $1 < n < {10}^{10}$ such that $φ(n^2)$ is a cube.
+
+
+### --tests--
+
+`totientOfSquare()` should return `5943040885644`.
+
+```js
+assert.strictEqual(totientOfSquare(), 5943040885644);
+```
+
+## 42
+
+### --description--
+
+For any positive integer $k$, a finite sequence $a_i$ of fractions $\frac{x_i}{y_i}$ is defined by:
+
+- $a_1 = \displaystyle\frac{1}{k}$ and
+- $a_i = \displaystyle\frac{(x_{i - 1} + 1)}{(y_{i - 1} - 1)}$ reduced to lowest terms for $i > 1$.
+
+When $a_i$ reaches some integer $n$, the sequence stops. (That is, when $y_i = 1$.)
+
+Define $f(k) = n$.
+
+For example, for $k = 20$:
+
+$$\frac{1}{20} → \frac{2}{19} → \frac{3}{18} = \frac{1}{6} → \frac{2}{5} → \frac{3}{4} → \frac{4}{3} → \frac{5}{2} → \frac{6}{1} = 6$$
+
+So $f(20) = 6$.
+
+Also $f(1) = 1$, $f(2) = 2$, $f(3) = 1$ and $\sum f(k^3) = 118\\,937$ for $1 ≤ k ≤ 100$.
+
+Find $\sum f(k^3)$ for $1 ≤ k ≤ 2 × {10}^6$.
+
+### --tests--
+
+`fractionalSequences()` should return `269533451410884200`.
+
+```js
+assert.strictEqual(fractionalSequences(), 269533451410884200);
+```
+
+## 43
+
+### --description--
+
+One variant of N.G. de Bruijn's silver dollar game can be described as follows:
+
+On a strip of squares a number of coins are placed, at most one coin per square. Only one coin, called the silver dollar, has any value. Two players take turns making moves. At each turn a player must make either a regular or a special move.
+
+A regular move consists of selecting one coin and moving it one or more squares to the left. The coin cannot move out of the strip or jump on or over another coin.
+
+Alternatively, the player can choose to make the special move of pocketing the leftmost coin rather than making a regular move. If no regular moves are possible, the player is forced to pocket the leftmost coin.
+
+The winner is the player who pockets the silver dollar.
+
+
+
+A winning configuration is an arrangement of coins on the strip where the first player can force a win no matter what the second player does.
+
+Let $W(n, c)$ be the number of winning configurations for a strip of $n$ squares, $c$ worthless coins and one silver dollar.
+
+You are given that $W(10, 2) = 324$ and $W(100, 10) = 1\\,514\\,704\\,946\\,113\\,500$.
+
+Find $W(1\\,000\\,000, 100)$ modulo the semiprime $1000\\,036\\,000\\,099 (= 1\\,000\\,003 \times 1\\,000\\,033)$.
+
+### --tests--
+
+`silverDollarGame()` should return `65579304332`.
+
+```js
+assert.strictEqual(silverDollarGame(), 65579304332);
+```
+
+## 44
+
+### --description--
+
+We define the Matrix Sum of a matrix as the maximum sum of matrix elements with each element being the only one in his row and column.
+
+For example, the Matrix Sum of the matrix below equals $3315 ( = 863 + 383 + 343 + 959 + 767)$:
+
+$$\begin{array}{rrrrr}
+ 7 & 53 & 183 & 439 & \color{lime}{863} \\\\
+ 497 & \color{lime}{383} & 563 & 79 & 973 \\\\
+ 287 & 63 & \color{lime}{343} & 169 & 583 \\\\
+ 627 & 343 & 773 & \color{lime}{959} & 943 \\\\
+ \color{lime}{767} & 473 & 103 & 699 & 303
+\end{array}$$
+
+Find the Matrix Sum of:
+
+$$\\begin{array}{r}
+ 7 & 53 & 183 & 439 & 863 & 497 & 383 & 563 & 79 & 973 & 287 & 63 & 343 & 169 & 583 \\\\
+ 627 & 343 & 773 & 959 & 943 & 767 & 473 & 103 & 699 & 303 & 957 & 703 & 583 & 639 & 913 \\\\
+ 447 & 283 & 463 & 29 & 23 & 487 & 463 & 993 & 119 & 883 & 327 & 493 & 423 & 159 & 743 \\\\
+ 217 & 623 & 3 & 399 & 853 & 407 & 103 & 983 & 89 & 463 & 290 & 516 & 212 & 462 & 350 \\\\
+ 960 & 376 & 682 & 962 & 300 & 780 & 486 & 502 & 912 & 800 & 250 & 346 & 172 & 812 & 350 \\\\
+ 870 & 456 & 192 & 162 & 593 & 473 & 915 & 45 & 989 & 873 & 823 & 965 & 425 & 329 & 803 \\\\
+ 973 & 965 & 905 & 919 & 133 & 673 & 665 & 235 & 509 & 613 & 673 & 815 & 165 & 992 & 326 \\\\
+ 322 & 148 & 972 & 962 & 286 & 255 & 941 & 541 & 265 & 323 & 925 & 281 & 601 & 95 & 973 \\\\
+ 445 & 721 & 11 & 525 & 473 & 65 & 511 & 164 & 138 & 672 & 18 & 428 & 154 & 448 & 848 \\\\
+ 414 & 456 & 310 & 312 & 798 & 104 & 566 & 520 & 302 & 248 & 694 & 976 & 430 & 392 & 198 \\\\
+ 184 & 829 & 373 & 181 & 631 & 101 & 969 & 613 & 840 & 740 & 778 & 458 & 284 & 760 & 390 \\\\
+ 821 & 461 & 843 & 513 & 17 & 901 & 711 & 993 & 293 & 157 & 274 & 94 & 192 & 156 & 574 \\\\
+ 34 & 124 & 4 & 878 & 450 & 476 & 712 & 914 & 838 & 669 & 875 & 299 & 823 & 329 & 699 \\\\
+ 815 & 559 & 813 & 459 & 522 & 788 & 168 & 586 & 966 & 232 & 308 & 833 & 251 & 631 & 107 \\\\
+ 813 & 883 & 451 & 509 & 615 & 77 & 281 & 613 & 459 & 205 & 380 & 274 & 302 & 35 & 805
+\end{array}$$
+
+### --tests--
+
+`matrixSum()` should return `13938`.
+
+```js
+assert.strictEqual(matrixSum(), 13938);
+```
+
+## 45
+
+### --description--
+
+The number 7 is special, because 7 is 111 written in base 2, and 11 written in base 6 (i.e. $7_{10} = {11}_6 = {111}_2$). In other words, 7 is a repunit in at least two bases $b > 1$.
+
+We shall call a positive integer with this property a strong repunit. It can be verified that there are 8 strong repunits below 50: {1, 7, 13, 15, 21, 31, 40, 43}. Furthermore, the sum of all strong repunits below 1000 equals 15864.
+
+Find the sum of all strong repunits below ${10}^{12}$.
+
+### --tests--
+
+`strongRepunits()` should return `336108797689259260`.
+
+```js
+assert.strictEqual(strongRepunits(), 336108797689259260);
+```
+
+## 46
+
+### --description--
+
+The largest integer $≤ 100$ that is only divisible by both the primes 2 and 3 is 96, as $96 = 32 \times 3 = 2^5 \times 3$.
+
+For two distinct primes $p$ and $q$ let $M(p, q, N)$ be the largest positive integer $≤ N$ only divisible by both $p$ and $q$ and $M(p, q, N)=0$ if such a positive integer does not exist.
+
+E.g. $M(2, 3, 100) = 96$.
+
+$M(3, 5, 100) = 75$ and not 90 because 90 is divisible by 2, 3 and 5. Also $M(2, 73, 100) = 0$ because there does not exist a positive integer $≤ 100$ that is divisible by both 2 and 73.
+
+Let $S(N)$ be the sum of all distinct $M(p, q, N)$. $S(100)=2262$.
+
+Find $S(10\\,000\\,000)$.
+
+### --tests--
+
+`integerDivisibleByTwoPrimes()` should return `11109800204052`.
+
+```js
+assert.strictEqual(integerDivisibleByTwoPrimes(), 11109800204052);
+```
+
+## 47
+
+### --description--
+
+Many numbers can be expressed as the sum of a square and a cube. Some of them in more than one way.
+
+Consider the palindromic numbers that can be expressed as the sum of a square and a cube, both greater than 1, in exactly 4 different ways.
+
+For example, 5229225 is a palindromic number and it can be expressed in exactly 4 different ways:
+
+$$\begin{align}
+ & {2285}^2 + {20}^3 \\\\
+ & {2223}^2 + {66}^3 \\\\
+ & {1810}^2 + {125}^3 \\\\
+ & {1197}^2 + {156}^3
+\end{align}$$
+
+Find the sum of the five smallest such palindromic numbers.
+
+### --tests--
+
+`sumOfSquareAndCube()` should return `1004195061`.
+
+```js
+assert.strictEqual(sumOfSquareAndCube(), 1004195061);
+```
+
+## 48
+
+### --description--
+
+An ant moves on a regular grid of squares that are coloured either black or white.
+
+The ant is always oriented in one of the cardinal directions (left, right, up or down) and moves from square to adjacent square according to the following rules:
+
+- if it is on a black square, it flips the color of the square to white, rotates 90° counterclockwise and moves forward one square.
+- if it is on a white square, it flips the color of the square to black, rotates 90° clockwise and moves forward one square.
+
+Starting with a grid that is entirely white, how many squares are black after ${10}^{18}$ moves of the ant?
+
+### --tests--
+
+`langtonsAnt()` should return `115384615384614940`.
+
+```js
+assert.strictEqual(langtonsAnt(), 115384615384614940);
+```
+
+## 49
+
+### --description--
+
+A list of size $n$ is a sequence of $n$ natural numbers. Examples are (2, 4, 6), (2, 6, 4), (10, 6, 15, 6), and (11).
+
+The greatest common divisor, or $gcd$, of a list is the largest natural number that divides all entries of the list. Examples: $gcd(2, 6, 4) = 2$, $gcd(10, 6, 15, 6) = 1$ and $gcd(11) = 11$.
+
+The least common multiple, or $lcm$, of a list is the smallest natural number divisible by each entry of the list. Examples: $lcm(2, 6, 4) = 12$, $lcm(10, 6, 15, 6) = 30$ and $lcm(11) = 11$.
+
+Let $f(G, L, N)$ be the number of lists of size $N$ with $gcd ≥ G$ and $lcm ≤ L$. For example:
+
+$$\begin{align}
+ & f(10, 100, 1) = 91 \\\\
+ & f(10, 100, 2) = 327 \\\\
+ & f(10, 100, 3) = 1135 \\\\
+ & f(10, 100, 1000)\bmod {101}^4 = 3\\,286\\,053
+\end{align}$$
+
+Find $f({10}^6, {10}^{12}, {10}^{18})\bmod {101}^4$.
+
+### --tests--
+
+`leastGreatestAndGreatestLeast()` should return `84664213`.
+
+```js
+assert.strictEqual(leastGreatestAndGreatestLeast(), 84664213);
+```
+
+## 50
+
+### --description--
+
+A hexagonal orchard of order $n$ is a triangular lattice made up of points within a regular hexagon with side $n$. The following is an example of a hexagonal orchard of order 5:
+
+
+
+Highlighted in green are the points which are hidden from the center by a point closer to it. It can be seen that for a hexagonal orchard of order 5, 30 points are hidden from the center.
+
+Let $H(n)$ be the number of points hidden from the center in a hexagonal orchard of order $n$.
+
+$H(5) = 30$. $H(10) = 138$. $H(1\\,000)$ = $1\\,177\\,848$.
+
+Find $H(100\\,000\\,000)$.
+
+### --tests--
+
+`hexagonalOrchards()` should return `11762187201804552`.
+
+```js
+assert.strictEqual(hexagonalOrchards(), 11762187201804552);
+```
+
+## 51
+
+### --description--
+
+Each one of the 25 sheep in a flock must be tested for a rare virus, known to affect 2% of the sheep population.
+
+An accurate and extremely sensitive PCR test exists for blood samples, producing a clear positive / negative result, but it is very time-consuming and expensive.
+
+Because of the high cost, the vet-in-charge suggests that instead of performing 25 separate tests, the following procedure can be used instead:
+
+The sheep are split into 5 groups of 5 sheep in each group. For each group, the 5 samples are mixed together and a single test is performed. Then,
+
+- If the result is negative, all the sheep in that group are deemed to be virus-free.
+- If the result is positive, 5 additional tests will be performed (a separate test for each animal) to determine the affected individual(s).
+
+Since the probability of infection for any specific animal is only 0.02, the first test (on the pooled samples) for each group will be:
+
+- Negative (and no more tests needed) with probability ${0.98}^5 = 0.9039207968$.
+- Positive (5 additional tests needed) with probability $1 - 0.9039207968 = 0.0960792032$.
+
+Thus, the expected number of tests for each group is $1 + 0.0960792032 × 5 = 1.480396016$.
+
+Consequently, all 5 groups can be screened using an average of only $1.480396016 × 5 = \mathbf{7.40198008}$ tests, which represents a huge saving of more than 70%!
+
+Although the scheme we have just described seems to be very efficient, it can still be improved considerably (always assuming that the test is sufficiently sensitive and no adverse effects are caused by mixing different samples). E.g.:
+
+- We may start by running a test on a mixture of all the 25 samples. It can be verified that in about 60.35% of the cases this test will be negative, thus no more tests will be needed. Further testing will only be required for the remaining 39.65% of the cases.
+- If we know that at least one animal in a group of 5 is infected and the first 4 individual tests come out negative, there is no need to run a test on the fifth animal (we know that it must be infected).
+- We can try a different number of groups / different number of animals in each group, adjusting those numbers at each level so that the total expected number of tests will be minimised.
+
+To simplify the very wide range of possibilities, there is one restriction we place when devising the most cost-efficient testing scheme: whenever we start with a mixed sample, all the sheep contributing to that sample must be fully screened (i.e. a verdict of infected / virus-free must be reached for all of them) before we start examining any other animals.
+
+For the current example, it turns out that the most cost-efficient testing scheme (we'll call it the optimal strategy) requires an average of just 4.155452 tests!
+
+Using the optimal strategy, let $T(s, p)$ represent the average number of tests needed to screen a flock of $s$ sheep for a virus having probability $p$ to be present in any individual. Thus, rounded to six decimal places, $T(25, 0.02) = 4.155452$ and $T(25, 0.10) = 12.702124$.
+
+Find $\sum T(10\\,000, p)$ for $p = 0.01, 0.02, 0.03, \ldots 0.50$. Give your answer rounded to six decimal places.
+
+### --tests--
+
+`bloodTests()` should return `378563.260589`.
+
+```js
+assert.strictEqual(bloodTests(), 378563.260589);
+```
+
+## 52
+
+### --description--
+
+A moon could be described by the sphere $C(r)$ with centre (0, 0, 0) and radius $r$.
+
+There are stations on the moon at the points on the surface of $C(r)$ with integer coordinates. The station at (0, 0, $r$) is called North Pole station, the station at (0, 0, $-r$) is called South Pole station.
+
+All stations are connected with each other via the shortest road on the great arc through the stations. A journey between two stations is risky. If $d$ is the length of the road between two stations, $\{\left(\frac{d}{πr}\right)}^2$ is a measure for the risk of the journey (let us call it the risk of the road). If the journey includes more than two stations, the risk of the journey is the sum of risks of the used roads.
+
+A direct journey from the North Pole station to the South Pole station has the length $πr$ and risk 1. The journey from the North Pole station to the South Pole station via (0, $r$, 0) has the same length, but a smaller risk:
+
+$${\left(\frac{\frac{1}{2}πr}{πr}\right)}^2+{\left(\frac{\frac{1}{2}πr}{πr}\right)}^2 = 0.5$$
+
+The minimal risk of a journey from the North Pole station to the South Pole station on $C(r)$ is $M(r)$.
+
+You are given that $M(7) = 0.178\\,494\\,399\\,8$ rounded to 10 digits behind the decimal point.
+
+Find $\displaystyle\sum_{n = 1}^{15} M(2^n - 1)$.
+
+Give your answer rounded to 10 digits behind the decimal point in the form a.bcdefghijk.
+
+### --tests--
+
+`riskyMoon()` should return `1.2759860331`.
+
+```js
+assert.strictEqual(riskyMoon(), 1.2759860331);
+```
+
+## 53
+
+### --description--
+
+Consider a honey bee's honeycomb where each cell is a perfect regular hexagon with side length 1.
+
+
+
+One particular cell is occupied by the queen bee. For a positive real number $L$, let $B(L)$ count the cells with distance $L$ from the queen bee cell (all distances are measured from centre to centre); you may assume that the honeycomb is large enough to accommodate for any distance we wish to consider.
+
+For example, $B(\sqrt{3}) = 6$, $B(\sqrt{21}) = 12$ and $B(111\\,111\\,111) = 54$.
+
+Find the number of $L ≤ 5 \times {10}^{11}$ such that $B(L) = 450$.
+
+### --tests--
+
+`distancesInHoneycomb()` should return `58065134`.
+
+```js
+assert.strictEqual(distancesInHoneycomb(), 58065134);
+```
+
+## 54
+
+### --description--
+
+Define $Co(n)$ to be the maximal possible sum of a set of mutually co-prime elements from $\\{1, 2, \ldots, n\\}$. For example $Co(10)$ is 30 and hits that maximum on the subset $\\{1, 5, 7, 8, 9\\}$.
+
+You are given that $Co(30) = 193$ and $Co(100) = 1356$.
+
+Find $Co(200\\,000)$.
+
+### --tests--
+
+`maximalCoprimeSubset()` should return `1726545007`.
+
+```js
+assert.strictEqual(maximalCoprimeSubset(), 1726545007);
+```
+
+## 55
+
+### --description--
+
+Let $a_n$ be the largest real root of a polynomial $g(x) = x^3 - 2^n \times x^2 + n$.
+
+For example, $a_2 = 3.86619826\ldots$
+
+Find the last eight digits of $\displaystyle\sum_{i = 1}^{30} \lfloor {a_i}^{987654321}\rfloor$.
+
+**Note:** $\lfloor a\rfloor$ represents the floor function.
+
+### --tests--
+
+`rootsOfCubicPolynomials()` should return `28010159`.
+
+```js
+assert.strictEqual(rootsOfCubicPolynomials(), 28010159);
+```
+
+## 56
+
+### --description--
+
+Consider the divisors of 30: 1, 2, 3, 5, 6, 10, 15, 30.
+
+It can be seen that for every divisor $d$ of 30, $d + \frac{30}{d}$ is prime.
+
+Find the sum of all positive integers $n$ not exceeding $100\\,000\\,000$ such that for every divisor $d$ of $n$, $d + \frac{n}{d}$ is prime.
+
+### --tests--
+
+`primeGeneratingIntegers()` should return `1739023853137`.
+
+```js
+assert.strictEqual(primeGeneratingIntegers(), 1739023853137);
+```
+
+## 57
+
+### --description--
+
+A cyclic number with $n$ digits has a very interesting property:
+
+When it is multiplied by 1, 2, 3, 4, ... $n$, all the products have exactly the same digits, in the same order, but rotated in a circular fashion!
+
+The smallest cyclic number is the 6-digit number 142857:
+
+$$\begin{align}
+ & 142857 × 1 = 142857 \\\\
+ & 142857 × 2 = 285714 \\\\
+ & 142857 × 3 = 428571 \\\\
+ & 142857 × 4 = 571428 \\\\
+ & 142857 × 5 = 714285 \\\\
+ & 142857 × 6 = 857142
+\end{align}$$
+
+The next cyclic number is 0588235294117647 with 16 digits:
+
+$$\begin{align}
+ & 0588235294117647 × 1 = 0588235294117647 \\\\
+ & 0588235294117647 × 2 = 1176470588235294 \\\\
+ & 0588235294117647 × 3 = 1764705882352941 \\\\
+ & \ldots \\\\
+ & 0588235294117647 × 16 = 9411764705882352
+\end{align}$$
+
+Note that for cyclic numbers, leading zeros are important.
+
+There is only one cyclic number for which, the eleven leftmost digits are 00000000137 and the five rightmost digits are 56789 (i.e., it has the form $00000000137\ldots56789$ with an unknown number of digits in the middle). Find the sum of all its digits.
+
+### --tests--
+
+`cyclicNumbers()` should return `3284144505`.
+
+```js
+assert.strictEqual(cyclicNumbers(), 3284144505);
+```
+
+## 58
+
+### --description--
+
+An infinite number of people (numbered 1, 2, 3, etc.) are lined up to get a room at Hilbert's newest infinite hotel. The hotel contains an infinite number of floors (numbered 1, 2, 3, etc.), and each floor contains an infinite number of rooms (numbered 1, 2, 3, etc.).
+
+Initially the hotel is empty. Hilbert declares a rule on how the $n^{\text{th}}$ person is assigned a room: person $n$ gets the first vacant room in the lowest numbered floor satisfying either of the following:
+
+- the floor is empty
+- the floor is not empty, and if the latest person taking a room in that floor is person $m$, then $m + n$ is a perfect square
+
+Person 1 gets room 1 in floor 1 since floor 1 is empty.
+
+Person 2 does not get room 2 in floor 1 since 1 + 2 = 3 is not a perfect square.
+
+Person 2 instead gets room 1 in floor 2 since floor 2 is empty.
+
+Person 3 gets room 2 in floor 1 since 1 + 3 = 4 is a perfect square.
+
+Eventually, every person in the line gets a room in the hotel.
+
+Define $P(f, r)$ to be $n$ if person $n$ occupies room $r$ in floor $f$, and 0 if no person occupies the room. Here are a few examples:
+
+$$\begin{align}
+ & P(1, 1) = 1 \\\\
+ & P(1, 2) = 3 \\\\
+ & P(2, 1) = 2 \\\\
+ & P(10, 20) = 440 \\\\
+ & P(25, 75) = 4863 \\\\
+ & P(99, 100) = 19454
+\end{align}$$
+
+Find the sum of all $P(f, r)$ for all positive $f$ and $r$ such that $f × r = 71\\,328\\,803\\,586\\,048$ and give the last 8 digits as your answer.
+
+### --tests--
+
+`hilbertsNewHotel()` should return `40632119`.
+
+```js
+assert.strictEqual(hilbertsNewHotel(), 40632119);
+```
+
+## 59
+
+### --description--
+
+Given two points ($x_1$, $y_1$, $z_1$) and ($x_2$, $y_2$, $z_2$) in three dimensional space, the Manhattan distance between those points is defined as $|x_1 - x_2| + |y_1 - y_2| + |z_1 - z_2|$.
+
+Let $C(r)$ be a sphere with radius $r$ and center in the origin $O(0, 0, 0)$.
+
+Let $I(r)$ be the set of all points with integer coordinates on the surface of $C(r)$.
+
+Let $S(r)$ be the sum of the Manhattan distances of all elements of $I(r)$ to the origin $O$.
+
+E.g. $S(45)=34518$.
+
+Find $S({10}^{10})$.
+
+### --tests--
+
+`scarySphere()` should return `878825614395267100`.
+
+```js
+assert.strictEqual(scarySphere(), 878825614395267100);
+```
+
+## 60
+
+### --description--
+
+The Thue-Morse sequence $\\{T_n\\}$ is a binary sequence satisfying:
+
+- $T_0 = 0$
+- $T_{2n} = T_n$
+- $T_{2n + 1} = 1 - T_n$
+
+The first several terms of $\\{T_n\\}$ are given as follows: $01101001\color{red}{10010}1101001011001101001\ldots$.
+
+We define $\\{A_n\\}$ as the sorted sequence of integers such that the binary expression of each element appears as a subsequence in $\\{T_n\\}$. For example, the decimal number 18 is expressed as 10010 in binary. 10010 appears in $\\{T_n\\}$ ($T_8$ to $T_{12}$), so 18 is an element of $\\{A_n\\}$. The decimal number 14 is expressed as 1110 in binary. 1110 never appears in $\\{T_n\\}$, so 14 is not an element of $\\{A_n\\}$.
+
+The first several terms of $A_n$ are given as follows:
+
+$$\begin{array}{cr}
+ n & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & \ldots \\\\
+ A_n & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 9 & 10 & 11 & 12 & 13 & 18 & \ldots
+\end{array}$$
+
+We can also verify that $A_{100} = 3251$ and $A_{1000} = 80\\,852\\,364\\,498$.
+
+Find the last 9 digits of $\displaystyle\sum_{k = 1}^{18} A_{{10}^k}$.
+
+### --tests--
+
+`subsequenceOfThueMorseSequence()` should return `178476944`.
+
+```js
+assert.strictEqual(subsequenceOfThueMorseSequence(), 178476944);
+```
+
+## 61
+
+### --description--
+
+Consider the number 54.
+
+54 can be factored in 7 distinct ways into one or more factors larger than 1:
+
+$$54, 2 × 27, 3 × 18, 6 × 9, 3 × 3 × 6, 2 × 3 × 9 \text{ and } 2 × 3 × 3 × 3$$
+
+If we require that the factors are all squarefree only two ways remain: $3 × 3 × 6$ and $2 × 3 × 3 × 3$.
+
+Let's call $Fsf(n)$ the number of ways $n$ can be factored into one or more squarefree factors larger than 1, so $Fsf(54) = 2$.
+
+Let $S(n)$ be $\sum Fsf(k)$ for $k = 2$ to $n$.
+
+$S(100) = 193$.
+
+Find $S(10\\,000\\,000\\,000)$.
+
+### --tests--
+
+`squarefreeFactors()` should return `457895958010`.
+
+```js
+assert.strictEqual(squarefreeFactors(), 457895958010);
+```
+
+## 62
+
+### --description--
+
+A cubic Bézier curve is defined by four points: $P_0$, $P_1$, $P_2$ and $P_3$.
+
+The curve is constructed as follows:
+
+
+
+On the segments $P_0P_1$, $P_1P_2$ and $P_2P_3$ the points $Q_0$,$Q_1$ and $Q_2$ are drawn such that $\frac{P_0Q_0}{P_0P_1} = \frac{P_1Q_1}{P_1P_2} = \frac{P_2Q_2}{P_2P_3} = t$, with $t$ in [0,1].
+
+On the segments $Q_0Q_1$ and $Q_1Q_2$ the points $R_0$ and $R_1$ are drawn such that $\frac{Q_0R_0}{Q_0Q_1} = \frac{Q_1R_1}{Q_1Q_2} = t$ for the same value of $t$.
+
+On the segment $R_0R_1$ the point $B$ is drawn such that $\frac{R_0B}{R_0R_1} = t$ for the same value of $t$.
+
+The Bézier curve defined by the points $P_0$, $P_1$, $P_2$, $P_3$ is the locus of $B$ as $Q_0$ takes all possible positions on the segment $P_0P_1$. (Please note that for all points the value of $t$ is the same.)
+
+From the construction it is clear that the Bézier curve will be tangent to the segments $P_0P_1$ in $P_0$ and $P_2P_3$ in $P_3$.
+
+A cubic Bézier curve with $P_0 = (1, 0)$, $P_1 = (1, v)$, $P_2 = (v, 1)$ and $P_3 = (0, 1)$ is used to approximate a quarter circle. The value $v > 0$ is chosen such that the area enclosed by the lines $OP_0$, $OP_3$ and the curve is equal to $\frac{π}{4}$ (the area of the quarter circle).
+
+By how many percent does the length of the curve differ from the length of the quarter circle? That is, if $L$ is the length of the curve, calculate $100 × \displaystyle\frac{L − \frac{π}{2}}{\frac{π}{2}}$. Give your answer rounded to 10 digits behind the decimal point.
+
+### --tests--
+
+`bezierCurves()` should return `0.0000372091`.
+
+```js
+assert.strictEqual(bezierCurves(), 0.0000372091);
+```
+
+## 63
+
+### --description--
+
+There are $N$ seats in a row. $N$ people come after each other to fill the seats according to the following rules:
+
+1. If there is any seat whose adjacent seat(s) are not occupied take such a seat.
+2. If there is no such seat and there is any seat for which only one adjacent seat is occupied take such a seat.
+3. Otherwise take one of the remaining available seats.
+
+Let $T(N)$ be the number of possibilities that $N$ seats are occupied by $N$ people with the given rules. The following figure shows $T(4) = 8$.
+
+
+
+We can verify that $T(10) = 61\\,632$ and $T(1\\,000)\bmod 100\\,000\\,007 = 47\\,255\\,094$.
+
+Find $T(1\\,000\\,000)\bmod 100\\,000\\,007$.
+
+### --tests--
+
+`comfortableDistance()` should return `44855254`.
+
+```js
+assert.strictEqual(comfortableDistance(), 44855254);
+```
+
+## 64
+
+### --description--
+
+The binomial coefficient $\displaystyle\binom{{10}^{18}}{{10}^9}$ is a number with more than 9 billion ($9 × {10}^9$) digits.
+
+Let $M(n, k, m)$ denote the binomial coefficient $\displaystyle\binom{n}{k}$ modulo $m$.
+
+Calculate $\sum M({10}^{18}, {10}^9, p \times q \times r)$ for $1000 < p < q < r < 5000$ and $p$, $q$, $r$ prime.
+
+### --tests--
+
+`hugeBinomialCoefficient()` should return `162619462356610300`.
+
+```js
+assert.strictEqual(hugeBinomialCoefficient(), 162619462356610300);
+```
+
+## 65
+
+### --description--
+
+Two players, Anton and Bernhard, are playing the following game.
+
+There is one pile of $n$ stones.
+
+The first player may remove any positive number of stones, but not the whole pile.
+
+Thereafter, each player may remove at most twice the number of stones his opponent took on the previous move.
+
+The player who removes the last stone wins.
+
+E.g. $n = 5$
+
+If the first player takes anything more than one stone the next player will be able to take all remaining stones.
+
+If the first player takes one stone, leaving four, his opponent will take also one stone, leaving three stones.
+
+The first player cannot take all three because he may take at most $2 \times 1 = 2$ stones. So let's say he also takes one stone, leaving 2.
+
+The second player can take the two remaining stones and wins.
+
+So 5 is a losing position for the first player.
+
+For some winning positions there is more than one possible move for the first player.
+
+E.g. when $n = 17$ the first player can remove one or four stones.
+
+Let $M(n)$ be the maximum number of stones the first player can take from a winning position at his first turn and $M(n) = 0$ for any other position.
+
+$\sum M(n)$ for $n ≤ 100$ is 728.
+
+Find $\sum M(n)$ for $n ≤ {10}^{18}$. Give your answer modulo ${10}^8$.
+
+### --tests--
+
+`stoneGameThree()` should return `88351299`.
+
+```js
+assert.strictEqual(stoneGameThree(), 88351299);
+```
+
+## 66
+
+### --description--
+
+Bozo sort, not to be confused with the slightly less efficient bogo sort, consists out of checking if the input sequence is sorted and if not swapping randomly two elements. This is repeated until eventually the sequence is sorted.
+
+If we consider all permutations of the first 4 natural numbers as input the expectation value of the number of swaps, averaged over all $4!$ input sequences is $24.75$.
+
+The already sorted sequence takes 0 steps.
+
+In this problem we consider the following variant on bozo sort.
+
+If the sequence is not in order we pick three elements at random and shuffle these three elements randomly.
+
+All $3! = 6$ permutations of those three elements are equally likely.
+
+The already sorted sequence will take 0 steps.
+
+If we consider all permutations of the first 4 natural numbers as input the expectation value of the number of shuffles, averaged over all $4!$ input sequences is $27.5$.
+
+Consider as input sequences the permutations of the first 11 natural numbers.
+
+Averaged over all $11!$ input sequences, what is the expected number of shuffles this sorting algorithm will perform? Give your answer rounded to the nearest integer.
+
+### --tests--
+
+`bozoSort()` should return `48271207`.
+
+```js
+assert.strictEqual(bozoSort(), 48271207);
+```
+
+## 67
+
+### --description--
+
+The harmonic series $1 + \dfrac{1}{2} + \dfrac{1}{3} + \dfrac{1}{4} + \ldots$ is well known to be divergent.
+
+If we however omit from this series every term where the denominator has a 9 in it, the series remarkably enough converges to approximately 22.9206766193. This modified harmonic series is called the Kempner series.
+
+Let us now consider another modified harmonic series by omitting from the harmonic series every term where the denominator has 3 or more equal consecutive digits. One can verify that out of the first 1200 terms of the harmonic series, only 20 terms will be omitted.
+
+These 20 omitted terms are:
+
+$$\dfrac{1}{111}, \dfrac{1}{222}, \dfrac{1}{333}, \dfrac{1}{444}, \dfrac{1}{555}, \dfrac{1}{666}, \dfrac{1}{777}, \dfrac{1}{888}, \dfrac{1}{999}, \dfrac{1}{1000}, \dfrac{1}{1110}, \\\\
+\dfrac{1}{1111}, \dfrac{1}{1112}, \dfrac{1}{1113}, \dfrac{1}{1114}, \dfrac{1}{1115}, \dfrac{1}{1116}, \dfrac{1}{1117}, \dfrac{1}{1118}, \dfrac{1}{1119}$$
+
+This series converges as well.
+
+Find the value the series converges to. Give your answer rounded to 10 digits behind the decimal point.
+
+### --tests--
+
+`kempnerLikeSeries()` should return `253.6135092068`.
+
+```js
+assert.strictEqual(kempnerLikeSeries(), 253.6135092068);
+```
+
+## 68
+
+### --description--
+
+In a standard 52 card deck of playing cards, a set of 4 cards is a Badugi if it contains 4 cards with no pairs and no two cards of the same suit.
+
+Let $f(n)$ be the number of ways to choose $n$ cards with a 4 card subset that is a Badugi. For example, there are $2\\,598\\,960$ ways to choose five cards from a standard 52 card deck, of which $514\\,800$ contain a 4 card subset that is a Badugi, so $f(5) = 514800$.
+
+Find $\sum f(n)$ for $4 ≤ n ≤ 13$.
+
+### --tests--
+
+`badugi()` should return `862400558448`.
+
+```js
+assert.strictEqual(badugi(), 862400558448);
+```
+
+## 69
+
+### --description--
+
+Let us define a geometric triangle as an integer sided triangle with sides $a ≤ b ≤ c$ so that its sides form a geometric progression, i.e. $b^2 = a \times c$.
+
+An example of such a geometric triangle is the triangle with sides $a = 144$, $b = 156$ and $c = 169$.
+
+There are $861\\,805$ geometric triangles with $\text{perimeter} ≤ {10}^6$.
+
+How many geometric triangles exist with $\text{perimeter} ≤ 2.5 \times {10}^{13}$?
+
+### --tests--
+
+`geometricTriangles()` should return `41791929448408`.
+
+```js
+assert.strictEqual(geometricTriangles(), 41791929448408);
+```
+
+## 70
+
+### --description--
+
+Oregon licence plates consist of three letters followed by a three digit number (each digit can be from [0...9]).
+
+While driving to work Seth plays the following game:
+
+Whenever the numbers of two licence plates seen on his trip add to 1000 that's a win.
+
+E.g. `MIC-012` and `HAN-988` is a win and `RYU-500` and `SET-500` too (as long as he sees them in the same trip).
+
+Find the expected number of plates he needs to see for a win. Give your answer rounded to 8 decimal places behind the decimal point.
+
+**Note:** We assume that each licence plate seen is equally likely to have any three digit number on it.
+
+### --tests--
+
+`licensePlates()` should return `40.66368097`.
+
+```js
+assert.strictEqual(licensePlates(), 40.66368097);
+```
+
+## 71
+
+### --description--
+
+Let $R(M, N)$ be the number of lattice points ($x$, $y$) which satisfy $M \lt x \le N$, $M \lt y \le N$ and $\left\lfloor\frac{y^2}{x^2}\right\rfloor$ is odd.
+
+We can verify that $R(0, 100) = 3\\,019$ and $R(100, 10\\,000) = 29\\,750\\,422$.
+
+Find $R(2 \times {10}^6, {10}^9)$.
+
+**Note:** $\lfloor x\rfloor$ represents the floor function.
+
+### --tests--
+
+`pencilsOfRays()` should return `301450082318807040`.
+
+```js
+assert.strictEqual(pencilsOfRays(), 301450082318807040);
+```
+
+## 72
+
+### --description--
+
+Every triangle has a circumscribed circle that goes through the three vertices. Consider all integer sided triangles for which the radius of the circumscribed circle is integral as well.
+
+Let $S(n)$ be the sum of the radii of the circumscribed circles of all such triangles for which the radius does not exceed $n$.
+
+$S(100) = 4\\,950$ and $S(1\\,200) = 1\\,653\\,605$.
+
+Find $S({10}^7)$.
+
+### --tests--
+
+`circumscribedCircles()` should return `727227472448913`.
+
+```js
+assert.strictEqual(circumscribedCircles(), 727227472448913);
+```
+
+## 73
+
+### --description--
+
+An integer partition of a number $n$ is a way of writing $n$ as a sum of positive integers.
+
+Partitions that differ only in the order of their summands are considered the same. A partition of $n$ into distinct parts is a partition of $n$ in which every part occurs at most once.
+
+The partitions of 5 into distinct parts are:
+
+5, 4 + 1 and 3 + 2.
+
+Let $f(n)$ be the maximum product of the parts of any such partition of $n$ into distinct parts and let $m(n)$ be the number of elements of any such partition of $n$ with that product.
+
+So $f(5) = 6$ and $m(5) = 2$.
+
+For $n = 10$ the partition with the largest product is $10 = 2 + 3 + 5$, which gives $f(10) = 30$ and $m(10) = 3$. And their product, $f(10) \times m(10) = 30 \times 3 = 90$
+
+It can be verified that $\sum f(n) \times m(n)$ for $1 ≤ n ≤ 100 = 1\\,683\\,550\\,844\\,462$.
+
+Find $\sum f(n) \times m(n)$ for $1 ≤ n ≤ {10}^{14}$. Give your answer modulo $982\\,451\\,653$, the 50 millionth prime.
+
+### --tests--
+
+`maximumIntegerPartitionProduct()` should return `334420941`.
+
+```js
+assert.strictEqual(maximumIntegerPartitionProduct(), 334420941);
+```
+
+## 74
+
+### --description--
+
+Let $S_n$ be an integer sequence produced with the following pseudo-random number generator:
+
+$$\begin{align}
+ S_0 & = 290\\,797 \\\\
+ S_{n + 1} & = {S_n}^2\bmod 50\\,515\\,093
+\end{align}$$
+
+Let $A(i, j)$ be the minimum of the numbers $S_i, S_{i + 1}, \ldots, S_j$ for $i ≤ j$. Let $M(N) = \sum A(i, j)$ for $1 ≤ i ≤ j ≤ N$.
+
+We can verify that $M(10) = 432\\,256\\,955$ and $M(10\\,000) = 3\\,264\\,567\\,774\\,119$.
+
+Find $M(2\\,000\\,000\\,000)$.
+
+### --tests--
+
+`minimumOfSubsequences()` should return `7435327983715286000`.
+
+```js
+assert.strictEqual(minimumOfSubsequences(), 7435327983715286000);
+```
+
+## 75
+
+### --description--
+
+Consider the following set of dice with nonstandard pips:
+
+$$\begin{array}{}
+ \text{Die A: } & 1 & 4 & 4 & 4 & 4 & 4 \\\\
+ \text{Die B: } & 2 & 2 & 2 & 5 & 5 & 5 \\\\
+ \text{Die C: } & 3 & 3 & 3 & 3 & 3 & 6 \\\\
+\end{array}$$
+
+A game is played by two players picking a die in turn and rolling it. The player who rolls the highest value wins.
+
+If the first player picks die $A$ and the second player picks die $B$ we get
+
+$P(\text{second player wins}) = \frac{7}{12} > \frac{1}{2}$
+
+If the first player picks die $B$ and the second player picks die $C$ we get
+
+$P(\text{second player wins}) = \frac{7}{12} > \frac{1}{2}$
+
+If the first player picks die $C$ and the second player picks die $A$ we get
+
+$P(\text{second player wins}) = \frac{25}{36} > \frac{1}{2}$
+
+So whatever die the first player picks, the second player can pick another die and have a larger than 50% chance of winning. A set of dice having this property is called a nontransitive set of dice.
+
+We wish to investigate how many sets of nontransitive dice exist. We will assume the following conditions:
+
+- There are three six-sided dice with each side having between 1 and $N$ pips, inclusive.
+- Dice with the same set of pips are equal, regardless of which side on the die the pips are located.
+- The same pip value may appear on multiple dice; if both players roll the same value neither player wins.
+- The sets of dice $\\{A, B, C\\}$, $\\{B, C, A\\}$ and $\\{C, A, B\\}$ are the same set.
+
+For $N = 7$ we find there are 9780 such sets.
+
+How many are there for $N = 30$?
+
+### --tests--
+
+`nontransitiveSetsOfDice()` should return `973059630185670`.
+
+```js
+assert.strictEqual(nontransitiveSetsOfDice(), 973059630185670);
+```
+
+## 76
+
+### --description--
+
+There are 16 positive integers that do not have a zero in their digits and that have a digital sum equal to 5, namely:
+
+5, 14, 23, 32, 41, 113, 122, 131, 212, 221, 311, 1112, 1121, 1211, 2111 and 11111.
+
+Their sum is 17891.
+
+Let $f(n)$ be the sum of all positive integers that do not have a zero in their digits and have a digital sum equal to $n$.
+
+Find $\displaystyle\sum_{i=1}^{17} f(13^i)$. Give the last 9 digits as your answer.
+
+### --tests--
+
+`experience13()` should return `732385277`.
+
+```js
+assert.strictEqual(experience13(), 732385277);
+```
+
+## 77
+
+### --description--
+
+Let $T(n)$ be the $n^{\text{th}}$ triangle number, so $T(n) = \frac{n(n + 1)}{2}$.
+
+Let $dT(n)$ be the number of divisors of $T(n)$. E.g.: $T(7) = 28$ and $dT(7) = 6$.
+
+Let $Tr(n)$ be the number of triples ($i$, $j$, $k$) such that $1 ≤ i < j < k ≤ n$ and $dT(i) > dT(j) > dT(k)$. $Tr(20) = 14$, $Tr(100) = 5\\,772$ and $Tr(1000) = 11\\,174\\,776$.
+
+Find $Tr(60\\,000\\,000)$. Give the last 18 digits of your answer.
+
+### --tests--
+
+`triangleTriples()` should return `147534623725724700`.
+
+```js
+assert.strictEqual(triangleTriples(), 147534623725724700);
+```
+
+## 78
+
+### --description--
+
+Let $f(n)$ be the number of couples ($x$, $y$) with $x$ and $y$ positive integers, $x ≤ y$ and the least common multiple of $x$ and $y$ equal to $n$.
+
+Let $g$ be the summatory function of $f$, i.e.: $g(n) = \sum f(i)$ for $1 ≤ i ≤ n$.
+
+You are given that $g({10}^6) = 37\\,429\\,395$.
+
+Find $g({10}^{12})$.
+
+### --tests--
+
+`leastCommonMultipleCount()` should return `132314136838185`.
+
+```js
+assert.strictEqual(leastCommonMultipleCount(), 132314136838185);
+```
+
+## 79
+
+### --description--
+
+An $m×n$ maze is an $m×n$ rectangular grid with walls placed between grid cells such that there is exactly one path from the top-left square to any other square. The following are examples of a 9×12 maze and a 15×20 maze:
+
+
+
+Let $C(m, n)$ be the number of distinct $m×n$ mazes. Mazes which can be formed by rotation and reflection from another maze are considered distinct.
+
+It can be verified that $C(1, 1) = 1$, $C(2, 2) = 4$, $C(3, 4) = 2415$, and $C(9, 12) = 2.5720\mathrm{e}\\,46$ (in scientific notation rounded to 5 significant digits).
+
+Find $C(100, 500)$ and write your answer as a string in scientific notation rounded to 5 significant digits.
+
+When giving your answer, use a lowercase e to separate mantissa and exponent. E.g. if the answer is 1234567891011 then the answer format would be the string `1.2346e12`.
+
+### --tests--
+
+`amazingMazes()` should return a string.
+
+```js
+assert(typeof amazingMazes() === 'string');
+```
+
+`amazingMazes()` should return the string `6.3202e25093`.
+
+```js
+assert.strictEqual(amazingMazes(), '6.3202e25093');
+```
+
+## 80
+
+### --description--
+
+For a prime $p$ let $S(p) = (\sum (p - k)!)\bmod (p)$ for $1 ≤ k ≤ 5$.
+
+For example, if $p = 7$,
+
+$$(7 - 1)! + (7 - 2)! + (7 - 3)! + (7 - 4)! + (7 - 5)! = 6! + 5! + 4! + 3! + 2! = 720 + 120 + 24 + 6 + 2 = 872$$
+
+As $872\bmod (7) = 4$, $S(7) = 4$.
+
+It can be verified that $\sum S(p) = 480$ for $5 ≤ p < 100$.
+
+Find $\sum S(p)$ for $5 ≤ p < {10}^8$.
+
+### --tests--
+
+`primeKFactorial()` should return `139602943319822`.
+
+```js
+assert.strictEqual(primeKFactorial(), 139602943319822);
+```
+
+## 81
+
+### --description--
+
+A polygon is a flat shape consisting of straight line segments that are joined to form a closed chain or circuit. A polygon consists of at least three sides and does not self-intersect.
+
+A set $S$ of positive numbers is said to generate a polygon $P$ if:
+
+- no two sides of $P$ are the same length,
+- the length of every side of $P$ is in $S$, and
+- $S$ contains no other value.
+
+For example:
+
+The set {3, 4, 5} generates a polygon with sides 3, 4, and 5 (a triangle).
+
+The set {6, 9, 11, 24} generates a polygon with sides 6, 9, 11, and 24 (a quadrilateral).
+
+The sets {1, 2, 3} and {2, 3, 4, 9} do not generate any polygon at all.
+
+Consider the sequence $s$, defined as follows:
+
+- $s_1 = 1$, $s_2 = 2$, $s_3 = 3$
+- $s_n = s_{n - 1} + s_{n - 3}$ for $n > 3$.
+
+Let $U_n$ be the set $\\{s_1, s_2, \ldots, s_n\\}$. For example, $U_{10} = \\{1, 2, 3, 4, 6, 9, 13, 19, 28, 41\\}$.
+
+Let $f(n)$ be the number of subsets of $U_n$ which generate at least one polygon.
+
+For example, $f(5) = 7$, $f(10) = 501$ and $f(25) = 18\\,635\\,853$.
+
+Find the last 9 digits of $f({10}^{18})$.
+
+### --tests--
+
+`generatingPolygons()` should return `697003956`.
+
+```js
+assert.strictEqual(generatingPolygons(), 697003956);
+```
+
+## 82
+
+### --description--
+
+Let $f_5(n)$ be the largest integer $x$ for which $5^x$ divides $n$.
+
+For example, $f_5(625\\,000) = 7$.
+
+Let $T_5(n)$ be the number of integers $i$ which satisfy $f_5((2 \times i - 1)!) < 2 \times f_5(i!)$ and $1 ≤ i ≤ n$.
+
+It can be verified that $T_5({10}^3) = 68$ and $T_5({10}^9) = 2\\,408\\,210$.
+
+Find $T_5({10}^{18})$.
+
+### --tests--
+
+`factorialDivisibilityComparison()` should return `22173624649806`.
+
+```js
+assert.strictEqual(factorialDivisibilityComparison(), 22173624649806);
+```
+
+## 83
+
+### --description--
+
+Define the sequence $a(n)$ as the number of adjacent pairs of ones in the binary expansion of $n$ (possibly overlapping).
+
+E.g.: $a(5) = a({101}_2) = 0$, $a(6) = a({110}_2) = 1$, $a(7) = a({111}_2) = 2$
+
+Define the sequence $b(n) = {(-1)}^{a(n)}$. This sequence is called the Rudin-Shapiro sequence.
+
+Also consider the summatory sequence of $b(n)$: $s(n) = \displaystyle\sum_{i = 0}^{n} b(i)$.
+
+The first couple of values of these sequences are:
+
+$$\begin{array}{lr}
+ n & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\\\
+ a(n) & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 2 \\\\
+ b(n) & 1 & 1 & 1 & -1 & 1 & 1 & -1 & 1 \\\\
+ s(n) & 1 & 2 & 3 & 2 & 3 & 4 & 3 & 4
+\end{array}$$
+
+The sequence $s(n)$ has the remarkable property that all elements are positive and every positive integer $k$ occurs exactly $k$ times.
+
+Define $g(t, c)$, with $1 ≤ c ≤ t$, as the index in $s(n)$ for which $t$ occurs for the $c$'th time in $s(n)$.
+
+E.g.: $g(3, 3) = 6$, $g(4, 2) = 7$ and $g(54321, 12345) = 1\\,220\\,847\\,710$.
+
+Let $F(n)$ be the fibonacci sequence defined by:
+
+$$\begin{align}
+ & F(0) = F(1) = 1 \text{ and} \\\\
+ & F(n) = F(n - 1) + F(n - 2) \text{ for } n > 1.
+\end{align}$$
+
+Define $GF(t) = g(F(t), F(t - 1))$.
+
+Find $\sum GF(t)$ for$ 2 ≤ t ≤ 45$.
+
+### --tests--
+
+`rudinShapiroSequence()` should return `3354706415856333000`.
+
+```js
+assert.strictEqual(rudinShapiroSequence(), 3354706415856333000);
+```
+
+## 84
+
+### --description--
+
+For any triangle $T$ in the plane, it can be shown that there is a unique ellipse with largest area that is completely inside $T$.
+
+
+
+For a given $n$, consider triangles $T$ such that:
+
+- the vertices of $T$ have integer coordinates with absolute value $≤ n$, and
+- the foci1 of the largest-area ellipse inside $T$ are $(\sqrt{13}, 0)$ and $(-\sqrt{13}, 0)$.
+
+Let $A(n)$ be the sum of the areas of all such triangles.
+
+For example, if $n = 8$, there are two such triangles. Their vertices are (-4,-3), (-4,3), (8,0) and (4,3), (4,-3), (-8,0), and the area of each triangle is 36. Thus $A(8) = 36 + 36 = 72$.
+
+It can be verified that $A(10) = 252$, $A(100) = 34\\,632$ and $A(1000) = 3\\,529\\,008$.
+
+Find $A(1\\,000\\,000\\,000)$.
+
+1The foci (plural of focus) of an ellipse are two points $A$ and $B$ such that for every point $P$ on the boundary of the ellipse, $AP + PB$ is constant.
+
+### --tests--
+
+`ellipsesInsideTriangles()` should return `3776957309612154000`.
+
+```js
+assert.strictEqual(ellipsesInsideTriangles(), 3776957309612154000);
+```
+
+## 85
+
+### --description--
+
+Let $n$ be an integer and $S(n)$ be the set of factors of $n$.
+
+A subset $A$ of $S(n)$ is called an antichain of $S(n)$ if $A$ contains only one element or if none of the elements of $A$ divides any of the other elements of $A$.
+
+For example: $S(30) = \\{1, 2, 3, 5, 6, 10, 15, 30\\}$
+
+$\\{2, 5, 6\\}$ is not an antichain of $S(30)$.
+
+$\\{2, 3, 5\\}$ is an antichain of $S(30)$.
+
+Let $N(n)$ be the maximum length of an antichain of $S(n)$.
+
+Find $\sum N(n)$ for $1 ≤ n ≤ {10}^8$
+
+### --tests--
+
+`maximumLengthOfAntichain()` should return `528755790`.
+
+```js
+assert.strictEqual(maximumLengthOfAntichain(), 528755790);
+```
+
+## 86
+
+### --description--
+
+A Harshad or Niven number is a number that is divisible by the sum of its digits.
+
+201 is a Harshad number because it is divisible by 3 (the sum of its digits.)
+
+When we truncate the last digit from 201, we get 20, which is a Harshad number.
+
+When we truncate the last digit from 20, we get 2, which is also a Harshad number.
+
+Let's call a Harshad number that, while recursively truncating the last digit, always results in a Harshad number a right truncatable Harshad number.
+
+Also:
+
+$\frac{201}{3} = 67$ which is prime.
+
+Let's call a Harshad number that, when divided by the sum of its digits, results in a prime a strong Harshad number.
+
+Now take the number 2011 which is prime. When we truncate the last digit from it we get 201, a strong Harshad number that is also right truncatable. Let's call such primes strong, right truncatable Harshad primes.
+
+You are given that the sum of the strong, right truncatable Harshad primes less than 10000 is 90619.
+
+Find the sum of the strong, right truncatable Harshad primes less than ${10}^{14}$.
+
+### --tests--
+
+`harshadNumbers()` should return `696067597313468`.
+
+```js
+assert.strictEqual(harshadNumbers(), 696067597313468);
+```
+
+## 87
+
+### --description--
+
+Consider all lattice points ($a$, $b$, $c$) with $0 ≤ a, b, c ≤ N$.
+
+From the origin $O(0, 0, 0)$ all lines are drawn to the other lattice points. Let $D(N)$ be the number of distinct such lines.
+
+You are given that $D(1\\,000\\,000) = 831\\,909\\,254\\,469\\,114\\,121$.
+
+Find $D({10}^{10})$. Give as your answer the first nine digits followed by the last nine digits.
+
+### --tests--
+
+`distinctLines()` should return `831907372805130000`.
+
+```js
+assert.strictEqual(distinctLines(), 831907372805130000);
+```
+
+## 88
+
+### --description--
+
+An unbiased single 4-sided die is thrown and its value, $T$, is noted.
+
+$T$ unbiased 6-sided dice are thrown and their scores are added together. The sum, $C$, is noted.
+
+$C$ unbiased 8-sided dice are thrown and their scores are added together. The sum, $O$, is noted.
+
+$O$ unbiased 12-sided dice are thrown and their scores are added together. The sum, $D$, is noted.
+
+$D$ unbiased 20-sided dice are thrown and their scores are added together. The sum, $I$, is noted.
+
+Find the variance of $I$, and give your answer rounded to 4 decimal places.
+
+### --tests--
+
+`platonicDice()` should return `2406376.3623`.
+
+```js
+assert.strictEqual(platonicDice(), 2406376.3623);
+```
+
+## 89
+
+### --description--
+
+Consider the triangle with sides $\sqrt{5}$, $\sqrt{65}$ and $\sqrt{68}$. It can be shown that this triangle has area 9.
+
+$S(n)$ is the sum of the areas of all triangles with sides $\sqrt{1 + b^2}$, $\sqrt{1 + c^2}$ and $\sqrt{b^2 + c^2}$ (for positive integers $b$ and $c$) that have an integral area not exceeding $n$.
+
+The example triangle has $b = 2$ and $c = 8$.
+
+$S({10}^6) = 18\\,018\\,206$.
+
+Find $S({10}^{10})$.
+
+### --tests--
+
+`nonRationalSidesAndIntegralArea()` should return `2919133642971`.
+
+```js
+assert.strictEqual(nonRationalSidesAndIntegralArea(), 2919133642971);
+```
+
+## 90
+
+### --description--
+
+Let $s_k$ be the number of 1’s when writing the numbers from 0 to $k$ in binary.
+
+For example, writing 0 to 5 in binary, we have 0, 1, 10, 11, 100, 101. There are seven 1’s, so $s_5 = 7$.
+
+The sequence $S = \\{s_k : k ≥ 0\\}$ starts $\\{0, 1, 2, 4, 5, 7, 9, 12, \ldots\\}$.
+
+A game is played by two players. Before the game starts, a number $n$ is chosen. A counter $c$ starts at 0. At each turn, the player chooses a number from 1 to $n$ (inclusive) and increases $c$ by that number. The resulting value of $c$ must be a member of $S$. If there are no more valid moves, the player loses.
+
+For example, with $n = 5$ and starting with $c = 0$:
+
+- Player 1 chooses 4, so $c$ becomes $0 + 4 = 4$.
+- Player 2 chooses 5, so $c$ becomes $4 + 5 = 9$.
+- Player 1 chooses 3, so $c$ becomes $9 + 3 = 12$.
+- etc.
+
+Note that $c$ must always belong to $S$, and each player can increase $c$ by at most $n$.
+
+Let $M(n)$ be the highest number the first player can choose at her first turn to force a win, and $M(n) = 0$ if there is no such move. For example, $M(2) = 2$, $M(7) = 1$ and $M(20) = 4$.
+
+It can be verified $\sum M{(n)}^3 = 8150$ for $1 ≤ n ≤ 20$.
+
+Find $\sum M{(n)}^3$ for $1 ≤ n ≤ 1000$.
+
+### --tests--
+
+`hoppingGame()` should return `61029882288`.
+
+```js
+assert.strictEqual(hoppingGame(), 61029882288);
+```
+
+## 91
+
+### --description--
+
+A rectilinear grid is an orthogonal grid where the spacing between the gridlines does not have to be equidistant.
+
+An example of such grid is logarithmic graph paper.
+
+Consider rectilinear grids in the Cartesian coordinate system with the following properties:
+
+- The gridlines are parallel to the axes of the Cartesian coordinate system.
+- There are $N + 2$ vertical and $N + 2$ horizontal gridlines. Hence there are $(N + 1) \times (N + 1)$ rectangular cells.
+- The equations of the two outer vertical gridlines are $x = -1$ and $x = 1$.
+- The equations of the two outer horizontal gridlines are $y = -1$ and $y = 1$.
+- The grid cells are colored red if they overlap with the unit circle, black otherwise.
+
+For this problem we would like you to find the positions of the remaining $N$ inner horizontal and $N$ inner vertical gridlines so that the area occupied by the red cells is minimized.
+
+E.g. here is a picture of the solution for $N = 10$:
+
+
+
+The area occupied by the red cells for $N = 10$ rounded to 10 digits behind the decimal point is 3.3469640797.
+
+Find the positions for $N = 400$. Give as your answer the area occupied by the red cells rounded to 10 digits behind the decimal point.
+
+### --tests--
+
+`enmeshedUnitCircle()` should return `3.1486734435`.
+
+```js
+assert.strictEqual(enmeshedUnitCircle(), 3.1486734435);
+```
+
+## 92
+
+### --description--
+
+An $n × n$ grid of squares contains $n^2$ ants, one ant per square.
+
+All ants decide to move simultaneously to an adjacent square (usually 4 possibilities, except for ants on the edge of the grid or at the corners).
+
+We define $f(n)$ to be the number of ways this can happen without any ants ending on the same square and without any two ants crossing the same edge between two squares.
+
+You are given that $f(4) = 88$.
+
+Find $f(10)$.
+
+### --tests--
+
+`migratingAnts()` should return `112398351350823100`.
+
+```js
+assert.strictEqual(migratingAnts(), 112398351350823100);
+```
+
+## 93
+
+### --description--
+
+Jeff eats a pie in an unusual way.
+
+The pie is circular. He starts with slicing an initial cut in the pie along a radius.
+
+While there is at least a given fraction $F$ of pie left, he performs the following procedure:
+
+- He makes two slices from the pie centre to any point of what is remaining of the pie border, any point on the remaining pie border equally likely. This will divide the remaining pie into three pieces.
+- Going counterclockwise from the initial cut, he takes the first two pie pieces and eats them.
+
+When less than a fraction $F$ of pie remains, he does not repeat this procedure. Instead, he eats all of the remaining pie.
+
+
+
+For $x ≥ 1$, let $E(x)$ be the expected number of times Jeff repeats the procedure above with $F = \frac{1}{x}$. It can be verified that $E(1) = 1$, $E(2) ≈ 1.2676536759$, and $E(7.5) ≈ 2.1215732071$.
+
+Find $E(40)$ rounded to 10 decimal places behind the decimal point.
+
+### --tests--
+
+`eatingPie()` should return `3.2370342194`.
+
+```js
+assert.strictEqual(eatingPie(), 3.2370342194);
+```
+
+## 94
+
+### --description--
+
+The Pythagorean tree is a fractal generated by the following procedure:
+
+Start with a unit square. Then, calling one of the sides its base (in the animation, the bottom side is the base):
+
+1. Attach a right triangle to the side opposite the base, with the hypotenuse coinciding with that side and with the sides in a 3-4-5 ratio. Note that the smaller side of the triangle must be on the 'right' side with respect to the base (see animation).
+2. Attach a square to each leg of the right triangle, with one of its sides coinciding with that leg.
+3. Repeat this procedure for both squares, considering as their bases the sides touching the triangle.
+
+The resulting figure, after an infinite number of iterations, is the Pythagorean tree.
+
+
+
+It can be shown that there exists at least one rectangle, whose sides are parallel to the largest square of the Pythagorean tree, which encloses the Pythagorean tree completely.
+
+Find the smallest area possible for such a bounding rectangle, and give your answer rounded to 10 decimal places.
+
+### --tests--
+
+`pythagoreanTree()` should return `28.2453753155`.
+
+```js
+assert.strictEqual(pythagoreanTree(), 28.2453753155);
+```
+
+## 95
+
+### --description--
+
+For any positive integer $n$, the $n$th weak Goodstein sequence $\\{g1, g2, g3, \ldots\\}$ is defined as:
+
+- $g_1 = n$
+- for $k > 1$, $g_k$ is obtained by writing $g_{k - 1}$ in base $k$, interpreting it as a base $k + 1$ number, and subtracting 1.
+
+The sequence terminates when $g_k$ becomes 0.
+
+For example, the $6$th weak Goodstein sequence is $\\{6, 11, 17, 25, \ldots\\}$:
+
+- $g_1 = 6$.
+- $g_2 = 11$ since $6 = 110_2$, $110_3 = 12$, and $12 - 1 = 11$.
+- $g_3 = 17$ since $11 = 102_3$, $102_4 = 18$, and $18 - 1 = 17$.
+- $g_4 = 25$ since $17 = 101_4$, $101_5 = 26$, and $26 - 1 = 25$.
+
+and so on.
+
+It can be shown that every weak Goodstein sequence terminates.
+
+Let $G(n)$ be the number of nonzero elements in the $n$th weak Goodstein sequence.
+
+It can be verified that $G(2) = 3$, $G(4) = 21$ and $G(6) = 381$.
+
+It can also be verified that $\sum G(n) = 2517$ for $1 ≤ n < 8$.
+
+Find the last 9 digits of $\sum G(n)$ for $1 ≤ n < 16$.
+
+### --tests--
+
+`weakGoodsteinSequence()` should return `173214653`.
+
+```js
+assert.strictEqual(weakGoodsteinSequence(), 173214653);
+```
+
+## 96
+
+### --description--
+
+On the parabola $y = \frac{x^2}{k}$, three points $A(a, \frac{a^2}{k})$, $B(b, \frac{b^2}{k})$ and $C(c, \frac{c^2}{k})$ are chosen.
+
+Let $F(K, X)$ be the number of the integer quadruplets $(k, a, b, c)$ such that at least one angle of the triangle $ABC$ is 45°, with $1 ≤ k ≤ K$ and $-X ≤ a < b < c ≤ X$.
+
+For example, $F(1, 10) = 41$ and $F(10, 100) = 12\\,492$.
+
+Find $F({10}^6, {10}^9)$.
+
+### --tests--
+
+`triangleOnParabola()` should return `141630459461893730`.
+
+```js
+assert.strictEqual(triangleOnParabola(), 141630459461893730);
+```
+
+## 97
+
+### --description--
+
+Inside a rope of length $n$, $n - 1$ points are placed with distance 1 from each other and from the endpoints. Among these points, we choose $m - 1$ points at random and cut the rope at these points to create $m$ segments.
+
+Let $E(n, m)$ be the expected length of the second-shortest segment. For example, $E(3, 2) = 2$ and $E(8, 3) = \frac{16}{7}$. Note that if multiple segments have the same shortest length the length of the second-shortest segment is defined as the same as the shortest length.
+
+Find $E({10}^7, 100)$. Give your answer rounded to 5 decimal places behind the decimal point.
+
+### --tests--
+
+`cuttingRope()` should return `2010.59096`.
+
+```js
+assert.strictEqual(cuttingRope(), 2010.59096);
+```
+
+## 98
+
+### --description--
+
+The first 15 fibonacci numbers are:
+
+$$1,1,2,3,5,8,13,21,34,55,89,144,233,377,610.$$
+
+It can be seen that 8 and 144 are not squarefree: 8 is divisible by 4 and 144 is divisible by 4 and by 9.
+
+So the first 13 squarefree fibonacci numbers are:
+
+$$1,1,2,3,5,13,21,34,55,89,233,377 \text{ and } 610.$$
+
+The $200$th squarefree fibonacci number is: 971183874599339129547649988289594072811608739584170445. The last sixteen digits of this number are: 1608739584170445 and in scientific notation this number can be written as `9.7e53`.
+
+Find the $100\\,000\\,000$th squarefree fibonacci number. Give as your answer as a string with its last sixteen digits followed by a comma followed by the number in scientific notation (rounded to one digit after the decimal point). For the $200$th squarefree number the answer would have been: `1608739584170445,9.7e53`
+
+**Note:** For this problem, assume that for every prime $p$, the first fibonacci number divisible by $p$ is not divisible by $p^2$ (this is part of Wall's conjecture). This has been verified for primes $≤ 3 \times {10}^{15}$, but has not been proven in general.
+
+If it happens that the conjecture is false, then the accepted answer to this problem isn't guaranteed to be the $100\\,000\\,000$th squarefree fibonacci number, rather it represents only a lower bound for that number.
+
+### --tests--
+
+`squarefreeFibonacciNumbers()` should return a string.
+
+```js
+assert(typeof squarefreeFibonacciNumbers() === 'string');
+```
+
+`squarefreeFibonacciNumbers()` should return the string `1508395636674243,6.5e27330467`.
+
+```js
+assert.strictEqual(squarefreeFibonacciNumbers(), '1508395636674243,6.5e27330467');
+```
+
+## 99
+
+### --description--
+
+A Fibonacci tree is a binary tree recursively defined as:
+
+- $T(0)$ is the empty tree.
+- $T(1)$ is the binary tree with only one node.
+- $T(k)$ consists of a root node that has $T(k - 1)$ and $T(k - 2)$ as children.
+
+On such a tree two players play a take-away game. On each turn a player selects a node and removes that node along with the subtree rooted at that node. The player who is forced to take the root node of the entire tree loses.
+
+Here are the winning moves of the first player on the first turn for $T(k)$ from $k = 1$ to $k = 6$.
+
+
+
+Let $f(k)$ be the number of winning moves of the first player (i.e. the moves for which the second player has no winning strategy) on the first turn of the game when this game is played on $T(k)$.
+
+For example, $f(5) = 1$ and $f(10) = 17$.
+
+Find $f(10000)$. Give the last 18 digits of your answer.
+
+### --tests--
+
+`fibonacciTreeGame()` should return `438505383468410600`.
+
+```js
+assert.strictEqual(fibonacciTreeGame(), 438505383468410600);
+```
+
+## --fcc-end--
+
\ No newline at end of file
diff --git a/curriculum/locales/english/project-euler-problems-401-to-480.md b/curriculum/locales/english/project-euler-problems-401-to-480.md
new file mode 100644
index 0000000..f02f4cb
--- /dev/null
+++ b/curriculum/locales/english/project-euler-problems-401-to-480.md
@@ -0,0 +1,2379 @@
+# Project Euler in Rust: 401 to 480
+
+Complete the freeCodeCamp Project Euler problems in the Rust programming language using WebAssembly.
+
+## 0
+
+### --description--
+
+The divisors of 6 are 1, 2, 3 and 6.
+
+The sum of the squares of these numbers is $1 + 4 + 9 + 36 = 50$.
+
+Let $\sigma_2(n)$ represent the sum of the squares of the divisors of $n$. Thus $\sigma_2(6) = 50$.
+
+Let $\Sigma_2$ represent the summatory function of $\sigma_2$, that is $\Sigma_2(n) = \sum \sigma_2(i)$ for $i=1$ to $n$. The first 6 values of $\Sigma_2$ are: 1, 6, 16, 37, 63 and 113.
+
+Find $\Sigma_2({10}^{15})$ modulo ${10}^9$.
+
+### --tests--
+
+`sumOfSquaresDivisors()` should return `281632621`.
+
+```js
+assert.strictEqual(sumOfSquaresDivisors(), 281632621);
+```
+
+## 1
+
+### --description--
+
+It can be shown that the polynomial $n^4 + 4n^3 + 2n^2 + 5n$ is a multiple of 6 for every integer $n$. It can also be shown that 6 is the largest integer satisfying this property.
+
+Define $M(a, b, c)$ as the maximum $m$ such that $n^4 + an^3 + bn^2 + cn$ is a multiple of $m$ for all integers $n$. For example, $M(4, 2, 5) = 6$.
+
+Also, define $S(N)$ as the sum of $M(a, b, c)$ for all $0 < a, b, c ≤ N$.
+
+We can verify that $S(10) = 1\\,972$ and $S(10\\,000) = 2\\,024\\,258\\,331\\,114$.
+
+Let $F_k$ be the Fibonacci sequence:
+
+- $F_0 = 0$, $F_1 = 1$ and
+- $F_k = F_{k - 1} + F_{k - 2}$ for $k ≥ 2$.
+
+Find the last 9 digits of $\sum S(F_k)$ for $2 ≤ k ≤ 1\\,234\\,567\\,890\\,123$.
+
+### --tests--
+
+`integerValuedPolynomials()` should return `356019862`.
+
+```js
+assert.strictEqual(integerValuedPolynomials(), 356019862);
+```
+
+## 2
+
+### --description--
+
+For integers $a$ and $b$, we define $D(a, b)$ as the domain enclosed by the parabola $y = x^2$ and the line $y = ax + b: D(a, b) = \\{ (x, y) | x^2 ≤ y ≤ ax + b \\}$.
+
+$L(a, b)$ is defined as the number of lattice points contained in $D(a, b)$. For example, $L(1, 2) = 8$ and $L(2, -1) = 1$.
+
+We also define $S(N)$ as the sum of $L(a, b)$ for all the pairs ($a$, $b$) such that the area of $D(a, b)$ is a rational number and $|a|,|b| ≤ N$.
+
+We can verify that $S(5) = 344$ and $S(100) = 26\\,709\\,528$.
+
+Find $S({10}^{12})$. Give your answer $\bmod {10}^8$.
+
+### --tests--
+
+`latticePoints()` should return `18224771`.
+
+```js
+assert.strictEqual(latticePoints(), 18224771);
+```
+
+## 3
+
+### --description--
+
+$E_a$ is an ellipse with an equation of the form $x^2 + 4y^2 = 4a^2$.
+
+$E_a'$ is the rotated image of $E_a$ by $θ$ degrees counterclockwise around the origin $O(0, 0)$ for $0° < θ < 90°$.
+
+
+
+$b$ is the distance to the origin of the two intersection points closest to the origin and $c$ is the distance of the two other intersection points.
+
+We call an ordered triplet ($a$, $b$, $c$) a canonical ellipsoidal triplet if $a$, $b$ and $c$ are positive integers.
+
+For example, (209, 247, 286) is a canonical ellipsoidal triplet.
+
+Let $C(N)$ be the number of distinct canonical ellipsoidal triplets ($a$, $b$, $c$) for $a ≤ N$.
+
+It can be verified that $C({10}^3) = 7$, $C({10}^4) = 106$ and $C({10}^6) = 11\\,845$.
+
+Find $C({10}^{17})$.
+
+### --tests--
+
+`crisscrossEllipses()` should return `1199215615081353`.
+
+```js
+assert.strictEqual(crisscrossEllipses(), 1199215615081353);
+```
+
+## 4
+
+### --description--
+
+We wish to tile a rectangle whose length is twice its width.
+
+Let $T(0)$ be the tiling consisting of a single rectangle.
+
+For $n > 0$, let $T(n)$ be obtained from $T( n- 1)$ by replacing all tiles in the following manner:
+
+
+
+The following animation demonstrates the tilings $T(n)$ for $n$ from 0 to 5:
+
+
+
+Let $f(n)$ be the number of points where four tiles meet in $T(n)$. For example, $f(1) = 0$, $f(4) = 82$ and $f({10}^9)\bmod {17}^7 = 126\\,897\\,180$.
+
+Find $f({10}^k)$ for $k = {10}^{18}$, give your answer modulo ${17}^7$.
+
+### --tests--
+
+`rectangularTiling()` should return `237696125`.
+
+```js
+assert.strictEqual(rectangularTiling(), 237696125);
+```
+
+## 5
+
+### --description--
+
+We are trying to find a hidden number selected from the set of integers {1, 2, ..., $n$} by asking questions. Each number (question) we ask, we get one of three possible answers:
+
+- "Your guess is lower than the hidden number" (and you incur a cost of a), or
+- "Your guess is higher than the hidden number" (and you incur a cost of b), or
+- "Yes, that's it!" (and the game ends).
+
+Given the value of $n$, $a$, and $b$, an optimal strategy minimizes the total cost for the worst possible case.
+
+For example, if $n = 5$, $a = 2$, and $b = 3$, then we may begin by asking "2" as our first question.
+
+If we are told that 2 is higher than the hidden number (for a cost of $b = 3$), then we are sure that "1" is the hidden number (for a total cost of 3).
+
+If we are told that 2 is lower than the hidden number (for a cost of $a = 2$), then our next question will be "4".
+
+If we are told that 4 is higher than the hidden number (for a cost of $b = 3$), then we are sure that "3" is the hidden number (for a total cost of $2 + 3 = \color{blue}{\mathbf{5}}$).
+
+If we are told that 4 is lower than the hidden number (for a cost of $a = 2$), then we are sure that "5" is the hidden number (for a total cost of $2 + 2 = \color{blue}{\mathbf{4}}$).
+
+Thus, the worst-case cost achieved by this strategy is 5. It can also be shown that this is the lowest worst-case cost that can be achieved. So, in fact, we have just described an optimal strategy for the given values of $n$, $a$, and $b$.
+
+Let $C(n, a, b)$ be the worst-case cost achieved by an optimal strategy for the given values of $n$, $a$, and $b$.
+
+Here are a few examples:
+
+$$\begin{align}
+ & C(5, 2, 3) = 5 \\\\
+ & C(500, \sqrt{2}, \sqrt{3}) = 13.220\\,731\\,97\ldots \\\\
+ & C(20\\,000, 5, 7) = 82 \\\\
+ & C(2\\,000\\,000, √5, √7) = 49.637\\,559\\,55\ldots \\\\
+\end{align}$$
+
+Let $F_k$ be the Fibonacci numbers: $F_k = F_{k - 1} + F_{k - 2}$ with base cases $F_1 = F_2 = 1$.
+
+Find $\displaystyle\sum_{k = 1}^{30} C({10}^{12}, \sqrt{k}, \sqrt{F_k})$, and give your answer rounded to 8 decimal places behind the decimal point.
+
+### --tests--
+
+`guessingGame()` should return `36813.12757207`.
+
+```js
+assert.strictEqual(guessingGame(), 36813.12757207);
+```
+
+## 6
+
+### --description--
+
+If we calculate $a^2\bmod 6$ for $0 ≤ a ≤ 5$ we get: 0, 1, 4, 3, 4, 1.
+
+The largest value of a such that $a^2 ≡ a\bmod 6$ is $4$.
+
+Let's call $M(n)$ the largest value of $a < n$ such that $a^2 ≡ a (\text{mod } n)$. So $M(6) = 4$.
+
+Find $\sum M(n)$ for $1 ≤ n ≤ {10}^7$.
+
+### --tests--
+
+`idempotents()` should return `39782849136421`.
+
+```js
+assert.strictEqual(idempotents(), 39782849136421);
+```
+
+## 7
+
+### --description--
+
+Let's call a lattice point ($x$, $y$) inadmissible if $x$, $y$ and $x + y$ are all positive perfect squares.
+
+For example, (9, 16) is inadmissible, while (0, 4), (3, 1) and (9, 4) are not.
+
+Consider a path from point ($x_1$, $y_1$) to point ($x_2$, $y_2$) using only unit steps north or east. Let's call such a path admissible if none of its intermediate points are inadmissible.
+
+Let $P(n)$ be the number of admissible paths from (0, 0) to ($n$, $n$). It can be verified that $P(5) = 252$, $P(16) = 596\\,994\\,440$ and $P(1\\,000)\bmod 1\\,000\\,000\\,007 = 341\\,920\\,854$.
+
+Find $P(10\\,000\\,000)\bmod 1\\,000\\,000\\,007$.
+
+### --tests--
+
+`admissiblePaths()` should return `299742733`.
+
+```js
+assert.strictEqual(admissiblePaths(), 299742733);
+```
+
+## 8
+
+### --description--
+
+Let $n$ be a positive integer. Consider nim positions where:
+
+- There are $n$ non-empty piles.
+- Each pile has size less than $2^n$.
+- No two piles have the same size.
+
+Let $W(n)$ be the number of winning nim positions satisfying the above conditions (a position is winning if the first player has a winning strategy).
+
+For example, $W(1) = 1$, $W(2) = 6$, $W(3) = 168$, $W(5) = 19\\,764\\,360$ and $W(100)\bmod 1\\,000\\,000\\,007 = 384\\,777\\,056$.
+
+Find $W(10\\,000\\,000)\bmod 1\\,000\\,000\\,007$.
+
+### --tests--
+
+`nimExtreme()` should return `253223948`.
+
+```js
+assert.strictEqual(nimExtreme(), 253223948);
+```
+
+## 9
+
+### --description--
+
+Let $C$ be the circle with radius $r$, $x^2 + y^2 = r^2$. We choose two points $P(a, b)$ and $Q(-a, c)$ so that the line passing through $P$ and $Q$ is tangent to $C$.
+
+For example, the quadruplet $(r, a, b, c) = (2, 6, 2, -7)$ satisfies this property.
+
+Let $F(R, X)$ be the number of the integer quadruplets $(r, a, b, c)$ with this property, and with $0 < r ≤ R$ and $0 < a ≤ X$.
+
+We can verify that $F(1, 5) = 10$, $F(2, 10) = 52$ and $F(10, 100) = 3384$.
+
+Find $F({10}^8, {10}^9) + F({10}^9, {10}^8)$.
+
+### --tests--
+
+`circleAndTangentLine()` should return `799999783589946600`.
+
+```js
+assert.strictEqual(circleAndTangentLine(), 799999783589946600);
+```
+
+## 10
+
+### --description--
+
+Let $n$ be a positive integer. Suppose there are stations at the coordinates $(x, y) = (2^i\bmod n, 3^i\bmod n)$ for $0 ≤ i ≤ 2n$. We will consider stations with the same coordinates as the same station.
+
+We wish to form a path from (0, 0) to ($n$, $n$) such that the $x$ and $y$ coordinates never decrease.
+
+Let $S(n)$ be the maximum number of stations such a path can pass through.
+
+For example, if $n = 22$, there are 11 distinct stations, and a valid path can pass through at most 5 stations. Therefore, $S(22) = 5$. The case is illustrated below, with an example of an optimal path:
+
+
+
+It can also be verified that $S(123) = 14$ and $S(10\\,000) = 48$.
+
+Find $\sum S(k^5)$ for $1 ≤ k ≤ 30$.
+
+### --tests--
+
+`uphillPaths()` should return `9936352`.
+
+```js
+assert.strictEqual(uphillPaths(), 9936352);
+```
+
+## 11
+
+### --description--
+
+For integers $m$, $n$ ($0 ≤ n < m$), let $L(m, n)$ be an $m×m$ grid with the top-right $n×n$ grid removed.
+
+For example, $L(5, 3)$ looks like this:
+
+
+
+We want to number each cell of $L(m, n)$ with consecutive integers 1, 2, 3, ... such that the number in every cell is smaller than the number below it and to the left of it.
+
+For example, here are two valid numberings of $L(5, 3)$:
+
+
+
+Let $LC(m, n)$ be the number of valid numberings of $L(m, n)$. It can be verified that $LC(3, 0) = 42$, $LC(5, 3) = 250\\,250$, $LC(6, 3) = 406\\,029\\,023\\,400$ and $LC(10, 5)\bmod 76\\,543\\,217 = 61\\,251\\,715$.
+
+Find $LC(10\\,000, 5\\,000)\bmod 76\\,543\\,217$.
+
+### --tests--
+
+`gnomonNumbering()` should return `38788800`.
+
+```js
+assert.strictEqual(gnomonNumbering(), 38788800);
+```
+
+## 12
+
+### --description--
+
+We say that a $d$-digit positive number (no leading zeros) is a one-child number if exactly one of its sub-strings is divisible by $d$.
+
+For example, 5671 is a 4-digit one-child number. Among all its sub-strings 5, 6, 7, 1, 56, 67, 71, 567, 671 and 5671, only 56 is divisible by 4.
+
+Similarly, 104 is a 3-digit one-child number because only 0 is divisible by 3. 1132451 is a 7-digit one-child number because only 245 is divisible by 7.
+
+Let $F(N)$ be the number of the one-child numbers less than $N$. We can verify that $F(10) = 9$, $F({10}^3) = 389$ and $F({10}^7) = 277\\,674$.
+
+Find $F({10}^{19})$.
+
+### --tests--
+
+`oneChildNumbers()` should return `3079418648040719`.
+
+```js
+assert.strictEqual(oneChildNumbers(), 3079418648040719);
+```
+
+## 13
+
+### --description--
+
+6174 is a remarkable number; if we sort its digits in increasing order and subtract that number from the number you get when you sort the digits in decreasing order, we get $7641 - 1467 = 6174$.
+
+Even more remarkable is that if we start from any 4 digit number and repeat this process of sorting and subtracting, we'll eventually end up with 6174 or immediately with 0 if all digits are equal.
+
+This also works with numbers that have less than 4 digits if we pad the number with leading zeroes until we have 4 digits.
+
+E.g. let's start with the number 0837:
+
+$$\begin{align}
+ & 8730 - 0378 = 8352 \\\\
+ & 8532 - 2358 = 6174
+\end{align}$$
+
+6174 is called the Kaprekar constant. The process of sorting and subtracting and repeating this until either 0 or the Kaprekar constant is reached is called the Kaprekar routine.
+
+We can consider the Kaprekar routine for other bases and number of digits. Unfortunately, it is not guaranteed a Kaprekar constant exists in all cases; either the routine can end up in a cycle for some input numbers or the constant the routine arrives at can be different for different input numbers. However, it can be shown that for 5 digits and a base $b = 6t + 3 ≠ 9$, a Kaprekar constant exists.
+
+E.g.
+base 15: ${(10, 4, 14, 9, 5)}\_{15}$
+base 21: $(14, 6, 20, 13, 7)\_{21}$
+
+Define $C_b$ to be the Kaprekar constant in base $b$ for 5 digits. Define the function $sb(i)$ to be:
+
+- 0 if $i = C_b$ or if $i$ written in base $b$ consists of 5 identical digits
+- the number of iterations it takes the Kaprekar routine in base $b$ to arrive at $C_b$, otherwise
+
+Note that we can define $sb(i)$ for all integers $i < b^5$. If $i$ written in base $b$ takes less than 5 digits, the number is padded with leading zero digits until we have 5 digits before applying the Kaprekar routine.
+
+Define $S(b)$ as the sum of $sb(i)$ for $0 < i < b^5$. E.g. $S(15) = 5\\,274\\,369$ $S(111) = 400\\,668\\,930\\,299$
+
+Find the sum of $S(6k + 3)$ for $2 ≤ k ≤ 300$. Give the last 18 digits as your answer.
+
+### --tests--
+
+`kaprekarConstant()` should return `552506775824935500`.
+
+```js
+assert.strictEqual(kaprekarConstant(), 552506775824935500);
+```
+
+## 14
+
+### --description--
+
+A set of lattice points $S$ is called a titanic set if there exists a line passing through exactly two points in $S$.
+
+An example of a titanic set is $S = \\{(0, 0), (0, 1), (0, 2), (1, 1), (2, 0), (1, 0)\\}$, where the line passing through (0, 1) and (2, 0) does not pass through any other point in $S$.
+
+On the other hand, the set {(0, 0), (1, 1), (2, 2), (4, 4)} is not a titanic set since the line passing through any two points in the set also passes through the other two.
+
+For any positive integer $N$, let $T(N)$ be the number of titanic sets $S$ whose every point ($x$, $y$) satisfies $0 ≤ x$, $y ≤ N$. It can be verified that $T(1) = 11$, $T(2) = 494$, $T(4) = 33\\,554\\,178$, $T(111)\bmod {10}^8 = 13\\,500\\,401$ and $T({10}^5)\bmod {10}^8 = 63\\,259\\,062$.
+
+Find $T({10}^{11})\bmod {10}^8$.
+
+### --tests--
+
+`titanicSets()` should return `55859742`.
+
+```js
+assert.strictEqual(titanicSets(), 55859742);
+```
+
+## 15
+
+### --description--
+
+A row of $n$ squares contains a frog in the leftmost square. By successive jumps the frog goes to the rightmost square and then back to the leftmost square. On the outward trip he jumps one, two or three squares to the right, and on the homeward trip he jumps to the left in a similar manner. He cannot jump outside the squares. He repeats the round-trip travel $m$ times.
+
+Let $F(m, n)$ be the number of the ways the frog can travel so that at most one square remains unvisited.
+
+For example, $F(1, 3) = 4$, $F(1, 4) = 15$, $F(1, 5) = 46$, $F(2, 3) = 16$ and $F(2, 100)\bmod {10}^9 = 429\\,619\\,151$.
+
+Find the last 9 digits of $F(10, {10}^{12})$.
+
+### --tests--
+
+`frogsTrip()` should return `898082747`.
+
+```js
+assert.strictEqual(frogsTrip(), 898082747);
+```
+
+## 16
+
+### --description--
+
+A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:
+
+$$\begin{align}
+ & \frac{1}{2} = 0.5 \\\\
+ & \frac{1}{3} = 0.(3) \\\\
+ & \frac{1}{4} = 0.25 \\\\
+ & \frac{1}{5} = 0.2 \\\\
+ & \frac{1}{6} = 0.1(6) \\\\
+ & \frac{1}{7} = 0.(142857) \\\\
+ & \frac{1}{8} = 0.125 \\\\
+ & \frac{1}{9} = 0.(1) \\\\
+ & \frac{1}{10} = 0.1 \\\\
+\end{align}$$
+
+Where $0.1(6)$ means $0.166666\ldots$, and has a 1-digit recurring cycle. It can be seen that $\frac{1}{7}$ has a 6-digit recurring cycle.
+
+Unit fractions whose denominator has no other prime factors than 2 and/or 5 are not considered to have a recurring cycle. We define the length of the recurring cycle of those unit fractions as 0.
+
+Let $L(n)$ denote the length of the recurring cycle of $\frac{1}{n}$. You are given that $\sum L(n)$ for $3 ≤ n ≤ 1\\,000\\,000$ equals $55\\,535\\,191\\,115$.
+
+Find $\sum L(n)$ for $3 ≤ n ≤ 100\\,000\\,000$.
+
+### --tests--
+
+`reciprocalCyclesTwo()` should return `446572970925740`.
+
+```js
+assert.strictEqual(reciprocalCyclesTwo(), 446572970925740);
+```
+
+## 17
+
+### --description--
+
+Let $n$ be a positive integer. An integer triple ($a$, $b$, $c$) is called a factorisation triple of $n$ if:
+
+- $1 ≤ a ≤ b ≤ c$
+- $a \times b \times c = n$.
+
+Define $f(n)$ to be $a + b + c$ for the factorisation triple ($a$, $b$, $c$) of $n$ which minimises $\frac{c}{a}$. One can show that this triple is unique.
+
+For example, $f(165) = 19$, $f(100\\,100) = 142$ and $f(20!) = 4\\,034\\,872$.
+
+Find $f(43!)$.
+
+### --tests--
+
+`factorisationTriples()` should return `1177163565297340400`.
+
+```js
+assert.strictEqual(factorisationTriples(), 1177163565297340400);
+```
+
+## 18
+
+### --description--
+
+The look and say sequence goes 1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211, ...
+
+The sequence starts with 1 and all other members are obtained by describing the previous member in terms of consecutive digits.
+
+It helps to do this out loud:
+
+1 is 'one one' $→ 11$
+
+11 is 'two ones' $→ 21$
+
+21 is 'one two and one one' $→ 1211$
+
+1211 is 'one one, one two and two ones' $→ 111221$
+
+111221 is 'three ones, two twos and one one' $→ 312211$
+
+...
+
+Define $A(n)$, $B(n)$ and $C(n)$ as the number of ones, twos and threes in the $n$'th element of the sequence respectively. One can verify that $A(40) = 31\\,254$, $B(40) = 20\\,259$ and $C(40) = 11\\,625$.
+
+Find $A(n)$, $B(n)$ and $C(n)$ for $n = {10}^{12}$. Give your answer modulo $2^{30}$ as a string and separate your values for $A$, $B$ and $C$ by a comma. E.g. for $n = 40$ the answer would be `31254,20259,11625`.
+
+### --tests--
+
+`lookAndSaySequence()` should return a string.
+
+```js
+assert(typeof lookAndSaySequence() === 'string');
+```
+
+
+`lookAndSaySequence()` should return the string `998567458,1046245404,43363922`.
+
+```js
+assert.strictEqual(lookAndSaySequence(), '998567458,1046245404,43363922');
+```
+
+## 19
+
+### --description--
+
+A positive integer matrix is a matrix whose elements are all positive integers.
+
+Some positive integer matrices can be expressed as a square of a positive integer matrix in two different ways. Here is an example:
+
+$$\begin{pmatrix}
+ 40 & 12 \\\\
+ 48 & 40
+\end{pmatrix} =
+{\begin{pmatrix}
+ 2 & 3 \\\\
+ 12 & 2
+\end{pmatrix}}^2 =
+{\begin{pmatrix}
+ 6 & 1 \\\\
+ 4 & 6
+\end{pmatrix}}^2$$
+
+We define $F(N)$ as the number of the 2x2 positive integer matrices which have a trace less than N and which can be expressed as a square of a positive integer matrix in two different ways.
+
+We can verify that $F(50) = 7$ and $F(1000) = 1019$.
+
+Find $F({10}^7)$.
+
+### --tests--
+
+`positiveIntegerMatrix()` should return `145159332`.
+
+```js
+assert.strictEqual(positiveIntegerMatrix(), 145159332);
+```
+
+## 20
+
+### --description--
+
+Numbers of the form $n^{15} + 1$ are composite for every integer $n > 1$.
+
+For positive integers $n$ and $m$ let $s(n, m)$ be defined as the sum of the distinct prime factors of $n^{15} + 1$ not exceeding $m$.
+
+E.g. $2^{15} + 1 = 3 × 3 × 11 × 331$.
+
+So $s(2, 10) = 3$ and $s(2, 1000) = 3 + 11 + 331 = 345$.
+
+Also ${10}^{15} + 1 = 7 × 11 × 13 × 211 × 241 × 2161 × 9091$.
+
+So $s(10, 100) = 31$ and $s(10, 1000) = 483$.
+
+Find $\sum s(n, {10}^8)$ for $1 ≤ n ≤ {10}^{11}$.
+
+### --tests--
+
+`primeFactorsOfN15Plus1()` should return `2304215802083466200`.
+
+```js
+assert.strictEqual(primeFactorsOfN15Plus1(), 2304215802083466200);
+```
+
+## 21
+
+### --description--
+
+Let $H$ be the hyperbola defined by the equation $12x^2 + 7xy - 12y^2 = 625$.
+
+Next, define $X$ as the point (7, 1). It can be seen that $X$ is in $H$.
+
+Now we define a sequence of points in $H, \\{P_i : i ≥ 1\\}$, as:
+
+- $P_1 = (13, \frac{61}{4})$.
+- $P_2 = (\frac{-43}{6}, -4)$.
+- For $i > 2$, $P_i$ is the unique point in $H$ that is different from $P_{i - 1}$ and such that line $P_iP_{i - 1}$ is parallel to line $P_{i - 2}X$. It can be shown that $P_i$ is well-defined, and that its coordinates are always rational.
+
+
+
+You are given that $P_3 = (\frac{-19}{2}, \frac{-229}{24})$, $P_4 = (\frac{1267}{144}, \frac{-37}{12})$ and $P_7 = (\frac{17\\,194\\,218\\,091}{143\\,327\\,232}, \frac{274\\,748\\,766\\,781}{1\\,719\\,926\\,784})$.
+
+Find $P_n$ for $n = {11}^{14}$ in the following format: If $P_n = (\frac{a}{b}, \frac{c}{d})$ where the fractions are in lowest terms and the denominators are positive, then the answer is $(a + b + c + d)\bmod 1\\,000\\,000\\,007$.
+
+For $n = 7$, the answer would have been: $806\\,236\\,837$.
+
+### --tests--
+
+`sequenceOfPointsOnHyperbola()` should return `92060460`.
+
+```js
+assert.strictEqual(sequenceOfPointsOnHyperbola(), 92060460);
+```
+
+## 22
+
+### --description--
+
+Let $n$ be a positive integer.
+
+A 6-sided die is thrown $n$ times. Let $c$ be the number of pairs of consecutive throws that give the same value.
+
+For example, if $n = 7$ and the values of the die throws are (1, 1, 5, 6, 6, 6, 3), then the following pairs of consecutive throws give the same value:
+
+$$\begin{align}
+ & (\underline{1}, \underline{1}, 5, 6, 6, 6, 3) \\\\
+ & (1, 1, 5, \underline{6}, \underline{6}, 6, 3) \\\\
+ & (1, 1, 5, 6, \underline{6}, \underline{6}, 3)
+\end{align}$$
+
+Therefore, $c = 3$ for (1, 1, 5, 6, 6, 6, 3).
+
+Define $C(n)$ as the number of outcomes of throwing a 6-sided die $n$ times such that $c$ does not exceed $π(n)$.1
+
+For example, $C(3) = 216$, $C(4) = 1290$, $C(11) = 361\\,912\\,500$ and $C(24) = 4\\,727\\,547\\,363\\,281\\,250\\,000$.
+
+Define $S(L)$ as $\sum C(n)$ for $1 ≤ n ≤ L$.
+
+For example, $S(50)\bmod 1\\,000\\,000\\,007 = 832\\,833\\,871$.
+
+Find $S(50\\,000\\,000)\bmod 1\\,000\\,000\\,007$.
+
+1 $π$ denotes the prime-counting function, i.e. $π(n)$ is the number of primes $≤ n$.
+
+### --tests--
+
+`consecutiveDieThrows()` should return `653972374`.
+
+```js
+assert.strictEqual(consecutiveDieThrows(), 653972374);
+```
+
+## 23
+
+### --description--
+
+
+
+The above is an example of a cryptic kakuro (also known as cross sums, or even sums cross) puzzle, with its final solution on the right. (The common rules of kakuro puzzles can be found easily on numerous internet sites. Other related information can also be currently found at krazydad.com whose author has provided the puzzle data for this challenge.)
+
+The `testPuzzles` array contains the description of 200 such puzzles, a mix of 5x5 and 6x6 types. The first puzzle in the file is the above example which is coded as string as follows:
+
+`6,X,X,(vCC),(vI),X,X,X,(hH),B,O,(vCA),(vJE),X,(hFE,vD),O,O,O,O,(hA),O,I,(hJC,vB),O,O,(hJC),H,O,O,O,X,X,X,(hJE),O,O,X`
+
+The first character is a numerical digit indicating the size of the information grid. It would be either a 6 (for a 5x5 kakuro puzzle) or a 7 (for a 6x6 puzzle) followed by a comma (,). The extra top line and left column are needed to insert information.
+
+The content of each cell is then described and followed by a comma, going left to right and starting with the top line.
+
+`X` = Gray cell, not required to be filled by a digit.
+
+`O` (upper case letter)= White empty cell to be filled by a digit.
+
+`A` = Or any one of the upper case letters from A to J to be replaced by its equivalent digit in the solved puzzle.
+
+`( )` = Location of the encrypted sums. Horizontal sums are preceded by a lower case "h" and vertical sums are preceded by a lower case "v". Those are followed by one or two upper case letters depending if the sum is a single digit or double digit one. For double digit sums, the first letter would be for the "tens" and the second one for the "units". When the cell must contain information for both a horizontal and a vertical sum, the first one is always for the horizontal sum and the two are separated by a comma within the same set of brackets, ex.: (hFE,vD). Each set of brackets is also immediately followed by a comma.
+
+The description of the last cell is followed by a Carriage Return/Line Feed (CRLF) instead of a comma.
+
+The required answer to each puzzle is based on the value of each letter necessary to arrive at the solution and according to the alphabetical order. As indicated under the example puzzle, its answer would be 8426039571. At least 9 out of the 10 encrypting letters are always part of the problem description. When only 9 are given, the missing one must be assigned the remaining digit.
+
+You are given that the sum of the answers for the first 10 puzzles in `testPuzzles` is 64414157580.
+
+Find the sum of the answers for `puzzles` array.
+
+### --tests--
+
+`kakuro(testPuzzles)` should return `1059760019628`.
+
+```js
+assert.strictEqual(kakuro(_testPuzzles), 1059760019628);
+```
+
+## 24
+
+### --description--
+
+Two positive numbers $A$ and $B$ are said to be connected (denoted by "$A ↔ B$") if one of these conditions holds:
+
+1. $A$ and $B$ have the same length and differ in exactly one digit; for example, $123 ↔ 173$.
+2. Adding one digit to the left of $A$ (or $B$) makes $B$ (or $A$); for example, $23 ↔ 223$ and $123 ↔ 23$.
+
+We call a prime $P$ a 2's relative if there exists a chain of connected primes between 2 and $P$ and no prime in the chain exceeds $P$.
+
+For example, 127 is a 2's relative. One of the possible chains is shown below:
+
+$$2 ↔ 3 ↔ 13 ↔ 113 ↔ 103 ↔ 107 ↔ 127$$
+
+However, 11 and 103 are not 2's relatives.
+
+Let $F(N)$ be the sum of the primes $≤ N$ which are not 2's relatives. We can verify that $F({10}^3) = 431$ and $F({10}^4) = 78\\,728$.
+
+Find $F({10}^7)$.
+
+### --tests--
+
+`primeConnection()` should return `46479497324`.
+
+```js
+assert.strictEqual(primeConnection(), 46479497324);
+```
+
+## 25
+
+### --description--
+
+Consider an infinite row of boxes. Some of the boxes contain a ball. For example, an initial configuration of 2 consecutive occupied boxes followed by 2 empty boxes, 2 occupied boxes, 1 empty box, and 2 occupied boxes can be denoted by the sequence (2, 2, 2, 1, 2), in which the number of consecutive occupied and empty boxes appear alternately.
+
+A turn consists of moving each ball exactly once according to the following rule: Transfer the leftmost ball which has not been moved to the nearest empty box to its right.
+
+After one turn the sequence (2, 2, 2, 1, 2) becomes (2, 2, 1, 2, 3) as can be seen below; note that we begin the new sequence starting at the first occupied box.
+
+
+
+A system like this is called a Box-Ball System or BBS for short.
+
+It can be shown that after a sufficient number of turns, the system evolves to a state where the consecutive numbers of occupied boxes is invariant. In the example below, the consecutive numbers of occupied boxes evolves to [1, 2, 3]; we shall call this the final state.
+
+
+
+We define the sequence $\\{t_i\\}$:
+
+$$\begin{align}
+ & s_0 = 290\\,797 \\\\
+ & s_{k + 1} = {s_k}^2\bmod 50\\,515\\,093 \\\\
+ & t_k = (s_k\bmod 64) + 1
+\end{align}$$
+
+Starting from the initial configuration $(t_0, t_1, \ldots, t_{10})$, the final state becomes [1, 3, 10, 24, 51, 75].
+
+Starting from the initial configuration $(t_0, t_1, \ldots, t_{10\\,000\\,000})$, find the final state.
+
+Give as your answer the sum of the squares of the elements of the final state. For example, if the final state is [1, 2, 3] then $14 (= 1^2 + 2^2 + 3^2)$ is your answer.
+
+### --tests--
+
+`boxBallSystem()` should return `31591886008`.
+
+```js
+assert.strictEqual(boxBallSystem(), 31591886008);
+```
+
+## 26
+
+### --description--
+
+A sequence of integers $S = \\{s_i\\}$ is called an $n$-sequence if it has $n$ elements and each element $s_i$ satisfies $1 ≤ s_i ≤ n$. Thus there are $n^n$ distinct $n$-sequences in total.
+
+For example, the sequence $S = \\{1, 5, 5, 10, 7, 7, 7, 2, 3, 7\\}$ is a 10-sequence.
+
+For any sequence $S$, let $L(S)$ be the length of the longest contiguous subsequence of $S$ with the same value. For example, for the given sequence $S$ above, $L(S) = 3$, because of the three consecutive 7's.
+
+Let $f(n) = \sum L(S)$ for all $n$-sequences $S$.
+
+For example, $f(3) = 45$, $f(7) = 1\\,403\\,689$ and $f(11) = 481\\,496\\,895\\,121$.
+
+Find $f(7\\,500\\,000)\bmod 1\\,000\\,000\\,009$.
+
+### --tests--
+
+`nSequences()` should return `97138867`.
+
+```js
+assert.strictEqual(nSequences(), 97138867);
+```
+
+## 27
+
+### --description--
+
+Let $a$, $b$ and $c$ be positive numbers.
+
+Let $W$, $X$, $Y$, $Z$ be four collinear points where $|WX| = a$, $|XY| = b$, $|YZ| = c$ and $|WZ| = a + b + c$.
+
+Let $C_{\text{in}}$ be the circle having the diameter $XY$.
+
+Let $C_{\text{out}}$ be the circle having the diameter $WZ$.
+
+The triplet ($a$, $b$, $c$) is called a *necklace triplet* if you can place $k ≥ 3$ distinct circles $C_1, C_2, \ldots, C_k$ such that:
+
+- $C_i$ has no common interior points with any $C_j$ for $1 ≤ i$, $j ≤ k$ and $i ≠ j$,
+- $C_i$ is tangent to both $C_{\text{in}}$ and $C_{\text{out}}$ for $1 ≤ i ≤ k$,
+- $C_i$ is tangent to $C_{i + 1}$ for $1 ≤ i < k$, and
+- $C_k$ is tangent to $C_1$.
+
+For example, (5, 5, 5) and (4, 3, 21) are necklace triplets, while it can be shown that (2, 2, 5) is not.
+
+
+
+Let $T(n)$ be the number of necklace triplets $(a, b, c)$ such that $a$, $b$ and $c$ are positive integers, and $b ≤ n$. For example, $T(1) = 9$, $T(20) = 732$ and $T(3\\,000) = 438\\,106$.
+
+Find $T(1\\,000\\,000\\,000)$.
+
+### --tests--
+
+`necklace(1000000000)` should return `747215561862`.
+
+```js
+assert.strictEqual(necklace(1000000000), 747215561862);
+```
+
+## 28
+
+### --description--
+
+A unitary divisor $d$ of a number $n$ is a divisor of $n$ that has the property $gcd(d, \frac{n}{d}) = 1$.
+
+The unitary divisors of $4! = 24$ are 1, 3, 8 and 24.
+
+The sum of their squares is $12 + 32 + 82 + 242 = 650$.
+
+Let $S(n)$ represent the sum of the squares of the unitary divisors of $n$. Thus $S(4!) = 650$.
+
+Find $S(100\\,000\\,000!)$ modulo $1\\,000\\,000\\,009$.
+
+### --tests--
+
+`sumSquaresOfUnitaryDivisors()` should return `98792821`.
+
+```js
+assert.strictEqual(sumSquaresOfUnitaryDivisors(), 98792821);
+```
+
+## 29
+
+### --description--
+
+$N$ disks are placed in a row, indexed 1 to $N$ from left to right.
+
+Each disk has a black side and white side. Initially all disks show their white side.
+
+At each turn, two, not necessarily distinct, integers $A$ and $B$ between 1 and $N$ (inclusive) are chosen uniformly at random. All disks with an index from $A$ to $B$ (inclusive) are flipped.
+
+The following example shows the case $N = 8$. At the first turn $A = 5$ and $B = 2$, and at the second turn $A = 4$ and $B = 6$.
+
+
+
+Let $E(N, M)$ be the expected number of disks that show their white side after $M$ turns. We can verify that $E(3, 1) = \frac{10}{9}$, $E(3, 2) = \frac{5}{3}$, $E(10, 4) ≈ 5.157$ and $E(100, 10) ≈ 51.893$.
+
+Find $E({10}^{10}, 4000)$. Give your answer rounded to 2 decimal places behind the decimal point.
+
+### --tests--
+
+`rangeFlips()` should return `5000624921.38`.
+
+```js
+assert.strictEqual(rangeFlips(), 5000624921.38);
+```
+
+## 30
+
+### --description--
+
+Fred the farmer arranges to have a new storage silo installed on his farm and having an obsession for all things square he is absolutely devastated when he discovers that it is circular. Quentin, the representative from the company that installed the silo, explains that they only manufacture cylindrical silos, but he points out that it is resting on a square base. Fred is not amused and insists that it is removed from his property.
+
+Quick thinking Quentin explains that when granular materials are delivered from above a conical slope is formed and the natural angle made with the horizontal is called the angle of repose. For example if the angle of repose, $\alpha = 30°$, and grain is delivered at the centre of the silo then a perfect cone will form towards the top of the cylinder. In the case of this silo, which has a diameter of 6m, the amount of space wasted would be approximately 32.648388556 m3. However, if grain is delivered at a point on the top which has a horizontal distance of $x$ metres from the centre then a cone with a strangely curved and sloping base is formed. He shows Fred a picture.
+
+
+
+We shall let the amount of space wasted in cubic metres be given by $V(x)$. If $x = 1.114\\,785\\,284$, which happens to have three squared decimal places, then the amount of space wasted, $V(1.114\\,785\\,284) \approx 36$. Given the range of possible solutions to this problem there is exactly one other option: $V(2.511\\,167\\,869) \approx 49$. It would be like knowing that the square is king of the silo, sitting in splendid glory on top of your grain.
+
+Fred's eyes light up with delight at this elegant resolution, but on closer inspection of Quentin's drawings and calculations his happiness turns to despondency once more. Fred points out to Quentin that it's the radius of the silo that is 6 metres, not the diameter, and the angle of repose for his grain is 40°. However, if Quentin can find a set of solutions for this particular silo then he will be more than happy to keep it.
+
+If Quick thinking Quentin is to satisfy frustratingly fussy Fred the farmer's appetite for all things square then determine the values of $x$ for all possible square space wastage options and calculate $\sum x$ correct to 9 decimal places.
+
+### --tests--
+
+`squareSpaceSilo()` should return `23.386029052`.
+
+```js
+assert.strictEqual(squareSpaceSilo(), 23.386029052);
+```
+
+## 31
+
+### --description--
+
+Let $S(n, m) = \sum φ(n × i)$ for $1 ≤ i ≤ m$. ($φ$ is Euler's totient function)
+
+You are given that $S(510\\,510, {10}^6) = 45\\,480\\,596\\,821\\,125\\,120$.
+
+Find $S(510\\,510, {10}^{11})$. Give the last 9 digits of your answer.
+
+### --tests--
+
+`totientSum()` should return `754862080`.
+
+```js
+assert.strictEqual(totientSum(), 754862080);
+```
+
+## 32
+
+### --description--
+
+Let $E(x_0, y_0)$ be the number of steps it takes to determine the greatest common divisor of $x_0$ and $y_0$ with Euclid's algorithm. More formally:
+
+$$\begin{align}
+ & x_1 = y_0, y_1 = x_0\bmod y_0 \\\\
+ & x_n = y_{n - 1}, y_n = x_{n - 1}\bmod y_{n - 1}
+\end{align}$$
+
+$E(x_0, y_0)$ is the smallest $n$ such that $y_n = 0$.
+
+We have $E(1, 1) = 1$, $E(10, 6) = 3$ and $E(6, 10) = 4$.
+
+Define $S(N)$ as the sum of $E(x, y)$ for $1 ≤ x$, $y ≤ N$.
+
+We have $S(1) = 1$, $S(10) = 221$ and $S(100) = 39\\,826$.
+
+Find $S(5 \times {10}^6)$.
+
+### --tests--
+
+`stepsInEuclidsAlgorithm()` should return `326624372659664`.
+
+```js
+assert.strictEqual(stepsInEuclidsAlgorithm(), 326624372659664);
+```
+
+## 33
+
+### --description--
+
+Recall that a graph is a collection of vertices and edges connecting the vertices, and that two vertices connected by an edge are called adjacent.
+
+Graphs can be embedded in Euclidean space by associating each vertex with a point in the Euclidean space.
+
+A flexible graph is an embedding of a graph where it is possible to move one or more vertices continuously so that the distance between at least two nonadjacent vertices is altered while the distances between each pair of adjacent vertices is kept constant.
+
+A rigid graph is an embedding of a graph which is not flexible.
+
+Informally, a graph is rigid if by replacing the vertices with fully rotating hinges and the edges with rods that are unbending and inelastic, no parts of the graph can be moved independently from the rest of the graph.
+
+The grid graphs embedded in the Euclidean plane are not rigid, as the following animation demonstrates:
+
+
+
+However, one can make them rigid by adding diagonal edges to the cells. For example, for the 2x3 grid graph, there are 19 ways to make the graph rigid:
+
+
+
+Note that for the purposes of this problem, we do not consider changing the orientation of a diagonal edge or adding both diagonal edges to a cell as a different way of making a grid graph rigid.
+
+Let $R(m, n)$ be the number of ways to make the $m × n$ grid graph rigid.
+
+E.g. $R(2, 3) = 19$ and $R(5, 5) = 23\\,679\\,901$.
+
+Define $S(N)$ as $\sum R(i, j)$ for $1 ≤ i$, $j ≤ N$.
+
+E.g. $S(5) = 25\\,021\\,721$.
+
+Find $S(100)$, give your answer modulo $1\\,000\\,000\\,033$.
+
+### --tests--
+
+`rigidGraphs()` should return `863253606`.
+
+```js
+assert.strictEqual(rigidGraphs(), 863253606);
+```
+
+## 34
+
+### --description--
+
+The Fibonacci numbers $\\{f_n, n ≥ 0\\}$ are defined recursively as $f_n = f_{n - 1} + f_{n - 2}$ with base cases $f_0 = 0$ and $f_1 = 1$.
+
+Define the polynomials $\\{F_n, n ≥ 0\\}$ as $F_n(x) = \displaystyle\sum_{i = 0}^n f_ix^i$.
+
+For example, $F_7(x) = x + x^2 + 2x^3 + 3x^4 + 5x^5 + 8x^6 + 13x^7$, and $F_7(11) = 268\\,357\\,683$.
+
+Let $n = {10}^{15}$. Find the sum $\displaystyle\sum_{x = 0}^{100} F_n(x)$ and give your answer modulo $1\\,307\\,674\\,368\\,000 \\, (= 15!)$.
+
+### --tests--
+
+`polynomialsOfFibonacciNumbers()` should return `252541322550`.
+
+```js
+assert.strictEqual(polynomialsOfFibonacciNumbers(), 252541322550);
+```
+
+## 35
+
+### --description--
+
+Julie proposes the following wager to her sister Louise.
+
+She suggests they play a game of chance to determine who will wash the dishes.
+
+For this game, they shall use a generator of independent random numbers uniformly distributed between 0 and 1.
+
+The game starts with $S = 0$.
+
+The first player, Louise, adds to $S$ different random numbers from the generator until $S > 1$ and records her last random number '$x$'.
+
+The second player, Julie, continues adding to $S$ different random numbers from the generator until $S > 2$ and records her last random number '$y$'.
+
+The player with the highest number wins and the loser washes the dishes, i.e. if $y > x$ the second player wins.
+
+For example, if the first player draws 0.62 and 0.44, the first player turn ends since $0.62 + 0.44 > 1$ and $x = 0.44$. If the second players draws 0.1, 0.27 and 0.91, the second player turn ends since $0.62 + 0.44 + 0.1 + 0.27 + 0.91 > 2$ and $y = 0.91$. Since $y > x$, the second player wins.
+
+Louise thinks about it for a second, and objects: "That's not fair".
+
+What is the probability that the second player wins? Give your answer rounded to 10 places behind the decimal point in the form 0.abcdefghij
+
+### --tests--
+
+`unfairWager()` should return `0.5276662759`.
+
+```js
+assert.strictEqual(unfairWager(), 0.5276662759);
+```
+
+## 36
+
+### --description--
+
+When we calculate $8^n$ modulo 11 for $n = 0$ to 9 we get: 1, 8, 9, 6, 4, 10, 3, 2, 5, 7.
+
+As we see all possible values from 1 to 10 occur. So 8 is a primitive root of 11.
+
+But there is more:
+
+If we take a closer look we see:
+
+$$\begin{align}
+ & 1 + 8 = 9 \\\\
+ & 8 + 9 = 17 ≡ 6\bmod 11 \\\\
+ & 9 + 6 = 15 ≡ 4\bmod 11 \\\\
+ & 6 + 4 = 10 \\\\
+ & 4 + 10 = 14 ≡ 3\bmod 11 \\\\
+ & 10 + 3 = 13 ≡ 2\bmod 11 \\\\
+ & 3 + 2 = 5 \\\\
+ & 2 + 5 = 7 \\\\
+ & 5 + 7 = 12 ≡ 1\bmod 11.
+\end{align}$$
+
+So the powers of 8 mod 11 are cyclic with period 10, and $8^n + 8^{n + 1} ≡ 8^{n + 2} (\text{mod } 11)$. 8 is called a Fibonacci primitive root of 11.
+
+Not every prime has a Fibonacci primitive root. There are 323 primes less than 10000 with one or more Fibonacci primitive roots and the sum of these primes is 1480491.
+
+Find the sum of the primes less than $100\\,000\\,000$ with at least one Fibonacci primitive root.
+
+### --tests--
+
+`fibonacciPrimitiveRoots()` should return `74204709657207`.
+
+```js
+assert.strictEqual(fibonacciPrimitiveRoots(), 74204709657207);
+```
+
+## 37
+
+### --description--
+
+For an $n$-tuple of integers $t = (a_1, \ldots, a_n)$, let $(x_1, \ldots, x_n)$ be the solutions of the polynomial equation $x^n + a_1x^{n - 1} + a_2x^{n - 2} + \ldots + a_{n - 1}x + a_n = 0$.
+
+Consider the following two conditions:
+
+- $x_1, \ldots, x_n$ are all real.
+- If $x_1, ..., x_n$ are sorted, $⌊x_i⌋ = i$ for $1 ≤ i ≤ n$. ($⌊·⌋:$ floor function.)
+
+In the case of $n = 4$, there are 12 $n$-tuples of integers which satisfy both conditions.
+
+We define $S(t)$ as the sum of the absolute values of the integers in $t$.
+
+For $n = 4$ we can verify that $\sum S(t) = 2087$ for all $n$-tuples $t$ which satisfy both conditions.
+
+Find $\sum S(t)$ for $n = 7$.
+
+### --tests--
+
+`polynomialIntegerPart()` should return `2046409616809`.
+
+```js
+assert.strictEqual(polynomialIntegerPart(), 2046409616809);
+```
+
+## 38
+
+### --description--
+
+Let $d(k)$ be the sum of all divisors of $k$.
+
+We define the function $S(N) = \sum_{i = 1}^N \sum_{j = 1}^N d(i \times j)$.
+
+For example, $S(3) = d(1) + d(2) + d(3) + d(2) + d(4) + d(6) + d(3) + d(6) + d(9) = 59$.
+
+You are given that $S({10}^3) = 563\\,576\\,517\\,282$ and $S({10}^5)\bmod {10}^9 = 215\\,766\\,508$.
+
+Find $S({10}^{11})\bmod {10}^9$.
+
+### --tests--
+
+`sumOfSumOfDivisors()` should return `968697378`.
+
+```js
+assert.strictEqual(sumOfSumOfDivisors(), 968697378);
+```
+
+## 39
+
+### --description--
+
+We want to tile a board of length $n$ and height 1 completely, with either 1 × 2 blocks or 1 × 1 blocks with a single decimal digit on top:
+
+
+
+For example, here are some of the ways to tile a board of length $n = 8$:
+
+
+
+Let $T(n)$ be the number of ways to tile a board of length $n$ as described above.
+
+For example, $T(1) = 10$ and $T(2) = 101$.
+
+Let $S(L)$ be the triple sum $\sum_{a, b, c} gcd(T(c^a), T(c^b))$ for $1 ≤ a, b, c ≤ L$.
+
+For example:
+
+$$\begin{align}
+ & S(2) = 10\\,444 \\\\
+ & S(3) = 1\\,292\\,115\\,238\\,446\\,807\\,016\\,106\\,539\\,989 \\\\
+ & S(4)\bmod 987\\,898\\,789 = 670\\,616\\,280.
+\end{align}$$
+
+Find $S(2000)\bmod 987\\,898\\,789$.
+
+### --tests--
+
+`gcdAndTiling()` should return `970746056`.
+
+```js
+assert.strictEqual(gcdAndTiling(), 970746056);
+```
+
+## 40
+
+### --description--
+
+For an integer $M$, we define $R(M)$ as the sum of $\frac{1}{p·q}$ for all the integer pairs $p$ and $q$ which satisfy all of these conditions:
+
+- $1 ≤ p < q ≤ M$
+- $p + q ≥ M$
+- $p$ and $q$ are coprime.
+
+We also define $S(N)$ as the sum of $R(i)$ for $2 ≤ i ≤ N$.
+
+We can verify that $S(2) = R(2) = \frac{1}{2}$, $S(10) ≈ 6.9147$ and $S(100) ≈ 58.2962$.
+
+Find $S({10}^7)$. Give your answer rounded to four decimal places.
+
+### --tests--
+
+`inverseSummationCoprimeCouples()` should return `5000088.8395`.
+
+```js
+assert.strictEqual(inverseSummationCoprimeCouples(), 5000088.8395);
+```
+
+## 41
+
+### --description--
+
+An integer is called eleven-free if its decimal expansion does not contain any substring representing a power of 11 except 1.
+
+For example, 2404 and 13431 are eleven-free, while 911 and 4121331 are not.
+
+Let $E(n)$ be the $n$th positive eleven-free integer. For example, $E(3) = 3$, $E(200) = 213$ and $E(500\\,000) = 531\\,563$.
+
+Find $E({10}^{18})$.
+
+### --tests--
+
+`elevenFreeIntegers()` should return `1295552661530920200`.
+
+```js
+assert.strictEqual(elevenFreeIntegers(), 1295552661530920200);
+```
+
+## 42
+
+### --description--
+
+Let $g(n)$ be a sequence defined as follows:
+
+$$\begin{align}
+ & g(4) = 13, \\\\
+ & g(n) = g(n-1) + gcd(n, g(n - 1)) \text{ for } n > 4.
+\end{align}$$
+
+The first few values are:
+
+$$\begin{array}{l}
+ n & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19 & 20 & \ldots \\\\
+ g(n) & 13 & 14 & 16 & 17 & 18 & 27 & 28 & 29 & 30 & 31 & 32 & 33 & 34 & 51 & 54 & 55 & 60 & \ldots
+\end{array}$$
+
+You are given that $g(1\\,000) = 2\\,524$ and $g(1\\,000\\,000) = 2\\,624\\,152$.
+
+Find $g({10}^{15})$.
+
+### --tests--
+
+`gcdSequence()` should return `2744233049300770`.
+
+```js
+assert.strictEqual(gcdSequence(), 2744233049300770);
+```
+
+## 43
+
+### --description--
+
+A group of $p$ people decide to sit down at a round table and play a lottery-ticket trading game. Each person starts off with a randomly-assigned, unscratched lottery ticket. Each ticket, when scratched, reveals a whole-pound prize ranging anywhere from £1 to £$p$, with no two tickets alike. The goal of the game is for each person to maximize his ticket winnings upon leaving the game.
+
+An arbitrary person is chosen to be the first player. Going around the table, each player has only one of two options:
+
+1. The player can scratch his ticket and reveal its worth to everyone at the table.
+2. The player can trade his unscratched ticket for a previous player's scratched ticket, and then leave the game with that ticket. The previous player then scratches his newly-acquired ticket and reveals its worth to everyone at the table.
+
+The game ends once all tickets have been scratched. All players still remaining at the table must leave with their currently-held tickets.
+
+Assume that each player uses the optimal strategy for maximizing the expected value of his ticket winnings.
+
+Let $E(p)$ represent the expected number of players left at the table when the game ends in a game consisting of $p$ players (e.g. $E(111) = 5.2912$ when rounded to 5 significant digits).
+
+Let $S_1(N) = \displaystyle\sum_{p = 1}^N E(p)$.
+
+Let $S_k(N) = \displaystyle\sum_{p = 1}^N S_{k - 1}(p)$ for $k > 1$.
+
+Find $S_{20}({10}^{14})$ and write the answer as a string in scientific notation rounded to 10 significant digits. Use a lowercase `e` to separate mantissa and exponent. For example, the answer for $S_3(100)$ would be `5.983679014e5`.
+
+### --tests--
+
+`roundtableLottery()` should return a string.
+
+```js
+assert(typeof roundtableLottery() === 'string');
+```
+
+`roundtableLottery()` should return the string `1.200856722e263`.
+
+```js
+assert.strictEqual(roundtableLottery(), '1.200856722e263');
+```
+
+## 44
+
+### --description--
+
+For every integer $n > 1$, the family of functions $f_{n, a, b}$ is defined by:
+
+$f_{n, a, b}(x) ≡ ax + b\bmod n$ for $a, b, x$ integer and $0 \lt a \lt n$, $0 \le b \lt n$, $0 \le x \lt n$.
+
+We will call $f_{n, a, b}$ a retraction if $f_{n, a, b}(f_{n, a, b}(x)) \equiv f_{n, a, b}(x)\bmod n$ for every $0 \le x \lt n$.
+
+Let $R(n)$ be the number of retractions for $n$.
+
+You are given that
+
+$$\sum_{k = 1}^{99\\,999} R(\displaystyle\binom{100\\,000}{k}) \equiv 628\\,701\\,600\bmod 1\\,000\\,000\\,007$$
+
+Find $$\sum_{k = 1}^{9\\,999\\,999} R(\displaystyle\binom{10\\,000\\,000}{k})$$ Give your answer modulo $1\\,000\\,000\\,007$.
+
+### --tests--
+
+`retractionsA()` should return `659104042`.
+
+```js
+assert.strictEqual(retractionsA(), 659104042);
+```
+
+## 45
+
+### --description--
+
+For every integer $n > 1$, the family of functions $f_{n, a, b}$ is defined by:
+
+$f_{n, a, b}(x) ≡ ax + b\bmod n$ for $a, b, x$ integer and $0 \lt a \lt n$, $0 \le b \lt n$, $0 \le x \lt n$.
+
+We will call $f_{n, a, b}$ a retraction if $f_{n, a, b}(f_{n, a, b}(x)) \equiv f_{n, a, b}(x)\bmod n$ for every $0 \le x \lt n$.
+
+Let $R(n)$ be the number of retractions for $n$.
+
+$F(N) = \displaystyle\sum_{n = 1}^N R(n^4 + 4)$.
+
+$F(1024) = 77\\,532\\,377\\,300\\,600$.
+
+Find $F({10}^7)$. Give your answer modulo $1\\,000\\,000\\,007$.
+
+### --tests--
+
+`retractionsB()` should return `907803852`.
+
+```js
+assert.strictEqual(retractionsB(), 907803852);
+```
+
+## 46
+
+### --description--
+
+For every integer $n > 1$, the family of functions $f_{n, a, b}$ is defined by:
+
+$f_{n, a, b}(x) ≡ ax + b\bmod n$ for $a, b, x$ integer and $0 \lt a \lt n$, $0 \le b \lt n$, $0 \le x \lt n$.
+
+We will call $f_{n, a, b}$ a retraction if $f_{n, a, b}(f_{n, a, b}(x)) \equiv f_{n, a, b}(x)\bmod n$ for every $0 \le x \lt n$.
+
+Let $R(n)$ be the number of retractions for $n$.
+
+$F(N) = \displaystyle\sum_{n = 2}^N R(n)$.
+
+$F({10}^7) ≡ 638\\,042\\,271\bmod 1\\,000\\,000\\,007$.
+
+Find $F({10}^{14})$. Give your answer modulo $1\\,000\\,000\\,007$.
+
+### --tests--
+
+`retractionsC()` should return `530553372`.
+
+```js
+assert.strictEqual(retractionsC(), 530553372);
+```
+
+## 47
+
+### --description--
+
+The function $lcm(a, b)$ denotes the least common multiple of $a$ and $b$.
+
+Let $A(n)$ be the average of the values of $lcm(n, i)$ for $1 ≤ i ≤ n$.
+
+E.g: $A(2) = \frac{2 + 2}{2} = 2$ and $A(10) = \frac{10 + 10 + 30 + 20 + 10 + 30 + 70 + 40 + 90 + 10}{10} = 32$.
+
+Let $S(n) = \sum A(k)$ for $1 ≤ k ≤ n$.
+
+$S(100) = 122\\,726$.
+
+Find $S(99\\,999\\,999\\,019)\bmod 999\\,999\\,017$.
+
+### --tests--
+
+`averageLCM()` should return `106467648`.
+
+```js
+assert.strictEqual(averageLCM(), 106467648);
+```
+
+## 48
+
+### --description--
+
+Phil the confectioner is making a new batch of chocolate covered candy. Each candy centre is shaped like an ellipsoid of revolution defined by the equation: $b^2x^2 + b^2y^2 + a^2z^2 = a^2b^2$.
+
+Phil wants to know how much chocolate is needed to cover one candy centre with a uniform coat of chocolate one millimeter thick.
+
+If $a = 1$ mm and $b = 1$ mm, the amount of chocolate required is $\frac{28}{3} \pi$ mm3
+
+If $a = 2$ mm and $b = 1$ mm, the amount of chocolate required is approximately 60.35475635 mm3.
+
+Find the amount of chocolate in mm3 required if $a = 3$ mm and $b = 1$ mm. Give your answer as the number rounded to 8 decimal places behind the decimal point.
+
+### --tests--
+
+`chocolateCoveredCandy()` should return `103.37870096`.
+
+```js
+assert.strictEqual(chocolateCoveredCandy(), 103.37870096);
+```
+
+## 49
+
+### --description--
+
+A hypocycloid is the curve drawn by a point on a small circle rolling inside a larger circle. The parametric equations of a hypocycloid centered at the origin, and starting at the right most point is given by:
+
+$$x(t) = (R - r) \cos(t) + r \cos(\frac{R - r}{r}t)$$
+
+$$y(t) = (R - r) \sin(t) - r \sin(\frac{R - r}{r} t)$$
+
+Where $R$ is the radius of the large circle and $r$ the radius of the small circle.
+
+Let $C(R, r)$ be the set of distinct points with integer coordinates on the hypocycloid with radius $R$ and $r$ and for which there is a corresponding value of $t$ such that $\sin(t)$ and $\cos(t)$ are rational numbers.
+
+Let $S(R, r) = \sum\_{(x,y) \in C(R, r)} |x| + |y|$ be the sum of the absolute values of the $x$ and $y$ coordinates of the points in $C(R, r)$.
+
+Let $T(N) = \sum_{R = 3}^N \sum_{r=1}^{\left\lfloor \frac{R - 1}{2} \right\rfloor} S(R, r)$ be the sum of $S(R, r)$ for $R$ and $r$ positive integers, $R\leq N$ and $2r < R$.
+
+You are given:
+
+$$\begin{align}
+ C(3, 1) = & \\{(3, 0), (-1, 2), (-1,0), (-1,-2)\\} \\\\
+ C(2500, 1000) = & \\{(2500, 0), (772, 2376), (772, -2376), (516, 1792), (516, -1792), (500, 0), (68, 504), \\\\
+ &(68, -504),(-1356, 1088), (-1356, -1088), (-1500, 1000), (-1500, -1000)\\}
+\end{align}$$
+
+**Note:** (-625, 0) is not an element of $C(2500, 1000)$ because $\sin(t)$ is not a rational number for the corresponding values of $t$.
+
+$S(3, 1) = (|3| + |0|) + (|-1| + |2|) + (|-1| + |0|) + (|-1| + |-2|) = 10$
+
+$T(3) = 10$; $T(10) = 524$; $T(100) = 580\\,442$; $T({10}^3) = 583\\,108\\,600$.
+
+Find $T({10}^6)$.
+
+### --tests--
+
+`hypocycloidAndLatticePoints()` should return `583333163984220900`.
+
+```js
+assert.strictEqual(hypocycloidAndLatticePoints(), 583333163984220900);
+```
+
+## 50
+
+### --description--
+
+Consider the number 15.
+
+There are eight positive numbers less than 15 which are coprime to 15: 1, 2, 4, 7, 8, 11, 13, 14.
+
+The modular inverses of these numbers modulo 15 are: 1, 8, 4, 13, 2, 11, 7, 14 because
+
+$$\begin{align}
+ & 1 \times 1\bmod 15 = 1 \\\\
+ & 2 \times 8 = 16\bmod 15 = 1 \\\\
+ & 4 \times 4 = 16\bmod 15 = 1 \\\\
+ & 7 \times 13 = 91\bmod 15 = 1 \\\\
+ & 11 \times 11 = 121\bmod 15 = 1 \\\\
+ & 14 \times 14 = 196\bmod 15 = 1
+\end{align}$$
+
+Let $I(n)$ be the largest positive number $m$ smaller than $n - 1$ such that the modular inverse of $m$ modulo $n$ equals $m$ itself.
+
+So $I(15) = 11$.
+
+Also $I(100) = 51$ and $I(7) = 1$.
+
+Find $\sum I(n)$ for $3 ≤ n ≤ 2 \times {10}^7$
+
+### --tests--
+
+`modularInverses()` should return `153651073760956`.
+
+```js
+assert.strictEqual(modularInverses(), 153651073760956);
+```
+
+## 51
+
+### --description--
+
+Define $F(m, n)$ as the number of $n$-tuples of positive integers for which the product of the elements doesn't exceed $m$.
+
+$F(10, 10) = 571$.
+
+$F({10}^6, {10}^6)\bmod 1\\,234\\,567\\,891 = 252\\,903\\,833$.
+
+Find $F({10}^9, {10}^9)\bmod 1\\,234\\,567\\,891$.
+
+### --tests--
+
+`longProducts()` should return `345558983`.
+
+```js
+assert.strictEqual(longProducts(), 345558983);
+```
+
+## 52
+
+### --description--
+
+A simple quadrilateral is a polygon that has four distinct vertices, has no straight angles and does not self-intersect.
+
+Let $Q(m, n)$ be the number of simple quadrilaterals whose vertices are lattice points with coordinates ($x$, $y$) satisfying $0 ≤ x ≤ m$ and $0 ≤ y ≤ n$.
+
+For example, $Q(2, 2) = 94$ as can be seen below:
+
+
+
+It can also be verified that $Q(3, 7) = 39\\,590$, $Q(12, 3) = 309\\,000$ and $Q(123, 45) = 70\\,542\\,215\\,894\\,646$.
+
+Find $Q(12\\,345, 6\\,789)\bmod 135\\,707\\,531$.
+
+### --tests--
+
+`latticeQuadrilaterals()` should return `104354107`.
+
+```js
+assert.strictEqual(latticeQuadrilaterals(), 104354107);
+```
+
+## 53
+
+### --description--
+
+In the following equation $x$, $y$, and $n$ are positive integers.
+
+$$\frac{1}{x} + \frac{1}{y} = \frac{1}{n}$$
+
+For a limit $L$ we define $F(L)$ as the number of solutions which satisfy $x < y ≤ L$.
+
+We can verify that $F(15) = 4$ and $F(1000) = 1069$.
+
+Find $F({10}^{12})$.
+
+### --tests--
+
+`diophantineReciprocalsThree()` should return `5435004633092`.
+
+```js
+assert.strictEqual(diophantineReciprocalsThree(), 5435004633092);
+```
+
+## 54
+
+### --description--
+
+Let $f(n)$ be the largest positive integer $x$ less than ${10}^9$ such that the last 9 digits of $n^x$ form the number $x$ (including leading zeros), or zero if no such integer exists.
+
+For example:
+
+$$\begin{align}
+ & f(4) = 411\\,728\\,896 (4^{411\\,728\\,896} = ...490\underline{411728896}) \\\\
+ & f(10) = 0 \\\\
+ & f(157) = 743\\,757 (157^{743\\,757} = ...567\underline{000743757}) \\\\
+ & Σf(n), 2 ≤ n ≤ 103 = 442\\,530\\,011\\,399
+\end{align}$$
+
+Find $\sum f(n)$, $2 ≤ n ≤ {10}^6$.
+
+### --tests--
+
+`powersWithTrailingDigits()` should return `450186511399999`.
+
+```js
+assert.strictEqual(powersWithTrailingDigits(), 450186511399999);
+```
+
+## 55
+
+### --description--
+
+Define:
+
+$$\begin{align}
+ & x_n = ({1248}^n\bmod 32323) - 16161 \\\\
+ & y_n = ({8421}^n\bmod 30103) - 15051 \\\\
+ & P_n = \\{(x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n)\\}
+\end{align}$$
+
+For example,
+$$P_8 = \\{(-14913, -6630), (-10161, 5625), (5226, 11896), (8340, -10778), (15852, -5203), (-15165, 11295), (-1427, -14495), (12407, 1060)\\}$$
+
+Let $C(n)$ be the number of triangles whose vertices are in $P_n$ which contain the origin in the interior.
+
+Examples:
+
+$$\begin{align}
+ & C(8) = 20 \\\\
+ & C(600) = 8\\,950\\,634 \\\\
+ & C(40\\,000) = 2\\,666\\,610\\,948\\,988
+\end{align}$$
+
+Find $C(2\\,000\\,000)$.
+
+### --tests--
+
+`trianglesContainingOriginTwo()` should return `333333208685971500`.
+
+```js
+assert.strictEqual(trianglesContainingOriginTwo(), 333333208685971500);
+```
+
+## 56
+
+### --description--
+
+Let $f(n) = n^2 - 3n - 1$.
+
+Let $p$ be a prime.
+
+Let $R(p)$ be the smallest positive integer $n$ such that $f(n)\bmod p^2 = 0$ if such an integer $n$ exists, otherwise $R(p) = 0$.
+
+Let $SR(L)$ be $\sum R(p)$ for all primes not exceeding $L$.
+
+Find $SR({10}^7)$.
+
+### --tests--
+
+`polynomialModuloSquareOfPrime()` should return `2647787126797397000`.
+
+```js
+assert.strictEqual(polynomialModuloSquareOfPrime(), 2647787126797397000);
+```
+
+## 57
+
+### --description--
+
+Consider the alphabet $A$ made out of the letters of the word `project`: $A = \\{c, e, j, o, p, r, t\\}$.
+
+Let $T(n)$ be the number of strings of length $n$ consisting of letters from $A$ that do not have a substring that is one of the 5040 permutations of `project`.
+
+$T(7) = 7^7 - 7! = 818\\,503$.
+
+Find $T({10}^{12})$. Give the last 9 digits of your answer.
+
+### --tests--
+
+`permutationsOfProject()` should return `423341841`.
+
+```js
+assert.strictEqual(permutationsOfProject(), 423341841);
+```
+
+## 58
+
+### --description--
+
+The flipping game is a two player game played on a $N$ by $N$ square board.
+
+Each square contains a disk with one side white and one side black.
+
+The game starts with all disks showing their white side.
+
+A turn consists of flipping all disks in a rectangle with the following properties:
+
+- the upper right corner of the rectangle contains a white disk
+- the rectangle width is a perfect square (1, 4, 9, 16, ...)
+- the rectangle height is a triangular number (1, 3, 6, 10, ...)
+
+
+
+Players alternate turns. A player wins by turning the grid all black.
+
+Let $W(N)$ be the number of winning moves for the first player on a $N$ by $N$ board with all disks white, assuming perfect play.
+
+$W(1) = 1$, $W(2) = 0$, $W(5) = 8$ and $W({10}^2) = 31\\,395$.
+
+For $N = 5$, the first player's eight winning first moves are:
+
+
+
+Find $W({10}^6)$.
+
+### --tests--
+
+`flippingGame()` should return `3996390106631`.
+
+```js
+assert.strictEqual(flippingGame(), 3996390106631);
+```
+
+## 59
+
+### --description--
+
+On the Euclidean plane, an ant travels from point $A(0, 1)$ to point $B(d, 1)$ for an integer $d$.
+
+In each step, the ant at point ($x_0$, $y_0$) chooses one of the lattice points ($x_1$, $y_1$) which satisfy $x_1 ≥ 0$ and $y_1 ≥ 1$ and goes straight to ($x_1$, $y_1$) at a constant velocity $v$. The value of $v$ depends on $y_0$ and $y_1$ as follows:
+
+- If $y_0 = y_1$, the value of $v$ equals $y_0$.
+- If $y_0 ≠ y_1$, the value of $v$ equals $\frac{y_1 - y_0}{\ln y_1 - \ln y_0}$.
+
+The left image is one of the possible paths for $d = 4$. First the ant goes from $A(0, 1)$ to $P_1(1, 3)$ at velocity $\frac{3 - 1}{\ln 3 - \ln 1} ≈ 1.8205$. Then the required time is $\frac{\sqrt{5}}{1.820} ≈ 1.2283$.
+
+From $P_1(1, 3)$ to $P_2(3, 3)$ the ant travels at velocity 3 so the required time is $\frac{2}{3} ≈ 0.6667$. From $P_2(3, 3)$ to $B(4, 1)$ the ant travels at velocity $\frac{1 - 3}{\ln 1 - \ln 3} ≈ 1.8205$ so the required time is $\frac{\sqrt{5}}{1.8205} ≈ 1.2283$.
+
+Thus the total required time is $1.2283 + 0.6667 + 1.2283 = 3.1233$.
+
+The right image is another path. The total required time is calculated as $0.98026 + 1 + 0.98026 = 2.96052$. It can be shown that this is the quickest path for $d = 4$.
+
+
+
+Let $F(d)$ be the total required time if the ant chooses the quickest path. For example, $F(4) ≈ 2.960\\,516\\,287$. We can verify that $F(10) ≈ 4.668\\,187\\,834$ and $F(100) ≈ 9.217\\,221\\,972$.
+
+Find $F(10\\,000)$. Give your answer rounded to nine decimal places.
+
+### --tests--
+
+`antOnTheMove()` should return `18.420738199`.
+
+```js
+assert.strictEqual(antOnTheMove(), 18.420738199);
+```
+
+## 60
+
+### --description--
+
+Let `f(k, n)` = $e^\frac{k}{n} - 1$, for all non-negative integers `k`.
+
+Remarkably, `f(6, 200) + f(75, 200) + f(89, 200) + f(226, 200)` = 3.1415926… ≈ π.
+
+In fact, it is the best approximation of π of the form `f(a, 200) + f(b, 200) + f(c, 200) + f(d, 200)`.
+
+Let `almostPi(n)` = a2 + b2 + c2 + d2 for a, b, c, d that minimize the error: $\lvert f(a,n) + f(b,n) + f(c,n) + f(d,n) - \Pi\rvert$
+
+You are given `almostPi(200)` = 62 + 752 + 892 + 2262 = 64658.
+
+### --tests--
+
+`almostPi` should be a function.
+
+```js
+assert(typeof almostPi === 'function')
+```
+
+`almostPi` should return a number.
+
+```js
+assert.strictEqual(typeof almostPi(10), 'number');
+```
+
+`almostPi(29)` should return `1208`.
+
+```js
+assert.strictEqual(almostPi(29), 1208);
+```
+
+`almostPi(50)` should return `4152`.
+
+```js
+assert.strictEqual(almostPi(50), 4152);
+```
+
+`almostPi(200)` should return `64658`.
+
+```js
+assert.strictEqual(almostPi(200), 64658);
+```
+
+## 61
+
+### --description--
+
+A 3-smooth number is an integer which has no prime factor larger than 3. For an integer $N$, we define $S(N)$ as the set of 3-smooth numbers less than or equal to $N$. For example, $S(20) = \\{1, 2, 3, 4, 6, 8, 9, 12, 16, 18\\}$.
+
+We define $F(N)$ as the number of permutations of $S(N)$ in which each element comes after all of its proper divisors.
+
+This is one of the possible permutations for $N = 20$.
+
+- 1, 2, 4, 3, 9, 8, 16, 6, 18, 12.
+
+This is not a valid permutation because 12 comes before its divisor 6.
+
+- 1, 2, 4, 3, 9, 8, 12, 16, 6, 18.
+
+We can verify that $F(6) = 5$, $F(8) = 9$, $F(20) = 450$ and $F(1000) ≈ 8.8521816557e\\,21$.
+
+Find $F({10}^{18})$. Give as your answer as a string in its scientific notation rounded to ten digits after the decimal point. When giving your answer, use a lowercase `e` to separate mantissa and exponent. E.g. if the answer is $112\\,233\\,445\\,566\\,778\\,899$ then the answer format would be `1.1223344557e17`.
+
+### --tests--
+
+`permutationOf3SmoothNumbers()` should return a string.
+
+```js
+assert.strictEqual(typeof permutationOf3SmoothNumbers() === 'string');
+```
+
+`permutationOf3SmoothNumbers()` should return the string `5.5350769703e1512`.
+
+```js
+assert.strictEqual(permutationOf3SmoothNumbers(), '5.5350769703e1512');
+```
+
+## 62
+
+### --description--
+
+The function $f$ is defined for all positive integers as follows:
+
+$$\begin{align}
+ & f(1) = 1 \\\\
+ & f(3) = 3 \\\\
+ & f(2n) = f(n) \\\\
+ & f(4n + 1) = 2f(2n + 1) - f(n) \\\\
+ & f(4n + 3) = 3f(2n + 1) - 2f(n)
+\end{align}$$
+
+The function $S(n)$ is defined as $\sum_{i=1}^{n} f(i)$.
+
+$S(8) = 22$ and $S(100) = 3604$.
+
+Find $S(3^{37})$. Give the last 9 digits of your answer.
+
+### --tests--
+
+`weirdRecurrenceRelation()` should return `808981553`.
+
+```js
+assert.strictEqual(weirdRecurrenceRelation(), 808981553);
+```
+
+## 63
+
+### --description--
+
+The Möbius function, denoted $μ(n)$, is defined as:
+
+- $μ(n) = (-1)^{ω(n)}$ if $n$ is squarefree (where $ω(n)$ is the number of distinct prime factors of $n$)
+- $μ(n) = 0$ if $n$ is not squarefree.
+
+Let $P(a, b)$ be the number of integers $n$ in the interval $[a, b]$ such that $μ(n) = 1$.
+
+Let $N(a, b)$ be the number of integers $n$ in the interval $[a, b]$ such that $μ(n) = -1$.
+
+For example, $P(2, 10) = 2$ and $N(2, 10) = 4$.
+
+Let $C(n)$ be the number of integer pairs $(a, b)$ such that:
+
+- $1 ≤ a ≤ b ≤ n$,
+- $99 \times N(a, b) ≤ 100 \times P(a, b)$, and
+- $99 \times P(a, b) ≤ 100 \times N(a, b)$.
+
+For example, $C(10) = 13$, $C(500) = 16\\,676$ and $C(10\\,000) = 20\\,155\\,319$.
+
+Find $C(20\\,000\\,000)$.
+
+### --tests--
+
+`mobiusFunctionAndIntervals()` should return `198775297232878`.
+
+```js
+assert.strictEqual(mobiusFunctionAndIntervals(), 198775297232878);
+```
+
+## 64
+
+### --description--
+
+The kernel of a polygon is defined by the set of points from which the entire polygon's boundary is visible. We define a polar polygon as a polygon for which the origin is strictly contained inside its kernel.
+
+For this problem, a polygon can have collinear consecutive vertices. However, a polygon still cannot have self-intersection and cannot have zero area.
+
+For example, only the first of the following is a polar polygon (the kernels of the second, third, and fourth do not strictly contain the origin, and the fifth does not have a kernel at all):
+
+
+
+Notice that the first polygon has three consecutive collinear vertices.
+
+Let $P(n)$ be the number of polar polygons such that the vertices $(x, y)$ have integer coordinates whose absolute values are not greater than $n$.
+
+Note that polygons should be counted as different if they have different set of edges, even if they enclose the same area. For example, the polygon with vertices [(0,0), (0,3), (1,1), (3,0)] is distinct from the polygon with vertices [(0,0), (0,3), (1,1), (3,0), (1,0)].
+
+For example, $P(1) = 131$, $P(2) = 1\\,648\\,531$, $P(3) = 1\\,099\\,461\\,296\\,175$ and $P(343)\bmod 1\\,000\\,000\\,007 = 937\\,293\\,740$.
+
+Find $P(7^{13})\bmod 1\\,000\\,000\\,007$.
+
+### --tests--
+
+`polarPolygons()` should return `585965659`.
+
+```js
+assert.strictEqual(polarPolygons(), 585965659);
+```
+
+## 65
+
+### --description--
+
+Let $P(m,n)$ be the number of distinct terms in an $m×n$ multiplication table.
+
+For example, a 3×4 multiplication table looks like this:
+
+$$\begin{array}{c}
+ × & \mathbf{1} & \mathbf{2} & \mathbf{3} & \mathbf{4} \\\\
+ \mathbf{1} & 1 & 2 & 3 & 4 \\\\
+ \mathbf{2} & 2 & 4 & 6 & 8 \\\\
+ \mathbf{3} & 3 & 6 & 9 & 12
+\end{array}$$
+
+There are 8 distinct terms {1, 2, 3, 4, 6, 8, 9, 12}, therefore $P(3, 4) = 8$.
+
+You are given that:
+
+$$\begin{align}
+ & P(64, 64) = 1\\,263, \\\\
+ & P(12, 345) = 1\\,998, \text{ and} \\\\
+ & P(32, {10}^{15}) = 13\\,826\\,382\\,602\\,124\\,302. \\\\
+\end{align}$$
+
+Find $P(64, {10}^{16})$.
+
+### --tests--
+
+`multiplicationTable()` should return `258381958195474750`.
+
+```js
+assert.strictEqual(multiplicationTable(), 258381958195474750);
+```
+
+## 66
+
+### --description--
+
+An integer $s$ is called a superinteger of another integer $n$ if the digits of $n$ form a subsequence of the digits of $s$.
+
+For example, 2718281828 is a superinteger of 18828, while 314159 is not a superinteger of 151.
+
+Let $p(n)$ be the $n$th prime number, and let $c(n)$ be the $n$th composite number. For example, $p(1) = 2$, $p(10) = 29$, $c(1) = 4$ and $c(10) = 18$.
+
+$$\begin{align}
+ & \\{p(i) : i ≥ 1\\} = \\{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, \ldots \\} \\\\
+ & \\{c(i) : i ≥ 1\\} = \\{4, 6, 8, 9, 10, 12, 14, 15, 16, 18, \ldots \\}
+\end{align}$$
+
+Let $P^D$ the sequence of the digital roots of $\\{p(i)\\}$ ($C^D$ is defined similarly for $\\{c(i)\\}$):
+
+$$\begin{align}
+ & P^D = \\{2, 3, 5, 7, 2, 4, 8, 1, 5, 2, \ldots \\} \\\\
+ & C^D = \\{4, 6, 8, 9, 1, 3, 5, 6, 7, 9, \ldots \\}
+\end{align}$$
+
+Let $P_n$ be the integer formed by concatenating the first $n$ elements of $P^D$ ($C_n$ is defined similarly for $C^D$).
+
+$$\begin{align}
+ & P_{10} = 2\\,357\\,248\\,152 \\\\
+ & C_{10} = 4\\,689\\,135\\,679
+\end{align}$$
+
+Let $f(n)$ be the smallest positive integer that is a common superinteger of $P_n$ and $C_n$. For example, $f(10) = 2\\,357\\,246\\,891\\,352\\,679$, and $f(100)\bmod 1\\,000\\,000\\,007 = 771\\,661\\,825$.
+
+Find $f(10\\,000)\bmod 1\\,000\\,000\\,007$.
+
+### --tests--
+
+`superinteger()` should return `775181359`.
+
+```js
+assert.strictEqual(superinteger(), 775181359);
+```
+
+## 67
+
+### --description--
+
+An integer is called B-smooth if none of its prime factors is greater than $B$.
+
+Let $SB(n)$ be the largest B-smooth divisor of $n$.
+
+Examples:
+
+$$\begin{align}
+ & S_1(10) = 1 \\\\
+ & S_4(2\\,100) = 12 \\\\
+ & S_{17}(2\\,496\\,144) = 5\\,712
+\end{align}$$
+
+Define $F(n) = \displaystyle\sum_{B = 1}^n \sum_{r = 0}^n S_B(\displaystyle\binom{n}{r})$. Here, $\displaystyle\binom{n}{r}$ denotes the binomial coefficient.
+
+Examples:
+
+$$\begin{align}
+ & F(11) = 3132 \\\\
+ & F(1\\,111)\bmod 1\\,000\\,000\\,993 = 706\\,036\\,312 \\\\
+ & F(111\\,111)\bmod 1\\,000\\,000\\,993 = 22\\,156\\,169
+\end{align}$$
+
+Find $F(11\\,111\\,111)\bmod 1\\,000\\,000\\,993$.
+
+### --tests--
+
+`smoothDivisorsOfBinomialCoefficients()` should return `852950321`.
+
+```js
+assert.strictEqual(smoothDivisorsOfBinomialCoefficients(), 852950321);
+```
+
+## 68
+
+### --description--
+
+In a room $N$ chairs are placed around a round table.
+
+Knights enter the room one by one and choose at random an available empty chair.
+
+To have enough elbow room the knights always leave at least one empty chair between each other.
+
+When there aren't any suitable chairs left, the fraction $C$ of empty chairs is determined. We also define $E(N)$ as the expected value of $C$.
+
+We can verify that $E(4) = \frac{1}{2}$ and $E(6) = \frac{5}{9}$.
+
+Find $E({10}^{18})$. Give your answer rounded to fourteen decimal places in the form 0.abcdefghijklmn.
+
+### --tests--
+
+`emptyChairs()` should return `0.56766764161831`.
+
+```js
+assert.strictEqual(emptyChairs(), 0.56766764161831);
+```
+
+## 69
+
+### --description--
+
+Consider a single game of Ramvok:
+
+Let $t$ represent the maximum number of turns the game lasts. If $t = 0$, then the game ends immediately. Otherwise, on each turn $i$, the player rolls a die. After rolling, if $i < t$ the player can either stop the game and receive a prize equal to the value of the current roll, or discard the roll and try again next turn. If $i = t$, then the roll cannot be discarded and the prize must be accepted. Before the game begins, $t$ is chosen by the player, who must then pay an up-front cost $ct$ for some constant $c$. For $c = 0$, $t$ can be chosen to be infinite (with an up-front cost of 0). Let $R(d, c)$ be the expected profit (i.e. net gain) that the player receives from a single game of optimally-played Ramvok, given a fair $d$-sided die and cost constant $c$. For example, $R(4, 0.2) = 2.65$. Assume that the player has sufficient funds for paying any/all up-front costs.
+
+Now consider a game of Super Ramvok:
+
+In Super Ramvok, the game of Ramvok is played repeatedly, but with a slight modification. After each game, the die is altered. The alteration process is as follows: The die is rolled once, and if the resulting face has its pips visible, then that face is altered to be blank instead. If the face is already blank, then it is changed back to its original value. After the alteration is made, another game of Ramvok can begin (and during such a game, at each turn, the die is rolled until a face with a value on it appears). The player knows which faces are blank and which are not at all times. The game of Super Ramvok ends once all faces of the die are blank.
+
+Let $S(d, c)$ be the expected profit that the player receives from an optimally-played game of Super Ramvok, given a fair $d$-sided die to start (with all sides visible), and cost constant $c$. For example, $S(6, 1) = 208.3$.
+
+Let $F(n) = \sum_{4 ≤ d ≤ n} \sum_{0 ≤ c ≤ n} S(d, c)$.
+
+Calculate $F(20)$, rounded to the nearest integer.
+
+### --tests--
+
+`superRamvok()` should return `147668794`.
+
+```js
+assert.strictEqual(superRamvok(), 147668794);
+```
+
+## 70
+
+### --description--
+
+The triangle $ΔABC$ is inscribed in an ellipse with equation $\frac{x^2}{a^2} + \frac{y^2}{b^2} = 1$, $0 < 2b < a$, $a$ and $b$ integers.
+
+Let $r(a, b)$ be the radius of the incircle of $ΔABC$ when the incircle has center $(2b, 0)$ and $A$ has coordinates $\left(\frac{a}{2}, \frac{\sqrt{3}}{2}b\right)$.
+
+For example, $r(3, 1) = \frac{1}{2}, r(6, 2) = 1, r(12, 3) = 2$.
+
+
+
+
+
+Let $G(n) = \sum_{a = 3}^n \sum_{b = 1}^{\left\lfloor\frac{a - 1}{2} \right\rfloor} r(a, b)$
+
+You are given $G(10) = 20.59722222$, $G(100) = 19223.60980$ (rounded to 10 significant digits).
+
+Find $G({10}^{11})$. Give your answer as a string in scientific notation rounded to 10 significant digits. Use a lowercase `e` to separate mantissa and exponent.
+
+For $G(10)$ the answer would have been `2.059722222e1`
+
+### --tests--
+
+`triangleInscribedInEllipse()` should return a string.
+
+```js
+assert(typeof triangleInscribedInEllipse() === 'string');
+```
+
+`triangleInscribedInEllipse()` should return the string `1.895093981e31`.
+
+```js
+assert.strictEqual(triangleInscribedInEllipse(), '1.895093981e31');
+```
+
+## 71
+
+### --description--
+
+There are $N$ seats in a row. $N$ people come one after another to fill the seats according to the following rules:
+
+1. No person sits beside another.
+1. The first person chooses any seat.
+1. Each subsequent person chooses the seat furthest from anyone else already seated, as long as it does not violate rule 1. If there is more than one choice satisfying this condition, then the person chooses the leftmost choice.
+
+Note that due to rule 1, some seats will surely be left unoccupied, and the maximum number of people that can be seated is less than $N$ (for $N > 1$).
+
+Here are the possible seating arrangements for $N = 15$:
+
+
+
+We see that if the first person chooses correctly, the 15 seats can seat up to 7 people. We can also see that the first person has 9 choices to maximize the number of people that may be seated.
+
+Let $f(N)$ be the number of choices the first person has to maximize the number of occupants for $N$ seats in a row. Thus, $f(1) = 1$, $f(15) = 9$, $f(20) = 6$, and $f(500) = 16$.
+
+Also, $\sum f(N) = 83$ for $1 ≤ N ≤ 20$ and $\sum f(N) = 13\\,343$ for $1 ≤ N ≤ 500$.
+
+Find $\sum f(N)$ for $1 ≤ N ≤ {10}^{12}$. Give the last 8 digits of your answer.
+
+### --tests--
+
+`comfortableDistanceTwo()` should return `73811586`.
+
+```js
+assert.strictEqual(comfortableDistanceTwo(), 73811586);
+```
+
+## 72
+
+### --description--
+
+Let $\varphi$ be the golden ratio: $\varphi = \frac{1+\sqrt{5}}{2}.$
+
+Remarkably it is possible to write every positive integer as a sum of powers of $\varphi$ even if we require that every power of $\varphi$ is used at most once in this sum.
+
+Even then this representation is not unique.
+
+We can make it unique by requiring that no powers with consecutive exponents are used and that the representation is finite.
+
+E.g:
+
+$2 = \varphi + \varphi^{-2}$ and $3 = \varphi^{2} + \varphi^{-2}$
+
+To represent this sum of powers of $\varphi$ we use a string of 0's and 1's with a point to indicate where the negative exponents start. We call this the representation in the phigital numberbase.
+
+So $1 = 1_{\varphi}$, $2 = 10.01_{\varphi}$, $3 = 100.01_{\varphi}$ and $14 = 100100.001001_{\varphi}$. The strings representing 1, 2 and 14 in the phigital number base are palindromic, while the string representing 3 is not (the phigital point is not the middle character).
+
+The sum of the positive integers not exceeding 1000 whose phigital representation is palindromic is 4345.
+
+Find the sum of the positive integers not exceeding $10^{10}$ whose phigital representation is palindromic.
+
+### --tests--
+
+`phigitalNumberBase()` should return `35856681704365`.
+
+```js
+assert.strictEqual(phigitalNumberBase(), 35856681704365);
+```
+
+## 73
+
+### --description--
+
+For a positive integer $n$ and digits $d$, we define $F(n, d)$ as the number of the divisors of $n$ whose last digits equal $d$.
+
+For example, $F(84, 4) = 3$. Among the divisors of 84 (1, 2, 3, 4, 6, 7, 12, 14, 21, 28, 42, 84), three of them (4, 14, 84) have the last digit 4.
+
+We can also verify that $F(12!, 12) = 11$ and $F(50!, 123) = 17\\,888$.
+
+Find $F({10}^6!, 65\\,432) \text{ modulo } ({10}^{16} + 61)$.
+
+### --tests--
+
+`lastDigitsOfDivisors()` should return `9690646731515010`.
+
+```js
+assert.strictEqual(lastDigitsOfDivisors(), 9690646731515010);
+```
+
+## 74
+
+### --description--
+
+$12n$ musicians participate at a music festival. On the first day, they form $3n$ quartets and practice all day.
+
+It is a disaster. At the end of the day, all musicians decide they will never again agree to play with any member of their quartet.
+
+On the second day, they form $4n$ trios, each musician avoiding his previous quartet partners.
+
+Let $f(12n)$ be the number of ways to organize the trios amongst the $12n$ musicians.
+
+You are given $f(12) = 576$ and $f(24)\bmod 1\\,000\\,000\\,007 = 509\\,089\\,824$.
+
+Find $f(600)\bmod 1\\,000\\,000\\,007$.
+
+### --tests--
+
+`musicFestival()` should return `75780067`.
+
+```js
+assert.strictEqual(musicFestival(), 75780067);
+```
+
+## 75
+
+### --description--
+
+Let $R(a, b, c)$ be the maximum area covered by three non-overlapping circles inside a triangle with edge lengths $a$, $b$ and $c$.
+
+Let $S(n)$ be the average value of $R(a, b, c)$ over all integer triplets $(a, b, c)$ such that $1 ≤ a ≤ b ≤ c < a + b ≤ n$.
+
+You are given $S(2) = R(1, 1, 1) ≈ 0.31998$, $S(5) ≈ 1.25899$.
+
+Find $S(1803)$ rounded to 5 decimal places behind the decimal point.
+
+### --tests--
+
+`circlePackingTwo()` should return `110242.87794`.
+
+```js
+assert.strictEqual(circlePackingTwo(), 110242.87794);
+```
+
+## 76
+
+### --description--
+
+The number sequence game starts with a sequence $S$ of $N$ numbers written on a line.
+
+Two players alternate turns. At his turn, a player must select and remove either the first or the last number remaining in the sequence.
+
+The player score is the sum of all the numbers he has taken. Each player attempts to maximize his own sum.
+
+If $N = 4$ and $S = \\{1, 2, 10, 3\\}$, then each player maximizes his score as follows:
+
+- Player 1: removes the first number (1)
+- Player 2: removes the last number from the remaining sequence (3)
+- Player 1: removes the last number from the remaining sequence (10)
+- Player 2: removes the remaining number (2)
+
+Player 1 score is $1 + 10 = 11$.
+
+Let $F(N)$ be the score of player 1 if both players follow the optimal strategy for the sequence $S = \\{s_1, s_2, \ldots, s_N\\}$ defined as:
+
+- $s_1 = 0$
+- $s_{i + 1} = ({s_i}^2 + 45)$ modulo $1\\,000\\,000\\,007$
+
+The sequence begins with $S = \\{0, 45, 2\\,070, 4\\,284\\,945, 753\\,524\\,550, 478\\,107\\,844, 894\\,218\\,625, \ldots\\}$.
+
+You are given $F(2) = 45$, $F(4) = 4\\,284\\,990$, $F(100) = 26\\,365\\,463\\,243$, $F(104) = 2\\,495\\,838\\,522\\,951$.
+
+Find $F({10}^8)$.
+
+### --tests--
+
+`numberSequenceGame()` should return `25044905874565164`.
+
+```js
+assert.strictEqual(numberSequenceGame(), 25044905874565164);
+```
+
+## 77
+
+### --description--
+
+Let us consider mixtures of three substances: $A$, $B$ and $C$. A mixture can be described by a ratio of the amounts of $A$, $B$, and $C$ in it, i.e., $(a : b : c)$. For example, a mixture described by the ratio (2 : 3 : 5) contains 20% $A$, 30% $B$ and 50% $C$.
+
+For the purposes of this problem, we cannot separate the individual components from a mixture. However, we can combine different amounts of different mixtures to form mixtures with new ratios.
+
+For example, say we have three mixtures with ratios (3 : 0 : 2), (3 : 6 : 11) and (3 : 3 : 4). By mixing 10 units of the first, 20 units of the second and 30 units of the third, we get a new mixture with ratio (6 : 5 : 9), since: ($10 \times \frac{3}{5} + 20 \times \frac{3}{20} + 30 \times \frac{3}{10}$ : $10 \times \frac{0}{5} + 20 \times \frac{6}{20} + 30 \times \frac{3}{10}$ : $10 \times \frac{2}{5} + 20 \times \frac{11}{20} + 30 \times \frac{4}{10}$) = (18 : 15 : 27) = (6 : 5 : 9)
+
+However, with the same three mixtures, it is impossible to form the ratio (3 : 2 : 1), since the amount of $B$ is always less than the amount of $C$.
+
+Let $n$ be a positive integer. Suppose that for every triple of integers $(a, b, c)$ with $0 ≤ a, b, c ≤ n$ and $gcd(a, b, c) = 1$, we have a mixture with ratio $(a : b : c)$. Let $M(n)$ be the set of all such mixtures.
+
+For example, $M(2)$ contains the 19 mixtures with the following ratios:
+
+{(0 : 0 : 1), (0 : 1 : 0), (0 : 1 : 1), (0 : 1 : 2), (0 : 2 : 1), (1 : 0 : 0), (1 : 0 : 1), (1 : 0 : 2), (1 : 1 : 0), (1 : 1 : 1), (1 : 1 : 2), (1 : 2 : 0), (1 : 2 : 1), (1 : 2 : 2), (2 : 0 : 1), (2 : 1 : 0), (2 : 1 : 1), (2 : 1 : 2), (2 : 2 : 1)}.
+
+Let $E(n)$ be the number of subsets of $M(n)$ which can produce the mixture with ratio (1 : 1 : 1), i.e., the mixture with equal parts $A$, $B$ and $C$.
+
+We can verify that $E(1) = 103$, $E(2) = 520\\,447$, $E(10)\bmod {11}^8 = 82\\,608\\,406$ and $E(500)\bmod {11}^8 = 13\\,801\\,403$.
+
+Find $E(10\\,000\\,000)\bmod {11}^8$.
+
+### --tests--
+
+`mixtures()` should return `59510340`.
+
+```js
+assert.strictEqual(mixtures(), 59510340);
+```
+
+## 78
+
+### --description--
+
+Let $a_k$, $b_k$, and $c_k$ represent the three solutions (real or complex numbers) to the expression $\frac{1}{x} = {\left(\frac{k}{x} \right)}^2 (k + x^2) - kx$.
+
+For instance, for $k = 5$, we see that $\\{a_5, b_5, c_5\\}$ is approximately $\\{5.727244, -0.363622 + 2.057397i, -0.363622 - 2.057397i\\}$.
+
+Let $S(n) = \displaystyle\sum_{p = 1}^n \sum_{k = 1}^n {(a_k + b_k)}^p {(b_k + c_k)}^p {(c_k + a_k)}^p$ for all integers $p$, $k$ such that $1 ≤ p, k ≤ n$.
+
+Interestingly, $S(n)$ is always an integer. For example, $S(4) = 51\\,160$.
+
+Find $S({10}^6) \text{ modulo } 1\\,000\\,000\\,007$.
+
+### --tests--
+
+`rootsOnTheRise()` should return `191541795`.
+
+```js
+assert.strictEqual(rootsOnTheRise(), 191541795);
+```
+
+## 79
+
+### --description--
+
+Consider all the words which can be formed by selecting letters, in any order, from the phrase:
+
+$$\mathbf{\text{thereisasyetinsufficientdataforameaningfulanswer}}$$
+
+Suppose those with 15 letters or less are listed in alphabetical order and numbered sequentially starting at 1.
+
+The list would include:
+
+$$\begin{align}
+ & 1: \text{a} \\\\
+ & 2: \text{aa} \\\\
+ & 3: \text{aaa} \\\\
+ & 4: \text{aaaa} \\\\
+ & 5: \text{aaaaa} \\\\
+ & 6: \text{aaaaaa} \\\\
+ & 7: \text{aaaaaac} \\\\
+ & 8: \text{aaaaaacd} \\\\
+ & 9: \text{aaaaaacde} \\\\
+ & 10: \text{aaaaaacdee} \\\\
+ & 11: \text{aaaaaacdeee} \\\\
+ & 12: \text{aaaaaacdeeee} \\\\
+ & 13: \text{aaaaaacdeeeee} \\\\
+ & 14: \text{aaaaaacdeeeeee} \\\\
+ & 15: \text{aaaaaacdeeeeeef} \\\\
+ & 16: \text{aaaaaacdeeeeeeg} \\\\
+ & 17: \text{aaaaaacdeeeeeeh} \\\\
+ & \ldots \\\\
+ & 28: \text{aaaaaacdeeeeeey} \\\\
+ & 29: \text{aaaaaacdeeeeef} \\\\
+ & 30: \text{aaaaaacdeeeeefe} \\\\
+ & \ldots \\\\
+ & 115246685191495242: \text{euleoywuttttsss} \\\\
+ & 115246685191495243: \text{euler} \\\\
+ & 115246685191495244: \text{eulera} \\\\
+ & ... \\\\
+ & 525069350231428029: \text{ywuuttttssssrrr} \\\\
+\end{align}$$
+
+Define $P(w)$ as the position of the word $w$.
+
+Define $W(p)$ as the word in position $p$.
+
+We can see that $P(w)$ and $W(p)$ are inverses: $P(W(p)) = p$ and $W(P(w)) = w$.
+
+Examples:
+
+$$\begin{align}
+ & W(10) = \text{ aaaaaacdee} \\\\
+ & P(\text{aaaaaacdee}) = 10 \\\\
+ & W(115246685191495243) = \text{ euler} \\\\
+ & P(\text{euler}) = 115246685191495243 \\\\
+\end{align}$$
+
+Find
+$$W(P(\text{legionary}) + P(\text{calorimeters}) - P(\text{annihilate}) + P(\text{orchestrated}) - P(\text{fluttering})).$$
+
+Give your answer using lowercase characters (no punctuation or space).
+
+### --tests--
+
+`euler480()` should return a string.
+
+```js
+assert(typeof euler480() === 'string');
+```
+
+`euler480()` should return the string `turnthestarson`.
+
+```js
+assert.strictEqual(euler480(), 'turnthestarson');
+```
+
+## --fcc-end--
+
\ No newline at end of file
diff --git a/curriculum/project-euler/project-euler-problems-1-to-100/problem-1-multiples-of-3-or-5.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-1-multiples-of-3-or-5.md
new file mode 100644
index 0000000..36c1d47
--- /dev/null
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-1-multiples-of-3-or-5.md
@@ -0,0 +1,73 @@
+---
+id: 5900f36e1000cf542c50fe80
+title: 'Problem 1: Multiples of 3 or 5'
+challengeType: 1
+forumTopicId: 301722
+dashedName: problem-1-multiples-of-3-or-5
+---
+
+# --description--
+
+If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
+
+Find the sum of all the multiples of 3 or 5 below the provided parameter value `number`.
+
+# --hints--
+
+`multiplesOf3Or5(10)` should return a number.
+
+```js
+assert(typeof multiplesOf3Or5(10) === 'number');
+```
+
+`multiplesOf3Or5(49)` should return 543.
+
+```js
+assert.strictEqual(multiplesOf3Or5(49), 543);
+```
+
+`multiplesOf3Or5(1000)` should return 233168.
+
+```js
+assert.strictEqual(multiplesOf3Or5(1000), 233168);
+```
+
+`multiplesOf3Or5(8456)` should return 16687353.
+
+```js
+assert.strictEqual(multiplesOf3Or5(8456), 16687353);
+```
+
+`multiplesOf3Or5(19564)` should return 89301183.
+
+```js
+assert.strictEqual(multiplesOf3Or5(19564), 89301183);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function multiplesOf3Or5(number) {
+
+ return true;
+}
+
+multiplesOf3Or5(1000);
+```
+
+# --solutions--
+
+```js
+const multiplesOf3Or5 = (number) => {
+ var total = 0;
+
+ for(var i = 0; i < number; i++) {
+ if(i % 3 == 0 || i % 5 == 0) {
+ total += i;
+ }
+ }
+ return total;
+};
+```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-10-summation-of-primes.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-10-summation-of-primes.md
similarity index 51%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-10-summation-of-primes.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-10-summation-of-primes.md
index d1194e1..144796d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-10-summation-of-primes.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-10-summation-of-primes.md
@@ -1,7 +1,7 @@
---
id: 5900f3761000cf542c50fe89
title: 'Problem 10: Summation of primes'
-challengeType: 5
+challengeType: 1
forumTopicId: 301723
dashedName: problem-10-summation-of-primes
---
@@ -60,21 +60,46 @@ primeSummation(2000000);
# --solutions--
```js
-function primeSummation(n) {
- if (n < 3) { return 0 };
- let nums = [0, 0, 2];
- for (let i = 3; i < n; i += 2){
- nums.push(i);
- nums.push(0);
- }
- let sum = 2;
- for (let i = 3; i < n; i += 2){
- if (nums[i] !== 0){
- sum += nums[i];
- for (let j = i*i; j < n; j += i){
- nums[j] = 0;
+class PrimeSeive {
+ constructor(num) {
+ const seive = Array(Math.floor((num - 1) / 2)).fill(true);
+ const upper = Math.floor((num - 1) / 2);
+ const sqrtUpper = Math.floor((Math.sqrt(num) - 1) / 2);
+
+ for (let i = 0; i <= sqrtUpper; i++) {
+ if (seive[i]) {
+ // Mark value in seive array
+ const prime = 2 * i + 3;
+ // Mark all multiples of this number as false (not prime)
+ const primeSquaredIndex = 2 * i ** 2 + 6 * i + 3;
+ for (let j = primeSquaredIndex; j < upper; j += prime) {
+ seive[j] = false;
+ }
}
}
+
+ this._seive = seive;
+ }
+
+ isPrime(num) {
+ return num === 2
+ ? true
+ : num % 2 === 0
+ ? false
+ : this.isOddPrime(num);
+ }
+
+ isOddPrime(num) {
+ return this._seive[(num - 3) / 2];
+ }
+};
+
+function primeSummation(num) {
+ const primeSeive = new PrimeSeive(num);
+
+ let sum = 2;
+ for (let i = 3; i < num; i += 2) {
+ if (primeSeive.isOddPrime(i)) sum += i;
}
return sum;
}
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-100-arranged-probability.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-100-arranged-probability.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-100-arranged-probability.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-100-arranged-probability.md
index 1d44675..4507fa4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-100-arranged-probability.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-100-arranged-probability.md
@@ -1,7 +1,7 @@
---
id: 5900f3d01000cf542c50fee3
title: 'Problem 100: Arranged probability'
-challengeType: 5
+challengeType: 1
forumTopicId: 301724
dashedName: problem-100-arranged-probability
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-11-largest-product-in-a-grid.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-11-largest-product-in-a-grid.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-11-largest-product-in-a-grid.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-11-largest-product-in-a-grid.md
index d7610e3..507d9a5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-11-largest-product-in-a-grid.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-11-largest-product-in-a-grid.md
@@ -1,7 +1,7 @@
---
id: 5900f3781000cf542c50fe8a
title: 'Problem 11: Largest product in a grid'
-challengeType: 5
+challengeType: 1
forumTopicId: 301734
dashedName: problem-11-largest-product-in-a-grid
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-12-highly-divisible-triangular-number.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-12-highly-divisible-triangular-number.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-12-highly-divisible-triangular-number.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-12-highly-divisible-triangular-number.md
index b14276a..2fa68e8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-12-highly-divisible-triangular-number.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-12-highly-divisible-triangular-number.md
@@ -1,7 +1,7 @@
---
id: 5900f3781000cf542c50fe8b
title: 'Problem 12: Highly divisible triangular number'
-challengeType: 5
+challengeType: 1
forumTopicId: 301746
dashedName: problem-12-highly-divisible-triangular-number
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-13-large-sum.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-13-large-sum.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-13-large-sum.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-13-large-sum.md
index 0577585..7e4db74 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-13-large-sum.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-13-large-sum.md
@@ -1,7 +1,7 @@
---
id: 5900f37a1000cf542c50fe8c
title: 'Problem 13: Large sum'
-challengeType: 5
+challengeType: 1
forumTopicId: 301757
dashedName: problem-13-large-sum
---
@@ -278,7 +278,7 @@ function largeSum(arr) {
sum = sum.toString(10);
- sum = sum.substr(0, 1) + sum.substr(2);
+ sum = sum.substring(0, 1) + sum.substring(2);
let firstTen = sum.slice(0, 10);
return parseInt(firstTen, 10);
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-14-longest-collatz-sequence.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-14-longest-collatz-sequence.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-14-longest-collatz-sequence.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-14-longest-collatz-sequence.md
index 27f5632..cac70d3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-14-longest-collatz-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-14-longest-collatz-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f37a1000cf542c50fe8d
title: 'Problem 14: Longest Collatz sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 301768
dashedName: problem-14-longest-collatz-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-15-lattice-paths.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-15-lattice-paths.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-15-lattice-paths.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-15-lattice-paths.md
index b3b0a49..a3c9a06 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-15-lattice-paths.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-15-lattice-paths.md
@@ -1,7 +1,7 @@
---
id: 5900f37b1000cf542c50fe8e
title: 'Problem 15: Lattice paths'
-challengeType: 5
+challengeType: 1
forumTopicId: 301780
dashedName: problem-15-lattice-paths
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-16-power-digit-sum.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-16-power-digit-sum.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-16-power-digit-sum.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-16-power-digit-sum.md
index b71b480..8ef1c13 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-16-power-digit-sum.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-16-power-digit-sum.md
@@ -1,7 +1,7 @@
---
id: 5900f37d1000cf542c50fe8f
title: 'Problem 16: Power digit sum'
-challengeType: 5
+challengeType: 1
forumTopicId: 301791
dashedName: problem-16-power-digit-sum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-17-number-letter-counts.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-17-number-letter-counts.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-17-number-letter-counts.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-17-number-letter-counts.md
index 2b096d1..c64e9f0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-17-number-letter-counts.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-17-number-letter-counts.md
@@ -1,7 +1,7 @@
---
id: 5900f37d1000cf542c50fe90
title: 'Problem 17: Number letter counts'
-challengeType: 5
+challengeType: 1
forumTopicId: 301804
dashedName: problem-17-number-letter-counts
---
diff --git a/curriculum/project-euler/project-euler-problems-1-to-100/problem-18-maximum-path-sum-i.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-18-maximum-path-sum-i.md
new file mode 100644
index 0000000..5658c42
--- /dev/null
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-18-maximum-path-sum-i.md
@@ -0,0 +1,104 @@
+---
+id: 5900f37e1000cf542c50fe91
+title: 'Problem 18: Maximum path sum I'
+challengeType: 1
+forumTopicId: 301815
+dashedName: problem-18-maximum-path-sum-i
+---
+
+# --description--
+
+By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.
+
+
+ 3
+ 7 4
+ 2 4 6
+ 8 5 9 3
+
+
+That is, 3 + 7 + 4 + 9 = 23.
+
+Find the maximum total from top to bottom of the triangle below:
+
+75
+95 64
+17 47 82
+18 35 87 10
+20 04 82 47 65
+19 01 23 75 03 34
+88 02 77 73 07 63 67
+99 65 04 28 06 16 70 92
+41 41 26 56 83 40 80 70 33
+41 48 72 33 47 32 37 16 94 29
+53 71 44 65 25 43 91 52 97 51 14
+70 11 33 28 77 73 17 78 39 68 17 57
+91 71 52 38 17 14 91 43 58 50 27 29 48
+63 66 04 68 89 53 67 30 73 16 69 87 40 31
+04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
+
+**NOTE:** As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o)
+
+# --hints--
+
+`maximumPathSumI([[3, 0, 0, 0], [7, 4, 0, 0],[2, 4, 6, 0],[8, 5, 9, 3]])` should return a number.
+
+```js
+assert(typeof maximumPathSumI(_testTriangle) === 'number');
+```
+
+`maximumPathSumI([[3, 0, 0, 0], [7, 4, 0, 0],[2, 4, 6, 0],[8, 5, 9, 3]])` should return 23.
+
+```js
+assert.strictEqual(maximumPathSumI(_testTriangle), 23);
+```
+
+`maximumPathSumI([[75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [17, 47, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [18, 35, 87, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [20, 4, 82, 47, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [19, 1, 23, 75, 3, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0], [88, 2, 77, 73, 7, 63, 67, 0, 0, 0, 0, 0, 0, 0, 0], [99, 65, 4, 28, 6, 16, 70, 92, 0, 0, 0, 0, 0, 0, 0], [41, 41, 26, 56, 83, 40, 80, 70, 33, 0, 0, 0, 0, 0, 0], [41, 48, 72, 33, 47, 32, 37, 16, 94, 29, 0, 0, 0, 0, 0], [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14, 0, 0, 0, 0], [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57, 0, 0, 0], [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48, 0, 0], [63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31, 0], [4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23]])` should return 1074.
+
+```js
+assert.strictEqual(maximumPathSumI(_numTriangle), 1074);
+```
+
+# --seed--
+
+## --before-user-code--
+
+```js
+const _numTriangle = [[75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [17, 47, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [18, 35, 87, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [20, 4, 82, 47, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [19, 1, 23, 75, 3, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0], [88, 2, 77, 73, 7, 63, 67, 0, 0, 0, 0, 0, 0, 0, 0], [99, 65, 4, 28, 6, 16, 70, 92, 0, 0, 0, 0, 0, 0, 0], [41, 41, 26, 56, 83, 40, 80, 70, 33, 0, 0, 0, 0, 0, 0], [41, 48, 72, 33, 47, 32, 37, 16, 94, 29, 0, 0, 0, 0, 0], [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14, 0, 0, 0, 0], [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57, 0, 0, 0], [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48, 0, 0], [63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31, 0], [4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23]];
+
+const _testTriangle = [[3, 0, 0, 0], [7, 4, 0, 0],[2, 4, 6, 0],[8, 5, 9, 3]];
+```
+
+## --seed-contents--
+
+```js
+function maximumPathSumI(triangle) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+const testTriangle = [[3, 0, 0, 0],
+ [7, 4, 0, 0],
+ [2, 4, 6, 0],
+ [8, 5, 9, 3]];
+
+function maximumPathSumI(triangle) {
+ let maxSum = triangle.slice();
+
+ for (let i = triangle.length - 1; i > 0; i--) {
+ let currentRow = maxSum[i];
+ let previousRow = maxSum[i - 1];
+ const temp = [];
+ for (let j = 0; j < i; j++) {
+ temp.push(Math.max((currentRow[j] + previousRow[j]), (currentRow[j + 1] + previousRow[j])));
+ }
+ maxSum[i - 1] = temp;
+ maxSum.pop();
+ }
+ return maxSum[0][0];
+}
+```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-19-counting-sundays.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-19-counting-sundays.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-19-counting-sundays.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-19-counting-sundays.md
index c12d6d1..5a3e24c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-19-counting-sundays.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-19-counting-sundays.md
@@ -1,7 +1,7 @@
---
id: 5900f37f1000cf542c50fe92
title: 'Problem 19: Counting Sundays'
-challengeType: 5
+challengeType: 1
forumTopicId: 301827
dashedName: problem-19-counting-sundays
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-2-even-fibonacci-numbers.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-2-even-fibonacci-numbers.md
similarity index 96%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-2-even-fibonacci-numbers.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-2-even-fibonacci-numbers.md
index ecf2a8a..4376672 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-2-even-fibonacci-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-2-even-fibonacci-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f36e1000cf542c50fe81
title: 'Problem 2: Even Fibonacci Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301838
dashedName: problem-2-even-fibonacci-numbers
---
@@ -22,7 +22,7 @@ By considering the terms in the Fibonacci sequence whose values do not exceed `n
assert(typeof fiboEvenSum(10) === 'number');
```
-Your function should return an `even` value.
+Your function should return an even value.
```js
assert.equal(fiboEvenSum(10) % 2 === 0, true);
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-20-factorial-digit-sum.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-20-factorial-digit-sum.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-20-factorial-digit-sum.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-20-factorial-digit-sum.md
index 579ac97..a109ff5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-20-factorial-digit-sum.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-20-factorial-digit-sum.md
@@ -1,7 +1,7 @@
---
id: 5900f3801000cf542c50fe93
title: 'Problem 20: Factorial digit sum'
-challengeType: 5
+challengeType: 1
forumTopicId: 301839
dashedName: problem-20-factorial-digit-sum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-21-amicable-numbers.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-21-amicable-numbers.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-21-amicable-numbers.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-21-amicable-numbers.md
index 58acfba..df19c7d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-21-amicable-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-21-amicable-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f3811000cf542c50fe94
title: 'Problem 21: Amicable numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301851
dashedName: problem-21-amicable-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-22-names-scores.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-22-names-scores.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-22-names-scores.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-22-names-scores.md
index e93e40d..4c8df43 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-22-names-scores.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-22-names-scores.md
@@ -1,7 +1,7 @@
---
id: 5a51eabcad78bf416f316e2a
title: 'Problem 22: Names scores'
-challengeType: 5
+challengeType: 1
forumTopicId: 301862
dashedName: problem-22-names-scores
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-23-non-abundant-sums.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-23-non-abundant-sums.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-23-non-abundant-sums.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-23-non-abundant-sums.md
index ce8b226..cc7079a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-23-non-abundant-sums.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-23-non-abundant-sums.md
@@ -1,7 +1,7 @@
---
id: 5900f3831000cf542c50fe96
title: 'Problem 23: Non-abundant sums'
-challengeType: 5
+challengeType: 1
forumTopicId: 301873
dashedName: problem-23-non-abundant-sums
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-24-lexicographic-permutations.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-24-lexicographic-permutations.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-24-lexicographic-permutations.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-24-lexicographic-permutations.md
index 4999833..91572e2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-24-lexicographic-permutations.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-24-lexicographic-permutations.md
@@ -1,7 +1,7 @@
---
id: 5900f3841000cf542c50fe97
title: 'Problem 24: Lexicographic permutations'
-challengeType: 5
+challengeType: 1
forumTopicId: 301885
dashedName: problem-24-lexicographic-permutations
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-25-1000-digit-fibonacci-number.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-25-1000-digit-fibonacci-number.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-25-1000-digit-fibonacci-number.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-25-1000-digit-fibonacci-number.md
index ca7d277..25d18d7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-25-1000-digit-fibonacci-number.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-25-1000-digit-fibonacci-number.md
@@ -1,7 +1,7 @@
---
id: 5900f3851000cf542c50fe98
title: 'Problem 25: 1000-digit Fibonacci number'
-challengeType: 5
+challengeType: 1
forumTopicId: 301897
dashedName: problem-25-1000-digit-fibonacci-number
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-26-reciprocal-cycles.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-26-reciprocal-cycles.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-26-reciprocal-cycles.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-26-reciprocal-cycles.md
index d6ee972..580ba58 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-26-reciprocal-cycles.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-26-reciprocal-cycles.md
@@ -1,7 +1,7 @@
---
id: 5900f3861000cf542c50fe99
title: 'Problem 26: Reciprocal cycles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301908
dashedName: problem-26-reciprocal-cycles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-27-quadratic-primes.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-27-quadratic-primes.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-27-quadratic-primes.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-27-quadratic-primes.md
index a694ee2..e7c8ebe 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-27-quadratic-primes.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-27-quadratic-primes.md
@@ -1,7 +1,7 @@
---
id: 5900f3871000cf542c50fe9a
title: 'Problem 27: Quadratic primes'
-challengeType: 5
+challengeType: 1
forumTopicId: 301919
dashedName: problem-27-quadratic-primes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-28-number-spiral-diagonals.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-28-number-spiral-diagonals.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-28-number-spiral-diagonals.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-28-number-spiral-diagonals.md
index a476199..eee5007 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-28-number-spiral-diagonals.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-28-number-spiral-diagonals.md
@@ -1,7 +1,7 @@
---
id: 5900f3881000cf542c50fe9b
title: 'Problem 28: Number spiral diagonals'
-challengeType: 5
+challengeType: 1
forumTopicId: 301930
dashedName: problem-28-number-spiral-diagonals
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-29-distinct-powers.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-29-distinct-powers.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-29-distinct-powers.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-29-distinct-powers.md
index 0fc363a..4b8f001 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-29-distinct-powers.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-29-distinct-powers.md
@@ -1,7 +1,7 @@
---
id: 5900f3891000cf542c50fe9c
title: 'Problem 29: Distinct powers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301941
dashedName: problem-29-distinct-powers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-3-largest-prime-factor.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-3-largest-prime-factor.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-3-largest-prime-factor.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-3-largest-prime-factor.md
index 0fbe58b..2961ac6 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-3-largest-prime-factor.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-3-largest-prime-factor.md
@@ -1,7 +1,7 @@
---
id: 5900f36f1000cf542c50fe82
title: 'Problem 3: Largest prime factor'
-challengeType: 5
+challengeType: 1
forumTopicId: 301952
dashedName: problem-3-largest-prime-factor
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-30-digit-n-powers.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-30-digit-n-powers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-30-digit-n-powers.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-30-digit-n-powers.md
index 1eb7fd4..1e7472b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-30-digit-n-powers.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-30-digit-n-powers.md
@@ -1,7 +1,7 @@
---
id: 5900f38a1000cf542c50fe9d
title: 'Problem 30: Digit n powers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301953
dashedName: problem-30-digit-n-powers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-31-coin-sums.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-31-coin-sums.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-31-coin-sums.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-31-coin-sums.md
index 0826a68..ae4372c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-31-coin-sums.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-31-coin-sums.md
@@ -1,7 +1,7 @@
---
id: 5900f38b1000cf542c50fe9e
title: 'Problem 31: Coin sums'
-challengeType: 5
+challengeType: 1
forumTopicId: 301965
dashedName: problem-31-coin-sums
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-32-pandigital-products.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-32-pandigital-products.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-32-pandigital-products.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-32-pandigital-products.md
index fe1724d..5fe7d04 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-32-pandigital-products.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-32-pandigital-products.md
@@ -1,7 +1,7 @@
---
id: 5900f38c1000cf542c50fe9f
title: 'Problem 32: Pandigital products'
-challengeType: 5
+challengeType: 1
forumTopicId: 301976
dashedName: problem-32-pandigital-products
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-33-digit-cancelling-fractions.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-33-digit-cancelling-fractions.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-33-digit-cancelling-fractions.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-33-digit-cancelling-fractions.md
index ec7756e..5419f2f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-33-digit-cancelling-fractions.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-33-digit-cancelling-fractions.md
@@ -1,7 +1,7 @@
---
id: 5900f38d1000cf542c50fea0
title: 'Problem 33: Digit cancelling fractions'
-challengeType: 5
+challengeType: 1
forumTopicId: 301987
dashedName: problem-33-digit-cancelling-fractions
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-34-digit-factorials.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-34-digit-factorials.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-34-digit-factorials.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-34-digit-factorials.md
index 080d068..2eb87f9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-34-digit-factorials.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-34-digit-factorials.md
@@ -1,7 +1,7 @@
---
id: 5900f38e1000cf542c50fea1
title: 'Problem 34: Digit factorials'
-challengeType: 5
+challengeType: 1
forumTopicId: 301998
dashedName: problem-34-digit-factorials
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-35-circular-primes.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-35-circular-primes.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-35-circular-primes.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-35-circular-primes.md
index 9abfdee..f87d297 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-35-circular-primes.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-35-circular-primes.md
@@ -1,7 +1,7 @@
---
id: 5900f38f1000cf542c50fea2
title: 'Problem 35: Circular primes'
-challengeType: 5
+challengeType: 1
forumTopicId: 302009
dashedName: problem-35-circular-primes
---
diff --git a/curriculum/project-euler/project-euler-problems-1-to-100/problem-36-double-base-palindromes.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-36-double-base-palindromes.md
new file mode 100644
index 0000000..93e60e4
--- /dev/null
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-36-double-base-palindromes.md
@@ -0,0 +1,131 @@
+---
+id: 5900f3901000cf542c50fea3
+title: 'Problem 36: Double-base palindromes'
+challengeType: 1
+forumTopicId: 302020
+dashedName: problem-36-double-base-palindromes
+---
+
+# --description--
+
+The decimal number, 585 = 10010010012 (binary), is palindromic in both bases.
+
+Find the sum of all numbers, less than `n`, whereas 1000 ≤ `n` ≤ 1000000, which are palindromic in base 10 and base 2.
+
+(Please note that the palindromic number, in either base, may not include leading zeros.)
+
+# --hints--
+
+`doubleBasePalindromes(1000)` should return a number.
+
+```js
+assert(typeof doubleBasePalindromes(1000) === 'number');
+```
+
+`doubleBasePalindromes(1000)` should return 1772.
+
+```js
+assert(doubleBasePalindromes(1000) == 1772);
+```
+
+`doubleBasePalindromes(50000)` should return 105795.
+
+```js
+assert(doubleBasePalindromes(50000) == 105795);
+```
+
+`doubleBasePalindromes(500000)` should return 286602.
+
+```js
+assert(doubleBasePalindromes(500000) == 286602);
+```
+
+`doubleBasePalindromes(1000000)` should return 872187.
+
+```js
+assert(doubleBasePalindromes(1000000) == 872187);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function doubleBasePalindromes(n) {
+
+ return n;
+}
+
+doubleBasePalindromes(1000000);
+```
+
+# --solutions--
+
+```js
+function buildPalindromesBase10(len) {
+ // Base cases
+ const palindromes = [];
+ if (len > 0) {
+ palindromes.push([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);
+ }
+ if (len > 1) {
+ palindromes.push([11, 22, 33, 44, 55, 66, 77, 88, 99, 0]);
+ }
+
+ for (let i = 3; i <= len; i++) {
+ const lengthIPalindromes = [];
+
+ for (let j = 1; j < 10; j++) {
+ const firstDigit = j * (10 ** (i - 1));
+ const lastDigit = j;
+ // Build off of palindromes 2 digits shorter
+ {
+ const shorterPalindromes = palindromes[i - 3];
+
+ for (const palindrome of shorterPalindromes) {
+ lengthIPalindromes.push(firstDigit + palindrome * 10 + lastDigit);
+ }
+ }
+ // Build off of palindromes 4 digits shorter
+ if (i > 4) {
+ const shorterPalindromes = palindromes[i - 5];
+
+ for (const palindrome of shorterPalindromes) {
+ lengthIPalindromes.push(firstDigit + palindrome * 100 + lastDigit);
+ }
+ }
+ }
+ palindromes.push(lengthIPalindromes);
+ }
+ return palindromes.flat();
+}
+
+function isPalindrome(num) {
+ const numAsString = num.toString();
+ const numDigits = numAsString.length;
+ for (let i = 0; i < numDigits / 2; i++) {
+ if (numAsString[i] !== numAsString[numDigits - 1 - i]) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function isPalindromeBase2(num) {
+ return isPalindrome(num.toString(2));
+}
+
+function doubleBasePalindromes(n) {
+ let palindromeSum = 0;
+ const maxDigits = Math.ceil(Math.log10(n));
+ const palindromesBase10 = buildPalindromesBase10(maxDigits);
+
+ // Loop over all palindromes less than n
+ for (let i = 0; i < palindromesBase10.length && palindromesBase10[i] < n; i++) {
+ if (isPalindromeBase2(palindromesBase10[i])) {
+ palindromeSum += palindromesBase10[i];
+ }
+ }
+ return palindromeSum;
+}
+```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-37-truncatable-primes.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-37-truncatable-primes.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-37-truncatable-primes.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-37-truncatable-primes.md
index 7cac6e4..5d4c80d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-37-truncatable-primes.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-37-truncatable-primes.md
@@ -1,7 +1,7 @@
---
id: 5900f3911000cf542c50fea4
title: 'Problem 37: Truncatable primes'
-challengeType: 5
+challengeType: 1
forumTopicId: 302031
dashedName: problem-37-truncatable-primes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-38-pandigital-multiples.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-38-pandigital-multiples.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-38-pandigital-multiples.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-38-pandigital-multiples.md
index e385d29..5ee26df 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-38-pandigital-multiples.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-38-pandigital-multiples.md
@@ -1,7 +1,7 @@
---
id: 5900f3931000cf542c50fea5
title: 'Problem 38: Pandigital multiples'
-challengeType: 5
+challengeType: 1
forumTopicId: 302042
dashedName: problem-38-pandigital-multiples
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-39-integer-right-triangles.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-39-integer-right-triangles.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-39-integer-right-triangles.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-39-integer-right-triangles.md
index d19bb81..f195726 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-39-integer-right-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-39-integer-right-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f3931000cf542c50fea6
title: 'Problem 39: Integer right triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 302054
dashedName: problem-39-integer-right-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-4-largest-palindrome-product.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-4-largest-palindrome-product.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-4-largest-palindrome-product.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-4-largest-palindrome-product.md
index 34dbf96..9e43625 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-4-largest-palindrome-product.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-4-largest-palindrome-product.md
@@ -1,7 +1,7 @@
---
id: 5900f3701000cf542c50fe83
title: 'Problem 4: Largest palindrome product'
-challengeType: 5
+challengeType: 1
forumTopicId: 302065
dashedName: problem-4-largest-palindrome-product
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-40-champernownes-constant.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-40-champernownes-constant.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-40-champernownes-constant.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-40-champernownes-constant.md
index f7f6c8f..c4386bd 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-40-champernownes-constant.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-40-champernownes-constant.md
@@ -1,7 +1,7 @@
---
id: 5900f3941000cf542c50fea7
title: 'Problem 40: Champernowne''s constant'
-challengeType: 5
+challengeType: 1
forumTopicId: 302066
dashedName: problem-40-champernownes-constant
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-41-pandigital-prime.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-41-pandigital-prime.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-41-pandigital-prime.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-41-pandigital-prime.md
index 4146547..a774fa3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-41-pandigital-prime.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-41-pandigital-prime.md
@@ -1,7 +1,7 @@
---
id: 5900f3951000cf542c50fea8
title: 'Problem 41: Pandigital prime'
-challengeType: 5
+challengeType: 1
forumTopicId: 302078
dashedName: problem-41-pandigital-prime
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-42-coded-triangle-numbers.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-42-coded-triangle-numbers.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-42-coded-triangle-numbers.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-42-coded-triangle-numbers.md
index bc3de08..abda6f2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-42-coded-triangle-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-42-coded-triangle-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f3961000cf542c50fea9
title: 'Problem 42: Coded triangle numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302089
dashedName: problem-42-coded-triangle-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-43-sub-string-divisibility.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-43-sub-string-divisibility.md
similarity index 92%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-43-sub-string-divisibility.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-43-sub-string-divisibility.md
index 7c3a5a8..871e140 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-43-sub-string-divisibility.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-43-sub-string-divisibility.md
@@ -1,7 +1,7 @@
---
id: 5900f3971000cf542c50feaa
title: 'Problem 43: Sub-string divisibility'
-challengeType: 5
+challengeType: 1
forumTopicId: 302100
dashedName: problem-43-sub-string-divisibility
---
@@ -73,7 +73,7 @@ substringDivisibility(5);
```js
function substringDivisibility(n) {
- function isSubDivisable(digits) {
+ function isSubDivisible(digits) {
const factors = [2, 3, 5, 7, 11, 13, 17];
for (let i = 1; i < digits.length - 2; i++) {
@@ -108,17 +108,17 @@ function substringDivisibility(n) {
}
const allowedDigits = [...new Array(n + 1).keys()];
- const divisablePandigitals = [];
+ const divisiblePandigitals = [];
heapsPermutations(
allowedDigits.length,
allowedDigits,
- isSubDivisable,
- divisablePandigitals
+ isSubDivisible,
+ divisiblePandigitals
);
let sum = 0;
- for (let i = 0; i < divisablePandigitals.length; i++) {
- sum += divisablePandigitals[i];
+ for (let i = 0; i < divisiblePandigitals.length; i++) {
+ sum += divisiblePandigitals[i];
}
return sum;
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-44-pentagon-numbers.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-44-pentagon-numbers.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-44-pentagon-numbers.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-44-pentagon-numbers.md
index 3b89176..44905c1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-44-pentagon-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-44-pentagon-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f3981000cf542c50feab
title: 'Problem 44: Pentagon numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302111
dashedName: problem-44-pentagon-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-45-triangular-pentagonal-and-hexagonal.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-45-triangular-pentagonal-and-hexagonal.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-45-triangular-pentagonal-and-hexagonal.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-45-triangular-pentagonal-and-hexagonal.md
index 5c3b224..e80bcc8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-45-triangular-pentagonal-and-hexagonal.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-45-triangular-pentagonal-and-hexagonal.md
@@ -1,7 +1,7 @@
---
id: 5900f3991000cf542c50feac
title: 'Problem 45: Triangular, pentagonal, and hexagonal'
-challengeType: 5
+challengeType: 1
forumTopicId: 302122
dashedName: problem-45-triangular-pentagonal-and-hexagonal
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-46-goldbachs-other-conjecture.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-46-goldbachs-other-conjecture.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-46-goldbachs-other-conjecture.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-46-goldbachs-other-conjecture.md
index 9cd82e5..1bcc859 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-46-goldbachs-other-conjecture.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-46-goldbachs-other-conjecture.md
@@ -1,7 +1,7 @@
---
id: 5900f39a1000cf542c50fead
title: 'Problem 46: Goldbach''s other conjecture'
-challengeType: 5
+challengeType: 1
forumTopicId: 302134
dashedName: problem-46-goldbachs-other-conjecture
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-47-distinct-primes-factors.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-47-distinct-primes-factors.md
similarity index 64%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-47-distinct-primes-factors.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-47-distinct-primes-factors.md
index 998b035..3b79403 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-47-distinct-primes-factors.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-47-distinct-primes-factors.md
@@ -1,7 +1,7 @@
---
id: 5900f39c1000cf542c50feae
title: 'Problem 47: Distinct primes factors'
-challengeType: 5
+challengeType: 1
forumTopicId: 302145
dashedName: problem-47-distinct-primes-factors
---
@@ -68,46 +68,27 @@ distinctPrimeFactors(4, 4);
```js
function distinctPrimeFactors(targetNumPrimes, targetConsecutive) {
- function numberOfPrimeFactors(n) {
- let factors = 0;
-
- // Considering 2 as a special case
- let firstFactor = true;
- while (n % 2 == 0) {
- n = n / 2;
- if (firstFactor) {
- factors++;
- firstFactor = false;
+ const primeLimit = targetNumPrimes * targetConsecutive * 10000;
+ const numFactors = Array(primeLimit).fill(0);
+
+ let numConsecutive = 0;
+ for (let i = 2; i < primeLimit; i++) {
+ if (numFactors[i] === targetNumPrimes) {
+ // Current number is composite with target num factors
+ numConsecutive++;
+ if (numConsecutive === targetConsecutive) {
+ return i - numConsecutive + 1;
}
- }
- // Adding other factors
- for (let i = 3; i < Math.sqrt(n); i += 2) {
- firstFactor = true;
- while (n % i == 0) {
- n = n / i;
- if (firstFactor) {
- factors++;
- firstFactor = false;
+ } else {
+ // Current number is not matching composite
+ numConsecutive = 0;
+ if (numFactors[i] === 0) {
+ // Current number is prime
+ for (let j = i; j < primeLimit; j += i) {
+ numFactors[j]++;
}
}
}
-
- if (n > 1) { factors++; }
-
- return factors;
- }
-
- let number = 0;
- let consecutive = 0;
-
- while (consecutive < targetConsecutive) {
- number++;
- if (numberOfPrimeFactors(number) >= targetNumPrimes) {
- consecutive++;
- } else {
- consecutive = 0;
- }
}
- return number - targetConsecutive + 1;
}
```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-48-self-powers.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-48-self-powers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-48-self-powers.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-48-self-powers.md
index 58e654f..d429c97 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-48-self-powers.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-48-self-powers.md
@@ -1,7 +1,7 @@
---
id: 5900f39c1000cf542c50feaf
title: 'Problem 48: Self powers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302157
dashedName: problem-48-self-powers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-49-prime-permutations.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-49-prime-permutations.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-49-prime-permutations.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-49-prime-permutations.md
index 0dc7ae0..3c0c1d3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-49-prime-permutations.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-49-prime-permutations.md
@@ -1,7 +1,7 @@
---
id: 5900f39d1000cf542c50feb0
title: 'Problem 49: Prime permutations'
-challengeType: 5
+challengeType: 1
forumTopicId: 302159
dashedName: problem-49-prime-permutations
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-5-smallest-multiple.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-5-smallest-multiple.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-5-smallest-multiple.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-5-smallest-multiple.md
index bdece25..2f20bce 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-5-smallest-multiple.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-5-smallest-multiple.md
@@ -1,7 +1,7 @@
---
id: 5900f3711000cf542c50fe84
title: 'Problem 5: Smallest multiple'
-challengeType: 5
+challengeType: 1
forumTopicId: 302160
dashedName: problem-5-smallest-multiple
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-50-consecutive-prime-sum.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-50-consecutive-prime-sum.md
similarity index 57%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-50-consecutive-prime-sum.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-50-consecutive-prime-sum.md
index e1a8c2f..2d583a5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-50-consecutive-prime-sum.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-50-consecutive-prime-sum.md
@@ -1,7 +1,7 @@
---
id: 5900f39e1000cf542c50feb1
title: 'Problem 50: Consecutive prime sum'
-challengeType: 5
+challengeType: 1
forumTopicId: 302161
dashedName: problem-50-consecutive-prime-sum
---
@@ -54,41 +54,57 @@ consecutivePrimeSum(1000000);
# --solutions--
```js
-// Initalize prime number list with sieve
-const NUM_PRIMES = 1000000;
-const PRIMES = [2];
-const PRIME_SIEVE = Array(Math.floor((NUM_PRIMES-1)/2)).fill(true);
-(function initPrimes(num) {
- const upper = Math.floor((num - 1) / 2);
- const sqrtUpper = Math.floor((Math.sqrt(num) - 1) / 2);
- for (let i = 0; i <= sqrtUpper; i++) {
- if (PRIME_SIEVE[i]) {
- // Mark value in PRIMES array
- const prime = 2 * i + 3;
- PRIMES.push(prime);
- // Mark all multiples of this number as false (not prime)
- const primeSqaredIndex = 2 * i ** 2 + 6 * i + 3;
- for (let j = primeSqaredIndex; j < upper; j += prime)
- PRIME_SIEVE[j] = false;
+class PrimeSeive {
+ constructor(num) {
+ const seive = Array(Math.floor((num - 1) / 2)).fill(true);
+ const primes = [2];
+ const upper = Math.floor((num - 1) / 2);
+ const sqrtUpper = Math.floor((Math.sqrt(num) - 1) / 2);
+
+ for (let i = 0; i <= sqrtUpper; i++) {
+ if (seive[i]) {
+ // Mark value in seive array
+ const prime = 2 * i + 3;
+ primes.push(prime);
+ // Mark all multiples of this number as false (not prime)
+ const primeSquaredIndex = 2 * i ** 2 + 6 * i + 3;
+ for (let j = primeSquaredIndex; j < upper; j += prime) {
+ seive[j] = false;
+ }
+ }
+ }
+ for (let i = sqrtUpper + 1; i < upper; i++) {
+ if (seive[i]) {
+ primes.push(2 * i + 3);
+ }
}
+
+ this._seive = seive;
+ this._primes = primes;
}
- for (let i = sqrtUpper + 1; i < upper; i++) {
- if (PRIME_SIEVE[i])
- PRIMES.push(2 * i + 3);
+
+ isPrime(num) {
+ return num === 2
+ ? true
+ : num % 2 === 0
+ ? false
+ : this.isOddPrime(num);
}
-})(NUM_PRIMES);
-
-function isPrime(num) {
- if (num === 2)
- return true;
- else if (num % 2 === 0)
- return false
- else
- return PRIME_SIEVE[(num - 3) / 2];
-}
+
+ isOddPrime(num) {
+ return this._seive[(num - 3) / 2];
+ }
+
+ get primes() {
+ return this._primes;
+ }
+};
function consecutivePrimeSum(limit) {
- // Initalize for longest sum < 100
+ // Initialize seive
+ const primeSeive = new PrimeSeive(limit);
+
+ // Initialize for longest sum < 100
let bestPrime = 41;
let bestI = 0;
let bestJ = 5;
@@ -102,20 +118,20 @@ function consecutivePrimeSum(limit) {
// -- Loop while pushing j towards end of PRIMES list
// keeping sum under limit
while (currSum < limit) {
- if (isPrime(currSum)) {
+ if (primeSeive.isPrime(currSum)) {
bestPrime = sumOfCurrRange = currSum;
bestI = i;
bestJ = j;
}
// -- Increment inner loop
j++;
- currSum += PRIMES[j];
+ currSum += primeSeive.primes[j];
}
// -- Increment outer loop
i++;
j = i + (bestJ - bestI);
- sumOfCurrRange -= PRIMES[i - 1];
- sumOfCurrRange += PRIMES[j];
+ sumOfCurrRange -= primeSeive.primes[i - 1];
+ sumOfCurrRange += primeSeive.primes[j];
}
// Return
return bestPrime;
diff --git a/curriculum/project-euler/project-euler-problems-1-to-100/problem-51-prime-digit-replacements.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-51-prime-digit-replacements.md
new file mode 100644
index 0000000..5b55ddd
--- /dev/null
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-51-prime-digit-replacements.md
@@ -0,0 +1,140 @@
+---
+id: 5900f39f1000cf542c50feb2
+title: 'Problem 51: Prime digit replacements'
+challengeType: 1
+forumTopicId: 302162
+dashedName: problem-51-prime-digit-replacements
+---
+
+# --description--
+
+By replacing the 1st digit of the 2-digit number \*3, it turns out that six of the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime.
+
+By replacing the 3rd and 4th digits of 56\*\*3 with the same digit, this 5-digit number is the first example having seven primes among the ten generated numbers, yielding the family: 56003, 56113, 56333, 56443, 56663, 56773, and 56993. Consequently 56003, being the first member of this family, is the smallest prime with this property.
+
+Find the smallest prime which, by replacing part of the number (not necessarily adjacent digits) with the same digit, is part of an `n` prime value family.
+
+# --hints--
+
+`primeDigitReplacements(6)` should return a number.
+
+```js
+assert(typeof primeDigitReplacements(6) === 'number');
+```
+
+`primeDigitReplacements(6)` should return `13`.
+
+```js
+assert.strictEqual(primeDigitReplacements(6), 13);
+```
+
+`primeDigitReplacements(7)` should return `56003`.
+
+```js
+assert.strictEqual(primeDigitReplacements(7), 56003);
+```
+
+`primeDigitReplacements(8)` should return `121313`.
+
+```js
+assert.strictEqual(primeDigitReplacements(8), 121313);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function primeDigitReplacements(n) {
+
+ return true;
+}
+
+primeDigitReplacements(6);
+```
+
+# --solutions--
+
+```js
+class PrimeSeive {
+ constructor(num) {
+ const seive = Array(Math.floor((num - 1) / 2)).fill(true);
+ const upper = Math.floor((num - 1) / 2);
+ const sqrtUpper = Math.floor((Math.sqrt(num) - 1) / 2);
+
+ for (let i = 0; i <= sqrtUpper; i++) {
+ if (seive[i]) {
+ // Mark value in seive array
+ const prime = 2 * i + 3;
+ // Mark all multiples of this number as false (not prime)
+ const primeSquaredIndex = 2 * i ** 2 + 6 * i + 3;
+ for (let j = primeSquaredIndex; j < upper; j += prime) {
+ seive[j] = false;
+ }
+ }
+ }
+
+ this._seive = seive;
+ }
+
+ isPrime(num) {
+ return num === 2
+ ? true
+ : num % 2 === 0
+ ? false
+ : this.isOddPrime(num);
+ }
+
+ isOddPrime(num) {
+ return this._seive[(num - 3) / 2];
+ }
+};
+
+function primeDigitReplacements(n) {
+ const primeSeive = new PrimeSeive(n * n * n * 2000);
+
+ function isNFamily(number, n) {
+ const prime = number.toString();
+ const lastDigit = prime[prime.length - 1];
+ return doesReplacingMakeFamily(prime, '0', n) ||
+ doesReplacingMakeFamily(prime, '2', n) ||
+ (lastDigit !== '1' && doesReplacingMakeFamily(prime, '1', n));
+ }
+
+ function doesReplacingMakeFamily(prime, digitToReplace, family) {
+ let miss = 0;
+ const base = parseInt(
+ prime
+ .split('')
+ .map(digit => digit == digitToReplace ? '0' : digit)
+ .join('')
+ );
+ const replacements = parseInt(
+ prime
+ .split('')
+ .map(digit => digit === digitToReplace ? '1' : '0')
+ .join('')
+ );
+ const start = prime[0] === digitToReplace ? 1 : 0;
+ for (let i = start; i < 10; i++) {
+ const nextNumber = base + i * replacements;
+ if (!isPartOfFamily(nextNumber, prime)) miss++;
+ if (10 - start - miss < family) break;
+ }
+ return 10 - start - miss === family;
+ }
+
+ function isPartOfFamily(number, prime) {
+ return (
+ primeSeive.isPrime(number) && number.toString().length === prime.length
+ );
+ }
+
+ for (let number = 1; number < 125000; number++) {
+ if (primeSeive.isPrime(number) && isNFamily(number, n)) {
+ return number;
+ }
+ }
+ return -1;
+}
+```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-52-permuted-multiples.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-52-permuted-multiples.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-52-permuted-multiples.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-52-permuted-multiples.md
index d5431d8..7a3886a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-52-permuted-multiples.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-52-permuted-multiples.md
@@ -1,7 +1,7 @@
---
id: 5900f3a01000cf542c50feb3
title: 'Problem 52: Permuted multiples'
-challengeType: 5
+challengeType: 1
forumTopicId: 302163
dashedName: problem-52-permuted-multiples
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-53-combinatoric-selections.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-53-combinatoric-selections.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-53-combinatoric-selections.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-53-combinatoric-selections.md
index dbd39ef..8d96ff1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-53-combinatoric-selections.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-53-combinatoric-selections.md
@@ -1,7 +1,7 @@
---
id: 5900f3a11000cf542c50feb4
title: 'Problem 53: Combinatoric selections'
-challengeType: 5
+challengeType: 1
forumTopicId: 302164
dashedName: problem-53-combinatoric-selections
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-54-poker-hands.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-54-poker-hands.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-54-poker-hands.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-54-poker-hands.md
index 16e04a9..cb51571 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-54-poker-hands.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-54-poker-hands.md
@@ -1,7 +1,7 @@
---
id: 5900f3a21000cf542c50feb5
title: 'Problem 54: Poker hands'
-challengeType: 5
+challengeType: 1
forumTopicId: 302165
dashedName: problem-54-poker-hands
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-55-lychrel-numbers.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-55-lychrel-numbers.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-55-lychrel-numbers.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-55-lychrel-numbers.md
index 8b074ba..890c5b0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-55-lychrel-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-55-lychrel-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f3a31000cf542c50feb6
title: 'Problem 55: Lychrel numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302166
dashedName: problem-55-lychrel-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-56-powerful-digit-sum.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-56-powerful-digit-sum.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-56-powerful-digit-sum.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-56-powerful-digit-sum.md
index 4073147..e445973 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-56-powerful-digit-sum.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-56-powerful-digit-sum.md
@@ -1,7 +1,7 @@
---
id: 5900f3a41000cf542c50feb7
title: 'Problem 56: Powerful digit sum'
-challengeType: 5
+challengeType: 1
forumTopicId: 302167
dashedName: problem-56-powerful-digit-sum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-57-square-root-convergents.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-57-square-root-convergents.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-57-square-root-convergents.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-57-square-root-convergents.md
index 17103bc..034974d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-57-square-root-convergents.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-57-square-root-convergents.md
@@ -1,7 +1,7 @@
---
id: 5900f3a51000cf542c50feb8
title: 'Problem 57: Square root convergents'
-challengeType: 5
+challengeType: 1
forumTopicId: 302168
dashedName: problem-57-square-root-convergents
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-58-spiral-primes.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-58-spiral-primes.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-58-spiral-primes.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-58-spiral-primes.md
index 29a3012..70b80eb 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-58-spiral-primes.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-58-spiral-primes.md
@@ -1,7 +1,7 @@
---
id: 5900f3a61000cf542c50feb9
title: 'Problem 58: Spiral primes'
-challengeType: 5
+challengeType: 1
forumTopicId: 302169
dashedName: problem-58-spiral-primes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-59-xor-decryption.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-59-xor-decryption.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-59-xor-decryption.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-59-xor-decryption.md
index 683db15..0784e29 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-59-xor-decryption.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-59-xor-decryption.md
@@ -1,7 +1,7 @@
---
id: 5900f3a81000cf542c50feba
title: 'Problem 59: XOR decryption'
-challengeType: 5
+challengeType: 1
forumTopicId: 302170
dashedName: problem-59-xor-decryption
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-6-sum-square-difference.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-6-sum-square-difference.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-6-sum-square-difference.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-6-sum-square-difference.md
index ec60601..65a460b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-6-sum-square-difference.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-6-sum-square-difference.md
@@ -1,7 +1,7 @@
---
id: 5900f3721000cf542c50fe85
title: 'Problem 6: Sum square difference'
-challengeType: 5
+challengeType: 1
forumTopicId: 302171
dashedName: problem-6-sum-square-difference
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-60-prime-pair-sets.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-60-prime-pair-sets.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-60-prime-pair-sets.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-60-prime-pair-sets.md
index 5acc6c2..dc4a88c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-60-prime-pair-sets.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-60-prime-pair-sets.md
@@ -1,7 +1,7 @@
---
id: 5900f3a81000cf542c50febb
title: 'Problem 60: Prime pair sets'
-challengeType: 5
+challengeType: 1
forumTopicId: 302172
dashedName: problem-60-prime-pair-sets
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-61-cyclical-figurate-numbers.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-61-cyclical-figurate-numbers.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-61-cyclical-figurate-numbers.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-61-cyclical-figurate-numbers.md
index 3f1e157..fd477f1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-61-cyclical-figurate-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-61-cyclical-figurate-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f3a91000cf542c50febc
title: 'Problem 61: Cyclical figurate numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302173
dashedName: problem-61-cyclical-figurate-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-62-cubic-permutations.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-62-cubic-permutations.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-62-cubic-permutations.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-62-cubic-permutations.md
index 82294e0..a89d136 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-62-cubic-permutations.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-62-cubic-permutations.md
@@ -1,7 +1,7 @@
---
id: 5900f3aa1000cf542c50febd
title: 'Problem 62: Cubic permutations'
-challengeType: 5
+challengeType: 1
forumTopicId: 302174
dashedName: problem-62-cubic-permutations
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-63-powerful-digit-counts.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-63-powerful-digit-counts.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-63-powerful-digit-counts.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-63-powerful-digit-counts.md
index 02c9603..2c8b0bb 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-63-powerful-digit-counts.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-63-powerful-digit-counts.md
@@ -1,7 +1,7 @@
---
id: 5900f3ab1000cf542c50febe
title: 'Problem 63: Powerful digit counts'
-challengeType: 5
+challengeType: 1
forumTopicId: 302175
dashedName: problem-63-powerful-digit-counts
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-64-odd-period-square-roots.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-64-odd-period-square-roots.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-64-odd-period-square-roots.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-64-odd-period-square-roots.md
index 6cc017e..a6acdfc 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-64-odd-period-square-roots.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-64-odd-period-square-roots.md
@@ -1,7 +1,7 @@
---
id: 5900f3ac1000cf542c50febf
title: 'Problem 64: Odd period square roots'
-challengeType: 5
+challengeType: 1
forumTopicId: 302176
dashedName: problem-64-odd-period-square-roots
---
@@ -12,7 +12,7 @@ All square roots are periodic when written as continued fractions and can be wri
$\\displaystyle \\quad \\quad \\sqrt{N}=a_0+\\frac 1 {a_1+\\frac 1 {a_2+ \\frac 1 {a3+ \\dots}}}$
-For example, let us consider $\\sqrt{23}:$:
+For example, let us consider $\\sqrt{23}$:
$\\quad \\quad \\sqrt{23}=4+\\sqrt{23}-4=4+\\frac 1 {\\frac 1 {\\sqrt{23}-4}}=4+\\frac 1 {1+\\frac{\\sqrt{23}-3}7}$
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-65-convergents-of-e.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-65-convergents-of-e.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-65-convergents-of-e.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-65-convergents-of-e.md
index 7a1383a..9aa6230 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-65-convergents-of-e.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-65-convergents-of-e.md
@@ -1,7 +1,7 @@
---
id: 5900f3ad1000cf542c50fec0
title: 'Problem 65: Convergents of e'
-challengeType: 5
+challengeType: 1
forumTopicId: 302177
dashedName: problem-65-convergents-of-e
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-66-diophantine-equation.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-66-diophantine-equation.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-66-diophantine-equation.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-66-diophantine-equation.md
index 0eab980..9e01ce1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-66-diophantine-equation.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-66-diophantine-equation.md
@@ -1,7 +1,7 @@
---
id: 5900f3ae1000cf542c50fec1
title: 'Problem 66: Diophantine equation'
-challengeType: 5
+challengeType: 1
forumTopicId: 302178
dashedName: problem-66-diophantine-equation
---
@@ -40,25 +40,25 @@ assert(typeof diophantineEquation(7) === 'number');
`diophantineEquation(7)` should return `5`.
-```
+```js
assert.strictEqual(diophantineEquation(7), 5);
```
`diophantineEquation(100)` should return `61`.
-```
+```js
assert.strictEqual(diophantineEquation(100), 61);
```
`diophantineEquation(409)` should return `409`.
-```
+```js
assert.strictEqual(diophantineEquation(409), 409);
```
`diophantineEquation(500)` should return `421`.
-```
+```js
assert.strictEqual(diophantineEquation(500), 421);
```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-67-maximum-path-sum-ii.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-67-maximum-path-sum-ii.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-67-maximum-path-sum-ii.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-67-maximum-path-sum-ii.md
index 9e1e818..ce1b4ca 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-67-maximum-path-sum-ii.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-67-maximum-path-sum-ii.md
@@ -1,7 +1,7 @@
---
id: 5900f3b01000cf542c50fec2
title: 'Problem 67: Maximum path sum II'
-challengeType: 5
+challengeType: 1
forumTopicId: 302179
dashedName: problem-67-maximum-path-sum-ii
---
@@ -25,13 +25,13 @@ Find the maximum total from top to bottom in `numTriangle`, a 2D array defined i
# --hints--
-`maximumPathSumII(testTriangle)` should return a number.
+`maximumPathSumII([[3, 0, 0, 0],[7, 4, 0, 0],[2, 4, 6, 0],[8, 5, 9, 3]])` should return a number.
```js
assert(typeof maximumPathSumII(_testTriangle) === 'number');
```
-`maximumPathSumII(testTriangle)` should return 23.
+`maximumPathSumII([[3, 0, 0, 0],[7, 4, 0, 0],[2, 4, 6, 0],[8, 5, 9, 3]])` should return 23.
```js
assert.strictEqual(maximumPathSumII(_testTriangle), 23);
@@ -62,13 +62,6 @@ function maximumPathSumII(triangle) {
return true;
}
-
-const testTriangle = [[3, 0, 0, 0],
- [7, 4, 0, 0],
- [2, 4, 6, 0],
- [8, 5, 9, 3]];
-
-maximumPathSumII(testTriangle);
```
# --solutions--
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-68-magic-5-gon-ring.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-68-magic-5-gon-ring.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-68-magic-5-gon-ring.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-68-magic-5-gon-ring.md
index 1492709..9745f01 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-68-magic-5-gon-ring.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-68-magic-5-gon-ring.md
@@ -1,7 +1,7 @@
---
id: 5900f3b01000cf542c50fec3
title: 'Problem 68: Magic 5-gon ring'
-challengeType: 5
+challengeType: 1
forumTopicId: 302180
dashedName: problem-68-magic-5-gon-ring
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-69-totient-maximum.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-69-totient-maximum.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-69-totient-maximum.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-69-totient-maximum.md
index 2e538e3..e57b133 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-69-totient-maximum.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-69-totient-maximum.md
@@ -1,7 +1,7 @@
---
id: 5900f3b11000cf542c50fec4
title: 'Problem 69: Totient maximum'
-challengeType: 5
+challengeType: 1
forumTopicId: 302181
dashedName: problem-69-totient-maximum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-7-10001st-prime.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-7-10001st-prime.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-7-10001st-prime.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-7-10001st-prime.md
index 18b18b2..6780c8f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-7-10001st-prime.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-7-10001st-prime.md
@@ -1,7 +1,7 @@
---
id: 5900f3731000cf542c50fe86
title: 'Problem 7: 10001st prime'
-challengeType: 5
+challengeType: 1
forumTopicId: 302182
dashedName: problem-7-10001st-prime
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-70-totient-permutation.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-70-totient-permutation.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-70-totient-permutation.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-70-totient-permutation.md
index 09c3e10..1328f1c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-70-totient-permutation.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-70-totient-permutation.md
@@ -1,7 +1,7 @@
---
id: 5900f3b21000cf542c50fec5
title: 'Problem 70: Totient permutation'
-challengeType: 5
+challengeType: 1
forumTopicId: 302183
dashedName: problem-70-totient-permutation
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-71-ordered-fractions.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-71-ordered-fractions.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-71-ordered-fractions.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-71-ordered-fractions.md
index 55a2e9b..267a176 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-71-ordered-fractions.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-71-ordered-fractions.md
@@ -1,7 +1,7 @@
---
id: 5900f3b31000cf542c50fec6
title: 'Problem 71: Ordered fractions'
-challengeType: 5
+challengeType: 1
forumTopicId: 302184
dashedName: problem-71-ordered-fractions
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-72-counting-fractions.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-72-counting-fractions.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-72-counting-fractions.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-72-counting-fractions.md
index 3929bde..dab392a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-72-counting-fractions.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-72-counting-fractions.md
@@ -1,7 +1,7 @@
---
id: 5900f3b41000cf542c50fec7
title: 'Problem 72: Counting fractions'
-challengeType: 5
+challengeType: 1
forumTopicId: 302185
dashedName: problem-72-counting-fractions
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-73-counting-fractions-in-a-range.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-73-counting-fractions-in-a-range.md
similarity index 56%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-73-counting-fractions-in-a-range.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-73-counting-fractions-in-a-range.md
index 10c1ae6..3dfe25f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-73-counting-fractions-in-a-range.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-73-counting-fractions-in-a-range.md
@@ -1,7 +1,7 @@
---
id: 5900f3b61000cf542c50fec8
title: 'Problem 73: Counting fractions in a range'
-challengeType: 5
+challengeType: 1
forumTopicId: 302186
dashedName: problem-73-counting-fractions-in-a-range
---
@@ -66,18 +66,56 @@ countingFractionsInARange(8);
# --solutions--
```js
-function countingFractionsInARange(limit) {
- let result = 0;
- const stack = [[3, 2]];
- while (stack.length > 0) {
- const [startDenominator, endDenominator] = stack.pop();
- const curDenominator = startDenominator + endDenominator;
- if (curDenominator <= limit) {
- result++;
- stack.push([startDenominator, curDenominator]);
- stack.push([curDenominator, endDenominator]);
+class PrimeSeive {
+ constructor(num) {
+ const seive = Array(Math.floor((num - 1) / 2)).fill(true);
+ const upper = Math.floor((num - 1) / 2);
+ const sqrtUpper = Math.floor((Math.sqrt(num) - 1) / 2);
+
+ for (let i = 0; i <= sqrtUpper; i++) {
+ if (seive[i]) {
+ // Mark value in seive array
+ const prime = 2 * i + 3;
+ // Mark all multiples of this number as false (not prime)
+ const primeSquaredIndex = 2 * i ** 2 + 6 * i + 3;
+ for (let j = primeSquaredIndex; j < upper; j += prime) {
+ seive[j] = false;
+ }
+ }
}
+
+ this._seive = seive;
+ }
+
+ isPrime(num) {
+ return num === 2
+ ? true
+ : num % 2 === 0
+ ? false
+ : this.isOddPrime(num);
+ }
+
+ isOddPrime(num) {
+ return this._seive[(num - 3) / 2];
+ }
+};
+const primeSeive = new PrimeSeive(12001);
+
+function countingFractionsInARange(num) {
+ const moebius = Array(num + 1).fill(1)
+
+ // Generate Moebis function terms
+ for (let i = 2; i <= num; i++) {
+ if (!primeSeive.isPrime(i)) continue;
+ for (let j = i; j <= num; j += i) moebius[j] *= -1;
+ for (let j = i * i; j <= num; j += i * i) moebius[j] = 0;
+ }
+ // Evaluate totient sum
+ let sum = 0;
+ for (let i = 1; i <= num; i++) {
+ const coeff = Math.floor(num / i - 2);
+ sum += moebius[i] * Math.floor(coeff * coeff / 12 + 0.5);
}
- return result;
+ return sum;
}
```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-74-digit-factorial-chains.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-74-digit-factorial-chains.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-74-digit-factorial-chains.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-74-digit-factorial-chains.md
index f864589..372b5c5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-74-digit-factorial-chains.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-74-digit-factorial-chains.md
@@ -1,7 +1,7 @@
---
id: 5900f3b61000cf542c50fec9
title: 'Problem 74: Digit factorial chains'
-challengeType: 5
+challengeType: 1
forumTopicId: 302187
dashedName: problem-74-digit-factorial-chains
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-75-singular-integer-right-triangles.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-75-singular-integer-right-triangles.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-75-singular-integer-right-triangles.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-75-singular-integer-right-triangles.md
index a20c0a9..40ab4fb 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-75-singular-integer-right-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-75-singular-integer-right-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f3b71000cf542c50feca
title: 'Problem 75: Singular integer right triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 302188
dashedName: problem-75-singular-integer-right-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-76-counting-summations.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-76-counting-summations.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-76-counting-summations.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-76-counting-summations.md
index bbc9618..04a358b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-76-counting-summations.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-76-counting-summations.md
@@ -1,7 +1,7 @@
---
id: 5900f3b81000cf542c50fecb
title: 'Problem 76: Counting summations'
-challengeType: 5
+challengeType: 1
forumTopicId: 302189
dashedName: problem-76-counting-summations
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-77-prime-summations.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-77-prime-summations.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-77-prime-summations.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-77-prime-summations.md
index bd26cc3..a5639dc 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-77-prime-summations.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-77-prime-summations.md
@@ -1,7 +1,7 @@
---
id: 5900f3b91000cf542c50fecc
title: 'Problem 77: Prime summations'
-challengeType: 5
+challengeType: 1
forumTopicId: 302190
dashedName: problem-77-prime-summations
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-78-coin-partitions.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-78-coin-partitions.md
similarity index 64%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-78-coin-partitions.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-78-coin-partitions.md
index 61f1451..26428a8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-78-coin-partitions.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-78-coin-partitions.md
@@ -1,7 +1,7 @@
---
id: 5900f3ba1000cf542c50fecd
title: 'Problem 78: Coin partitions'
-challengeType: 5
+challengeType: 1
forumTopicId: 302191
dashedName: problem-78-coin-partitions
---
@@ -74,30 +74,28 @@ coinPartitions(7);
# --solutions--
```js
+// compute pentagonal numbers per generating function
+const pentagonalNumbers = Array(251)
+ .fill(0)
+ .flatMap((_, i) => i ? [i * (3 * i - 1) / 2, i * (3 * i - 1) / 2 + i] : []);
+
function coinPartitions(divisor) {
- const partitions = [1];
-
- let n = 0;
- while (partitions[n] !== 0) {
- n++;
- partitions.push(0);
-
- let i = 0;
- let pentagonal = 1;
- while (pentagonal <= n) {
- const sign = i % 4 > 1 ? -1 : 1;
- partitions[n] += sign * partitions[n - pentagonal];
- partitions[n] = partitions[n] % divisor;
-
- i++;
-
- let k = Math.floor(i / 2) + 1;
- if (i % 2 !== 0) {
- k *= -1;
- }
- pentagonal = Math.floor((k * (3 * k - 1)) / 2);
+ // helper data
+ const signs = [1, 1, -1, -1];
+
+ // compute partition counts until we find a multiple of divisor
+ const partitions = Array(divisor + 1).fill(0);
+ partitions[0] = 1;
+ for (let i = 1; partitions[i - 1] > 0; i++) {
+ // compute next partition count
+ for (let j = 0; pentagonalNumbers[j] <= i; j++) {
+ partitions[i] += partitions[i - pentagonalNumbers[j]] * signs[j % 4];
}
+
+ partitions[i] = partitions[i] % divisor;
+ if (partitions[i] < 0) partitions[i] += divisor; // positive mod
+ // return when found
+ if (partitions[i] === 0) return i;
}
- return n;
}
```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-79-passcode-derivation.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-79-passcode-derivation.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-79-passcode-derivation.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-79-passcode-derivation.md
index e9858fa..a17babe 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-79-passcode-derivation.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-79-passcode-derivation.md
@@ -1,7 +1,7 @@
---
id: 5900f3bb1000cf542c50fece
title: 'Problem 79: Passcode derivation'
-challengeType: 5
+challengeType: 1
forumTopicId: 302192
dashedName: problem-79-passcode-derivation
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-8-largest-product-in-a-series.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-8-largest-product-in-a-series.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-8-largest-product-in-a-series.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-8-largest-product-in-a-series.md
index 0fd4703..c84d410 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-8-largest-product-in-a-series.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-8-largest-product-in-a-series.md
@@ -1,7 +1,7 @@
---
id: 5900f3741000cf542c50fe87
title: 'Problem 8: Largest product in a series'
-challengeType: 5
+challengeType: 1
forumTopicId: 302193
dashedName: problem-8-largest-product-in-a-series
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-80-square-root-digital-expansion.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-80-square-root-digital-expansion.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-80-square-root-digital-expansion.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-80-square-root-digital-expansion.md
index a552334..34d7dd6 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-80-square-root-digital-expansion.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-80-square-root-digital-expansion.md
@@ -1,7 +1,7 @@
---
id: 5900f3bc1000cf542c50fecf
title: 'Problem 80: Square root digital expansion'
-challengeType: 5
+challengeType: 1
forumTopicId: 302194
dashedName: problem-80-square-root-digital-expansion
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-81-path-sum-two-ways.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-81-path-sum-two-ways.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-81-path-sum-two-ways.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-81-path-sum-two-ways.md
index 1a34ca9..baae406 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-81-path-sum-two-ways.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-81-path-sum-two-ways.md
@@ -1,7 +1,7 @@
---
id: 5900f3bd1000cf542c50fed0
title: 'Problem 81: Path sum: two ways'
-challengeType: 5
+challengeType: 1
forumTopicId: 302195
dashedName: problem-81-path-sum-two-ways
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-82-path-sum-three-ways.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-82-path-sum-three-ways.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-82-path-sum-three-ways.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-82-path-sum-three-ways.md
index 27e015e..1cad1c0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-82-path-sum-three-ways.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-82-path-sum-three-ways.md
@@ -1,7 +1,7 @@
---
id: 5900f3be1000cf542c50fed1
title: 'Problem 82: Path sum: three ways'
-challengeType: 5
+challengeType: 1
forumTopicId: 302196
dashedName: problem-82-path-sum-three-ways
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-83-path-sum-four-ways.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-83-path-sum-four-ways.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-83-path-sum-four-ways.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-83-path-sum-four-ways.md
index bd3b6f0..5e69598 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-83-path-sum-four-ways.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-83-path-sum-four-ways.md
@@ -1,7 +1,7 @@
---
id: 5900f3bf1000cf542c50fed2
title: 'Problem 83: Path sum: four ways'
-challengeType: 5
+challengeType: 1
forumTopicId: 302197
dashedName: problem-83-path-sum-four-ways
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-84-monopoly-odds.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-84-monopoly-odds.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-84-monopoly-odds.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-84-monopoly-odds.md
index 6870d2e..92c630f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-84-monopoly-odds.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-84-monopoly-odds.md
@@ -1,7 +1,7 @@
---
id: 5900f3c11000cf542c50fed3
title: 'Problem 84: Monopoly odds'
-challengeType: 5
+challengeType: 1
forumTopicId: 302198
dashedName: problem-84-monopoly-odds
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-85-counting-rectangles.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-85-counting-rectangles.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-85-counting-rectangles.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-85-counting-rectangles.md
index 5db9e13..9de90d9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-85-counting-rectangles.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-85-counting-rectangles.md
@@ -1,7 +1,7 @@
---
id: 5900f3c11000cf542c50fed4
title: 'Problem 85: Counting rectangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 302199
dashedName: problem-85-counting-rectangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-86-cuboid-route.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-86-cuboid-route.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-86-cuboid-route.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-86-cuboid-route.md
index caa496a..fc4762b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-86-cuboid-route.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-86-cuboid-route.md
@@ -1,7 +1,7 @@
---
id: 5900f3c31000cf542c50fed5
title: 'Problem 86: Cuboid route'
-challengeType: 5
+challengeType: 1
forumTopicId: 302200
dashedName: problem-86-cuboid-route
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-87-prime-power-triples.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-87-prime-power-triples.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-87-prime-power-triples.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-87-prime-power-triples.md
index 57da5af..a6c51ef 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-87-prime-power-triples.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-87-prime-power-triples.md
@@ -1,7 +1,7 @@
---
id: 5900f3c51000cf542c50fed8
title: 'Problem 87: Prime power triples'
-challengeType: 5
+challengeType: 1
forumTopicId: 302201
dashedName: problem-87-prime-power-triples
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-88-product-sum-numbers.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-88-product-sum-numbers.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-88-product-sum-numbers.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-88-product-sum-numbers.md
index 3134d9c..4677989 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-88-product-sum-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-88-product-sum-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f3c51000cf542c50fed6
title: 'Problem 88: Product-sum numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302203
dashedName: problem-88-product-sum-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-89-roman-numerals.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-89-roman-numerals.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-89-roman-numerals.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-89-roman-numerals.md
index 3c0e7ac..52c0384 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-89-roman-numerals.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-89-roman-numerals.md
@@ -1,7 +1,7 @@
---
id: 5900f3c51000cf542c50fed7
title: 'Problem 89: Roman numerals'
-challengeType: 5
+challengeType: 1
forumTopicId: 302204
dashedName: problem-89-roman-numerals
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-9-special-pythagorean-triplet.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-9-special-pythagorean-triplet.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-9-special-pythagorean-triplet.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-9-special-pythagorean-triplet.md
index 3ce9715..a853dd4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-9-special-pythagorean-triplet.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-9-special-pythagorean-triplet.md
@@ -1,7 +1,7 @@
---
id: 5900f3761000cf542c50fe88
title: 'Problem 9: Special Pythagorean triplet'
-challengeType: 5
+challengeType: 1
forumTopicId: 302205
dashedName: problem-9-special-pythagorean-triplet
---
@@ -30,7 +30,7 @@ assert(typeof specialPythagoreanTriplet(24) === 'number');
assert.strictEqual(specialPythagoreanTriplet(24), 480);
```
-`specialPythagoreanTriplet(120)` should return 49920, 55080 or 60000
+`specialPythagoreanTriplet(120)` should return 49920, 55080 or 60000.
```js
assert([49920, 55080, 60000].includes(specialPythagoreanTriplet(120)));
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-90-cube-digit-pairs.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-90-cube-digit-pairs.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-90-cube-digit-pairs.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-90-cube-digit-pairs.md
index c07bf97..cd56e94 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-90-cube-digit-pairs.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-90-cube-digit-pairs.md
@@ -1,7 +1,7 @@
---
id: 5900f3c61000cf542c50fed9
title: 'Problem 90: Cube digit pairs'
-challengeType: 5
+challengeType: 1
forumTopicId: 302207
dashedName: problem-90-cube-digit-pairs
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-91-right-triangles-with-integer-coordinates.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-91-right-triangles-with-integer-coordinates.md
similarity index 93%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-91-right-triangles-with-integer-coordinates.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-91-right-triangles-with-integer-coordinates.md
index b38a0eb..3343541 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-91-right-triangles-with-integer-coordinates.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-91-right-triangles-with-integer-coordinates.md
@@ -1,18 +1,18 @@
---
id: 5900f3c71000cf542c50feda
title: 'Problem 91: Right triangles with integer coordinates'
-challengeType: 5
+challengeType: 1
forumTopicId: 302208
dashedName: problem-91-right-triangles-with-integer-coordinates
---
# --description--
-The points ${P}(x_1, y_1)$ and ${Q}(x_2, y_2)$ are plotted at integer co-ordinates and are joined to the origin, ${O}(0, 0)$, to form ${\Delta}OPQ$.
+The points ${P}(x_1, y_1)$ and ${Q}(x_2, y_2)$ are plotted at integer coordinates and are joined to the origin, ${O}(0, 0)$, to form ${\Delta}OPQ$.
-There are exactly fourteen triangles containing a right angle that can be formed when each co-ordinate lies between 0 and 2 inclusive; that is, $0 ≤ x_1, y_1, x_2, y_2 ≤ 2$.
+There are exactly fourteen triangles containing a right angle that can be formed when each coordinate lies between 0 and 2 inclusive; that is, $0 ≤ x_1, y_1, x_2, y_2 ≤ 2$.
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-92-square-digit-chains.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-92-square-digit-chains.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-92-square-digit-chains.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-92-square-digit-chains.md
index 065f0b7..6b5f3bd 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-92-square-digit-chains.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-92-square-digit-chains.md
@@ -1,7 +1,7 @@
---
id: 5900f3c81000cf542c50fedb
title: 'Problem 92: Square digit chains'
-challengeType: 5
+challengeType: 1
forumTopicId: 302209
dashedName: problem-92-square-digit-chains
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-93-arithmetic-expressions.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-93-arithmetic-expressions.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-93-arithmetic-expressions.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-93-arithmetic-expressions.md
index 81b5dce..5a8afb7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-93-arithmetic-expressions.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-93-arithmetic-expressions.md
@@ -1,7 +1,7 @@
---
id: 5900f3ca1000cf542c50fedc
title: 'Problem 93: Arithmetic expressions'
-challengeType: 5
+challengeType: 1
forumTopicId: 302210
dashedName: problem-93-arithmetic-expressions
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-94-almost-equilateral-triangles.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-94-almost-equilateral-triangles.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-94-almost-equilateral-triangles.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-94-almost-equilateral-triangles.md
index ef0c095..4b3ab85 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-94-almost-equilateral-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-94-almost-equilateral-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f3ca1000cf542c50fedd
title: 'Problem 94: Almost equilateral triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 302211
dashedName: problem-94-almost-equilateral-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-95-amicable-chains.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-95-amicable-chains.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-95-amicable-chains.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-95-amicable-chains.md
index 9d42e7c..66805b9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-95-amicable-chains.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-95-amicable-chains.md
@@ -1,7 +1,7 @@
---
id: 5900f3cc1000cf542c50fede
title: 'Problem 95: Amicable chains'
-challengeType: 5
+challengeType: 1
forumTopicId: 302212
dashedName: problem-95-amicable-chains
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-96-su-doku.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-96-su-doku.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-96-su-doku.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-96-su-doku.md
index 1050910..098fdb0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-96-su-doku.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-96-su-doku.md
@@ -1,7 +1,7 @@
---
id: 5900f3cc1000cf542c50fedf
title: 'Problem 96: Su Doku'
-challengeType: 5
+challengeType: 1
forumTopicId: 302213
dashedName: problem-96-su-doku
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-97-large-non-mersenne-prime.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-97-large-non-mersenne-prime.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-97-large-non-mersenne-prime.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-97-large-non-mersenne-prime.md
index 15dafc7..cabdb34 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-97-large-non-mersenne-prime.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-97-large-non-mersenne-prime.md
@@ -1,7 +1,7 @@
---
id: 5900f3ce1000cf542c50fee0
title: 'Problem 97: Large non-Mersenne prime'
-challengeType: 5
+challengeType: 1
forumTopicId: 302214
dashedName: problem-97-large-non-mersenne-prime
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-98-anagramic-squares.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-98-anagramic-squares.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-98-anagramic-squares.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-98-anagramic-squares.md
index e633090..f54ab71 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-98-anagramic-squares.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-98-anagramic-squares.md
@@ -1,7 +1,7 @@
---
id: 5900f3cf1000cf542c50fee1
title: 'Problem 98: Anagramic squares'
-challengeType: 5
+challengeType: 1
forumTopicId: 302215
dashedName: problem-98-anagramic-squares
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-99-largest-exponential.md b/curriculum/project-euler/project-euler-problems-1-to-100/problem-99-largest-exponential.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-99-largest-exponential.md
rename to curriculum/project-euler/project-euler-problems-1-to-100/problem-99-largest-exponential.md
index 07d9a48..af44a7d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-99-largest-exponential.md
+++ b/curriculum/project-euler/project-euler-problems-1-to-100/problem-99-largest-exponential.md
@@ -1,7 +1,7 @@
---
id: 5900f3d01000cf542c50fee2
title: 'Problem 99: Largest exponential'
-challengeType: 5
+challengeType: 1
forumTopicId: 302216
dashedName: problem-99-largest-exponential
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-101-optimum-polynomial.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-101-optimum-polynomial.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-101-optimum-polynomial.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-101-optimum-polynomial.md
index 430a7c7..a29433a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-101-optimum-polynomial.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-101-optimum-polynomial.md
@@ -1,7 +1,7 @@
---
id: 5900f3d21000cf542c50fee4
title: 'Problem 101: Optimum polynomial'
-challengeType: 5
+challengeType: 1
forumTopicId: 301725
dashedName: problem-101-optimum-polynomial
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-102-triangle-containment.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-102-triangle-containment.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-102-triangle-containment.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-102-triangle-containment.md
index 9705afb..c90a827 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-102-triangle-containment.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-102-triangle-containment.md
@@ -1,7 +1,7 @@
---
id: 5900f3d21000cf542c50fee5
title: 'Problem 102: Triangle containment'
-challengeType: 5
+challengeType: 1
forumTopicId: 301726
dashedName: problem-102-triangle-containment
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-103-special-subset-sums-optimum.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-103-special-subset-sums-optimum.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-103-special-subset-sums-optimum.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-103-special-subset-sums-optimum.md
index 3def69e..37ef60c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-103-special-subset-sums-optimum.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-103-special-subset-sums-optimum.md
@@ -1,7 +1,7 @@
---
id: 5900f3d61000cf542c50fee7
title: 'Problem 103: Special subset sums: optimum'
-challengeType: 5
+challengeType: 1
forumTopicId: 301727
dashedName: problem-103-special-subset-sums-optimum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-104-pandigital-fibonacci-ends.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-104-pandigital-fibonacci-ends.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-104-pandigital-fibonacci-ends.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-104-pandigital-fibonacci-ends.md
index 1c61ea7..baa7dcb 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-104-pandigital-fibonacci-ends.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-104-pandigital-fibonacci-ends.md
@@ -1,7 +1,7 @@
---
id: 5900f3d51000cf542c50fee6
title: 'Problem 104: Pandigital Fibonacci ends'
-challengeType: 5
+challengeType: 1
forumTopicId: 301728
dashedName: problem-104-pandigital-fibonacci-ends
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-105-special-subset-sums-testing.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-105-special-subset-sums-testing.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-105-special-subset-sums-testing.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-105-special-subset-sums-testing.md
index 0a5d611..1636463 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-105-special-subset-sums-testing.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-105-special-subset-sums-testing.md
@@ -1,7 +1,7 @@
---
id: 5900f3d61000cf542c50fee8
title: 'Problem 105: Special subset sums: testing'
-challengeType: 5
+challengeType: 1
forumTopicId: 301729
dashedName: problem-105-special-subset-sums-testing
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-106-special-subset-sums-meta-testing.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-106-special-subset-sums-meta-testing.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-106-special-subset-sums-meta-testing.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-106-special-subset-sums-meta-testing.md
index e771a72..67638b5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-106-special-subset-sums-meta-testing.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-106-special-subset-sums-meta-testing.md
@@ -1,7 +1,7 @@
---
id: 5900f3d71000cf542c50fee9
title: 'Problem 106: Special subset sums: meta-testing'
-challengeType: 5
+challengeType: 1
forumTopicId: 301730
dashedName: problem-106-special-subset-sums-meta-testing
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-107-minimal-network.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-107-minimal-network.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-107-minimal-network.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-107-minimal-network.md
index 7b4aa32..75338ba 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-107-minimal-network.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-107-minimal-network.md
@@ -1,7 +1,7 @@
---
id: 5900f3d91000cf542c50feea
title: 'Problem 107: Minimal network'
-challengeType: 5
+challengeType: 1
forumTopicId: 301731
dashedName: problem-107-minimal-network
---
@@ -27,7 +27,7 @@ The same network can be represented by the matrix below.
However, it is possible to optimise the network by removing some edges and still ensure that all points on the network remain connected. The network which achieves the maximum saving is shown below. It has a weight of 93, representing a saving of 243 − 93 = 150 from the original network.
-
+
Using `network`, an 2D array representing network in matrix form, find the maximum saving which can be achieved by removing redundant edges whilst ensuring that the network remains connected. Vertices not having connection will be represented with `-1`.
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-108-diophantine-reciprocals-i.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-108-diophantine-reciprocals-i.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-108-diophantine-reciprocals-i.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-108-diophantine-reciprocals-i.md
index 52aa7ab..a4f34e8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-108-diophantine-reciprocals-i.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-108-diophantine-reciprocals-i.md
@@ -1,7 +1,7 @@
---
id: 5900f3d91000cf542c50feeb
title: 'Problem 108: Diophantine Reciprocals I'
-challengeType: 5
+challengeType: 1
forumTopicId: 301732
dashedName: problem-108-diophantine-reciprocals-i
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-109-darts.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-109-darts.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-109-darts.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-109-darts.md
index 150a67a..68a417c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-109-darts.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-109-darts.md
@@ -1,7 +1,7 @@
---
id: 5900f3db1000cf542c50feec
title: 'Problem 109: Darts'
-challengeType: 5
+challengeType: 1
forumTopicId: 301733
dashedName: problem-109-darts
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-110-diophantine-reciprocals-ii.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-110-diophantine-reciprocals-ii.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-110-diophantine-reciprocals-ii.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-110-diophantine-reciprocals-ii.md
index 79070c6..9bbeb3d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-110-diophantine-reciprocals-ii.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-110-diophantine-reciprocals-ii.md
@@ -1,7 +1,7 @@
---
id: 5900f3db1000cf542c50feed
title: 'Problem 110: Diophantine Reciprocals II'
-challengeType: 5
+challengeType: 1
forumTopicId: 301735
dashedName: problem-110-diophantine-reciprocals-ii
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-111-primes-with-runs.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-111-primes-with-runs.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-111-primes-with-runs.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-111-primes-with-runs.md
index 51373dc..fee3226 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-111-primes-with-runs.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-111-primes-with-runs.md
@@ -1,7 +1,7 @@
---
id: 5900f3db1000cf542c50feee
title: 'Problem 111: Primes with runs'
-challengeType: 5
+challengeType: 1
forumTopicId: 301736
dashedName: problem-111-primes-with-runs
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-112-bouncy-numbers.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-112-bouncy-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-112-bouncy-numbers.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-112-bouncy-numbers.md
index d2b8f07..7599de2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-112-bouncy-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-112-bouncy-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f3dd1000cf542c50feef
title: 'Problem 112: Bouncy numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301738
dashedName: problem-112-bouncy-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-113-non-bouncy-numbers.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-113-non-bouncy-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-113-non-bouncy-numbers.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-113-non-bouncy-numbers.md
index a06f41a..868909e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-113-non-bouncy-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-113-non-bouncy-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f3dd1000cf542c50fef0
title: 'Problem 113: Non-bouncy numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301739
dashedName: problem-113-non-bouncy-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-114-counting-block-combinations-i.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-114-counting-block-combinations-i.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-114-counting-block-combinations-i.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-114-counting-block-combinations-i.md
index 01bd2e8..ff84a9b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-114-counting-block-combinations-i.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-114-counting-block-combinations-i.md
@@ -1,7 +1,7 @@
---
id: 5900f3e01000cf542c50fef2
title: 'Problem 114: Counting block combinations I'
-challengeType: 5
+challengeType: 1
forumTopicId: 301740
dashedName: problem-114-counting-block-combinations-i
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-115-counting-block-combinations-ii.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-115-counting-block-combinations-ii.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-115-counting-block-combinations-ii.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-115-counting-block-combinations-ii.md
index 1e65da5..a659ea3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-115-counting-block-combinations-ii.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-115-counting-block-combinations-ii.md
@@ -1,7 +1,7 @@
---
id: 5900f3df1000cf542c50fef1
title: 'Problem 115: Counting block combinations II'
-challengeType: 5
+challengeType: 1
forumTopicId: 301741
dashedName: problem-115-counting-block-combinations-ii
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-116-red-green-or-blue-tiles.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-116-red-green-or-blue-tiles.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-116-red-green-or-blue-tiles.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-116-red-green-or-blue-tiles.md
index 2d2e54b..15fc613 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-116-red-green-or-blue-tiles.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-116-red-green-or-blue-tiles.md
@@ -1,7 +1,7 @@
---
id: 5900f3e01000cf542c50fef3
title: 'Problem 116: Red, green or blue tiles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301742
dashedName: problem-116-red-green-or-blue-tiles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-117-red-green-and-blue-tiles.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-117-red-green-and-blue-tiles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-117-red-green-and-blue-tiles.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-117-red-green-and-blue-tiles.md
index 51c5743..65a9d37 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-117-red-green-and-blue-tiles.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-117-red-green-and-blue-tiles.md
@@ -1,7 +1,7 @@
---
id: 5900f3e21000cf542c50fef4
title: 'Problem 117: Red, green, and blue tiles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301743
dashedName: problem-117-red-green-and-blue-tiles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-118-pandigital-prime-sets.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-118-pandigital-prime-sets.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-118-pandigital-prime-sets.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-118-pandigital-prime-sets.md
index 00a0605..195d391 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-118-pandigital-prime-sets.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-118-pandigital-prime-sets.md
@@ -1,7 +1,7 @@
---
id: 5900f3e21000cf542c50fef5
title: 'Problem 118: Pandigital prime sets'
-challengeType: 5
+challengeType: 1
forumTopicId: 301744
dashedName: problem-118-pandigital-prime-sets
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-119-digit-power-sum.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-119-digit-power-sum.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-119-digit-power-sum.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-119-digit-power-sum.md
index 1db0014..87bf836 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-119-digit-power-sum.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-119-digit-power-sum.md
@@ -1,7 +1,7 @@
---
id: 5900f3e41000cf542c50fef6
title: 'Problem 119: Digit power sum'
-challengeType: 5
+challengeType: 1
forumTopicId: 301745
dashedName: problem-119-digit-power-sum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-120-square-remainders.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-120-square-remainders.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-120-square-remainders.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-120-square-remainders.md
index 828f12b..d42c224 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-120-square-remainders.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-120-square-remainders.md
@@ -1,7 +1,7 @@
---
id: 5900f3e41000cf542c50fef7
title: 'Problem 120: Square remainders'
-challengeType: 5
+challengeType: 1
forumTopicId: 301747
dashedName: problem-120-square-remainders
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-121-disc-game-prize-fund.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-121-disc-game-prize-fund.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-121-disc-game-prize-fund.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-121-disc-game-prize-fund.md
index c8db41a..0f23b7f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-121-disc-game-prize-fund.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-121-disc-game-prize-fund.md
@@ -1,7 +1,7 @@
---
id: 5900f3e51000cf542c50fef8
title: 'Problem 121: Disc game prize fund'
-challengeType: 5
+challengeType: 1
forumTopicId: 301748
dashedName: problem-121-disc-game-prize-fund
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-122-efficient-exponentiation.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-122-efficient-exponentiation.md
similarity index 85%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-122-efficient-exponentiation.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-122-efficient-exponentiation.md
index a023244..0af7c5b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-122-efficient-exponentiation.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-122-efficient-exponentiation.md
@@ -1,7 +1,7 @@
---
id: 5900f3e61000cf542c50fef9
title: 'Problem 122: Efficient exponentiation'
-challengeType: 5
+challengeType: 1
forumTopicId: 301749
dashedName: problem-122-efficient-exponentiation
---
@@ -39,10 +39,10 @@ For $1 ≤ k ≤ 200$, find $\sum{m(k)}$.
# --hints--
-`efficientExponentation()` should return `1582`.
+`efficientExponentiation()` should return `1582`.
```js
-assert.strictEqual(efficientExponentation(), 1582);
+assert.strictEqual(efficientExponentiation(), 1582);
```
# --seed--
@@ -50,12 +50,12 @@ assert.strictEqual(efficientExponentation(), 1582);
## --seed-contents--
```js
-function efficientExponentation() {
+function efficientExponentiation() {
return true;
}
-efficientExponentation();
+efficientExponentiation();
```
# --solutions--
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-123-prime-square-remainders.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-123-prime-square-remainders.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-123-prime-square-remainders.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-123-prime-square-remainders.md
index 6b5de78..743089b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-123-prime-square-remainders.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-123-prime-square-remainders.md
@@ -1,7 +1,7 @@
---
id: 5900f3e71000cf542c50fefa
title: 'Problem 123: Prime square remainders'
-challengeType: 5
+challengeType: 1
forumTopicId: 301750
dashedName: problem-123-prime-square-remainders
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-124-ordered-radicals.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-124-ordered-radicals.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-124-ordered-radicals.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-124-ordered-radicals.md
index 0877928..899171a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-124-ordered-radicals.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-124-ordered-radicals.md
@@ -1,7 +1,7 @@
---
id: 5900f3e81000cf542c50fefb
title: 'Problem 124: Ordered radicals'
-challengeType: 5
+challengeType: 1
forumTopicId: 301751
dashedName: problem-124-ordered-radicals
---
diff --git a/curriculum/project-euler/project-euler-problems-101-to-200/problem-125-palindromic-sums.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-125-palindromic-sums.md
new file mode 100644
index 0000000..eb499c1
--- /dev/null
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-125-palindromic-sums.md
@@ -0,0 +1,79 @@
+---
+id: 5900f3e91000cf542c50fefc
+title: 'Problem 125: Palindromic sums'
+challengeType: 1
+forumTopicId: 301752
+dashedName: problem-125-palindromic-sums
+---
+
+# --description--
+
+The palindromic number 595 is interesting because it can be written as the sum of consecutive squares: $6^2 + 7^2 + 8^2 + 9^2 + 10^2 + 11^2 + 12^2$.
+
+There are exactly eleven palindromes below one-thousand that can be written as consecutive square sums, and the sum of these palindromes is 4164. Note that $1 = 0^2 + 1^2$ has not been included as this problem is concerned with the squares of positive integers.
+
+Find the sum of all the numbers less than the `limit` that are both palindromic and can be written as the sum of consecutive squares.
+
+# --hints--
+`palindromicSums(100000000)` should return `2906969179`.
+
+```js
+
+assert.strictEqual(palindromicSums(100000000), 2906969179);
+
+```
+
+`palindromicSums(100)` should return `137`.
+
+```js
+assert.strictEqual(palindromicSums(100), 137);
+```
+
+`palindromicSums(1000)` should return `4164`.
+
+```js
+assert.strictEqual(palindromicSums(1000),4164);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function palindromicSums(limit) {
+
+ return true;
+}
+
+palindromicSums(100);
+```
+
+# --solutions--
+
+```js
+function isPalindrome(num) {
+ return num
+ .toString()
+ .split('')
+ .every((digit, i, arr) => digit === arr[arr.length - 1 - i]);
+}
+
+function palindromicSums(limit) {
+ let sumOfPalindromes = 0;
+ const sqrtLimit = Math.sqrt(limit);
+ const list = new Set();
+
+ for (let i = 1; i <= sqrtLimit; i++) {
+ let sumOfSquares = i * i;
+ for (let j = i + 1; j <= sqrtLimit; j++) {
+ sumOfSquares += j * j;
+ if (sumOfSquares > limit) break;
+ if (isPalindrome(sumOfSquares) && !list.has(sumOfSquares)) {
+ sumOfPalindromes += sumOfSquares;
+ list.add(sumOfSquares);
+ }
+ }
+ }
+ return sumOfPalindromes;
+}
+```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-126-cuboid-layers.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-126-cuboid-layers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-126-cuboid-layers.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-126-cuboid-layers.md
index 61e8b8c..1f7725c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-126-cuboid-layers.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-126-cuboid-layers.md
@@ -1,7 +1,7 @@
---
id: 5900f3ea1000cf542c50fefd
title: 'Problem 126: Cuboid layers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301753
dashedName: problem-126-cuboid-layers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-127-abc-hits.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-127-abc-hits.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-127-abc-hits.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-127-abc-hits.md
index 075655d..2f7f927 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-127-abc-hits.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-127-abc-hits.md
@@ -1,7 +1,7 @@
---
id: 5900f3ec1000cf542c50fefe
title: 'Problem 127: abc-hits'
-challengeType: 5
+challengeType: 1
forumTopicId: 301754
dashedName: problem-127-abc-hits
---
diff --git a/curriculum/project-euler/project-euler-problems-101-to-200/problem-128-hexagonal-tile-differences.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-128-hexagonal-tile-differences.md
new file mode 100644
index 0000000..c00be08
--- /dev/null
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-128-hexagonal-tile-differences.md
@@ -0,0 +1,117 @@
+---
+id: 5900f3ec1000cf542c50feff
+title: 'Problem 128: Hexagonal tile differences'
+challengeType: 1
+forumTopicId: 301755
+dashedName: problem-128-hexagonal-tile-differences
+---
+
+# --description--
+
+A hexagonal tile with number 1 is surrounded by a ring of six hexagonal tiles, starting at "12 o'clock" and numbering the tiles 2 to 7 in an anti-clockwise direction.
+
+New rings are added in the same fashion, with the next rings being numbered 8 to 19, 20 to 37, 38 to 61, and so on. The diagram below shows the first three rings.
+
+
+
+By finding the difference between tile $n$ and each of its six neighbours we shall define $PD(n)$ to be the number of those differences which are prime.
+
+For example, working clockwise around tile 8 the differences are 12, 29, 11, 6, 1, and 13. So $PD(8) = 3$.
+
+In the same way, the differences around tile 17 are 1, 17, 16, 1, 11, and 10, hence $PD(17) = 2$.
+
+It can be shown that the maximum value of $PD(n)$ is $3$.
+
+If all of the tiles for which $PD(n) = 3$ are listed in ascending order to form a sequence, the 10th tile would be 271.
+
+Find the 2000th tile in this sequence.
+
+# --hints--
+
+`hexagonalTile(10)` should return `271`.
+
+```js
+assert.strictEqual(hexagonalTile(10), 271);
+```
+
+`hexagonalTile(2000)` should return `14516824220`.
+
+```js
+assert.strictEqual(hexagonalTile(2000), 14516824220);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function hexagonalTile(tileIndex) {
+
+ return true;
+}
+
+hexagonalTile(10);
+```
+
+# --solutions--
+
+```js
+class PrimeSeive {
+ constructor(num) {
+ const seive = Array(Math.floor((num - 1) / 2)).fill(true);
+ const upper = Math.floor((num - 1) / 2);
+ const sqrtUpper = Math.floor((Math.sqrt(num) - 1) / 2);
+
+ for (let i = 0; i <= sqrtUpper; i++) {
+ if (seive[i]) {
+ // Mark value in seive array
+ const prime = 2 * i + 3;
+ // Mark all multiples of this number as false (not prime)
+ const primeSquaredIndex = 2 * i ** 2 + 6 * i + 3;
+ for (let j = primeSquaredIndex; j < upper; j += prime) {
+ seive[j] = false;
+ }
+ }
+ }
+
+ this._seive = seive;
+ }
+
+ isPrime(num) {
+ return num === 2
+ ? true
+ : num % 2 === 0
+ ? false
+ : this.isOddPrime(num);
+ }
+
+ isOddPrime(num) {
+ return this._seive[(num - 3) / 2];
+ }
+};
+
+function hexagonalTile(tileIndex) {
+ const primeSeive = new PrimeSeive(tileIndex * 420);
+ let count = 1;
+ let n = 1;
+ let number = 0;
+
+ while (count < tileIndex) {
+ if (primeSeive.isPrime(6*n - 1) &&
+ primeSeive.isPrime(6*n + 1) &&
+ primeSeive.isPrime(12*n + 5)) {
+ number = 3*n*n - 3*n + 2;
+ count++;
+ if (count >= tileIndex) break;
+ }
+ if (primeSeive.isPrime(6*n + 5) &&
+ primeSeive.isPrime(6*n - 1) &&
+ primeSeive.isPrime(12*n - 7) && n != 1) {
+ number = 3*n*n + 3*n + 1;
+ count++;
+ }
+ n++;
+ }
+ return number;
+}
+```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-129-repunit-divisibility.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-129-repunit-divisibility.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-129-repunit-divisibility.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-129-repunit-divisibility.md
index 8fef321..e7f423f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-129-repunit-divisibility.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-129-repunit-divisibility.md
@@ -1,7 +1,7 @@
---
id: 5900f3ef1000cf542c50ff01
title: 'Problem 129: Repunit divisibility'
-challengeType: 5
+challengeType: 1
forumTopicId: 301756
dashedName: problem-129-repunit-divisibility
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-130-composites-with-prime-repunit-property.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-130-composites-with-prime-repunit-property.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-130-composites-with-prime-repunit-property.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-130-composites-with-prime-repunit-property.md
index 4952594..48f7149 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-130-composites-with-prime-repunit-property.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-130-composites-with-prime-repunit-property.md
@@ -1,7 +1,7 @@
---
id: 5900f3ee1000cf542c50ff00
title: 'Problem 130: Composites with prime repunit property'
-challengeType: 5
+challengeType: 1
forumTopicId: 301758
dashedName: problem-130-composites-with-prime-repunit-property
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-131-prime-cube-partnership.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-131-prime-cube-partnership.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-131-prime-cube-partnership.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-131-prime-cube-partnership.md
index a88b77d..73e7e8e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-131-prime-cube-partnership.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-131-prime-cube-partnership.md
@@ -1,7 +1,7 @@
---
id: 5900f3ef1000cf542c50ff02
title: 'Problem 131: Prime cube partnership'
-challengeType: 5
+challengeType: 1
forumTopicId: 301759
dashedName: problem-131-prime-cube-partnership
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-132-large-repunit-factors.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-132-large-repunit-factors.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-132-large-repunit-factors.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-132-large-repunit-factors.md
index bda0bad..5ca7c07 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-132-large-repunit-factors.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-132-large-repunit-factors.md
@@ -1,7 +1,7 @@
---
id: 5900f3f11000cf542c50ff03
title: 'Problem 132: Large repunit factors'
-challengeType: 5
+challengeType: 1
forumTopicId: 301760
dashedName: problem-132-large-repunit-factors
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-133-repunit-nonfactors.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-133-repunit-nonfactors.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-133-repunit-nonfactors.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-133-repunit-nonfactors.md
index 022bba6..ee861a1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-133-repunit-nonfactors.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-133-repunit-nonfactors.md
@@ -1,7 +1,7 @@
---
id: 5900f3f21000cf542c50ff04
title: 'Problem 133: Repunit nonfactors'
-challengeType: 5
+challengeType: 1
forumTopicId: 301761
dashedName: problem-133-repunit-nonfactors
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-134-prime-pair-connection.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-134-prime-pair-connection.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-134-prime-pair-connection.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-134-prime-pair-connection.md
index 27bfeef..d6629ef 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-134-prime-pair-connection.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-134-prime-pair-connection.md
@@ -1,7 +1,7 @@
---
id: 5900f3f21000cf542c50ff05
title: 'Problem 134: Prime pair connection'
-challengeType: 5
+challengeType: 1
forumTopicId: 301762
dashedName: problem-134-prime-pair-connection
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-135-same-differences.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-135-same-differences.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-135-same-differences.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-135-same-differences.md
index 2b6509b..3045467 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-135-same-differences.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-135-same-differences.md
@@ -1,7 +1,7 @@
---
id: 5900f3f31000cf542c50ff06
title: 'Problem 135: Same differences'
-challengeType: 5
+challengeType: 1
forumTopicId: 301763
dashedName: problem-135-same-differences
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-136-singleton-difference.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-136-singleton-difference.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-136-singleton-difference.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-136-singleton-difference.md
index 971f6ae..d73ff59 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-136-singleton-difference.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-136-singleton-difference.md
@@ -1,7 +1,7 @@
---
id: 5900f3f51000cf542c50ff07
title: 'Problem 136: Singleton difference'
-challengeType: 5
+challengeType: 1
forumTopicId: 301764
dashedName: problem-136-singleton-difference
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-137-fibonacci-golden-nuggets.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-137-fibonacci-golden-nuggets.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-137-fibonacci-golden-nuggets.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-137-fibonacci-golden-nuggets.md
index 6f1ea61..c2d8829 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-137-fibonacci-golden-nuggets.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-137-fibonacci-golden-nuggets.md
@@ -1,7 +1,7 @@
---
id: 5900f3f51000cf542c50ff08
title: 'Problem 137: Fibonacci golden nuggets'
-challengeType: 5
+challengeType: 1
forumTopicId: 301765
dashedName: problem-137-fibonacci-golden-nuggets
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-138-special-isosceles-triangles.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-138-special-isosceles-triangles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-138-special-isosceles-triangles.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-138-special-isosceles-triangles.md
index 6b94842..e65f3e8f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-138-special-isosceles-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-138-special-isosceles-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f3f61000cf542c50ff09
title: 'Problem 138: Special isosceles triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301766
dashedName: problem-138-special-isosceles-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-139-pythagorean-tiles.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-139-pythagorean-tiles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-139-pythagorean-tiles.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-139-pythagorean-tiles.md
index cd05d68..ad26713 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-139-pythagorean-tiles.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-139-pythagorean-tiles.md
@@ -1,7 +1,7 @@
---
id: 5900f3f71000cf542c50ff0a
title: 'Problem 139: Pythagorean tiles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301767
dashedName: problem-139-pythagorean-tiles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-140-modified-fibonacci-golden-nuggets.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-140-modified-fibonacci-golden-nuggets.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-140-modified-fibonacci-golden-nuggets.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-140-modified-fibonacci-golden-nuggets.md
index e05d709..0b32413 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-140-modified-fibonacci-golden-nuggets.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-140-modified-fibonacci-golden-nuggets.md
@@ -1,7 +1,7 @@
---
id: 5900f3fa1000cf542c50ff0c
title: 'Problem 140: Modified Fibonacci golden nuggets'
-challengeType: 5
+challengeType: 1
forumTopicId: 301769
dashedName: problem-140-modified-fibonacci-golden-nuggets
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-141-investigating-progressive-numbers-n-which-are-also-square.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-141-investigating-progressive-numbers-n-which-are-also-square.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-141-investigating-progressive-numbers-n-which-are-also-square.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-141-investigating-progressive-numbers-n-which-are-also-square.md
index 9e1876c..9f1e9d3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-141-investigating-progressive-numbers-n-which-are-also-square.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-141-investigating-progressive-numbers-n-which-are-also-square.md
@@ -1,7 +1,7 @@
---
id: 5900f3f91000cf542c50ff0b
title: 'Problem 141: Investigating progressive numbers, n, which are also square'
-challengeType: 5
+challengeType: 1
forumTopicId: 301770
dashedName: problem-141-investigating-progressive-numbers-n-which-are-also-square
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-142-perfect-square-collection.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-142-perfect-square-collection.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-142-perfect-square-collection.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-142-perfect-square-collection.md
index dea7472..17a0795 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-142-perfect-square-collection.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-142-perfect-square-collection.md
@@ -1,7 +1,7 @@
---
id: 5900f3fa1000cf542c50ff0d
title: 'Problem 142: Perfect Square Collection'
-challengeType: 5
+challengeType: 1
forumTopicId: 301771
dashedName: problem-142-perfect-square-collection
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-143-investigating-the-torricelli-point-of-a-triangle.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-143-investigating-the-torricelli-point-of-a-triangle.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-143-investigating-the-torricelli-point-of-a-triangle.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-143-investigating-the-torricelli-point-of-a-triangle.md
index 6e07616..740abfa 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-143-investigating-the-torricelli-point-of-a-triangle.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-143-investigating-the-torricelli-point-of-a-triangle.md
@@ -1,7 +1,7 @@
---
id: 5900f3fc1000cf542c50ff0e
title: 'Problem 143: Investigating the Torricelli point of a triangle'
-challengeType: 5
+challengeType: 1
forumTopicId: 301772
dashedName: problem-143-investigating-the-torricelli-point-of-a-triangle
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-144-investigating-multiple-reflections-of-a-laser-beam.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-144-investigating-multiple-reflections-of-a-laser-beam.md
similarity index 86%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-144-investigating-multiple-reflections-of-a-laser-beam.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-144-investigating-multiple-reflections-of-a-laser-beam.md
index a1faca6..935df9d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-144-investigating-multiple-reflections-of-a-laser-beam.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-144-investigating-multiple-reflections-of-a-laser-beam.md
@@ -1,7 +1,7 @@
---
id: 5900f3fc1000cf542c50ff0f
title: 'Problem 144: Investigating multiple reflections of a laser beam'
-challengeType: 5
+challengeType: 1
forumTopicId: 301773
dashedName: problem-144-investigating-multiple-reflections-of-a-laser-beam
---
@@ -15,8 +15,8 @@ The specific white cell we will be considering is an ellipse with the equation $
The section corresponding to $−0.01 ≤ x ≤ +0.01$ at the top is missing, allowing the light to enter and exit through the hole.
The light beam in this problem starts at the point (0.0, 10.1) just outside the white cell, and the beam first impacts the mirror at (1.4, -9.6).
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-145-how-many-reversible-numbers-are-there-below-one-billion.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-145-how-many-reversible-numbers-are-there-below-one-billion.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-145-how-many-reversible-numbers-are-there-below-one-billion.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-145-how-many-reversible-numbers-are-there-below-one-billion.md
index 7b72223..f307994 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-145-how-many-reversible-numbers-are-there-below-one-billion.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-145-how-many-reversible-numbers-are-there-below-one-billion.md
@@ -1,7 +1,7 @@
---
id: 5900f3fd1000cf542c50ff10
title: 'Problem 145: How many reversible numbers are there below one-billion?'
-challengeType: 5
+challengeType: 1
forumTopicId: 301774
dashedName: problem-145-how-many-reversible-numbers-are-there-below-one-billion
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-146-investigating-a-prime-pattern.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-146-investigating-a-prime-pattern.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-146-investigating-a-prime-pattern.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-146-investigating-a-prime-pattern.md
index ed8f0bd..6407520 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-146-investigating-a-prime-pattern.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-146-investigating-a-prime-pattern.md
@@ -1,7 +1,7 @@
---
id: 5900f3fe1000cf542c50ff11
title: 'Problem 146: Investigating a Prime Pattern'
-challengeType: 5
+challengeType: 1
forumTopicId: 301775
dashedName: problem-146-investigating-a-prime-pattern
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-147-rectangles-in-cross-hatched-grids.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-147-rectangles-in-cross-hatched-grids.md
similarity index 94%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-147-rectangles-in-cross-hatched-grids.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-147-rectangles-in-cross-hatched-grids.md
index 9d058e4..de23fc8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-147-rectangles-in-cross-hatched-grids.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-147-rectangles-in-cross-hatched-grids.md
@@ -1,7 +1,7 @@
---
id: 5900f3ff1000cf542c50ff12
title: 'Problem 147: Rectangles in cross-hatched grids'
-challengeType: 5
+challengeType: 1
forumTopicId: 301776
dashedName: problem-147-rectangles-in-cross-hatched-grids
---
@@ -10,7 +10,7 @@ dashedName: problem-147-rectangles-in-cross-hatched-grids
In a 3x2 cross-hatched grid, a total of 37 different rectangles could be situated within that grid as indicated in the sketch.
-
+
There are 5 grids smaller than 3x2, vertical and horizontal dimensions being important, i.e. 1x1, 2x1, 3x1, 1x2 and 2x2. If each of them is cross-hatched, the following number of different rectangles could be situated within those smaller grids:
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-148-exploring-pascals-triangle.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-148-exploring-pascals-triangle.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-148-exploring-pascals-triangle.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-148-exploring-pascals-triangle.md
index ecd6bab..d30e62b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-148-exploring-pascals-triangle.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-148-exploring-pascals-triangle.md
@@ -1,7 +1,7 @@
---
id: 5900f4021000cf542c50ff14
title: 'Problem 148: Exploring Pascal''s triangle'
-challengeType: 5
+challengeType: 1
forumTopicId: 301777
dashedName: problem-148-exploring-pascals-triangle
---
@@ -10,7 +10,7 @@ dashedName: problem-148-exploring-pascals-triangle
We can easily verify that none of the entries in the first seven rows of Pascal's triangle are divisible by 7:
-```
+```markup
1
1 1
1 2 1
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-149-searching-for-a-maximum-sum-subsequence.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-149-searching-for-a-maximum-sum-subsequence.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-149-searching-for-a-maximum-sum-subsequence.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-149-searching-for-a-maximum-sum-subsequence.md
index 82a1ae1..1d300db 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-149-searching-for-a-maximum-sum-subsequence.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-149-searching-for-a-maximum-sum-subsequence.md
@@ -1,7 +1,7 @@
---
id: 5900f4021000cf542c50ff13
title: 'Problem 149: Searching for a maximum-sum subsequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 301778
dashedName: problem-149-searching-for-a-maximum-sum-subsequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-150-searching-a-triangular-array-for-a-sub-triangle-having-minimum-sum.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-150-searching-a-triangular-array-for-a-sub-triangle-having-minimum-sum.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-150-searching-a-triangular-array-for-a-sub-triangle-having-minimum-sum.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-150-searching-a-triangular-array-for-a-sub-triangle-having-minimum-sum.md
index 950104d..7ae755c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-150-searching-a-triangular-array-for-a-sub-triangle-having-minimum-sum.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-150-searching-a-triangular-array-for-a-sub-triangle-having-minimum-sum.md
@@ -3,7 +3,7 @@ id: 5900f4031000cf542c50ff15
title: >-
Problem 150: Searching a triangular array for a sub-triangle having
minimum-sum
-challengeType: 5
+challengeType: 1
forumTopicId: 301781
dashedName: problem-150-searching-a-triangular-array-for-a-sub-triangle-having-minimum-sum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-151-paper-sheets-of-standard-sizes-an-expected-value-problem.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-151-paper-sheets-of-standard-sizes-an-expected-value-problem.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-151-paper-sheets-of-standard-sizes-an-expected-value-problem.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-151-paper-sheets-of-standard-sizes-an-expected-value-problem.md
index cd06eb5..f5d8ba2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-151-paper-sheets-of-standard-sizes-an-expected-value-problem.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-151-paper-sheets-of-standard-sizes-an-expected-value-problem.md
@@ -1,7 +1,7 @@
---
id: 5900f4031000cf542c50ff16
title: 'Problem 151: Paper sheets of standard sizes: an expected-value problem'
-challengeType: 5
+challengeType: 1
forumTopicId: 301782
dashedName: problem-151-paper-sheets-of-standard-sizes-an-expected-value-problem
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-152-writing-one-half-as-a-sum-of-inverse-squares.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-152-writing-one-half-as-a-sum-of-inverse-squares.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-152-writing-one-half-as-a-sum-of-inverse-squares.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-152-writing-one-half-as-a-sum-of-inverse-squares.md
index 79a7bd5..c03197b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-152-writing-one-half-as-a-sum-of-inverse-squares.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-152-writing-one-half-as-a-sum-of-inverse-squares.md
@@ -1,7 +1,7 @@
---
id: 5900f4041000cf542c50ff17
title: 'Problem 152: Writing one half as a sum of inverse squares'
-challengeType: 5
+challengeType: 1
forumTopicId: 301783
dashedName: problem-152-writing-one-half-as-a-sum-of-inverse-squares
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-153-investigating-gaussian-integers.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-153-investigating-gaussian-integers.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-153-investigating-gaussian-integers.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-153-investigating-gaussian-integers.md
index 21ea252..48eaca0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-153-investigating-gaussian-integers.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-153-investigating-gaussian-integers.md
@@ -1,7 +1,7 @@
---
id: 5900f4051000cf542c50ff18
title: 'Problem 153: Investigating Gaussian Integers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301784
dashedName: problem-153-investigating-gaussian-integers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-154-exploring-pascals-pyramid.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-154-exploring-pascals-pyramid.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-154-exploring-pascals-pyramid.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-154-exploring-pascals-pyramid.md
index 50401fe..7c7f2da 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-154-exploring-pascals-pyramid.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-154-exploring-pascals-pyramid.md
@@ -1,7 +1,7 @@
---
id: 5900f4071000cf542c50ff19
title: 'Problem 154: Exploring Pascal''s pyramid'
-challengeType: 5
+challengeType: 1
forumTopicId: 301785
dashedName: problem-154-exploring-pascals-pyramid
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-155-counting-capacitor-circuits.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-155-counting-capacitor-circuits.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-155-counting-capacitor-circuits.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-155-counting-capacitor-circuits.md
index d79411a..689d875 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-155-counting-capacitor-circuits.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-155-counting-capacitor-circuits.md
@@ -1,7 +1,7 @@
---
id: 5900f4081000cf542c50ff1a
title: 'Problem 155: Counting Capacitor Circuits'
-challengeType: 5
+challengeType: 1
forumTopicId: 301786
dashedName: problem-155-counting-capacitor-circuits
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-156-counting-digits.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-156-counting-digits.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-156-counting-digits.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-156-counting-digits.md
index 1c29670..18df0f1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-156-counting-digits.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-156-counting-digits.md
@@ -1,7 +1,7 @@
---
id: 5900f4091000cf542c50ff1b
title: 'Problem 156: Counting Digits'
-challengeType: 5
+challengeType: 1
forumTopicId: 301787
dashedName: problem-156-counting-digits
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-157-solving-the-diophantine-equation.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-157-solving-the-diophantine-equation.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-157-solving-the-diophantine-equation.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-157-solving-the-diophantine-equation.md
index 8640d87..1755588 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-157-solving-the-diophantine-equation.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-157-solving-the-diophantine-equation.md
@@ -1,7 +1,7 @@
---
id: 5900f4091000cf542c50ff1c
title: 'Problem 157: Solving the diophantine equation'
-challengeType: 5
+challengeType: 1
forumTopicId: 301788
dashedName: problem-157-solving-the-diophantine-equation
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-158-exploring-strings-for-which-only-one-character-comes-lexicographically-after-its-neighbour-to-the-left.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-158-exploring-strings-for-which-only-one-character-comes-lexicographically-after-its-neighbour-to-the-left.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-158-exploring-strings-for-which-only-one-character-comes-lexicographically-after-its-neighbour-to-the-left.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-158-exploring-strings-for-which-only-one-character-comes-lexicographically-after-its-neighbour-to-the-left.md
index b8658b5..0958ce2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-158-exploring-strings-for-which-only-one-character-comes-lexicographically-after-its-neighbour-to-the-left.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-158-exploring-strings-for-which-only-one-character-comes-lexicographically-after-its-neighbour-to-the-left.md
@@ -3,7 +3,7 @@ id: 5900f40a1000cf542c50ff1d
title: >-
Problem 158: Exploring strings for which only one character comes
lexicographically after its neighbour to the left
-challengeType: 5
+challengeType: 1
forumTopicId: 301789
dashedName: >-
problem-158-exploring-strings-for-which-only-one-character-comes-lexicographically-after-its-neighbour-to-the-left
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-159-digital-root-sums-of-factorisations.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-159-digital-root-sums-of-factorisations.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-159-digital-root-sums-of-factorisations.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-159-digital-root-sums-of-factorisations.md
index 10e00d1..23d7835 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-159-digital-root-sums-of-factorisations.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-159-digital-root-sums-of-factorisations.md
@@ -1,7 +1,7 @@
---
id: 5900f40c1000cf542c50ff1e
title: 'Problem 159: Digital root sums of factorisations'
-challengeType: 5
+challengeType: 1
forumTopicId: 301790
dashedName: problem-159-digital-root-sums-of-factorisations
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-160-factorial-trailing-digits.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-160-factorial-trailing-digits.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-160-factorial-trailing-digits.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-160-factorial-trailing-digits.md
index bd08ab9..931bc41 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-160-factorial-trailing-digits.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-160-factorial-trailing-digits.md
@@ -1,7 +1,7 @@
---
id: 5900f40d1000cf542c50ff1f
title: 'Problem 160: Factorial trailing digits'
-challengeType: 5
+challengeType: 1
forumTopicId: 301794
dashedName: problem-160-factorial-trailing-digits
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-161-triominoes.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-161-triominoes.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-161-triominoes.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-161-triominoes.md
index 3c64584..2388b67 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-161-triominoes.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-161-triominoes.md
@@ -1,7 +1,7 @@
---
id: 5900f40d1000cf542c50ff20
title: 'Problem 161: Triominoes'
-challengeType: 5
+challengeType: 1
forumTopicId: 301795
dashedName: problem-161-triominoes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-162-hexadecimal-numbers.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-162-hexadecimal-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-162-hexadecimal-numbers.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-162-hexadecimal-numbers.md
index 8b63fdc..9ad9403 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-162-hexadecimal-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-162-hexadecimal-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f40e1000cf542c50ff21
title: 'Problem 162: Hexadecimal numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301796
dashedName: problem-162-hexadecimal-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-163-cross-hatched-triangles.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-163-cross-hatched-triangles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-163-cross-hatched-triangles.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-163-cross-hatched-triangles.md
index 1bd17c7..45a8ed0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-163-cross-hatched-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-163-cross-hatched-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f40f1000cf542c50ff22
title: 'Problem 163: Cross-hatched triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301797
dashedName: problem-163-cross-hatched-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-164-numbers-for-which-no-three-consecutive-digits-have-a-sum-greater-than-a-given-value.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-164-numbers-for-which-no-three-consecutive-digits-have-a-sum-greater-than-a-given-value.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-164-numbers-for-which-no-three-consecutive-digits-have-a-sum-greater-than-a-given-value.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-164-numbers-for-which-no-three-consecutive-digits-have-a-sum-greater-than-a-given-value.md
index 18a4bc8..a41ebea 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-164-numbers-for-which-no-three-consecutive-digits-have-a-sum-greater-than-a-given-value.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-164-numbers-for-which-no-three-consecutive-digits-have-a-sum-greater-than-a-given-value.md
@@ -3,7 +3,7 @@ id: 5900f4111000cf542c50ff23
title: >-
Problem 164: Numbers for which no three consecutive digits have a sum greater
than a given value
-challengeType: 5
+challengeType: 1
forumTopicId: 301798
dashedName: >-
problem-164-numbers-for-which-no-three-consecutive-digits-have-a-sum-greater-than-a-given-value
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-165-intersections.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-165-intersections.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-165-intersections.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-165-intersections.md
index 9a25a15..ce5c015 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-165-intersections.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-165-intersections.md
@@ -1,7 +1,7 @@
---
id: 5900f4111000cf542c50ff24
title: 'Problem 165: Intersections'
-challengeType: 5
+challengeType: 1
forumTopicId: 301799
dashedName: problem-165-intersections
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-166-criss-cross.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-166-criss-cross.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-166-criss-cross.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-166-criss-cross.md
index dfb3821..fbe5a1f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-166-criss-cross.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-166-criss-cross.md
@@ -1,7 +1,7 @@
---
id: 5900f4131000cf542c50ff25
title: 'Problem 166: Criss Cross'
-challengeType: 5
+challengeType: 1
forumTopicId: 301800
dashedName: problem-166-criss-cross
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-167-investigating-ulam-sequences.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-167-investigating-ulam-sequences.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-167-investigating-ulam-sequences.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-167-investigating-ulam-sequences.md
index 6e2b3c1..37f3fd5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-167-investigating-ulam-sequences.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-167-investigating-ulam-sequences.md
@@ -1,7 +1,7 @@
---
id: 5900f4141000cf542c50ff26
title: 'Problem 167: Investigating Ulam sequences'
-challengeType: 5
+challengeType: 1
forumTopicId: 301801
dashedName: problem-167-investigating-ulam-sequences
---
diff --git a/curriculum/project-euler/project-euler-problems-101-to-200/problem-168-number-rotations.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-168-number-rotations.md
new file mode 100644
index 0000000..5080241
--- /dev/null
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-168-number-rotations.md
@@ -0,0 +1,82 @@
+---
+id: 5900f4151000cf542c50ff27
+title: 'Problem 168: Number Rotations'
+challengeType: 1
+forumTopicId: 301802
+dashedName: problem-168-number-rotations
+---
+
+# --description--
+
+Consider the number 142857. We can right-rotate this number by moving the last digit (7) to the front of it, giving us 714285.
+
+It can be verified that $714285 = 5 × 142857$.
+
+This demonstrates an unusual property of 142857: it is a divisor of its right-rotation.
+
+For integer number of digits $a$ and $b$, find the last 5 digits of the sum of all integers $n$, $10^a < n < 10^b$, that have this property.
+
+# --hints--
+
+`numberRotations(2, 10)` should return `98311`.
+
+```js
+assert.strictEqual(numberRotations(2, 10), 98311);
+```
+
+`numberRotations(2, 100)` should return `59206`.
+
+```js
+assert.strictEqual(numberRotations(2, 100), 59206);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function numberRotations(a, b) {
+
+ return 0;
+}
+
+numberRotations();
+```
+
+# --solutions--
+
+```js
+function numberRotations(minDigits, maxDigits) {
+ const DIGITS_TO_KEEP = 100000n;
+ const powersOfTen = Array(maxDigits).fill(0);
+ powersOfTen[0] = 1n;
+ for (let i = 1; i < maxDigits; i++) {
+ powersOfTen[i] = powersOfTen[i - 1] * 10n;
+ }
+
+ // We want numbers of the form xd * m = dx
+ // Or more precisely:
+ // (x * 10 + d) * m = d*10^(n-1) + x
+ // Solving for x:
+ // x = d (10^(n-1) - m) / (10 * m - 1)
+ let total = 0n;
+ for (let numDigits = minDigits; numDigits <= maxDigits; numDigits++) {
+ // Check all multiplier - digit pairs to see if a candidate can be built
+ // with the correct number of digits
+ for (let multiplier = 1n; multiplier < 10n; multiplier++) {
+ for (let lastDigit = 1n; lastDigit < 10n; lastDigit++) {
+ const numerator = lastDigit * (powersOfTen[numDigits - 1] - multiplier);
+ const denominator = (powersOfTen[1] * multiplier - 1n);
+ if (numerator % denominator === 0n) {
+ const candidate = (numerator / denominator) * 10n + lastDigit;
+ if (candidate.toString().length === numDigits) {
+ total = (total + candidate) % DIGITS_TO_KEEP;
+ }
+ }
+ }
+ }
+ }
+
+ return parseInt(total);
+}
+```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-169-exploring-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-169-exploring-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-169-exploring-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-169-exploring-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md
index 78f6895..bc4e5eb 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-169-exploring-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-169-exploring-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md
@@ -3,7 +3,7 @@ id: 5900f4151000cf542c50ff28
title: >-
Problem 169: Exploring the number of different ways a number can be expressed
as a sum of powers of 2
-challengeType: 5
+challengeType: 1
forumTopicId: 301803
dashedName: >-
problem-169-exploring-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-170-find-the-largest-0-to-9-pandigital-that-can-be-formed-by-concatenating-products.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-170-find-the-largest-0-to-9-pandigital-that-can-be-formed-by-concatenating-products.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-170-find-the-largest-0-to-9-pandigital-that-can-be-formed-by-concatenating-products.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-170-find-the-largest-0-to-9-pandigital-that-can-be-formed-by-concatenating-products.md
index 6cce571..a05f5fa 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-170-find-the-largest-0-to-9-pandigital-that-can-be-formed-by-concatenating-products.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-170-find-the-largest-0-to-9-pandigital-that-can-be-formed-by-concatenating-products.md
@@ -3,7 +3,7 @@ id: 5900f4161000cf542c50ff29
title: >-
Problem 170: Find the largest 0 to 9 pandigital that can be formed by
concatenating products
-challengeType: 5
+challengeType: 1
forumTopicId: 301805
dashedName: >-
problem-170-find-the-largest-0-to-9-pandigital-that-can-be-formed-by-concatenating-products
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-171-finding-numbers-for-which-the-sum-of-the-squares-of-the-digits-is-a-square.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-171-finding-numbers-for-which-the-sum-of-the-squares-of-the-digits-is-a-square.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-171-finding-numbers-for-which-the-sum-of-the-squares-of-the-digits-is-a-square.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-171-finding-numbers-for-which-the-sum-of-the-squares-of-the-digits-is-a-square.md
index e4658cd..30ed95e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-171-finding-numbers-for-which-the-sum-of-the-squares-of-the-digits-is-a-square.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-171-finding-numbers-for-which-the-sum-of-the-squares-of-the-digits-is-a-square.md
@@ -3,7 +3,7 @@ id: 5900f4181000cf542c50ff2a
title: >-
Problem 171: Finding numbers for which the sum of the squares of the digits is
a square
-challengeType: 5
+challengeType: 1
forumTopicId: 301806
dashedName: >-
problem-171-finding-numbers-for-which-the-sum-of-the-squares-of-the-digits-is-a-square
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-172-investigating-numbers-with-few-repeated-digits.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-172-investigating-numbers-with-few-repeated-digits.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-172-investigating-numbers-with-few-repeated-digits.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-172-investigating-numbers-with-few-repeated-digits.md
index 0ad7b86..cfc75b9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-172-investigating-numbers-with-few-repeated-digits.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-172-investigating-numbers-with-few-repeated-digits.md
@@ -1,7 +1,7 @@
---
id: 5900f4181000cf542c50ff2b
title: 'Problem 172: Investigating numbers with few repeated digits'
-challengeType: 5
+challengeType: 1
forumTopicId: 301807
dashedName: problem-172-investigating-numbers-with-few-repeated-digits
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-173-using-up-to-one-million-tiles-how-many-different-hollow-square-laminae-can-be-formed.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-173-using-up-to-one-million-tiles-how-many-different-hollow-square-laminae-can-be-formed.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-173-using-up-to-one-million-tiles-how-many-different-hollow-square-laminae-can-be-formed.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-173-using-up-to-one-million-tiles-how-many-different-hollow-square-laminae-can-be-formed.md
index 5d49c3b..12dfaa1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-173-using-up-to-one-million-tiles-how-many-different-hollow-square-laminae-can-be-formed.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-173-using-up-to-one-million-tiles-how-many-different-hollow-square-laminae-can-be-formed.md
@@ -3,7 +3,7 @@ id: 5900f41a1000cf542c50ff2c
title: >-
Problem 173: Using up to one million tiles how many different "hollow" square
laminae can be formed?
-challengeType: 5
+challengeType: 1
forumTopicId: 301808
dashedName: >-
problem-173-using-up-to-one-million-tiles-how-many-different-hollow-square-laminae-can-be-formed
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-174-counting-the-number-of-hollow-square-laminae-that-can-form-one-two-three-...-distinct-arrangements.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-174-counting-the-number-of-hollow-square-laminae-that-can-form-one-two-three-...-distinct-arrangements.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-174-counting-the-number-of-hollow-square-laminae-that-can-form-one-two-three-...-distinct-arrangements.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-174-counting-the-number-of-hollow-square-laminae-that-can-form-one-two-three-...-distinct-arrangements.md
index ff72763..ed0eeb2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-174-counting-the-number-of-hollow-square-laminae-that-can-form-one-two-three-...-distinct-arrangements.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-174-counting-the-number-of-hollow-square-laminae-that-can-form-one-two-three-...-distinct-arrangements.md
@@ -3,7 +3,7 @@ id: 5900f41a1000cf542c50ff2d
title: >-
Problem 174: Counting the number of "hollow" square laminae that can form one,
two, three, ... distinct arrangements
-challengeType: 5
+challengeType: 1
forumTopicId: 301809
dashedName: >-
problem-174-counting-the-number-of-hollow-square-laminae-that-can-form-one-two-three-----distinct-arrangements
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-175-fractions-involving-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-175-fractions-involving-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-175-fractions-involving-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-175-fractions-involving-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md
index 2090764..216cfa1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-175-fractions-involving-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-175-fractions-involving-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2.md
@@ -3,7 +3,7 @@ id: 5900f41c1000cf542c50ff2e
title: >-
Problem 175: Fractions involving the number of different ways a number can be
expressed as a sum of powers of 2
-challengeType: 5
+challengeType: 1
forumTopicId: 301810
dashedName: >-
problem-175-fractions-involving-the-number-of-different-ways-a-number-can-be-expressed-as-a-sum-of-powers-of-2
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-176-right-angled-triangles-that-share-a-cathetus.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-176-right-angled-triangles-that-share-a-cathetus.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-176-right-angled-triangles-that-share-a-cathetus.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-176-right-angled-triangles-that-share-a-cathetus.md
index d5e7b34..0105649 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-176-right-angled-triangles-that-share-a-cathetus.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-176-right-angled-triangles-that-share-a-cathetus.md
@@ -1,7 +1,7 @@
---
id: 5900f41c1000cf542c50ff2f
title: 'Problem 176: Right-angled triangles that share a cathetus'
-challengeType: 5
+challengeType: 1
forumTopicId: 301811
dashedName: problem-176-right-angled-triangles-that-share-a-cathetus
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-177-integer-angled-quadrilaterals.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-177-integer-angled-quadrilaterals.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-177-integer-angled-quadrilaterals.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-177-integer-angled-quadrilaterals.md
index 686ddad..750a7e2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-177-integer-angled-quadrilaterals.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-177-integer-angled-quadrilaterals.md
@@ -1,7 +1,7 @@
---
id: 5900f41e1000cf542c50ff30
title: 'Problem 177: Integer angled Quadrilaterals'
-challengeType: 5
+challengeType: 1
forumTopicId: 301812
dashedName: problem-177-integer-angled-quadrilaterals
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-178-step-numbers.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-178-step-numbers.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-178-step-numbers.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-178-step-numbers.md
index e9ea0ad..22f4413 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-178-step-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-178-step-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f41e1000cf542c50ff31
title: 'Problem 178: Step Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301813
dashedName: problem-178-step-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-179-consecutive-positive-divisors.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-179-consecutive-positive-divisors.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-179-consecutive-positive-divisors.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-179-consecutive-positive-divisors.md
index 9245393..a159a7a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-179-consecutive-positive-divisors.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-179-consecutive-positive-divisors.md
@@ -1,7 +1,7 @@
---
id: 5900f41f1000cf542c50ff32
title: 'Problem 179: Consecutive positive divisors'
-challengeType: 5
+challengeType: 1
forumTopicId: 301814
dashedName: problem-179-consecutive-positive-divisors
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-180-rational-zeros-of-a-function-of-three-variables.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-180-rational-zeros-of-a-function-of-three-variables.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-180-rational-zeros-of-a-function-of-three-variables.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-180-rational-zeros-of-a-function-of-three-variables.md
index e1b5202..347135b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-180-rational-zeros-of-a-function-of-three-variables.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-180-rational-zeros-of-a-function-of-three-variables.md
@@ -1,7 +1,7 @@
---
id: 5900f4201000cf542c50ff33
title: 'Problem 180: Rational zeros of a function of three variables'
-challengeType: 5
+challengeType: 1
forumTopicId: 301816
dashedName: problem-180-rational-zeros-of-a-function-of-three-variables
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-181-investigating-in-how-many-ways-objects-of-two-different-colours-can-be-grouped.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-181-investigating-in-how-many-ways-objects-of-two-different-colours-can-be-grouped.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-181-investigating-in-how-many-ways-objects-of-two-different-colours-can-be-grouped.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-181-investigating-in-how-many-ways-objects-of-two-different-colours-can-be-grouped.md
index 0618f8a..d23abc5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-181-investigating-in-how-many-ways-objects-of-two-different-colours-can-be-grouped.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-181-investigating-in-how-many-ways-objects-of-two-different-colours-can-be-grouped.md
@@ -3,7 +3,7 @@ id: 5900f4231000cf542c50ff34
title: >-
Problem 181: Investigating in how many ways objects of two different colours
can be grouped
-challengeType: 5
+challengeType: 1
forumTopicId: 301817
dashedName: >-
problem-181-investigating-in-how-many-ways-objects-of-two-different-colours-can-be-grouped
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-182-rsa-encryption.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-182-rsa-encryption.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-182-rsa-encryption.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-182-rsa-encryption.md
index 7ffc6ae..2d45244 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-182-rsa-encryption.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-182-rsa-encryption.md
@@ -1,7 +1,7 @@
---
id: 5900f4231000cf542c50ff35
title: 'Problem 182: RSA encryption'
-challengeType: 5
+challengeType: 1
forumTopicId: 301818
dashedName: problem-182-rsa-encryption
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-183-maximum-product-of-parts.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-183-maximum-product-of-parts.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-183-maximum-product-of-parts.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-183-maximum-product-of-parts.md
index 5740c72..7586be4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-183-maximum-product-of-parts.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-183-maximum-product-of-parts.md
@@ -1,7 +1,7 @@
---
id: 5900f4231000cf542c50ff36
title: 'Problem 183: Maximum product of parts'
-challengeType: 5
+challengeType: 1
forumTopicId: 301819
dashedName: problem-183-maximum-product-of-parts
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-184-triangles-containing-the-origin.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-184-triangles-containing-the-origin.md
similarity index 90%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-184-triangles-containing-the-origin.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-184-triangles-containing-the-origin.md
index 904f49b..98b6978 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-184-triangles-containing-the-origin.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-184-triangles-containing-the-origin.md
@@ -1,7 +1,7 @@
---
id: 5900f4241000cf542c50ff37
title: 'Problem 184: Triangles containing the origin'
-challengeType: 5
+challengeType: 1
forumTopicId: 301820
dashedName: problem-184-triangles-containing-the-origin
---
@@ -20,10 +20,10 @@ How many triangles are there containing the origin in the interior and having al
# --hints--
-`trianglesConttainingOrigin()` should return `1725323624056`.
+`trianglesContainingOrigin()` should return `1725323624056`.
```js
-assert.strictEqual(trianglesConttainingOrigin(), 1725323624056);
+assert.strictEqual(trianglesContainingOrigin(), 1725323624056);
```
# --seed--
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-185-number-mind.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-185-number-mind.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-185-number-mind.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-185-number-mind.md
index 726be00..e7908a7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-185-number-mind.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-185-number-mind.md
@@ -1,7 +1,7 @@
---
id: 5900f4251000cf542c50ff38
title: 'Problem 185: Number Mind'
-challengeType: 5
+challengeType: 1
forumTopicId: 301821
dashedName: problem-185-number-mind
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-186-connectedness-of-a-network.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-186-connectedness-of-a-network.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-186-connectedness-of-a-network.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-186-connectedness-of-a-network.md
index e6543b3..d3e4fef 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-186-connectedness-of-a-network.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-186-connectedness-of-a-network.md
@@ -1,7 +1,7 @@
---
id: 5900f4281000cf542c50ff39
title: 'Problem 186: Connectedness of a network'
-challengeType: 5
+challengeType: 1
forumTopicId: 301822
dashedName: problem-186-connectedness-of-a-network
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-187-semiprimes.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-187-semiprimes.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-187-semiprimes.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-187-semiprimes.md
index 13c3f99..bcd6f32 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-187-semiprimes.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-187-semiprimes.md
@@ -1,7 +1,7 @@
---
id: 5900f4291000cf542c50ff3a
title: 'Problem 187: Semiprimes'
-challengeType: 5
+challengeType: 1
forumTopicId: 301823
dashedName: problem-187-semiprimes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-188-the-hyperexponentiation-of-a-number.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-188-the-hyperexponentiation-of-a-number.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-188-the-hyperexponentiation-of-a-number.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-188-the-hyperexponentiation-of-a-number.md
index d8b9140..1e0ae1d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-188-the-hyperexponentiation-of-a-number.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-188-the-hyperexponentiation-of-a-number.md
@@ -1,7 +1,7 @@
---
id: 5900f4291000cf542c50ff3b
title: 'Problem 188: The hyperexponentiation of a number'
-challengeType: 5
+challengeType: 1
forumTopicId: 301824
dashedName: problem-188-the-hyperexponentiation-of-a-number
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-189-tri-colouring-a-triangular-grid.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-189-tri-colouring-a-triangular-grid.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-189-tri-colouring-a-triangular-grid.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-189-tri-colouring-a-triangular-grid.md
index 5563014..8058ded 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-189-tri-colouring-a-triangular-grid.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-189-tri-colouring-a-triangular-grid.md
@@ -1,7 +1,7 @@
---
id: 5900f4291000cf542c50ff3c
title: 'Problem 189: Tri-colouring a triangular grid'
-challengeType: 5
+challengeType: 1
forumTopicId: 301825
dashedName: problem-189-tri-colouring-a-triangular-grid
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-190-maximising-a-weighted-product.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-190-maximising-a-weighted-product.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-190-maximising-a-weighted-product.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-190-maximising-a-weighted-product.md
index 5730d55..8063329 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-190-maximising-a-weighted-product.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-190-maximising-a-weighted-product.md
@@ -1,7 +1,7 @@
---
id: 5900f42b1000cf542c50ff3d
title: 'Problem 190: Maximising a weighted product'
-challengeType: 5
+challengeType: 1
forumTopicId: 301828
dashedName: problem-190-maximising-a-weighted-product
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-191-prize-strings.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-191-prize-strings.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-191-prize-strings.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-191-prize-strings.md
index 348e981..8e4e35e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-191-prize-strings.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-191-prize-strings.md
@@ -1,7 +1,7 @@
---
id: 5900f42b1000cf542c50ff3e
title: 'Problem 191: Prize Strings'
-challengeType: 5
+challengeType: 1
forumTopicId: 301829
dashedName: problem-191-prize-strings
---
@@ -14,7 +14,7 @@ During an n-day period a trinary string is formed for each child consisting of L
Although there are eighty-one trinary strings for a 4-day period that can be formed, exactly forty-three strings would lead to a prize:
-```
+```markup
OOOO OOOA OOOL OOAO OOAA OOAL OOLO OOLA OAOO OAOA
OAOL OAAO OAAL OALO OALA OLOO OLOA OLAO OLAA AOOO
AOOA AOOL AOAO AOAA AOAL AOLO AOLA AAOO AAOA AAOL
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-192-best-approximations.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-192-best-approximations.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-192-best-approximations.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-192-best-approximations.md
index 4d98c5f..61889d4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-192-best-approximations.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-192-best-approximations.md
@@ -1,7 +1,7 @@
---
id: 5900f42c1000cf542c50ff3f
title: 'Problem 192: Best Approximations'
-challengeType: 5
+challengeType: 1
forumTopicId: 301830
dashedName: problem-192-best-approximations
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-193-squarefree-numbers.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-193-squarefree-numbers.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-193-squarefree-numbers.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-193-squarefree-numbers.md
index d053b30..7e17fd2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-193-squarefree-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-193-squarefree-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f42f1000cf542c50ff41
title: 'Problem 193: Squarefree Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301831
dashedName: problem-193-squarefree-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-194-coloured-configurations.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-194-coloured-configurations.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-194-coloured-configurations.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-194-coloured-configurations.md
index 646784f..fa61151 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-194-coloured-configurations.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-194-coloured-configurations.md
@@ -1,7 +1,7 @@
---
id: 5900f42f1000cf542c50ff40
title: 'Problem 194: Coloured Configurations'
-challengeType: 5
+challengeType: 1
forumTopicId: 301832
dashedName: problem-194-coloured-configurations
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-195-inscribed-circles-of-triangles-with-one-angle-of-60-degrees.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-195-inscribed-circles-of-triangles-with-one-angle-of-60-degrees.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-195-inscribed-circles-of-triangles-with-one-angle-of-60-degrees.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-195-inscribed-circles-of-triangles-with-one-angle-of-60-degrees.md
index e3808b0..18c2acd 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-195-inscribed-circles-of-triangles-with-one-angle-of-60-degrees.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-195-inscribed-circles-of-triangles-with-one-angle-of-60-degrees.md
@@ -1,7 +1,7 @@
---
id: 5900f4311000cf542c50ff43
title: 'Problem 195: Inscribed circles of triangles with one angle of 60 degrees'
-challengeType: 5
+challengeType: 1
forumTopicId: 301833
dashedName: problem-195-inscribed-circles-of-triangles-with-one-angle-of-60-degrees
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-196-prime-triplets.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-196-prime-triplets.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-196-prime-triplets.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-196-prime-triplets.md
index be86b16..6d128e8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-196-prime-triplets.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-196-prime-triplets.md
@@ -1,7 +1,7 @@
---
id: 5900f4301000cf542c50ff42
title: 'Problem 196: Prime triplets'
-challengeType: 5
+challengeType: 1
forumTopicId: 301834
dashedName: problem-196-prime-triplets
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-197-investigating-the-behaviour-of-a-recursively-defined-sequence.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-197-investigating-the-behaviour-of-a-recursively-defined-sequence.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-197-investigating-the-behaviour-of-a-recursively-defined-sequence.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-197-investigating-the-behaviour-of-a-recursively-defined-sequence.md
index 4bc0d39..608f288 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-197-investigating-the-behaviour-of-a-recursively-defined-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-197-investigating-the-behaviour-of-a-recursively-defined-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f4311000cf542c50ff44
title: 'Problem 197: Investigating the behaviour of a recursively defined sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 301835
dashedName: problem-197-investigating-the-behaviour-of-a-recursively-defined-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-198-ambiguous-numbers.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-198-ambiguous-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-198-ambiguous-numbers.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-198-ambiguous-numbers.md
index 7dd804a..69c2ba8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-198-ambiguous-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-198-ambiguous-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f4331000cf542c50ff45
title: 'Problem 198: Ambiguous Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301836
dashedName: problem-198-ambiguous-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-199-iterative-circle-packing.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-199-iterative-circle-packing.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-199-iterative-circle-packing.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-199-iterative-circle-packing.md
index d2fc263..f7a4c56 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-199-iterative-circle-packing.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-199-iterative-circle-packing.md
@@ -1,7 +1,7 @@
---
id: 5900f4341000cf542c50ff46
title: 'Problem 199: Iterative Circle Packing'
-challengeType: 5
+challengeType: 1
forumTopicId: 301837
dashedName: problem-199-iterative-circle-packing
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200.md b/curriculum/project-euler/project-euler-problems-101-to-200/problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200.md
rename to curriculum/project-euler/project-euler-problems-101-to-200/problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200.md
index 78f207a..f1b7334 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200.md
+++ b/curriculum/project-euler/project-euler-problems-101-to-200/problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200.md
@@ -3,7 +3,7 @@ id: 5900f4351000cf542c50ff47
title: >-
Problem 200: Find the 200th prime-proof sqube containing the contiguous
sub-string "200"
-challengeType: 5
+challengeType: 1
forumTopicId: 301840
dashedName: >-
problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-201-subsets-with-a-unique-sum.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-201-subsets-with-a-unique-sum.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-201-subsets-with-a-unique-sum.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-201-subsets-with-a-unique-sum.md
index 701c089..5637da5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-201-subsets-with-a-unique-sum.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-201-subsets-with-a-unique-sum.md
@@ -1,7 +1,7 @@
---
id: 5900f4361000cf542c50ff48
title: 'Problem 201: Subsets with a unique sum'
-challengeType: 5
+challengeType: 1
forumTopicId: 301841
dashedName: problem-201-subsets-with-a-unique-sum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-202-laserbeam.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-202-laserbeam.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-202-laserbeam.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-202-laserbeam.md
index 558df13..5d916d5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-202-laserbeam.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-202-laserbeam.md
@@ -1,7 +1,7 @@
---
id: 5900f4371000cf542c50ff49
title: 'Problem 202: Laserbeam'
-challengeType: 5
+challengeType: 1
forumTopicId: 301843
dashedName: problem-202-laserbeam
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-203-squarefree-binomial-coefficients.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-203-squarefree-binomial-coefficients.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-203-squarefree-binomial-coefficients.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-203-squarefree-binomial-coefficients.md
index 2ee86e5..8c57298 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-203-squarefree-binomial-coefficients.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-203-squarefree-binomial-coefficients.md
@@ -1,7 +1,7 @@
---
id: 5900f4381000cf542c50ff4a
title: 'Problem 203: Squarefree Binomial Coefficients'
-challengeType: 5
+challengeType: 1
forumTopicId: 301844
dashedName: problem-203-squarefree-binomial-coefficients
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-204-generalised-hamming-numbers.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-204-generalised-hamming-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-204-generalised-hamming-numbers.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-204-generalised-hamming-numbers.md
index b7fb032..584cf57 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-204-generalised-hamming-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-204-generalised-hamming-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f4381000cf542c50ff4b
title: 'Problem 204: Generalised Hamming Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301845
dashedName: problem-204-generalised-hamming-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-205-dice-game.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-205-dice-game.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-205-dice-game.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-205-dice-game.md
index 08245eb..17614db 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-205-dice-game.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-205-dice-game.md
@@ -1,7 +1,7 @@
---
id: 5900f4391000cf542c50ff4c
title: 'Problem 205: Dice Game'
-challengeType: 5
+challengeType: 1
forumTopicId: 301846
dashedName: problem-205-dice-game
---
diff --git a/curriculum/project-euler/project-euler-problems-201-to-300/problem-206-concealed-square.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-206-concealed-square.md
new file mode 100644
index 0000000..b843f6f
--- /dev/null
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-206-concealed-square.md
@@ -0,0 +1,63 @@
+---
+id: 5900f43a1000cf542c50ff4d
+title: 'Problem 206: Concealed Square'
+challengeType: 1
+forumTopicId: 301847
+dashedName: problem-206-concealed-square
+---
+
+# --description--
+
+Find the unique positive integer whose square has the form 1_2_3_4_5_6_7_8_9_0, where each "_" is a single digit.
+
+# --hints--
+
+`concealedSquare()` should return `1389019170`.
+
+```js
+assert.strictEqual(concealedSquare(), 1389019170);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function concealedSquare() {
+
+ return true;
+}
+
+concealedSquare();
+```
+
+# --solutions--
+
+```js
+// Check if n**2 matches the pattern
+function squareMatches(n) {
+ // Need BigInt due to size of values
+ let nSquared = (BigInt(n) * BigInt(n)).toString();
+
+ // Check if digits match pattern
+ for (let i = 1; i <= 9; i++) {
+ if (nSquared[2 * (i - 1)] != i) return false;
+ }
+ return true;
+}
+
+// Find integer whose square matches the pattern
+function concealedSquare() {
+ // Set bounds based upon max and min candidates
+ const minSquareRoot = Math.floor(Math.sqrt(10203040506070809) / 10) * 10;
+ const maxSquareRoot = Math.ceil(Math.sqrt(19293949596979899) / 10) * 10;
+
+ for (let x = maxSquareRoot; x >= minSquareRoot; x -= 10) {
+ // Note: 3*3 = 9 and 7*7 = 49 are only trailing digits
+ // that can produce 9 as trailing digit in square
+ if (squareMatches(x + 3)) return (x + 3)*10;
+ if (squareMatches(x + 7)) return (x + 7)*10;
+ }
+ return -1;
+}
+```
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-207-integer-partition-equations.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-207-integer-partition-equations.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-207-integer-partition-equations.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-207-integer-partition-equations.md
index fab97cf..3892565 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-207-integer-partition-equations.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-207-integer-partition-equations.md
@@ -1,7 +1,7 @@
---
id: 5900f43c1000cf542c50ff4e
title: 'Problem 207: Integer partition equations'
-challengeType: 5
+challengeType: 1
forumTopicId: 301848
dashedName: problem-207-integer-partition-equations
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-208-robot-walks.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-208-robot-walks.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-208-robot-walks.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-208-robot-walks.md
index 9223d6e..032ec4c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-208-robot-walks.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-208-robot-walks.md
@@ -1,7 +1,7 @@
---
id: 5900f43f1000cf542c50ff51
title: 'Problem 208: Robot Walks'
-challengeType: 5
+challengeType: 1
forumTopicId: 301849
dashedName: problem-208-robot-walks
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-209-circular-logic.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-209-circular-logic.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-209-circular-logic.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-209-circular-logic.md
index fe23e25..7556ba3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-209-circular-logic.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-209-circular-logic.md
@@ -1,7 +1,7 @@
---
id: 5900f43e1000cf542c50ff4f
title: 'Problem 209: Circular Logic'
-challengeType: 5
+challengeType: 1
forumTopicId: 301850
dashedName: problem-209-circular-logic
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-210-obtuse-angled-triangles.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-210-obtuse-angled-triangles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-210-obtuse-angled-triangles.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-210-obtuse-angled-triangles.md
index fa696ba..0dbbed2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-210-obtuse-angled-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-210-obtuse-angled-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f43e1000cf542c50ff50
title: 'Problem 210: Obtuse Angled Triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301852
dashedName: problem-210-obtuse-angled-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-211-divisor-square-sum.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-211-divisor-square-sum.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-211-divisor-square-sum.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-211-divisor-square-sum.md
index e793fa2..3dddaca 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-211-divisor-square-sum.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-211-divisor-square-sum.md
@@ -1,7 +1,7 @@
---
id: 5900f43f1000cf542c50ff52
title: 'Problem 211: Divisor Square Sum'
-challengeType: 5
+challengeType: 1
forumTopicId: 301853
dashedName: problem-211-divisor-square-sum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-212-combined-volume-of-cuboids.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-212-combined-volume-of-cuboids.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-212-combined-volume-of-cuboids.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-212-combined-volume-of-cuboids.md
index 43f0ee8..763042d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-212-combined-volume-of-cuboids.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-212-combined-volume-of-cuboids.md
@@ -1,7 +1,7 @@
---
id: 5900f4411000cf542c50ff53
title: 'Problem 212: Combined Volume of Cuboids'
-challengeType: 5
+challengeType: 1
forumTopicId: 301854
dashedName: problem-212-combined-volume-of-cuboids
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-213-flea-circus.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-213-flea-circus.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-213-flea-circus.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-213-flea-circus.md
index 1e45718..a18eb63 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-213-flea-circus.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-213-flea-circus.md
@@ -1,7 +1,7 @@
---
id: 5900f4411000cf542c50ff54
title: 'Problem 213: Flea Circus'
-challengeType: 5
+challengeType: 1
forumTopicId: 301855
dashedName: problem-213-flea-circus
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-214-totient-chains.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-214-totient-chains.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-214-totient-chains.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-214-totient-chains.md
index b570d77..3b9e74e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-214-totient-chains.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-214-totient-chains.md
@@ -1,7 +1,7 @@
---
id: 5900f4421000cf542c50ff55
title: 'Problem 214: Totient Chains'
-challengeType: 5
+challengeType: 1
forumTopicId: 301856
dashedName: problem-214-totient-chains
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-215-crack-free-walls.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-215-crack-free-walls.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-215-crack-free-walls.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-215-crack-free-walls.md
index 0da02d7..2fec8a7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-215-crack-free-walls.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-215-crack-free-walls.md
@@ -1,7 +1,7 @@
---
id: 5900f4431000cf542c50ff56
title: 'Problem 215: Crack-free Walls'
-challengeType: 5
+challengeType: 1
forumTopicId: 301857
dashedName: problem-215-crack-free-walls
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-216-investigating-the-primality-of-numbers-of-the-form-2n2-1.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-216-investigating-the-primality-of-numbers-of-the-form-2n2-1.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-216-investigating-the-primality-of-numbers-of-the-form-2n2-1.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-216-investigating-the-primality-of-numbers-of-the-form-2n2-1.md
index b159c4f..a528915 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-216-investigating-the-primality-of-numbers-of-the-form-2n2-1.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-216-investigating-the-primality-of-numbers-of-the-form-2n2-1.md
@@ -1,7 +1,7 @@
---
id: 5900f4451000cf542c50ff57
title: 'Problem 216: Investigating the primality of numbers of the form 2n2-1'
-challengeType: 5
+challengeType: 1
forumTopicId: 301858
dashedName: problem-216-investigating-the-primality-of-numbers-of-the-form-2n2-1
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-217-balanced-numbers.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-217-balanced-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-217-balanced-numbers.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-217-balanced-numbers.md
index 690b7ae..f685410 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-217-balanced-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-217-balanced-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f4461000cf542c50ff58
title: 'Problem 217: Balanced Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301859
dashedName: problem-217-balanced-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-218-perfect-right-angled-triangles.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-218-perfect-right-angled-triangles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-218-perfect-right-angled-triangles.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-218-perfect-right-angled-triangles.md
index 22e6c42..1d29c00 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-218-perfect-right-angled-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-218-perfect-right-angled-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f4461000cf542c50ff59
title: 'Problem 218: Perfect right-angled triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301860
dashedName: problem-218-perfect-right-angled-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-219-skew-cost-coding.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-219-skew-cost-coding.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-219-skew-cost-coding.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-219-skew-cost-coding.md
index 499f3ce..f2d2b0f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-219-skew-cost-coding.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-219-skew-cost-coding.md
@@ -1,7 +1,7 @@
---
id: 5900f4481000cf542c50ff5a
title: 'Problem 219: Skew-cost coding'
-challengeType: 5
+challengeType: 1
forumTopicId: 301861
dashedName: problem-219-skew-cost-coding
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-220-heighway-dragon.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-220-heighway-dragon.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-220-heighway-dragon.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-220-heighway-dragon.md
index 343a3d1..c799ec6 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-220-heighway-dragon.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-220-heighway-dragon.md
@@ -1,7 +1,7 @@
---
id: 5900f4481000cf542c50ff5b
title: 'Problem 220: Heighway Dragon'
-challengeType: 5
+challengeType: 1
forumTopicId: 301863
dashedName: problem-220-heighway-dragon
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-221-alexandrian-integers.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-221-alexandrian-integers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-221-alexandrian-integers.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-221-alexandrian-integers.md
index 116fe55..e7fedf2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-221-alexandrian-integers.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-221-alexandrian-integers.md
@@ -1,7 +1,7 @@
---
id: 5900f4491000cf542c50ff5c
title: 'Problem 221: Alexandrian Integers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301864
dashedName: problem-221-alexandrian-integers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-222-sphere-packing.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-222-sphere-packing.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-222-sphere-packing.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-222-sphere-packing.md
index 2253345..cdb6a9c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-222-sphere-packing.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-222-sphere-packing.md
@@ -1,7 +1,7 @@
---
id: 5900f44b1000cf542c50ff5d
title: 'Problem 222: Sphere Packing'
-challengeType: 5
+challengeType: 1
forumTopicId: 301865
dashedName: problem-222-sphere-packing
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-223-almost-right-angled-triangles-i.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-223-almost-right-angled-triangles-i.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-223-almost-right-angled-triangles-i.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-223-almost-right-angled-triangles-i.md
index 2544709..7fdbc36 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-223-almost-right-angled-triangles-i.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-223-almost-right-angled-triangles-i.md
@@ -1,7 +1,7 @@
---
id: 5900f44b1000cf542c50ff5e
title: 'Problem 223: Almost right-angled triangles I'
-challengeType: 5
+challengeType: 1
forumTopicId: 301866
dashedName: problem-223-almost-right-angled-triangles-i
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-224-almost-right-angled-triangles-ii.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-224-almost-right-angled-triangles-ii.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-224-almost-right-angled-triangles-ii.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-224-almost-right-angled-triangles-ii.md
index 88309e7..c9f9b44 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-224-almost-right-angled-triangles-ii.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-224-almost-right-angled-triangles-ii.md
@@ -1,7 +1,7 @@
---
id: 5900f44e1000cf542c50ff5f
title: 'Problem 224: Almost right-angled triangles II'
-challengeType: 5
+challengeType: 1
forumTopicId: 301867
dashedName: problem-224-almost-right-angled-triangles-ii
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-225-tribonacci-non-divisors.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-225-tribonacci-non-divisors.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-225-tribonacci-non-divisors.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-225-tribonacci-non-divisors.md
index cc035ea..2221b44 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-225-tribonacci-non-divisors.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-225-tribonacci-non-divisors.md
@@ -1,7 +1,7 @@
---
id: 5900f44e1000cf542c50ff60
title: 'Problem 225: Tribonacci non-divisors'
-challengeType: 5
+challengeType: 1
forumTopicId: 301868
dashedName: problem-225-tribonacci-non-divisors
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-226-a-scoop-of-blancmange.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-226-a-scoop-of-blancmange.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-226-a-scoop-of-blancmange.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-226-a-scoop-of-blancmange.md
index 8381c5a..4511828 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-226-a-scoop-of-blancmange.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-226-a-scoop-of-blancmange.md
@@ -1,7 +1,7 @@
---
id: 5900f4511000cf542c50ff62
title: 'Problem 226: A Scoop of Blancmange'
-challengeType: 5
+challengeType: 1
forumTopicId: 301869
dashedName: problem-226-a-scoop-of-blancmange
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-227-the-chase.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-227-the-chase.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-227-the-chase.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-227-the-chase.md
index 3277ee9..3121c6a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-227-the-chase.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-227-the-chase.md
@@ -1,7 +1,7 @@
---
id: 5900f44f1000cf542c50ff61
title: 'Problem 227: The Chase'
-challengeType: 5
+challengeType: 1
forumTopicId: 301870
dashedName: problem-227-the-chase
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-228-minkowski-sums.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-228-minkowski-sums.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-228-minkowski-sums.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-228-minkowski-sums.md
index e45fcad..fcbb829 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-228-minkowski-sums.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-228-minkowski-sums.md
@@ -1,7 +1,7 @@
---
id: 5900f4511000cf542c50ff63
title: 'Problem 228: Minkowski Sums'
-challengeType: 5
+challengeType: 1
forumTopicId: 301871
dashedName: problem-228-minkowski-sums
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-229-four-representations-using-squares.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-229-four-representations-using-squares.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-229-four-representations-using-squares.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-229-four-representations-using-squares.md
index 3fc510a..1d295a8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-229-four-representations-using-squares.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-229-four-representations-using-squares.md
@@ -1,7 +1,7 @@
---
id: 5900f4521000cf542c50ff64
title: 'Problem 229: Four Representations using Squares'
-challengeType: 5
+challengeType: 1
forumTopicId: 301872
dashedName: problem-229-four-representations-using-squares
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-230-fibonacci-words.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-230-fibonacci-words.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-230-fibonacci-words.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-230-fibonacci-words.md
index de003dc..92fa72e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-230-fibonacci-words.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-230-fibonacci-words.md
@@ -1,7 +1,7 @@
---
id: 5900f4531000cf542c50ff65
title: 'Problem 230: Fibonacci Words'
-challengeType: 5
+challengeType: 1
forumTopicId: 301874
dashedName: problem-230-fibonacci-words
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-231-the-prime-factorisation-of-binomial-coefficients.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-231-the-prime-factorisation-of-binomial-coefficients.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-231-the-prime-factorisation-of-binomial-coefficients.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-231-the-prime-factorisation-of-binomial-coefficients.md
index 1757050..498810c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-231-the-prime-factorisation-of-binomial-coefficients.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-231-the-prime-factorisation-of-binomial-coefficients.md
@@ -1,7 +1,7 @@
---
id: 5900f4531000cf542c50ff66
title: 'Problem 231: The prime factorisation of binomial coefficients'
-challengeType: 5
+challengeType: 1
forumTopicId: 301875
dashedName: problem-231-the-prime-factorisation-of-binomial-coefficients
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-232-the-race.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-232-the-race.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-232-the-race.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-232-the-race.md
index 43fab42..c03c0d6 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-232-the-race.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-232-the-race.md
@@ -1,7 +1,7 @@
---
id: 5900f4551000cf542c50ff67
title: 'Problem 232: The Race'
-challengeType: 5
+challengeType: 1
forumTopicId: 301876
dashedName: problem-232-the-race
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-233-lattice-points-on-a-circle.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-233-lattice-points-on-a-circle.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-233-lattice-points-on-a-circle.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-233-lattice-points-on-a-circle.md
index 53a4747..db65094 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-233-lattice-points-on-a-circle.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-233-lattice-points-on-a-circle.md
@@ -1,7 +1,7 @@
---
id: 5900f4551000cf542c50ff68
title: 'Problem 233: Lattice points on a circle'
-challengeType: 5
+challengeType: 1
forumTopicId: 301877
dashedName: problem-233-lattice-points-on-a-circle
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-234-semidivisible-numbers.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-234-semidivisible-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-234-semidivisible-numbers.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-234-semidivisible-numbers.md
index 92f831f..ec01ca3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-234-semidivisible-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-234-semidivisible-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f4571000cf542c50ff69
title: 'Problem 234: Semidivisible numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301878
dashedName: problem-234-semidivisible-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-235-an-arithmetic-geometric-sequence.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-235-an-arithmetic-geometric-sequence.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-235-an-arithmetic-geometric-sequence.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-235-an-arithmetic-geometric-sequence.md
index d5d6eae..8936873 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-235-an-arithmetic-geometric-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-235-an-arithmetic-geometric-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f4571000cf542c50ff6a
title: 'Problem 235: An Arithmetic Geometric sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 301879
dashedName: problem-235-an-arithmetic-geometric-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-236-luxury-hampers.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-236-luxury-hampers.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-236-luxury-hampers.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-236-luxury-hampers.md
index 694a292..f577307 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-236-luxury-hampers.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-236-luxury-hampers.md
@@ -1,7 +1,7 @@
---
id: 5900f4591000cf542c50ff6b
title: 'Problem 236: Luxury Hampers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301881
dashedName: problem-236-luxury-hampers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-237-tours-on-a-4-x-n-playing-board.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-237-tours-on-a-4-x-n-playing-board.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-237-tours-on-a-4-x-n-playing-board.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-237-tours-on-a-4-x-n-playing-board.md
index ecbfcaf..ba03257 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-237-tours-on-a-4-x-n-playing-board.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-237-tours-on-a-4-x-n-playing-board.md
@@ -1,7 +1,7 @@
---
id: 5900f4591000cf542c50ff6c
title: 'Problem 237: Tours on a 4 x n playing board'
-challengeType: 5
+challengeType: 1
forumTopicId: 301882
dashedName: problem-237-tours-on-a-4-x-n-playing-board
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-238-infinite-string-tour.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-238-infinite-string-tour.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-238-infinite-string-tour.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-238-infinite-string-tour.md
index 6f7babc..52dd3f1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-238-infinite-string-tour.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-238-infinite-string-tour.md
@@ -1,7 +1,7 @@
---
id: 5900f45b1000cf542c50ff6d
title: 'Problem 238: Infinite string tour'
-challengeType: 5
+challengeType: 1
forumTopicId: 301883
dashedName: problem-238-infinite-string-tour
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-239-twenty-two-foolish-primes.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-239-twenty-two-foolish-primes.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-239-twenty-two-foolish-primes.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-239-twenty-two-foolish-primes.md
index a17ebf5..9fff827 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-239-twenty-two-foolish-primes.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-239-twenty-two-foolish-primes.md
@@ -1,7 +1,7 @@
---
id: 5900f45c1000cf542c50ff6e
title: 'Problem 239: Twenty-two Foolish Primes'
-challengeType: 5
+challengeType: 1
forumTopicId: 301884
dashedName: problem-239-twenty-two-foolish-primes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-240-top-dice.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-240-top-dice.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-240-top-dice.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-240-top-dice.md
index 084f88b..3a49399 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-240-top-dice.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-240-top-dice.md
@@ -1,7 +1,7 @@
---
id: 5900f45d1000cf542c50ff6f
title: 'Problem 240: Top Dice'
-challengeType: 5
+challengeType: 1
forumTopicId: 301887
dashedName: problem-240-top-dice
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-241-perfection-quotients.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-241-perfection-quotients.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-241-perfection-quotients.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-241-perfection-quotients.md
index 740e8a8..492d3f6 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-241-perfection-quotients.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-241-perfection-quotients.md
@@ -1,7 +1,7 @@
---
id: 5900f45d1000cf542c50ff70
title: 'Problem 241: Perfection Quotients'
-challengeType: 5
+challengeType: 1
forumTopicId: 301888
dashedName: problem-241-perfection-quotients
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-242-odd-triplets.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-242-odd-triplets.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-242-odd-triplets.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-242-odd-triplets.md
index 161fc01..abbcfca 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-242-odd-triplets.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-242-odd-triplets.md
@@ -1,7 +1,7 @@
---
id: 5900f45f1000cf542c50ff71
title: 'Problem 242: Odd Triplets'
-challengeType: 5
+challengeType: 1
forumTopicId: 301889
dashedName: problem-242-odd-triplets
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-243-resilience.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-243-resilience.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-243-resilience.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-243-resilience.md
index e29ca09..67287ea 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-243-resilience.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-243-resilience.md
@@ -1,7 +1,7 @@
---
id: 5900f4601000cf542c50ff73
title: 'Problem 243: Resilience'
-challengeType: 5
+challengeType: 1
forumTopicId: 301890
dashedName: problem-243-resilience
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-244-sliders.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-244-sliders.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-244-sliders.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-244-sliders.md
index 1cf581d..dab5b24 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-244-sliders.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-244-sliders.md
@@ -1,7 +1,7 @@
---
id: 5900f4601000cf542c50ff72
title: 'Problem 244: Sliders'
-challengeType: 5
+challengeType: 1
forumTopicId: 301891
dashedName: problem-244-sliders
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-245-coresilience.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-245-coresilience.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-245-coresilience.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-245-coresilience.md
index 56ee519..c3e090d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-245-coresilience.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-245-coresilience.md
@@ -1,7 +1,7 @@
---
id: 5900f4621000cf542c50ff74
title: 'Problem 245: Coresilience'
-challengeType: 5
+challengeType: 1
forumTopicId: 301892
dashedName: problem-245-coresilience
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-246-tangents-to-an-ellipse.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-246-tangents-to-an-ellipse.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-246-tangents-to-an-ellipse.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-246-tangents-to-an-ellipse.md
index ab40939..14d2bf8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-246-tangents-to-an-ellipse.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-246-tangents-to-an-ellipse.md
@@ -1,7 +1,7 @@
---
id: 5900f4621000cf542c50ff75
title: 'Problem 246: Tangents to an ellipse'
-challengeType: 5
+challengeType: 1
forumTopicId: 301893
dashedName: problem-246-tangents-to-an-ellipse
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-247-squares-under-a-hyperbola.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-247-squares-under-a-hyperbola.md
similarity index 94%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-247-squares-under-a-hyperbola.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-247-squares-under-a-hyperbola.md
index dc93c77..14d7280 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-247-squares-under-a-hyperbola.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-247-squares-under-a-hyperbola.md
@@ -1,7 +1,7 @@
---
id: 5900f4641000cf542c50ff76
title: 'Problem 247: Squares under a hyperbola'
-challengeType: 5
+challengeType: 1
forumTopicId: 301894
dashedName: problem-247-squares-under-a-hyperbola
---
@@ -18,7 +18,7 @@ Let the index of $S_n$ be the pair (left, below) indicating the number of square
-The diagram shows some such squares labelled by number.
+The diagram shows some such squares labeled by number.
$S_2$ has one square to its left and none below, so the index of $S_2$ is (1, 0).
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-248-numbers-for-which-eulers-totient-function-equals-13.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-248-numbers-for-which-eulers-totient-function-equals-13.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-248-numbers-for-which-eulers-totient-function-equals-13.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-248-numbers-for-which-eulers-totient-function-equals-13.md
index a5cad89..0df6dd5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-248-numbers-for-which-eulers-totient-function-equals-13.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-248-numbers-for-which-eulers-totient-function-equals-13.md
@@ -1,7 +1,7 @@
---
id: 5900f4651000cf542c50ff77
title: 'Problem 248: Numbers for which Euler’s totient function equals 13!'
-challengeType: 5
+challengeType: 1
forumTopicId: 301895
dashedName: problem-248-numbers-for-which-eulers-totient-function-equals-13
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-249-prime-subset-sums.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-249-prime-subset-sums.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-249-prime-subset-sums.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-249-prime-subset-sums.md
index 046cf38..09232c7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-249-prime-subset-sums.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-249-prime-subset-sums.md
@@ -1,7 +1,7 @@
---
id: 5900f4671000cf542c50ff79
title: 'Problem 249: Prime Subset Sums'
-challengeType: 5
+challengeType: 1
forumTopicId: 301896
dashedName: problem-249-prime-subset-sums
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-250-250250.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-250-250250.md
similarity index 67%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-250-250250.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-250-250250.md
index 467e360..c526154 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-250-250250.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-250-250250.md
@@ -1,14 +1,14 @@
---
id: 5900f4661000cf542c50ff78
title: 'Problem 250: 250250'
-challengeType: 5
+challengeType: 1
forumTopicId: 301898
dashedName: problem-250-250250
---
# --description--
-Find the number of non-empty subsets of $\\{11, 22, 33, \ldots, {250250}^{250250}\\}$, the sum of whose elements is divisible by 250. Enter the rightmost 16 digits as your answer.
+Find the number of non-empty subsets of $\\{{1}^{1}, {2}^{2}, {3}^{3}, \ldots, {250250}^{250250}\\}$, the sum of whose elements is divisible by 250. Enter the rightmost 16 digits as your answer.
# --hints--
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-251-cardano-triplets.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-251-cardano-triplets.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-251-cardano-triplets.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-251-cardano-triplets.md
index 4156faa..8f40135 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-251-cardano-triplets.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-251-cardano-triplets.md
@@ -1,7 +1,7 @@
---
id: 5900f4671000cf542c50ff7a
title: 'Problem 251: Cardano Triplets'
-challengeType: 5
+challengeType: 1
forumTopicId: 301899
dashedName: problem-251-cardano-triplets
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-252-convex-holes.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-252-convex-holes.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-252-convex-holes.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-252-convex-holes.md
index dbf77bb..e275539 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-252-convex-holes.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-252-convex-holes.md
@@ -1,7 +1,7 @@
---
id: 5900f4691000cf542c50ff7b
title: 'Problem 252: Convex Holes'
-challengeType: 5
+challengeType: 1
forumTopicId: 301900
dashedName: problem-252-convex-holes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-253-tidying-up.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-253-tidying-up.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-253-tidying-up.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-253-tidying-up.md
index f051932..1afe16e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-253-tidying-up.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-253-tidying-up.md
@@ -1,7 +1,7 @@
---
id: 5900f4691000cf542c50ff7c
title: 'Problem 253: Tidying up'
-challengeType: 5
+challengeType: 1
forumTopicId: 301901
dashedName: problem-253-tidying-up
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-254-sums-of-digit-factorials.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-254-sums-of-digit-factorials.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-254-sums-of-digit-factorials.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-254-sums-of-digit-factorials.md
index 34891e4..3d91777 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-254-sums-of-digit-factorials.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-254-sums-of-digit-factorials.md
@@ -1,7 +1,7 @@
---
id: 5900f46b1000cf542c50ff7d
title: 'Problem 254: Sums of Digit Factorials'
-challengeType: 5
+challengeType: 1
forumTopicId: 301902
dashedName: problem-254-sums-of-digit-factorials
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-255-rounded-square-roots.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-255-rounded-square-roots.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-255-rounded-square-roots.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-255-rounded-square-roots.md
index 2237416..abfbcfe 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-255-rounded-square-roots.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-255-rounded-square-roots.md
@@ -1,7 +1,7 @@
---
id: 5900f46d1000cf542c50ff7f
title: 'Problem 255: Rounded Square Roots'
-challengeType: 5
+challengeType: 1
forumTopicId: 301903
dashedName: problem-255-rounded-square-roots
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-256-tatami-free-rooms.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-256-tatami-free-rooms.md
similarity index 89%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-256-tatami-free-rooms.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-256-tatami-free-rooms.md
index 54a2213..2788c2e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-256-tatami-free-rooms.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-256-tatami-free-rooms.md
@@ -1,7 +1,7 @@
---
id: 5900f46c1000cf542c50ff7e
title: 'Problem 256: Tatami-Free Rooms'
-challengeType: 5
+challengeType: 1
forumTopicId: 301904
dashedName: problem-256-tatami-free-rooms
---
@@ -16,7 +16,7 @@ For this problem, we consider only rectangular rooms with integer dimensions $a$
There is one rule to follow when laying out tatami: there must be no points where corners of four different mats meet. For example, consider the two arrangements below for a 4×4 room:
-
+
The arrangement on the left is acceptable, whereas the one on the right is not: a red "X" in the middle, marks the point where four tatami meet.
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-257-angular-bisectors.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-257-angular-bisectors.md
similarity index 95%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-257-angular-bisectors.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-257-angular-bisectors.md
index 7e5d939..3b4fe6d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-257-angular-bisectors.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-257-angular-bisectors.md
@@ -1,14 +1,14 @@
---
id: 5900f46e1000cf542c50ff80
title: 'Problem 257: Angular Bisectors'
-challengeType: 5
+challengeType: 1
forumTopicId: 301905
dashedName: problem-257-angular-bisectors
---
# --description--
-Given is an integer sided triangle $ABC$ with sides $a ≤ b ≤ c$. ($AB = c$, $BC = a$ and $AC = b$).
+Given is an integer sided triangle $ABC$ with sides $a ≤ b ≤ c$ ($AB = c$, $BC = a$ and $AC = b$).
The angular bisectors of the triangle intersect the sides at points $E$, $F$ and $G$ (see picture below).
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-258-a-lagged-fibonacci-sequence.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-258-a-lagged-fibonacci-sequence.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-258-a-lagged-fibonacci-sequence.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-258-a-lagged-fibonacci-sequence.md
index a8c17db..d21eb67 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-258-a-lagged-fibonacci-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-258-a-lagged-fibonacci-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f46e1000cf542c50ff81
title: 'Problem 258: A lagged Fibonacci sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 301906
dashedName: problem-258-a-lagged-fibonacci-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-259-reachable-numbers.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-259-reachable-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-259-reachable-numbers.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-259-reachable-numbers.md
index fb73482..a8fa3ce 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-259-reachable-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-259-reachable-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f4701000cf542c50ff82
title: 'Problem 259: Reachable Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301907
dashedName: problem-259-reachable-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-260-stone-game.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-260-stone-game.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-260-stone-game.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-260-stone-game.md
index 717d3bf..d0724fd 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-260-stone-game.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-260-stone-game.md
@@ -1,7 +1,7 @@
---
id: 5900f4701000cf542c50ff83
title: 'Problem 260: Stone Game'
-challengeType: 5
+challengeType: 1
forumTopicId: 301909
dashedName: problem-260-stone-game
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-261-pivotal-square-sums.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-261-pivotal-square-sums.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-261-pivotal-square-sums.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-261-pivotal-square-sums.md
index b1e186d..21b58c4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-261-pivotal-square-sums.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-261-pivotal-square-sums.md
@@ -1,7 +1,7 @@
---
id: 5900f4711000cf542c50ff84
title: 'Problem 261: Pivotal Square Sums'
-challengeType: 5
+challengeType: 1
forumTopicId: 301910
dashedName: problem-261-pivotal-square-sums
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-262-mountain-range.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-262-mountain-range.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-262-mountain-range.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-262-mountain-range.md
index 3100647..d340e83 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-262-mountain-range.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-262-mountain-range.md
@@ -1,7 +1,7 @@
---
id: 5900f4731000cf542c50ff85
title: 'Problem 262: Mountain Range'
-challengeType: 5
+challengeType: 1
forumTopicId: 301911
dashedName: problem-262-mountain-range
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-263-an-engineers-dream-come-true.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-263-an-engineers-dream-come-true.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-263-an-engineers-dream-come-true.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-263-an-engineers-dream-come-true.md
index a5677f3..8fec64c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-263-an-engineers-dream-come-true.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-263-an-engineers-dream-come-true.md
@@ -1,7 +1,7 @@
---
id: 5900f4741000cf542c50ff86
title: 'Problem 263: An engineers'' dream come true'
-challengeType: 5
+challengeType: 1
forumTopicId: 301912
dashedName: problem-263-an-engineers-dream-come-true
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-264-triangle-centres.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-264-triangle-centres.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-264-triangle-centres.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-264-triangle-centres.md
index 1414627..dc22c0c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-264-triangle-centres.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-264-triangle-centres.md
@@ -1,7 +1,7 @@
---
id: 5900f4751000cf542c50ff87
title: 'Problem 264: Triangle Centres'
-challengeType: 5
+challengeType: 1
forumTopicId: 301913
dashedName: problem-264-triangle-centres
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-265-binary-circles.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-265-binary-circles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-265-binary-circles.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-265-binary-circles.md
index d738f9b..44edab8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-265-binary-circles.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-265-binary-circles.md
@@ -1,7 +1,7 @@
---
id: 5900f4761000cf542c50ff88
title: 'Problem 265: Binary Circles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301914
dashedName: problem-265-binary-circles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-266-pseudo-square-root.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-266-pseudo-square-root.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-266-pseudo-square-root.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-266-pseudo-square-root.md
index 8b18897..2b22e96 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-266-pseudo-square-root.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-266-pseudo-square-root.md
@@ -1,7 +1,7 @@
---
id: 5900f4771000cf542c50ff89
title: 'Problem 266: Pseudo Square Root'
-challengeType: 5
+challengeType: 1
forumTopicId: 301915
dashedName: problem-266-pseudo-square-root
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-267-billionaire.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-267-billionaire.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-267-billionaire.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-267-billionaire.md
index 2330fc8..8dbe1d8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-267-billionaire.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-267-billionaire.md
@@ -1,7 +1,7 @@
---
id: 5900f4771000cf542c50ff8a
title: 'Problem 267: Billionaire'
-challengeType: 5
+challengeType: 1
forumTopicId: 301916
dashedName: problem-267-billionaire
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-268-counting-numbers-with-at-least-four-distinct-prime-factors-less-than-100.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-268-counting-numbers-with-at-least-four-distinct-prime-factors-less-than-100.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-268-counting-numbers-with-at-least-four-distinct-prime-factors-less-than-100.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-268-counting-numbers-with-at-least-four-distinct-prime-factors-less-than-100.md
index 21f4fa5..553550d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-268-counting-numbers-with-at-least-four-distinct-prime-factors-less-than-100.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-268-counting-numbers-with-at-least-four-distinct-prime-factors-less-than-100.md
@@ -3,7 +3,7 @@ id: 5900f4791000cf542c50ff8b
title: >-
Problem 268: Counting numbers with at least four distinct prime factors less
than 100
-challengeType: 5
+challengeType: 1
forumTopicId: 301917
dashedName: >-
problem-268-counting-numbers-with-at-least-four-distinct-prime-factors-less-than-100
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-269-polynomials-with-at-least-one-integer-root.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-269-polynomials-with-at-least-one-integer-root.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-269-polynomials-with-at-least-one-integer-root.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-269-polynomials-with-at-least-one-integer-root.md
index da8ed3e..3b66b2a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-269-polynomials-with-at-least-one-integer-root.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-269-polynomials-with-at-least-one-integer-root.md
@@ -1,7 +1,7 @@
---
id: 5900f4791000cf542c50ff8c
title: 'Problem 269: Polynomials with at least one integer root'
-challengeType: 5
+challengeType: 1
forumTopicId: 301918
dashedName: problem-269-polynomials-with-at-least-one-integer-root
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-270-cutting-squares.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-270-cutting-squares.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-270-cutting-squares.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-270-cutting-squares.md
index e98082a..0f495db 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-270-cutting-squares.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-270-cutting-squares.md
@@ -1,7 +1,7 @@
---
id: 5900f47c1000cf542c50ff8e
title: 'Problem 270: Cutting Squares'
-challengeType: 5
+challengeType: 1
forumTopicId: 301920
dashedName: problem-270-cutting-squares
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-271-modular-cubes-part-1.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-271-modular-cubes-part-1.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-271-modular-cubes-part-1.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-271-modular-cubes-part-1.md
index 1566254..f1dbf4b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-271-modular-cubes-part-1.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-271-modular-cubes-part-1.md
@@ -1,7 +1,7 @@
---
id: 5900f47b1000cf542c50ff8d
title: 'Problem 271: Modular Cubes, part 1'
-challengeType: 5
+challengeType: 1
forumTopicId: 301921
dashedName: problem-271-modular-cubes-part-1
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-272-modular-cubes-part-2.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-272-modular-cubes-part-2.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-272-modular-cubes-part-2.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-272-modular-cubes-part-2.md
index 1366467..d764ea6 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-272-modular-cubes-part-2.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-272-modular-cubes-part-2.md
@@ -1,7 +1,7 @@
---
id: 5900f47d1000cf542c50ff8f
title: 'Problem 272: Modular Cubes, part 2'
-challengeType: 5
+challengeType: 1
forumTopicId: 301922
dashedName: problem-272-modular-cubes-part-2
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-273-sum-of-squares.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-273-sum-of-squares.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-273-sum-of-squares.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-273-sum-of-squares.md
index f53c8f3..d5ffc27 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-273-sum-of-squares.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-273-sum-of-squares.md
@@ -1,7 +1,7 @@
---
id: 5900f47e1000cf542c50ff90
title: 'Problem 273: Sum of Squares'
-challengeType: 5
+challengeType: 1
forumTopicId: 301923
dashedName: problem-273-sum-of-squares
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-274-divisibility-multipliers.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-274-divisibility-multipliers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-274-divisibility-multipliers.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-274-divisibility-multipliers.md
index 8534028..bf56b69 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-274-divisibility-multipliers.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-274-divisibility-multipliers.md
@@ -1,7 +1,7 @@
---
id: 5900f47f1000cf542c50ff91
title: 'Problem 274: Divisibility Multipliers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301924
dashedName: problem-274-divisibility-multipliers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-275-balanced-sculptures.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-275-balanced-sculptures.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-275-balanced-sculptures.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-275-balanced-sculptures.md
index 52508d8..0ea3a8e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-275-balanced-sculptures.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-275-balanced-sculptures.md
@@ -1,7 +1,7 @@
---
id: 5900f4801000cf542c50ff92
title: 'Problem 275: Balanced Sculptures'
-challengeType: 5
+challengeType: 1
forumTopicId: 301925
dashedName: problem-275-balanced-sculptures
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-276-primitive-triangles.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-276-primitive-triangles.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-276-primitive-triangles.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-276-primitive-triangles.md
index b5e1877..26ce008 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-276-primitive-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-276-primitive-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f4801000cf542c50ff93
title: 'Problem 276: Primitive Triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301926
dashedName: problem-276-primitive-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-277-a-modified-collatz-sequence.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-277-a-modified-collatz-sequence.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-277-a-modified-collatz-sequence.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-277-a-modified-collatz-sequence.md
index 1082154..c80635a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-277-a-modified-collatz-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-277-a-modified-collatz-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f4811000cf542c50ff94
title: 'Problem 277: A Modified Collatz sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 301927
dashedName: problem-277-a-modified-collatz-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-278-linear-combinations-of-semiprimes.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-278-linear-combinations-of-semiprimes.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-278-linear-combinations-of-semiprimes.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-278-linear-combinations-of-semiprimes.md
index 19e3042..215c51c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-278-linear-combinations-of-semiprimes.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-278-linear-combinations-of-semiprimes.md
@@ -1,7 +1,7 @@
---
id: 5900f4831000cf542c50ff95
title: 'Problem 278: Linear Combinations of Semiprimes'
-challengeType: 5
+challengeType: 1
forumTopicId: 301928
dashedName: problem-278-linear-combinations-of-semiprimes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-279-triangles-with-integral-sides-and-an-integral-angle.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-279-triangles-with-integral-sides-and-an-integral-angle.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-279-triangles-with-integral-sides-and-an-integral-angle.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-279-triangles-with-integral-sides-and-an-integral-angle.md
index c83c673..9d50a5e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-279-triangles-with-integral-sides-and-an-integral-angle.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-279-triangles-with-integral-sides-and-an-integral-angle.md
@@ -1,7 +1,7 @@
---
id: 5900f4841000cf542c50ff96
title: 'Problem 279: Triangles with integral sides and an integral angle'
-challengeType: 5
+challengeType: 1
forumTopicId: 301929
dashedName: problem-279-triangles-with-integral-sides-and-an-integral-angle
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-280-ant-and-seeds.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-280-ant-and-seeds.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-280-ant-and-seeds.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-280-ant-and-seeds.md
index 7aec32e..5057b8b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-280-ant-and-seeds.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-280-ant-and-seeds.md
@@ -1,7 +1,7 @@
---
id: 5900f4841000cf542c50ff97
title: 'Problem 280: Ant and seeds'
-challengeType: 5
+challengeType: 1
forumTopicId: 301931
dashedName: problem-280-ant-and-seeds
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-281-pizza-toppings.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-281-pizza-toppings.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-281-pizza-toppings.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-281-pizza-toppings.md
index 46837ff..c99d803 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-281-pizza-toppings.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-281-pizza-toppings.md
@@ -1,7 +1,7 @@
---
id: 5900f4861000cf542c50ff98
title: 'Problem 281: Pizza Toppings'
-challengeType: 5
+challengeType: 1
forumTopicId: 301932
dashedName: problem-281-pizza-toppings
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-282-the-ackermann-function.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-282-the-ackermann-function.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-282-the-ackermann-function.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-282-the-ackermann-function.md
index aaaf1c4..1d1cb04 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-282-the-ackermann-function.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-282-the-ackermann-function.md
@@ -1,7 +1,7 @@
---
id: 5900f4861000cf542c50ff99
title: 'Problem 282: The Ackermann function'
-challengeType: 5
+challengeType: 1
forumTopicId: 301933
dashedName: problem-282-the-ackermann-function
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral.md
index d88415d..e32d0d7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral.md
@@ -2,7 +2,7 @@
id: 5900f4881000cf542c50ff9a
title: >-
Problem 283: Integer sided triangles for which the area / perimeter ratio is integral
-challengeType: 5
+challengeType: 1
forumTopicId: 301934
dashedName: >-
problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-284-steady-squares.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-284-steady-squares.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-284-steady-squares.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-284-steady-squares.md
index 417ddd2..d6c86b0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-284-steady-squares.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-284-steady-squares.md
@@ -1,7 +1,7 @@
---
id: 5900f4891000cf542c50ff9b
title: 'Problem 284: Steady Squares'
-challengeType: 5
+challengeType: 1
forumTopicId: 301935
dashedName: problem-284-steady-squares
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-285-pythagorean-odds.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-285-pythagorean-odds.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-285-pythagorean-odds.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-285-pythagorean-odds.md
index ad75e38..5c6e491 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-285-pythagorean-odds.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-285-pythagorean-odds.md
@@ -1,7 +1,7 @@
---
id: 5900f48a1000cf542c50ff9c
title: 'Problem 285: Pythagorean odds'
-challengeType: 5
+challengeType: 1
forumTopicId: 301936
dashedName: problem-285-pythagorean-odds
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-286-scoring-probabilities.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-286-scoring-probabilities.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-286-scoring-probabilities.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-286-scoring-probabilities.md
index 1e5a444..26e3e19 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-286-scoring-probabilities.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-286-scoring-probabilities.md
@@ -1,7 +1,7 @@
---
id: 5900f48a1000cf542c50ff9d
title: 'Problem 286: Scoring probabilities'
-challengeType: 5
+challengeType: 1
forumTopicId: 301937
dashedName: problem-286-scoring-probabilities
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-287-quadtree-encoding-a-simple-compression-algorithm.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-287-quadtree-encoding-a-simple-compression-algorithm.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-287-quadtree-encoding-a-simple-compression-algorithm.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-287-quadtree-encoding-a-simple-compression-algorithm.md
index c6b5bee..0016dd7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-287-quadtree-encoding-a-simple-compression-algorithm.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-287-quadtree-encoding-a-simple-compression-algorithm.md
@@ -1,7 +1,7 @@
---
id: 5900f48b1000cf542c50ff9e
title: 'Problem 287: Quadtree encoding (a simple compression algorithm)'
-challengeType: 5
+challengeType: 1
forumTopicId: 301938
dashedName: problem-287-quadtree-encoding-a-simple-compression-algorithm
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-288-an-enormous-factorial.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-288-an-enormous-factorial.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-288-an-enormous-factorial.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-288-an-enormous-factorial.md
index 6a4b1ea..fd30ed5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-288-an-enormous-factorial.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-288-an-enormous-factorial.md
@@ -1,7 +1,7 @@
---
id: 5900f48d1000cf542c50ff9f
title: 'Problem 288: An enormous factorial'
-challengeType: 5
+challengeType: 1
forumTopicId: 301939
dashedName: problem-288-an-enormous-factorial
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-289-eulerian-cycles.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-289-eulerian-cycles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-289-eulerian-cycles.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-289-eulerian-cycles.md
index d313645..f45f837 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-289-eulerian-cycles.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-289-eulerian-cycles.md
@@ -1,7 +1,7 @@
---
id: 5900f48d1000cf542c50ffa0
title: 'Problem 289: Eulerian Cycles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301940
dashedName: problem-289-eulerian-cycles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-290-digital-signature.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-290-digital-signature.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-290-digital-signature.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-290-digital-signature.md
index 9439010..a6b3636 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-290-digital-signature.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-290-digital-signature.md
@@ -1,7 +1,7 @@
---
id: 5900f48f1000cf542c50ffa1
title: 'Problem 290: Digital Signature'
-challengeType: 5
+challengeType: 1
forumTopicId: 301942
dashedName: problem-290-digital-signature
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-291-panaitopol-primes.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-291-panaitopol-primes.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-291-panaitopol-primes.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-291-panaitopol-primes.md
index 2922bdc..bb33727 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-291-panaitopol-primes.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-291-panaitopol-primes.md
@@ -1,7 +1,7 @@
---
id: 5900f48f1000cf542c50ffa2
title: 'Problem 291: Panaitopol Primes'
-challengeType: 5
+challengeType: 1
forumTopicId: 301943
dashedName: problem-291-panaitopol-primes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-292-pythagorean-polygons.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-292-pythagorean-polygons.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-292-pythagorean-polygons.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-292-pythagorean-polygons.md
index 7f4ae44..8e0dd89 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-292-pythagorean-polygons.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-292-pythagorean-polygons.md
@@ -1,7 +1,7 @@
---
id: 5900f4911000cf542c50ffa3
title: 'Problem 292: Pythagorean Polygons'
-challengeType: 5
+challengeType: 1
forumTopicId: 301944
dashedName: problem-292-pythagorean-polygons
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-293-pseudo-fortunate-numbers.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-293-pseudo-fortunate-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-293-pseudo-fortunate-numbers.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-293-pseudo-fortunate-numbers.md
index 2da024c..0c80768 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-293-pseudo-fortunate-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-293-pseudo-fortunate-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f4931000cf542c50ffa4
title: 'Problem 293: Pseudo-Fortunate Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301945
dashedName: problem-293-pseudo-fortunate-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-294-sum-of-digits---experience-23.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-294-sum-of-digits---experience-23.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-294-sum-of-digits---experience-23.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-294-sum-of-digits---experience-23.md
index 20216ac..b32ebc8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-294-sum-of-digits---experience-23.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-294-sum-of-digits---experience-23.md
@@ -1,7 +1,7 @@
---
id: 5900f4931000cf542c50ffa5
title: 'Problem 294: Sum of digits - experience #23'
-challengeType: 5
+challengeType: 1
forumTopicId: 301946
dashedName: problem-294-sum-of-digits---experience-23
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-295-lenticular-holes.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-295-lenticular-holes.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-295-lenticular-holes.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-295-lenticular-holes.md
index c6cb54c..54ef688 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-295-lenticular-holes.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-295-lenticular-holes.md
@@ -1,7 +1,7 @@
---
id: 5900f4931000cf542c50ffa6
title: 'Problem 295: Lenticular holes'
-challengeType: 5
+challengeType: 1
forumTopicId: 301947
dashedName: problem-295-lenticular-holes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-296-angular-bisector-and-tangent.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-296-angular-bisector-and-tangent.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-296-angular-bisector-and-tangent.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-296-angular-bisector-and-tangent.md
index 9001b02..806828a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-296-angular-bisector-and-tangent.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-296-angular-bisector-and-tangent.md
@@ -1,7 +1,7 @@
---
id: 5900f4941000cf542c50ffa7
title: 'Problem 296: Angular Bisector and Tangent'
-challengeType: 5
+challengeType: 1
forumTopicId: 301948
dashedName: problem-296-angular-bisector-and-tangent
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-297-zeckendorf-representation.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-297-zeckendorf-representation.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-297-zeckendorf-representation.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-297-zeckendorf-representation.md
index 8178fce..55f3adb 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-297-zeckendorf-representation.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-297-zeckendorf-representation.md
@@ -1,7 +1,7 @@
---
id: 5900f4951000cf542c50ffa8
title: 'Problem 297: Zeckendorf Representation'
-challengeType: 5
+challengeType: 1
forumTopicId: 301949
dashedName: problem-297-zeckendorf-representation
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-298-selective-amnesia.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-298-selective-amnesia.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-298-selective-amnesia.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-298-selective-amnesia.md
index 66e9501..cc787a7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-298-selective-amnesia.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-298-selective-amnesia.md
@@ -1,7 +1,7 @@
---
id: 5900f4971000cf542c50ffa9
title: 'Problem 298: Selective Amnesia'
-challengeType: 5
+challengeType: 1
forumTopicId: 301950
dashedName: problem-298-selective-amnesia
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-299-three-similar-triangles.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-299-three-similar-triangles.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-299-three-similar-triangles.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-299-three-similar-triangles.md
index 20a21fc..f12f154 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-299-three-similar-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-299-three-similar-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f4971000cf542c50ffaa
title: 'Problem 299: Three similar triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301951
dashedName: problem-299-three-similar-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-300-protein-folding.md b/curriculum/project-euler/project-euler-problems-201-to-300/problem-300-protein-folding.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-300-protein-folding.md
rename to curriculum/project-euler/project-euler-problems-201-to-300/problem-300-protein-folding.md
index 0d58795..235032e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-300-protein-folding.md
+++ b/curriculum/project-euler/project-euler-problems-201-to-300/problem-300-protein-folding.md
@@ -1,7 +1,7 @@
---
id: 5900f49a1000cf542c50ffac
title: 'Problem 300: Protein folding'
-challengeType: 5
+challengeType: 1
forumTopicId: 301954
dashedName: problem-300-protein-folding
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-301-nim.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-301-nim.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-301-nim.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-301-nim.md
index 064b907..b66b1b9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-301-nim.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-301-nim.md
@@ -1,7 +1,7 @@
---
id: 5900f4991000cf542c50ffab
title: 'Problem 301: Nim'
-challengeType: 5
+challengeType: 1
forumTopicId: 301955
dashedName: problem-301-nim
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-302-strong-achilles-numbers.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-302-strong-achilles-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-302-strong-achilles-numbers.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-302-strong-achilles-numbers.md
index a6a7c46..4c5301c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-302-strong-achilles-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-302-strong-achilles-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f49b1000cf542c50ffad
title: 'Problem 302: Strong Achilles Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301956
dashedName: problem-302-strong-achilles-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-303-multiples-with-small-digits.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-303-multiples-with-small-digits.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-303-multiples-with-small-digits.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-303-multiples-with-small-digits.md
index 75fca87..108d8bd 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-303-multiples-with-small-digits.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-303-multiples-with-small-digits.md
@@ -1,7 +1,7 @@
---
id: 5900f49b1000cf542c50ffae
title: 'Problem 303: Multiples with small digits'
-challengeType: 5
+challengeType: 1
forumTopicId: 301957
dashedName: problem-303-multiples-with-small-digits
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-304-primonacci.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-304-primonacci.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-304-primonacci.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-304-primonacci.md
index add0b83..a493994 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-304-primonacci.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-304-primonacci.md
@@ -1,7 +1,7 @@
---
id: 5900f49d1000cf542c50ffaf
title: 'Problem 304: Primonacci'
-challengeType: 5
+challengeType: 1
forumTopicId: 301958
dashedName: problem-304-primonacci
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-305-reflexive-position.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-305-reflexive-position.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-305-reflexive-position.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-305-reflexive-position.md
index eff1a14..566e7b7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-305-reflexive-position.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-305-reflexive-position.md
@@ -1,7 +1,7 @@
---
id: 5900f49d1000cf542c50ffb0
title: 'Problem 305: Reflexive Position'
-challengeType: 5
+challengeType: 1
forumTopicId: 301959
dashedName: problem-305-reflexive-position
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-306-paper-strip-game.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-306-paper-strip-game.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-306-paper-strip-game.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-306-paper-strip-game.md
index 986c592..613af2c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-306-paper-strip-game.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-306-paper-strip-game.md
@@ -1,7 +1,7 @@
---
id: 5900f49f1000cf542c50ffb1
title: 'Problem 306: Paper-strip Game'
-challengeType: 5
+challengeType: 1
forumTopicId: 301960
dashedName: problem-306-paper-strip-game
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-307-chip-defects.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-307-chip-defects.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-307-chip-defects.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-307-chip-defects.md
index b23c879..3f0fd2b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-307-chip-defects.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-307-chip-defects.md
@@ -1,7 +1,7 @@
---
id: 5900f4a01000cf542c50ffb2
title: 'Problem 307: Chip Defects'
-challengeType: 5
+challengeType: 1
forumTopicId: 301961
dashedName: problem-307-chip-defects
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-308-an-amazing-prime-generating-automaton.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-308-an-amazing-prime-generating-automaton.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-308-an-amazing-prime-generating-automaton.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-308-an-amazing-prime-generating-automaton.md
index 066f71c..22f3cab 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-308-an-amazing-prime-generating-automaton.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-308-an-amazing-prime-generating-automaton.md
@@ -1,7 +1,7 @@
---
id: 5900f4a11000cf542c50ffb3
title: 'Problem 308: An amazing Prime-generating Automaton'
-challengeType: 5
+challengeType: 1
forumTopicId: 301962
dashedName: problem-308-an-amazing-prime-generating-automaton
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-309-integer-ladders.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-309-integer-ladders.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-309-integer-ladders.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-309-integer-ladders.md
index a20e422..d7be6f1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-309-integer-ladders.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-309-integer-ladders.md
@@ -1,7 +1,7 @@
---
id: 5900f4a11000cf542c50ffb4
title: 'Problem 309: Integer Ladders'
-challengeType: 5
+challengeType: 1
forumTopicId: 301963
dashedName: problem-309-integer-ladders
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-310-nim-square.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-310-nim-square.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-310-nim-square.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-310-nim-square.md
index db915fa..4eacb35 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-310-nim-square.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-310-nim-square.md
@@ -1,7 +1,7 @@
---
id: 5900f4a21000cf542c50ffb5
title: 'Problem 310: Nim Square'
-challengeType: 5
+challengeType: 1
forumTopicId: 301966
dashedName: problem-310-nim-square
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-311-biclinic-integral-quadrilaterals.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-311-biclinic-integral-quadrilaterals.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-311-biclinic-integral-quadrilaterals.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-311-biclinic-integral-quadrilaterals.md
index dc235a5..8337692 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-311-biclinic-integral-quadrilaterals.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-311-biclinic-integral-quadrilaterals.md
@@ -1,7 +1,7 @@
---
id: 5900f4a31000cf542c50ffb6
title: 'Problem 311: Biclinic Integral Quadrilaterals'
-challengeType: 5
+challengeType: 1
forumTopicId: 301967
dashedName: problem-311-biclinic-integral-quadrilaterals
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-312-cyclic-paths-on-sierpiski-graphs.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-312-cyclic-paths-on-sierpiski-graphs.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-312-cyclic-paths-on-sierpiski-graphs.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-312-cyclic-paths-on-sierpiski-graphs.md
index 99b4af5..d90dc2a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-312-cyclic-paths-on-sierpiski-graphs.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-312-cyclic-paths-on-sierpiski-graphs.md
@@ -1,7 +1,7 @@
---
id: 5900f4a51000cf542c50ffb7
title: 'Problem 312: Cyclic paths on Sierpiński graphs'
-challengeType: 5
+challengeType: 1
forumTopicId: 301968
dashedName: problem-312-cyclic-paths-on-sierpiski-graphs
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-313-sliding-game.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-313-sliding-game.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-313-sliding-game.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-313-sliding-game.md
index b56e4ac..2b62f88 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-313-sliding-game.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-313-sliding-game.md
@@ -1,7 +1,7 @@
---
id: 5900f4a61000cf542c50ffb8
title: 'Problem 313: Sliding game'
-challengeType: 5
+challengeType: 1
forumTopicId: 301969
dashedName: problem-313-sliding-game
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-314-the-mouse-on-the-moon.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-314-the-mouse-on-the-moon.md
similarity index 90%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-314-the-mouse-on-the-moon.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-314-the-mouse-on-the-moon.md
index 5a13d84..8d6523f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-314-the-mouse-on-the-moon.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-314-the-mouse-on-the-moon.md
@@ -1,7 +1,7 @@
---
id: 5900f4a71000cf542c50ffb9
title: 'Problem 314: The Mouse on the Moon'
-challengeType: 5
+challengeType: 1
forumTopicId: 301970
dashedName: problem-314-the-mouse-on-the-moon
---
@@ -18,7 +18,7 @@ Although not allowed, but to get an idea if this is anything better: if you plac
However, if you cut off from the square four triangles with sides 75 m, 75 m and $75\sqrt{2}$ m the total area becomes 238750 $\text{m}^2$ and the perimeter becomes $1400 + 300\sqrt{2}$ m. So this gives an $\frac{\text{enclosed-area}}{\text{wall-length}}$ ratio of 130.87, which is significantly better.
-
+
Find the maximum $\frac{\text{enclosed-area}}{\text{wall-length}}$ ratio. Give your answer rounded to 8 places behind the decimal point in the form abc.defghijk.
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-315-digital-root-clocks.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-315-digital-root-clocks.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-315-digital-root-clocks.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-315-digital-root-clocks.md
index fe73d04..d69506d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-315-digital-root-clocks.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-315-digital-root-clocks.md
@@ -1,7 +1,7 @@
---
id: 5900f4a71000cf542c50ffba
title: 'Problem 315: Digital root clocks'
-challengeType: 5
+challengeType: 1
forumTopicId: 301971
dashedName: problem-315-digital-root-clocks
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-316-numbers-in-decimal-expansions.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-316-numbers-in-decimal-expansions.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-316-numbers-in-decimal-expansions.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-316-numbers-in-decimal-expansions.md
index 391ed26..991df99 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-316-numbers-in-decimal-expansions.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-316-numbers-in-decimal-expansions.md
@@ -1,7 +1,7 @@
---
id: 5900f4a81000cf542c50ffbb
title: 'Problem 316: Numbers in decimal expansions'
-challengeType: 5
+challengeType: 1
forumTopicId: 301972
dashedName: problem-316-numbers-in-decimal-expansions
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-317-firecracker.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-317-firecracker.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-317-firecracker.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-317-firecracker.md
index 0a2bd30..f9715cf 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-317-firecracker.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-317-firecracker.md
@@ -1,7 +1,7 @@
---
id: 5900f4aa1000cf542c50ffbc
title: 'Problem 317: Firecracker'
-challengeType: 5
+challengeType: 1
forumTopicId: 301973
dashedName: problem-317-firecracker
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-318-2011-nines.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-318-2011-nines.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-318-2011-nines.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-318-2011-nines.md
index b1e3e8a..0b00fa2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-318-2011-nines.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-318-2011-nines.md
@@ -1,7 +1,7 @@
---
id: 5900f4ab1000cf542c50ffbd
title: 'Problem 318: 2011 nines'
-challengeType: 5
+challengeType: 1
forumTopicId: 301974
dashedName: problem-318-2011-nines
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-319-bounded-sequences.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-319-bounded-sequences.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-319-bounded-sequences.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-319-bounded-sequences.md
index c8c65d5..36341fa 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-319-bounded-sequences.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-319-bounded-sequences.md
@@ -1,7 +1,7 @@
---
id: 5900f4ab1000cf542c50ffbe
title: 'Problem 319: Bounded Sequences'
-challengeType: 5
+challengeType: 1
forumTopicId: 301975
dashedName: problem-319-bounded-sequences
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-320-factorials-divisible-by-a-huge-integer.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-320-factorials-divisible-by-a-huge-integer.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-320-factorials-divisible-by-a-huge-integer.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-320-factorials-divisible-by-a-huge-integer.md
index 7695a3c..b0f0cc5 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-320-factorials-divisible-by-a-huge-integer.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-320-factorials-divisible-by-a-huge-integer.md
@@ -1,7 +1,7 @@
---
id: 5900f4ae1000cf542c50ffbf
title: 'Problem 320: Factorials divisible by a huge integer'
-challengeType: 5
+challengeType: 1
forumTopicId: 301977
dashedName: problem-320-factorials-divisible-by-a-huge-integer
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-321-swapping-counters.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-321-swapping-counters.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-321-swapping-counters.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-321-swapping-counters.md
index d463100..584763b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-321-swapping-counters.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-321-swapping-counters.md
@@ -1,7 +1,7 @@
---
id: 5900f4ae1000cf542c50ffc0
title: 'Problem 321: Swapping Counters'
-challengeType: 5
+challengeType: 1
forumTopicId: 301978
dashedName: problem-321-swapping-counters
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-322-binomial-coefficients-divisible-by-10.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-322-binomial-coefficients-divisible-by-10.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-322-binomial-coefficients-divisible-by-10.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-322-binomial-coefficients-divisible-by-10.md
index d532a4a..2c1725a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-322-binomial-coefficients-divisible-by-10.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-322-binomial-coefficients-divisible-by-10.md
@@ -1,7 +1,7 @@
---
id: 5900f4af1000cf542c50ffc1
title: 'Problem 322: Binomial coefficients divisible by 10'
-challengeType: 5
+challengeType: 1
forumTopicId: 301979
dashedName: problem-322-binomial-coefficients-divisible-by-10
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-323-bitwise-or-operations-on-random-integers.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-323-bitwise-or-operations-on-random-integers.md
similarity index 91%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-323-bitwise-or-operations-on-random-integers.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-323-bitwise-or-operations-on-random-integers.md
index 31e3633..7cd5acf 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-323-bitwise-or-operations-on-random-integers.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-323-bitwise-or-operations-on-random-integers.md
@@ -1,16 +1,14 @@
---
id: 5900f4b01000cf542c50ffc2
title: 'Problem 323: Bitwise-OR operations on random integers'
-challengeType: 5
+challengeType: 1
forumTopicId: 301980
dashedName: problem-323-bitwise-or-operations-on-random-integers
---
# --description--
-Let $y_0, y_1, y_2, \ldots$ be a sequence of random unsigned 32 bit integers
-
-(i.e. $0 ≤ y_i < 2^{32}$, every value equally likely).
+Let $y_0, y_1, y_2, \ldots$ be a sequence of random unsigned 32 bit integers (i.e. $0 ≤ y_i < 2^{32}$, every value equally likely).
For the sequence $x_i$ the following recursion is given:
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-324-building-a-tower.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-324-building-a-tower.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-324-building-a-tower.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-324-building-a-tower.md
index b2da292..492e7aa 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-324-building-a-tower.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-324-building-a-tower.md
@@ -1,7 +1,7 @@
---
id: 5900f4b11000cf542c50ffc3
title: 'Problem 324: Building a tower'
-challengeType: 5
+challengeType: 1
forumTopicId: 301981
dashedName: problem-324-building-a-tower
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-325-stone-game-ii.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-325-stone-game-ii.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-325-stone-game-ii.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-325-stone-game-ii.md
index bc828c8..b1392c1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-325-stone-game-ii.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-325-stone-game-ii.md
@@ -1,7 +1,7 @@
---
id: 5900f4b11000cf542c50ffc4
title: 'Problem 325: Stone Game II'
-challengeType: 5
+challengeType: 1
forumTopicId: 301982
dashedName: problem-325-stone-game-ii
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-326-modulo-summations.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-326-modulo-summations.md
similarity index 84%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-326-modulo-summations.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-326-modulo-summations.md
index ededd29..e43a4a9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-326-modulo-summations.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-326-modulo-summations.md
@@ -1,14 +1,14 @@
---
id: 5900f4b21000cf542c50ffc5
title: 'Problem 326: Modulo Summations'
-challengeType: 5
+challengeType: 1
forumTopicId: 301983
dashedName: problem-326-modulo-summations
---
# --description--
-Let an be a sequence recursively defined by: $a_1 = 1$, $\displaystyle a_n = \left(\sum_{k = 1}^{n - 1} k \times a_k\right)\bmod n$.
+Let $a_n$ be a sequence recursively defined by: $a_1 = 1$, $\displaystyle a_n = \left(\sum_{k = 1}^{n - 1} k \times a_k\right)\bmod n$.
So the first 10 elements of $a_n$ are: 1, 1, 0, 3, 0, 3, 5, 4, 1, 9.
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-327-rooms-of-doom.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-327-rooms-of-doom.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-327-rooms-of-doom.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-327-rooms-of-doom.md
index e1714be..96f4d4a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-327-rooms-of-doom.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-327-rooms-of-doom.md
@@ -1,7 +1,7 @@
---
id: 5900f4b31000cf542c50ffc6
title: 'Problem 327: Rooms of Doom'
-challengeType: 5
+challengeType: 1
forumTopicId: 301984
dashedName: problem-327-rooms-of-doom
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-328-lowest-cost-search.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-328-lowest-cost-search.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-328-lowest-cost-search.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-328-lowest-cost-search.md
index 7cb9e0d..3d3d441 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-328-lowest-cost-search.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-328-lowest-cost-search.md
@@ -1,7 +1,7 @@
---
id: 5900f4b41000cf542c50ffc7
title: 'Problem 328: Lowest-cost Search'
-challengeType: 5
+challengeType: 1
forumTopicId: 301985
dashedName: problem-328-lowest-cost-search
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-329-prime-frog.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-329-prime-frog.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-329-prime-frog.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-329-prime-frog.md
index 54f72db..e14df07 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-329-prime-frog.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-329-prime-frog.md
@@ -1,7 +1,7 @@
---
id: 5900f4b51000cf542c50ffc8
title: 'Problem 329: Prime Frog'
-challengeType: 5
+challengeType: 1
forumTopicId: 301986
dashedName: problem-329-prime-frog
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-330-eulers-number.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-330-eulers-number.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-330-eulers-number.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-330-eulers-number.md
index d79904d..07d3dde 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-330-eulers-number.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-330-eulers-number.md
@@ -1,7 +1,7 @@
---
id: 5900f4b71000cf542c50ffc9
title: 'Problem 330: Euler''s Number'
-challengeType: 5
+challengeType: 1
forumTopicId: 301988
dashedName: problem-330-eulers-number
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-331-cross-flips.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-331-cross-flips.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-331-cross-flips.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-331-cross-flips.md
index 024faed..03b3021 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-331-cross-flips.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-331-cross-flips.md
@@ -1,7 +1,7 @@
---
id: 5900f4b71000cf542c50ffca
title: 'Problem 331: Cross flips'
-challengeType: 5
+challengeType: 1
forumTopicId: 301989
dashedName: problem-331-cross-flips
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-332-spherical-triangles.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-332-spherical-triangles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-332-spherical-triangles.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-332-spherical-triangles.md
index c09640c..45dcdd7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-332-spherical-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-332-spherical-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f4b91000cf542c50ffcb
title: 'Problem 332: Spherical triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 301990
dashedName: problem-332-spherical-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-333-special-partitions.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-333-special-partitions.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-333-special-partitions.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-333-special-partitions.md
index 35023e9..04f147b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-333-special-partitions.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-333-special-partitions.md
@@ -1,7 +1,7 @@
---
id: 5900f4b91000cf542c50ffcc
title: 'Problem 333: Special partitions'
-challengeType: 5
+challengeType: 1
forumTopicId: 301991
dashedName: problem-333-special-partitions
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-334-spilling-the-beans.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-334-spilling-the-beans.md
similarity index 89%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-334-spilling-the-beans.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-334-spilling-the-beans.md
index bc5e4a1..10194d3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-334-spilling-the-beans.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-334-spilling-the-beans.md
@@ -1,7 +1,7 @@
---
id: 5900f4ba1000cf542c50ffcd
title: 'Problem 334: Spilling the beans'
-challengeType: 5
+challengeType: 1
forumTopicId: 301992
dashedName: problem-334-spilling-the-beans
---
@@ -12,7 +12,7 @@ In Plato's heaven, there exist an infinite number of bowls in a straight line. E
For example, consider two adjacent bowls containing 2 and 3 beans respectively, all other bowls being empty. The following eight moves will finish the game:
-
+
You are given the following sequences:
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-335-gathering-the-beans.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-335-gathering-the-beans.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-335-gathering-the-beans.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-335-gathering-the-beans.md
index f20d369..b871f96 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-335-gathering-the-beans.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-335-gathering-the-beans.md
@@ -1,7 +1,7 @@
---
id: 5900f4bd1000cf542c50ffce
title: 'Problem 335: Gathering the beans'
-challengeType: 5
+challengeType: 1
forumTopicId: 301993
dashedName: problem-335-gathering-the-beans
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-336-maximix-arrangements.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-336-maximix-arrangements.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-336-maximix-arrangements.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-336-maximix-arrangements.md
index e767deb..dc3c704 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-336-maximix-arrangements.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-336-maximix-arrangements.md
@@ -1,7 +1,7 @@
---
id: 5900f4bd1000cf542c50ffcf
title: 'Problem 336: Maximix Arrangements'
-challengeType: 5
+challengeType: 1
forumTopicId: 301994
dashedName: problem-336-maximix-arrangements
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-337-totient-stairstep-sequences.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-337-totient-stairstep-sequences.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-337-totient-stairstep-sequences.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-337-totient-stairstep-sequences.md
index a0298d4..ed090ed 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-337-totient-stairstep-sequences.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-337-totient-stairstep-sequences.md
@@ -1,7 +1,7 @@
---
id: 5900f4be1000cf542c50ffd0
title: 'Problem 337: Totient Stairstep Sequences'
-challengeType: 5
+challengeType: 1
forumTopicId: 301995
dashedName: problem-337-totient-stairstep-sequences
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-338-cutting-rectangular-grid-paper.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-338-cutting-rectangular-grid-paper.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-338-cutting-rectangular-grid-paper.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-338-cutting-rectangular-grid-paper.md
index 7039c9e..c0c2bbc 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-338-cutting-rectangular-grid-paper.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-338-cutting-rectangular-grid-paper.md
@@ -1,7 +1,7 @@
---
id: 5900f4be1000cf542c50ffd1
title: 'Problem 338: Cutting Rectangular Grid Paper'
-challengeType: 5
+challengeType: 1
forumTopicId: 301996
dashedName: problem-338-cutting-rectangular-grid-paper
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-339-peredur-fab-efrawg.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-339-peredur-fab-efrawg.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-339-peredur-fab-efrawg.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-339-peredur-fab-efrawg.md
index c080309..7c1934c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-339-peredur-fab-efrawg.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-339-peredur-fab-efrawg.md
@@ -1,7 +1,7 @@
---
id: 5900f4c01000cf542c50ffd2
title: 'Problem 339: Peredur fab Efrawg'
-challengeType: 5
+challengeType: 1
forumTopicId: 301997
dashedName: problem-339-peredur-fab-efrawg
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-340-crazy-function.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-340-crazy-function.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-340-crazy-function.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-340-crazy-function.md
index 64a2664..eeee6c9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-340-crazy-function.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-340-crazy-function.md
@@ -1,7 +1,7 @@
---
id: 5900f4c21000cf542c50ffd4
title: 'Problem 340: Crazy Function'
-challengeType: 5
+challengeType: 1
forumTopicId: 301999
dashedName: problem-340-crazy-function
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-341-golombs-self-describing-sequence.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-341-golombs-self-describing-sequence.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-341-golombs-self-describing-sequence.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-341-golombs-self-describing-sequence.md
index 52f97ba..989907c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-341-golombs-self-describing-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-341-golombs-self-describing-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f4c11000cf542c50ffd3
title: 'Problem 341: Golomb''s self-describing sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 302000
dashedName: problem-341-golombs-self-describing-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-342-the-totient-of-a-square-is-a-cube.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-342-the-totient-of-a-square-is-a-cube.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-342-the-totient-of-a-square-is-a-cube.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-342-the-totient-of-a-square-is-a-cube.md
index 950e7d6..85990bc 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-342-the-totient-of-a-square-is-a-cube.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-342-the-totient-of-a-square-is-a-cube.md
@@ -1,7 +1,7 @@
---
id: 5900f4c31000cf542c50ffd5
title: 'Problem 342: The totient of a square is a cube'
-challengeType: 5
+challengeType: 1
forumTopicId: 302001
dashedName: problem-342-the-totient-of-a-square-is-a-cube
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-343-fractional-sequences.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-343-fractional-sequences.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-343-fractional-sequences.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-343-fractional-sequences.md
index 65410d7..f284af9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-343-fractional-sequences.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-343-fractional-sequences.md
@@ -1,7 +1,7 @@
---
id: 5900f4c41000cf542c50ffd6
title: 'Problem 343: Fractional Sequences'
-challengeType: 5
+challengeType: 1
forumTopicId: 302002
dashedName: problem-343-fractional-sequences
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-344-silver-dollar-game.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-344-silver-dollar-game.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-344-silver-dollar-game.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-344-silver-dollar-game.md
index d3ee3fc..7e8cf81 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-344-silver-dollar-game.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-344-silver-dollar-game.md
@@ -1,7 +1,7 @@
---
id: 5900f4c51000cf542c50ffd7
title: 'Problem 344: Silver dollar game'
-challengeType: 5
+challengeType: 1
forumTopicId: 302003
dashedName: problem-344-silver-dollar-game
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-345-matrix-sum.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-345-matrix-sum.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-345-matrix-sum.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-345-matrix-sum.md
index f82ee97..cf884f8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-345-matrix-sum.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-345-matrix-sum.md
@@ -1,7 +1,7 @@
---
id: 5900f4c81000cf542c50ffda
title: 'Problem 345: Matrix Sum'
-challengeType: 5
+challengeType: 1
forumTopicId: 302004
dashedName: problem-345-matrix-sum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-346-strong-repunits.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-346-strong-repunits.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-346-strong-repunits.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-346-strong-repunits.md
index 88c4634..98b7cc4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-346-strong-repunits.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-346-strong-repunits.md
@@ -1,7 +1,7 @@
---
id: 5900f4c71000cf542c50ffd8
title: 'Problem 346: Strong Repunits'
-challengeType: 5
+challengeType: 1
forumTopicId: 302005
dashedName: problem-346-strong-repunits
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-347-largest-integer-divisible-by-two-primes.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-347-largest-integer-divisible-by-two-primes.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-347-largest-integer-divisible-by-two-primes.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-347-largest-integer-divisible-by-two-primes.md
index 9924ba3..15174e8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-347-largest-integer-divisible-by-two-primes.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-347-largest-integer-divisible-by-two-primes.md
@@ -1,7 +1,7 @@
---
id: 5900f4c81000cf542c50ffd9
title: 'Problem 347: Largest integer divisible by two primes'
-challengeType: 5
+challengeType: 1
forumTopicId: 302006
dashedName: problem-347-largest-integer-divisible-by-two-primes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-348-sum-of-a-square-and-a-cube.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-348-sum-of-a-square-and-a-cube.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-348-sum-of-a-square-and-a-cube.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-348-sum-of-a-square-and-a-cube.md
index 0c4cc34..c2447c6 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-348-sum-of-a-square-and-a-cube.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-348-sum-of-a-square-and-a-cube.md
@@ -1,7 +1,7 @@
---
id: 5900f4c81000cf542c50ffdb
title: 'Problem 348: Sum of a square and a cube'
-challengeType: 5
+challengeType: 1
forumTopicId: 302007
dashedName: problem-348-sum-of-a-square-and-a-cube
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-349-langtons-ant.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-349-langtons-ant.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-349-langtons-ant.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-349-langtons-ant.md
index 156d06c..71fe178 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-349-langtons-ant.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-349-langtons-ant.md
@@ -1,7 +1,7 @@
---
id: 5900f4ca1000cf542c50ffdc
title: 'Problem 349: Langton''s ant'
-challengeType: 5
+challengeType: 1
forumTopicId: 302008
dashedName: problem-349-langtons-ant
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-350-constraining-the-least-greatest-and-the-greatest-least.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-350-constraining-the-least-greatest-and-the-greatest-least.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-350-constraining-the-least-greatest-and-the-greatest-least.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-350-constraining-the-least-greatest-and-the-greatest-least.md
index 5076c24..c5f4e5a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-350-constraining-the-least-greatest-and-the-greatest-least.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-350-constraining-the-least-greatest-and-the-greatest-least.md
@@ -1,7 +1,7 @@
---
id: 5900f4cb1000cf542c50ffdd
title: 'Problem 350: Constraining the least greatest and the greatest least'
-challengeType: 5
+challengeType: 1
forumTopicId: 302010
dashedName: problem-350-constraining-the-least-greatest-and-the-greatest-least
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-351-hexagonal-orchards.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-351-hexagonal-orchards.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-351-hexagonal-orchards.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-351-hexagonal-orchards.md
index 87af2e2..75c78da 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-351-hexagonal-orchards.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-351-hexagonal-orchards.md
@@ -1,7 +1,7 @@
---
id: 5900f4cb1000cf542c50ffde
title: 'Problem 351: Hexagonal orchards'
-challengeType: 5
+challengeType: 1
forumTopicId: 302011
dashedName: problem-351-hexagonal-orchards
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-352-blood-tests.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-352-blood-tests.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-352-blood-tests.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-352-blood-tests.md
index d9e1197..b0de4ec 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-352-blood-tests.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-352-blood-tests.md
@@ -1,7 +1,7 @@
---
id: 5900f4cd1000cf542c50ffdf
title: 'Problem 352: Blood tests'
-challengeType: 5
+challengeType: 1
forumTopicId: 302012
dashedName: problem-352-blood-tests
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-353-risky-moon.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-353-risky-moon.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-353-risky-moon.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-353-risky-moon.md
index 3973a53..83cb0d4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-353-risky-moon.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-353-risky-moon.md
@@ -1,7 +1,7 @@
---
id: 5900f4cd1000cf542c50ffe0
title: 'Problem 353: Risky moon'
-challengeType: 5
+challengeType: 1
forumTopicId: 302013
dashedName: problem-353-risky-moon
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-354-distances-in-a-bees-honeycomb.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-354-distances-in-a-bees-honeycomb.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-354-distances-in-a-bees-honeycomb.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-354-distances-in-a-bees-honeycomb.md
index bac01ea..f60039e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-354-distances-in-a-bees-honeycomb.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-354-distances-in-a-bees-honeycomb.md
@@ -1,7 +1,7 @@
---
id: 5900f4cf1000cf542c50ffe1
title: 'Problem 354: Distances in a bee''s honeycomb'
-challengeType: 5
+challengeType: 1
forumTopicId: 302014
dashedName: problem-354-distances-in-a-bees-honeycomb
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-355-maximal-coprime-subset.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-355-maximal-coprime-subset.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-355-maximal-coprime-subset.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-355-maximal-coprime-subset.md
index 8c693f1..a7e2179 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-355-maximal-coprime-subset.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-355-maximal-coprime-subset.md
@@ -1,7 +1,7 @@
---
id: 5900f4d01000cf542c50ffe2
title: 'Problem 355: Maximal coprime subset'
-challengeType: 5
+challengeType: 1
forumTopicId: 302015
dashedName: problem-355-maximal-coprime-subset
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-356-largest-roots-of-cubic-polynomials.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-356-largest-roots-of-cubic-polynomials.md
similarity index 87%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-356-largest-roots-of-cubic-polynomials.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-356-largest-roots-of-cubic-polynomials.md
index 07aeae1..ec4939b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-356-largest-roots-of-cubic-polynomials.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-356-largest-roots-of-cubic-polynomials.md
@@ -1,14 +1,14 @@
---
id: 5900f4d01000cf542c50ffe3
title: 'Problem 356: Largest roots of cubic polynomials'
-challengeType: 5
+challengeType: 1
forumTopicId: 302016
dashedName: problem-356-largest-roots-of-cubic-polynomials
---
# --description--
-Let an be the largest real root of a polynomial $g(x) = x^3 - 2^n \times x^2 + n$.
+Let $a_n$ be the largest real root of a polynomial $g(x) = x^3 - 2^n \times x^2 + n$.
For example, $a_2 = 3.86619826\ldots$
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-357-prime-generating-integers.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-357-prime-generating-integers.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-357-prime-generating-integers.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-357-prime-generating-integers.md
index 6483905..003fc35 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-357-prime-generating-integers.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-357-prime-generating-integers.md
@@ -1,7 +1,7 @@
---
id: 5900f4d11000cf542c50ffe4
title: 'Problem 357: Prime generating integers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302017
dashedName: problem-357-prime-generating-integers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-358-cyclic-numbers.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-358-cyclic-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-358-cyclic-numbers.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-358-cyclic-numbers.md
index b77898c..b298050 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-358-cyclic-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-358-cyclic-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f4d21000cf542c50ffe5
title: 'Problem 358: Cyclic numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302018
dashedName: problem-358-cyclic-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-359-hilberts-new-hotel.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-359-hilberts-new-hotel.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-359-hilberts-new-hotel.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-359-hilberts-new-hotel.md
index 6e11ece..1fd01d0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-359-hilberts-new-hotel.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-359-hilberts-new-hotel.md
@@ -1,7 +1,7 @@
---
id: 5900f4d31000cf542c50ffe6
title: 'Problem 359: Hilbert''s New Hotel'
-challengeType: 5
+challengeType: 1
forumTopicId: 302019
dashedName: problem-359-hilberts-new-hotel
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-360-scary-sphere.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-360-scary-sphere.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-360-scary-sphere.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-360-scary-sphere.md
index f043644..932a0a9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-360-scary-sphere.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-360-scary-sphere.md
@@ -1,7 +1,7 @@
---
id: 5900f4d41000cf542c50ffe7
title: 'Problem 360: Scary Sphere'
-challengeType: 5
+challengeType: 1
forumTopicId: 302021
dashedName: problem-360-scary-sphere
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-361-subsequence-of-thue-morse-sequence.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-361-subsequence-of-thue-morse-sequence.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-361-subsequence-of-thue-morse-sequence.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-361-subsequence-of-thue-morse-sequence.md
index e137ee1..60d72bf 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-361-subsequence-of-thue-morse-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-361-subsequence-of-thue-morse-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f4d51000cf542c50ffe8
title: 'Problem 361: Subsequence of Thue-Morse sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 302022
dashedName: problem-361-subsequence-of-thue-morse-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-362-squarefree-factors.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-362-squarefree-factors.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-362-squarefree-factors.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-362-squarefree-factors.md
index 50d4cc1..19f6b0f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-362-squarefree-factors.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-362-squarefree-factors.md
@@ -1,7 +1,7 @@
---
id: 5900f4d61000cf542c50ffe9
title: 'Problem 362: Squarefree factors'
-challengeType: 5
+challengeType: 1
forumTopicId: 302023
dashedName: problem-362-squarefree-factors
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-363-bzier-curves.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-363-bzier-curves.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-363-bzier-curves.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-363-bzier-curves.md
index abdff28..78c4885 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-363-bzier-curves.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-363-bzier-curves.md
@@ -1,7 +1,7 @@
---
id: 5900f4d91000cf542c50ffeb
title: 'Problem 363: Bézier Curves'
-challengeType: 5
+challengeType: 1
forumTopicId: 302024
dashedName: problem-363-bzier-curves
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-364-comfortable-distance.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-364-comfortable-distance.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-364-comfortable-distance.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-364-comfortable-distance.md
index 20f7f21..3ee50db 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-364-comfortable-distance.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-364-comfortable-distance.md
@@ -1,7 +1,7 @@
---
id: 5900f4d91000cf542c50ffea
title: 'Problem 364: Comfortable distance'
-challengeType: 5
+challengeType: 1
forumTopicId: 302025
dashedName: problem-364-comfortable-distance
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-365-a-huge-binomial-coefficient.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-365-a-huge-binomial-coefficient.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-365-a-huge-binomial-coefficient.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-365-a-huge-binomial-coefficient.md
index 3c778cb..46dc7ab 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-365-a-huge-binomial-coefficient.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-365-a-huge-binomial-coefficient.md
@@ -1,7 +1,7 @@
---
id: 5900f4da1000cf542c50ffec
title: 'Problem 365: A huge binomial coefficient'
-challengeType: 5
+challengeType: 1
forumTopicId: 302026
dashedName: problem-365-a-huge-binomial-coefficient
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-366-stone-game-iii.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-366-stone-game-iii.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-366-stone-game-iii.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-366-stone-game-iii.md
index 85cf792..e4c51cb 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-366-stone-game-iii.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-366-stone-game-iii.md
@@ -1,7 +1,7 @@
---
id: 5900f4da1000cf542c50ffed
title: 'Problem 366: Stone Game III'
-challengeType: 5
+challengeType: 1
forumTopicId: 302027
dashedName: problem-366-stone-game-iii
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-367-bozo-sort.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-367-bozo-sort.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-367-bozo-sort.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-367-bozo-sort.md
index 2497cd8..01a24b3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-367-bozo-sort.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-367-bozo-sort.md
@@ -1,7 +1,7 @@
---
id: 5900f4db1000cf542c50ffee
title: 'Problem 367: Bozo sort'
-challengeType: 5
+challengeType: 1
forumTopicId: 302028
dashedName: problem-367-bozo-sort
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-368-a-kempner-like-series.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-368-a-kempner-like-series.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-368-a-kempner-like-series.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-368-a-kempner-like-series.md
index 48cecc9..afc2e6d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-368-a-kempner-like-series.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-368-a-kempner-like-series.md
@@ -1,7 +1,7 @@
---
id: 5900f4dd1000cf542c50ffef
title: 'Problem 368: A Kempner-like series'
-challengeType: 5
+challengeType: 1
forumTopicId: 302029
dashedName: problem-368-a-kempner-like-series
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-369-badugi.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-369-badugi.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-369-badugi.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-369-badugi.md
index ce8f9a6..b297bf9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-369-badugi.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-369-badugi.md
@@ -1,7 +1,7 @@
---
id: 5900f4de1000cf542c50fff0
title: 'Problem 369: Badugi'
-challengeType: 5
+challengeType: 1
forumTopicId: 302030
dashedName: problem-369-badugi
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-370-geometric-triangles.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-370-geometric-triangles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-370-geometric-triangles.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-370-geometric-triangles.md
index c26ef22..dd37d16 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-370-geometric-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-370-geometric-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f4de1000cf542c50fff1
title: 'Problem 370: Geometric triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 302032
dashedName: problem-370-geometric-triangles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-371-licence-plates.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-371-licence-plates.md
similarity index 93%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-371-licence-plates.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-371-licence-plates.md
index 63d7295..dee9928 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-371-licence-plates.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-371-licence-plates.md
@@ -1,7 +1,7 @@
---
id: 5900f4e01000cf542c50fff2
title: 'Problem 371: Licence plates'
-challengeType: 5
+challengeType: 1
forumTopicId: 302033
dashedName: problem-371-licence-plates
---
@@ -14,7 +14,7 @@ While driving to work Seth plays the following game:
Whenever the numbers of two licence plates seen on his trip add to 1000 that's a win.
-E.g. `MIC-012` and `HAN-988` is a win and `RYU-500` and `SET-500` too. (as long as he sees them in the same trip).
+E.g. `MIC-012` and `HAN-988` is a win and `RYU-500` and `SET-500` too (as long as he sees them in the same trip).
Find the expected number of plates he needs to see for a win. Give your answer rounded to 8 decimal places behind the decimal point.
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-372-pencils-of-rays.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-372-pencils-of-rays.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-372-pencils-of-rays.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-372-pencils-of-rays.md
index 9f39453..9a8e0ff 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-372-pencils-of-rays.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-372-pencils-of-rays.md
@@ -1,7 +1,7 @@
---
id: 5900f4e11000cf542c50fff3
title: 'Problem 372: Pencils of rays'
-challengeType: 5
+challengeType: 1
forumTopicId: 302034
dashedName: problem-372-pencils-of-rays
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-373-circumscribed-circles.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-373-circumscribed-circles.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-373-circumscribed-circles.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-373-circumscribed-circles.md
index c50df93..dbe4e1d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-373-circumscribed-circles.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-373-circumscribed-circles.md
@@ -1,7 +1,7 @@
---
id: 5900f4e11000cf542c50fff4
title: 'Problem 373: Circumscribed Circles'
-challengeType: 5
+challengeType: 1
forumTopicId: 302035
dashedName: problem-373-circumscribed-circles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-374-maximum-integer-partition-product.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-374-maximum-integer-partition-product.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-374-maximum-integer-partition-product.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-374-maximum-integer-partition-product.md
index febbdf8..e257827 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-374-maximum-integer-partition-product.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-374-maximum-integer-partition-product.md
@@ -1,7 +1,7 @@
---
id: 5900f4e51000cf542c50fff6
title: 'Problem 374: Maximum Integer Partition Product'
-challengeType: 5
+challengeType: 1
forumTopicId: 302036
dashedName: problem-374-maximum-integer-partition-product
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-375-minimum-of-subsequences.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-375-minimum-of-subsequences.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-375-minimum-of-subsequences.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-375-minimum-of-subsequences.md
index 314922e..2b3b9c7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-375-minimum-of-subsequences.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-375-minimum-of-subsequences.md
@@ -1,7 +1,7 @@
---
id: 5900f4e41000cf542c50fff5
title: 'Problem 375: Minimum of subsequences'
-challengeType: 5
+challengeType: 1
forumTopicId: 302037
dashedName: problem-375-minimum-of-subsequences
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-376-nontransitive-sets-of-dice.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-376-nontransitive-sets-of-dice.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-376-nontransitive-sets-of-dice.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-376-nontransitive-sets-of-dice.md
index b326d1d..a6c6ffb 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-376-nontransitive-sets-of-dice.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-376-nontransitive-sets-of-dice.md
@@ -1,7 +1,7 @@
---
id: 5900f4e51000cf542c50fff7
title: 'Problem 376: Nontransitive sets of dice'
-challengeType: 5
+challengeType: 1
forumTopicId: 302038
dashedName: problem-376-nontransitive-sets-of-dice
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-377-sum-of-digits-experience-13.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-377-sum-of-digits-experience-13.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-377-sum-of-digits-experience-13.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-377-sum-of-digits-experience-13.md
index 66868c0..ff149a2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-377-sum-of-digits-experience-13.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-377-sum-of-digits-experience-13.md
@@ -1,7 +1,7 @@
---
id: 5900f4e51000cf542c50fff8
title: 'Problem 377: Sum of digits, experience 13'
-challengeType: 5
+challengeType: 1
forumTopicId: 302039
dashedName: problem-377-sum-of-digits-experience-13
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-378-triangle-triples.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-378-triangle-triples.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-378-triangle-triples.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-378-triangle-triples.md
index 5fda48f..e72ba43 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-378-triangle-triples.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-378-triangle-triples.md
@@ -1,7 +1,7 @@
---
id: 5900f4e61000cf542c50fff9
title: 'Problem 378: Triangle Triples'
-challengeType: 5
+challengeType: 1
forumTopicId: 302040
dashedName: problem-378-triangle-triples
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-379-least-common-multiple-count.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-379-least-common-multiple-count.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-379-least-common-multiple-count.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-379-least-common-multiple-count.md
index 9ae9c6d..0f2fb89 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-379-least-common-multiple-count.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-379-least-common-multiple-count.md
@@ -1,7 +1,7 @@
---
id: 5900f4e81000cf542c50fffa
title: 'Problem 379: Least common multiple count'
-challengeType: 5
+challengeType: 1
forumTopicId: 302041
dashedName: problem-379-least-common-multiple-count
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-380-amazing-mazes.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-380-amazing-mazes.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-380-amazing-mazes.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-380-amazing-mazes.md
index 5fbfe5f..e3d7c66 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-380-amazing-mazes.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-380-amazing-mazes.md
@@ -1,7 +1,7 @@
---
id: 5900f4e81000cf542c50fffb
title: 'Problem 380: Amazing Mazes!'
-challengeType: 5
+challengeType: 1
forumTopicId: 302044
dashedName: problem-380-amazing-mazes
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-381-prime-k-factorial.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-381-prime-k-factorial.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-381-prime-k-factorial.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-381-prime-k-factorial.md
index 1c5cb8b..21d1936 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-381-prime-k-factorial.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-381-prime-k-factorial.md
@@ -1,7 +1,7 @@
---
id: 5900f4ea1000cf542c50fffc
title: 'Problem 381: (prime-k) factorial'
-challengeType: 5
+challengeType: 1
forumTopicId: 302045
dashedName: problem-381-prime-k-factorial
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-382-generating-polygons.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-382-generating-polygons.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-382-generating-polygons.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-382-generating-polygons.md
index 9b829c6..605495d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-382-generating-polygons.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-382-generating-polygons.md
@@ -1,7 +1,7 @@
---
id: 5900f4eb1000cf542c50fffd
title: 'Problem 382: Generating polygons'
-challengeType: 5
+challengeType: 1
forumTopicId: 302046
dashedName: problem-382-generating-polygons
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-383-divisibility-comparison-between-factorials.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-383-divisibility-comparison-between-factorials.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-383-divisibility-comparison-between-factorials.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-383-divisibility-comparison-between-factorials.md
index e626c7e..4a85198 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-383-divisibility-comparison-between-factorials.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-383-divisibility-comparison-between-factorials.md
@@ -1,7 +1,7 @@
---
id: 5900f4ed1000cf542c50ffff
title: 'Problem 383: Divisibility comparison between factorials'
-challengeType: 5
+challengeType: 1
forumTopicId: 302047
dashedName: problem-383-divisibility-comparison-between-factorials
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-384-rudin-shapiro-sequence.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-384-rudin-shapiro-sequence.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-384-rudin-shapiro-sequence.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-384-rudin-shapiro-sequence.md
index 3f7783f..d1dd089 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-384-rudin-shapiro-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-384-rudin-shapiro-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f4ed1000cf542c50fffe
title: 'Problem 384: Rudin-Shapiro sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 302048
dashedName: problem-384-rudin-shapiro-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-385-ellipses-inside-triangles.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-385-ellipses-inside-triangles.md
similarity index 89%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-385-ellipses-inside-triangles.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-385-ellipses-inside-triangles.md
index f660a35..62312fa 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-385-ellipses-inside-triangles.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-385-ellipses-inside-triangles.md
@@ -1,7 +1,7 @@
---
id: 5900f4ee1000cf542c510000
title: 'Problem 385: Ellipses inside triangles'
-challengeType: 5
+challengeType: 1
forumTopicId: 302049
dashedName: problem-385-ellipses-inside-triangles
---
@@ -10,7 +10,7 @@ dashedName: problem-385-ellipses-inside-triangles
For any triangle $T$ in the plane, it can be shown that there is a unique ellipse with largest area that is completely inside $T$.
-
+
For a given $n$, consider triangles $T$ such that:
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-386-maximum-length-of-an-antichain.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-386-maximum-length-of-an-antichain.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-386-maximum-length-of-an-antichain.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-386-maximum-length-of-an-antichain.md
index 4b9e255..de0614e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-386-maximum-length-of-an-antichain.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-386-maximum-length-of-an-antichain.md
@@ -1,7 +1,7 @@
---
id: 5900f4ef1000cf542c510001
title: 'Problem 386: Maximum length of an antichain'
-challengeType: 5
+challengeType: 1
forumTopicId: 302050
dashedName: problem-386-maximum-length-of-an-antichain
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-387-harshad-numbers.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-387-harshad-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-387-harshad-numbers.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-387-harshad-numbers.md
index be8569b..2b2ccbb 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-387-harshad-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-387-harshad-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f4f11000cf542c510003
title: 'Problem 387: Harshad Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302051
dashedName: problem-387-harshad-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-388-distinct-lines.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-388-distinct-lines.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-388-distinct-lines.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-388-distinct-lines.md
index 0221499..4ff7f14 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-388-distinct-lines.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-388-distinct-lines.md
@@ -1,7 +1,7 @@
---
id: 5900f4f11000cf542c510002
title: 'Problem 388: Distinct Lines'
-challengeType: 5
+challengeType: 1
forumTopicId: 302052
dashedName: problem-388-distinct-lines
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-389-platonic-dice.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-389-platonic-dice.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-389-platonic-dice.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-389-platonic-dice.md
index 3c82720..081791f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-389-platonic-dice.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-389-platonic-dice.md
@@ -1,7 +1,7 @@
---
id: 5900f4f21000cf542c510004
title: 'Problem 389: Platonic Dice'
-challengeType: 5
+challengeType: 1
forumTopicId: 302053
dashedName: problem-389-platonic-dice
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-390-triangles-with-non-rational-sides-and-integral-area.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-390-triangles-with-non-rational-sides-and-integral-area.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-390-triangles-with-non-rational-sides-and-integral-area.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-390-triangles-with-non-rational-sides-and-integral-area.md
index 6a8c5ab..fa9e6f0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-390-triangles-with-non-rational-sides-and-integral-area.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-390-triangles-with-non-rational-sides-and-integral-area.md
@@ -1,7 +1,7 @@
---
id: 5900f4f21000cf542c510005
title: 'Problem 390: Triangles with non rational sides and integral area'
-challengeType: 5
+challengeType: 1
forumTopicId: 302055
dashedName: problem-390-triangles-with-non-rational-sides-and-integral-area
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-391-hopping-game.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-391-hopping-game.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-391-hopping-game.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-391-hopping-game.md
index 9c3d849..e94e14e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-391-hopping-game.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-391-hopping-game.md
@@ -1,7 +1,7 @@
---
id: 5900f4f31000cf542c510006
title: 'Problem 391: Hopping Game'
-challengeType: 5
+challengeType: 1
forumTopicId: 302056
dashedName: problem-391-hopping-game
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-392-enmeshed-unit-circle.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-392-enmeshed-unit-circle.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-392-enmeshed-unit-circle.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-392-enmeshed-unit-circle.md
index 8ac59a4..5065da0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-392-enmeshed-unit-circle.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-392-enmeshed-unit-circle.md
@@ -1,7 +1,7 @@
---
id: 5900f4f41000cf542c510007
title: 'Problem 392: Enmeshed unit circle'
-challengeType: 5
+challengeType: 1
forumTopicId: 302057
dashedName: problem-392-enmeshed-unit-circle
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-393-migrating-ants.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-393-migrating-ants.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-393-migrating-ants.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-393-migrating-ants.md
index db37ca4..28a0b4d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-393-migrating-ants.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-393-migrating-ants.md
@@ -1,7 +1,7 @@
---
id: 5900f4f61000cf542c510008
title: 'Problem 393: Migrating ants'
-challengeType: 5
+challengeType: 1
forumTopicId: 302058
dashedName: problem-393-migrating-ants
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-394-eating-pie.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-394-eating-pie.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-394-eating-pie.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-394-eating-pie.md
index 741e374..5901e19 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-394-eating-pie.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-394-eating-pie.md
@@ -1,7 +1,7 @@
---
id: 5900f4f71000cf542c510009
title: 'Problem 394: Eating pie'
-challengeType: 5
+challengeType: 1
forumTopicId: 302059
dashedName: problem-394-eating-pie
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-395-pythagorean-tree.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-395-pythagorean-tree.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-395-pythagorean-tree.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-395-pythagorean-tree.md
index 2c2f8b9..28477a1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-395-pythagorean-tree.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-395-pythagorean-tree.md
@@ -1,7 +1,7 @@
---
id: 5900f4f71000cf542c51000a
title: 'Problem 395: Pythagorean tree'
-challengeType: 5
+challengeType: 1
forumTopicId: 302060
dashedName: problem-395-pythagorean-tree
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-396-weak-goodstein-sequence.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-396-weak-goodstein-sequence.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-396-weak-goodstein-sequence.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-396-weak-goodstein-sequence.md
index 77684c2..33d738c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-396-weak-goodstein-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-396-weak-goodstein-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f4f81000cf542c51000b
title: 'Problem 396: Weak Goodstein sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 302061
dashedName: problem-396-weak-goodstein-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-397-triangle-on-parabola.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-397-triangle-on-parabola.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-397-triangle-on-parabola.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-397-triangle-on-parabola.md
index 3b9e67c..2d9fc18 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-397-triangle-on-parabola.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-397-triangle-on-parabola.md
@@ -1,7 +1,7 @@
---
id: 5900f4f91000cf542c51000c
title: 'Problem 397: Triangle on parabola'
-challengeType: 5
+challengeType: 1
forumTopicId: 302062
dashedName: problem-397-triangle-on-parabola
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-398-cutting-rope.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-398-cutting-rope.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-398-cutting-rope.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-398-cutting-rope.md
index c51e6f4..ade3370 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-398-cutting-rope.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-398-cutting-rope.md
@@ -1,7 +1,7 @@
---
id: 5900f4fa1000cf542c51000d
title: 'Problem 398: Cutting rope'
-challengeType: 5
+challengeType: 1
forumTopicId: 302063
dashedName: problem-398-cutting-rope
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-399-squarefree-fibonacci-numbers.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-399-squarefree-fibonacci-numbers.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-399-squarefree-fibonacci-numbers.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-399-squarefree-fibonacci-numbers.md
index 5d21ab4..37a34ad 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-399-squarefree-fibonacci-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-399-squarefree-fibonacci-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f4fc1000cf542c51000e
title: 'Problem 399: Squarefree Fibonacci Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302064
dashedName: problem-399-squarefree-fibonacci-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-400-fibonacci-tree-game.md b/curriculum/project-euler/project-euler-problems-301-to-400/problem-400-fibonacci-tree-game.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-400-fibonacci-tree-game.md
rename to curriculum/project-euler/project-euler-problems-301-to-400/problem-400-fibonacci-tree-game.md
index e7f36af..ed865dc 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-400-fibonacci-tree-game.md
+++ b/curriculum/project-euler/project-euler-problems-301-to-400/problem-400-fibonacci-tree-game.md
@@ -1,7 +1,7 @@
---
id: 5900f4fe1000cf542c510010
title: 'Problem 400: Fibonacci tree game'
-challengeType: 5
+challengeType: 1
forumTopicId: 302067
dashedName: problem-400-fibonacci-tree-game
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-401-sum-of-squares-of-divisors.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-401-sum-of-squares-of-divisors.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-401-sum-of-squares-of-divisors.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-401-sum-of-squares-of-divisors.md
index 69bf18c..eb0c045 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-401-sum-of-squares-of-divisors.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-401-sum-of-squares-of-divisors.md
@@ -1,7 +1,7 @@
---
id: 5900f4fd1000cf542c51000f
title: 'Problem 401: Sum of squares of divisors'
-challengeType: 5
+challengeType: 1
forumTopicId: 302069
dashedName: problem-401-sum-of-squares-of-divisors
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-402-integer-valued-polynomials.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-402-integer-valued-polynomials.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-402-integer-valued-polynomials.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-402-integer-valued-polynomials.md
index 7fd0858..cdda26e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-402-integer-valued-polynomials.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-402-integer-valued-polynomials.md
@@ -1,7 +1,7 @@
---
id: 5900f4ff1000cf542c510011
title: 'Problem 402: Integer-valued polynomials'
-challengeType: 5
+challengeType: 1
forumTopicId: 302070
dashedName: problem-402-integer-valued-polynomials
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-403-lattice-points-enclosed-by-parabola-and-line.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-403-lattice-points-enclosed-by-parabola-and-line.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-403-lattice-points-enclosed-by-parabola-and-line.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-403-lattice-points-enclosed-by-parabola-and-line.md
index 1bf202f..e3f8bfa 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-403-lattice-points-enclosed-by-parabola-and-line.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-403-lattice-points-enclosed-by-parabola-and-line.md
@@ -1,7 +1,7 @@
---
id: 5900f5001000cf542c510013
title: 'Problem 403: Lattice points enclosed by parabola and line'
-challengeType: 5
+challengeType: 1
forumTopicId: 302071
dashedName: problem-403-lattice-points-enclosed-by-parabola-and-line
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-404-crisscross-ellipses.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-404-crisscross-ellipses.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-404-crisscross-ellipses.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-404-crisscross-ellipses.md
index 4c14d87..edd17b0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-404-crisscross-ellipses.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-404-crisscross-ellipses.md
@@ -1,7 +1,7 @@
---
id: 5900f5001000cf542c510012
title: 'Problem 404: Crisscross Ellipses'
-challengeType: 5
+challengeType: 1
forumTopicId: 302072
dashedName: problem-404-crisscross-ellipses
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-405-a-rectangular-tiling.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-405-a-rectangular-tiling.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-405-a-rectangular-tiling.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-405-a-rectangular-tiling.md
index ea82b2c..cb151b7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-405-a-rectangular-tiling.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-405-a-rectangular-tiling.md
@@ -1,7 +1,7 @@
---
id: 5900f5021000cf542c510014
title: 'Problem 405: A rectangular tiling'
-challengeType: 5
+challengeType: 1
forumTopicId: 302073
dashedName: problem-405-a-rectangular-tiling
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-406-guessing-game.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-406-guessing-game.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-406-guessing-game.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-406-guessing-game.md
index f99ac40..6e1478d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-406-guessing-game.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-406-guessing-game.md
@@ -1,7 +1,7 @@
---
id: 5900f5021000cf542c510015
title: 'Problem 406: Guessing Game'
-challengeType: 5
+challengeType: 1
forumTopicId: 302074
dashedName: problem-406-guessing-game
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-407-idempotents.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-407-idempotents.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-407-idempotents.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-407-idempotents.md
index bae66db..f676b0c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-407-idempotents.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-407-idempotents.md
@@ -1,7 +1,7 @@
---
id: 5900f5041000cf542c510016
title: 'Problem 407: Idempotents'
-challengeType: 5
+challengeType: 1
forumTopicId: 302075
dashedName: problem-407-idempotents
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-408-admissible-paths-through-a-grid.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-408-admissible-paths-through-a-grid.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-408-admissible-paths-through-a-grid.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-408-admissible-paths-through-a-grid.md
index 94e93e6..260a191 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-408-admissible-paths-through-a-grid.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-408-admissible-paths-through-a-grid.md
@@ -1,7 +1,7 @@
---
id: 5900f5091000cf542c51001b
title: 'Problem 408: Admissible paths through a grid'
-challengeType: 5
+challengeType: 1
forumTopicId: 302076
dashedName: problem-408-admissible-paths-through-a-grid
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-409-nim-extreme.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-409-nim-extreme.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-409-nim-extreme.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-409-nim-extreme.md
index b751cb4..735a1c7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-409-nim-extreme.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-409-nim-extreme.md
@@ -1,7 +1,7 @@
---
id: 5900f5061000cf542c510017
title: 'Problem 409: Nim Extreme'
-challengeType: 5
+challengeType: 1
forumTopicId: 302077
dashedName: problem-409-nim-extreme
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-410-circle-and-tangent-line.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-410-circle-and-tangent-line.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-410-circle-and-tangent-line.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-410-circle-and-tangent-line.md
index 81ab40a..fd9d28a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-410-circle-and-tangent-line.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-410-circle-and-tangent-line.md
@@ -1,7 +1,7 @@
---
id: 5900f5071000cf542c510018
title: 'Problem 410: Circle and tangent line'
-challengeType: 5
+challengeType: 1
forumTopicId: 302079
dashedName: problem-410-circle-and-tangent-line
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-411-uphill-paths.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-411-uphill-paths.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-411-uphill-paths.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-411-uphill-paths.md
index ebbfb49..e7ea4cb 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-411-uphill-paths.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-411-uphill-paths.md
@@ -1,7 +1,7 @@
---
id: 5900f5081000cf542c510019
title: 'Problem 411: Uphill paths'
-challengeType: 5
+challengeType: 1
forumTopicId: 302080
dashedName: problem-411-uphill-paths
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-412-gnomon-numbering.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-412-gnomon-numbering.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-412-gnomon-numbering.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-412-gnomon-numbering.md
index f4af5fa..f50157e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-412-gnomon-numbering.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-412-gnomon-numbering.md
@@ -1,7 +1,7 @@
---
id: 5900f5081000cf542c51001a
title: 'Problem 412: Gnomon numbering'
-challengeType: 5
+challengeType: 1
forumTopicId: 302081
dashedName: problem-412-gnomon-numbering
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-413-one-child-numbers.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-413-one-child-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-413-one-child-numbers.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-413-one-child-numbers.md
index 2db9542..0a50da9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-413-one-child-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-413-one-child-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f50a1000cf542c51001c
title: 'Problem 413: One-child Numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302082
dashedName: problem-413-one-child-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-414-kaprekar-constant.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-414-kaprekar-constant.md
similarity index 96%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-414-kaprekar-constant.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-414-kaprekar-constant.md
index 8882c36..0d3500b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-414-kaprekar-constant.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-414-kaprekar-constant.md
@@ -1,7 +1,7 @@
---
id: 5900f50b1000cf542c51001d
title: 'Problem 414: Kaprekar constant'
-challengeType: 5
+challengeType: 1
forumTopicId: 302083
dashedName: problem-414-kaprekar-constant
---
@@ -25,7 +25,9 @@ $$\begin{align}
We can consider the Kaprekar routine for other bases and number of digits. Unfortunately, it is not guaranteed a Kaprekar constant exists in all cases; either the routine can end up in a cycle for some input numbers or the constant the routine arrives at can be different for different input numbers. However, it can be shown that for 5 digits and a base $b = 6t + 3 ≠ 9$, a Kaprekar constant exists.
-E.g. base 15: ${(10, 4, 14, 9, 5)}\_{15}$ base 21: $(14, 6, 20, 13, 7)_{21}$
+E.g.
+base 15: ${(10, 4, 14, 9, 5)}\_{15}$
+base 21: $(14, 6, 20, 13, 7)\_{21}$
Define $C_b$ to be the Kaprekar constant in base $b$ for 5 digits. Define the function $sb(i)$ to be:
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-415-titanic-sets.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-415-titanic-sets.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-415-titanic-sets.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-415-titanic-sets.md
index 1a71397..a03c026 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-415-titanic-sets.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-415-titanic-sets.md
@@ -1,7 +1,7 @@
---
id: 5900f50c1000cf542c51001e
title: 'Problem 415: Titanic sets'
-challengeType: 5
+challengeType: 1
forumTopicId: 302084
dashedName: problem-415-titanic-sets
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-416-a-frogs-trip.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-416-a-frogs-trip.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-416-a-frogs-trip.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-416-a-frogs-trip.md
index 8465a86..048adb2 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-416-a-frogs-trip.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-416-a-frogs-trip.md
@@ -1,7 +1,7 @@
---
id: 5900f50e1000cf542c510020
title: 'Problem 416: A frog''s trip'
-challengeType: 5
+challengeType: 1
forumTopicId: 302085
dashedName: problem-416-a-frogs-trip
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-417-reciprocal-cycles-ii.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-417-reciprocal-cycles-ii.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-417-reciprocal-cycles-ii.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-417-reciprocal-cycles-ii.md
index c04af96..c4292ce 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-417-reciprocal-cycles-ii.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-417-reciprocal-cycles-ii.md
@@ -1,7 +1,7 @@
---
id: 5900f50d1000cf542c51001f
title: 'Problem 417: Reciprocal cycles II'
-challengeType: 5
+challengeType: 1
forumTopicId: 302086
dashedName: problem-417-reciprocal-cycles-ii
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-418-factorisation-triples.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-418-factorisation-triples.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-418-factorisation-triples.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-418-factorisation-triples.md
index 43a5d24..0c37647 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-418-factorisation-triples.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-418-factorisation-triples.md
@@ -1,7 +1,7 @@
---
id: 5900f50f1000cf542c510021
title: 'Problem 418: Factorisation triples'
-challengeType: 5
+challengeType: 1
forumTopicId: 302087
dashedName: problem-418-factorisation-triples
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-419-look-and-say-sequence.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-419-look-and-say-sequence.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-419-look-and-say-sequence.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-419-look-and-say-sequence.md
index 12e5c58..4143ab3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-419-look-and-say-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-419-look-and-say-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f5101000cf542c510022
title: 'Problem 419: Look and say sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 302088
dashedName: problem-419-look-and-say-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-420-2x2-positive-integer-matrix.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-420-2x2-positive-integer-matrix.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-420-2x2-positive-integer-matrix.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-420-2x2-positive-integer-matrix.md
index bcd4905..e9d58f4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-420-2x2-positive-integer-matrix.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-420-2x2-positive-integer-matrix.md
@@ -1,7 +1,7 @@
---
id: 5900f5111000cf542c510023
title: 'Problem 420: 2x2 positive integer matrix'
-challengeType: 5
+challengeType: 1
forumTopicId: 302090
dashedName: problem-420-2x2-positive-integer-matrix
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-421-prime-factors-of-n151.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-421-prime-factors-of-n151.md
similarity index 93%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-421-prime-factors-of-n151.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-421-prime-factors-of-n151.md
index 9e9bb64..f94cb95 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-421-prime-factors-of-n151.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-421-prime-factors-of-n151.md
@@ -1,7 +1,7 @@
---
id: 5900f5131000cf542c510024
-title: 'Problem 421: Prime factors of n15+1'
-challengeType: 5
+title: 'Problem 421: Prime factors of n^15+1'
+challengeType: 1
forumTopicId: 302091
dashedName: problem-421-prime-factors-of-n151
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-422-sequence-of-points-on-a-hyperbola.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-422-sequence-of-points-on-a-hyperbola.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-422-sequence-of-points-on-a-hyperbola.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-422-sequence-of-points-on-a-hyperbola.md
index 07ec19e..bb46ddc 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-422-sequence-of-points-on-a-hyperbola.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-422-sequence-of-points-on-a-hyperbola.md
@@ -1,7 +1,7 @@
---
id: 5900f5131000cf542c510025
title: 'Problem 422: Sequence of points on a hyperbola'
-challengeType: 5
+challengeType: 1
forumTopicId: 302092
dashedName: problem-422-sequence-of-points-on-a-hyperbola
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-423-consecutive-die-throws.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-423-consecutive-die-throws.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-423-consecutive-die-throws.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-423-consecutive-die-throws.md
index d639003..9497832 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-423-consecutive-die-throws.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-423-consecutive-die-throws.md
@@ -1,7 +1,7 @@
---
id: 5900f5141000cf542c510027
title: 'Problem 423: Consecutive die throws'
-challengeType: 5
+challengeType: 1
forumTopicId: 302093
dashedName: problem-423-consecutive-die-throws
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-424-kakuro.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-424-kakuro.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-424-kakuro.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-424-kakuro.md
index a8a4030..ddd2fc8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-424-kakuro.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-424-kakuro.md
@@ -1,7 +1,7 @@
---
id: 5900f5141000cf542c510026
title: 'Problem 424: Kakuro'
-challengeType: 5
+challengeType: 1
forumTopicId: 302094
dashedName: problem-424-kakuro
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-425-prime-connection.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-425-prime-connection.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-425-prime-connection.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-425-prime-connection.md
index 72f5393..dfba791 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-425-prime-connection.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-425-prime-connection.md
@@ -1,7 +1,7 @@
---
id: 5900f5151000cf542c510028
title: 'Problem 425: Prime connection'
-challengeType: 5
+challengeType: 1
forumTopicId: 302095
dashedName: problem-425-prime-connection
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-426-box-ball-system.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-426-box-ball-system.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-426-box-ball-system.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-426-box-ball-system.md
index 3f1e34d..332a15a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-426-box-ball-system.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-426-box-ball-system.md
@@ -1,7 +1,7 @@
---
id: 5900f5171000cf542c510029
title: 'Problem 426: Box-ball system'
-challengeType: 5
+challengeType: 1
forumTopicId: 302096
dashedName: problem-426-box-ball-system
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-427-n-sequences.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-427-n-sequences.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-427-n-sequences.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-427-n-sequences.md
index bc840f4..3f244f7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-427-n-sequences.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-427-n-sequences.md
@@ -1,7 +1,7 @@
---
id: 5900f5181000cf542c51002a
title: 'Problem 427: n-sequences'
-challengeType: 5
+challengeType: 1
forumTopicId: 302097
dashedName: problem-427-n-sequences
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-428-necklace-of-circles.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-428-necklace-of-circles.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-428-necklace-of-circles.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-428-necklace-of-circles.md
index 30d46ed..ac3ff6f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-428-necklace-of-circles.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-428-necklace-of-circles.md
@@ -1,7 +1,7 @@
---
id: 5900f5191000cf542c51002b
title: 'Problem 428: Necklace of Circles'
-challengeType: 5
+challengeType: 1
forumTopicId: 302098
dashedName: problem-428-necklace-of-circles
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-429-sum-of-squares-of-unitary-divisors.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-429-sum-of-squares-of-unitary-divisors.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-429-sum-of-squares-of-unitary-divisors.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-429-sum-of-squares-of-unitary-divisors.md
index 8735e80..928c602 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-429-sum-of-squares-of-unitary-divisors.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-429-sum-of-squares-of-unitary-divisors.md
@@ -1,7 +1,7 @@
---
id: 5900f5191000cf542c51002c
title: 'Problem 429: Sum of squares of unitary divisors'
-challengeType: 5
+challengeType: 1
forumTopicId: 302099
dashedName: problem-429-sum-of-squares-of-unitary-divisors
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-430-range-flips.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-430-range-flips.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-430-range-flips.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-430-range-flips.md
index ded4bec..78a6eee 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-430-range-flips.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-430-range-flips.md
@@ -1,7 +1,7 @@
---
id: 5900f51a1000cf542c51002d
title: 'Problem 430: Range flips'
-challengeType: 5
+challengeType: 1
forumTopicId: 302101
dashedName: problem-430-range-flips
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-431-square-space-silo.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-431-square-space-silo.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-431-square-space-silo.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-431-square-space-silo.md
index 96f109a..32bcb7e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-431-square-space-silo.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-431-square-space-silo.md
@@ -1,7 +1,7 @@
---
id: 5900f51b1000cf542c51002e
title: 'Problem 431: Square Space Silo'
-challengeType: 5
+challengeType: 1
forumTopicId: 302102
dashedName: problem-431-square-space-silo
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-432-totient-sum.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-432-totient-sum.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-432-totient-sum.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-432-totient-sum.md
index 845ee38..2a3f5b7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-432-totient-sum.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-432-totient-sum.md
@@ -1,7 +1,7 @@
---
id: 5900f51e1000cf542c510030
title: 'Problem 432: Totient sum'
-challengeType: 5
+challengeType: 1
forumTopicId: 302103
dashedName: problem-432-totient-sum
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-433-steps-in-euclids-algorithm.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-433-steps-in-euclids-algorithm.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-433-steps-in-euclids-algorithm.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-433-steps-in-euclids-algorithm.md
index 1999a6f..d90b355 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-433-steps-in-euclids-algorithm.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-433-steps-in-euclids-algorithm.md
@@ -1,7 +1,7 @@
---
id: 5900f51d1000cf542c51002f
title: 'Problem 433: Steps in Euclid''s algorithm'
-challengeType: 5
+challengeType: 1
forumTopicId: 302104
dashedName: problem-433-steps-in-euclids-algorithm
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-434-rigid-graphs.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-434-rigid-graphs.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-434-rigid-graphs.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-434-rigid-graphs.md
index a598aeb..8c8fa90 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-434-rigid-graphs.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-434-rigid-graphs.md
@@ -1,7 +1,7 @@
---
id: 5900f51f1000cf542c510031
title: 'Problem 434: Rigid graphs'
-challengeType: 5
+challengeType: 1
forumTopicId: 302105
dashedName: problem-434-rigid-graphs
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-435-polynomials-of-fibonacci-numbers.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-435-polynomials-of-fibonacci-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-435-polynomials-of-fibonacci-numbers.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-435-polynomials-of-fibonacci-numbers.md
index 9be0b43..9df767a 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-435-polynomials-of-fibonacci-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-435-polynomials-of-fibonacci-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f5201000cf542c510032
title: 'Problem 435: Polynomials of Fibonacci numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302106
dashedName: problem-435-polynomials-of-fibonacci-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-436-unfair-wager.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-436-unfair-wager.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-436-unfair-wager.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-436-unfair-wager.md
index d5dfcc5..444c6f9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-436-unfair-wager.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-436-unfair-wager.md
@@ -1,7 +1,7 @@
---
id: 5900f5221000cf542c510033
title: 'Problem 436: Unfair wager'
-challengeType: 5
+challengeType: 1
forumTopicId: 302107
dashedName: problem-436-unfair-wager
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-437-fibonacci-primitive-roots.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-437-fibonacci-primitive-roots.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-437-fibonacci-primitive-roots.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-437-fibonacci-primitive-roots.md
index 8a10954..db2aa25 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-437-fibonacci-primitive-roots.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-437-fibonacci-primitive-roots.md
@@ -1,7 +1,7 @@
---
id: 5900f5241000cf542c510036
title: 'Problem 437: Fibonacci primitive roots'
-challengeType: 5
+challengeType: 1
forumTopicId: 302108
dashedName: problem-437-fibonacci-primitive-roots
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-438-integer-part-of-polynomial-equations-solutions.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-438-integer-part-of-polynomial-equations-solutions.md
similarity index 95%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-438-integer-part-of-polynomial-equations-solutions.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-438-integer-part-of-polynomial-equations-solutions.md
index e247069..05c8bd7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-438-integer-part-of-polynomial-equations-solutions.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-438-integer-part-of-polynomial-equations-solutions.md
@@ -1,7 +1,7 @@
---
id: 5900f5231000cf542c510034
title: 'Problem 438: Integer part of polynomial equation''s solutions'
-challengeType: 5
+challengeType: 1
forumTopicId: 302109
dashedName: problem-438-integer-part-of-polynomial-equations-solutions
---
@@ -19,7 +19,7 @@ In the case of $n = 4$, there are 12 $n$-tuples of integers which satisfy both c
We define $S(t)$ as the sum of the absolute values of the integers in $t$.
-For $n = 4$ we can verify that $\sum S(t) = 2087$ for all $n$-tuples t which satisfy both conditions.
+For $n = 4$ we can verify that $\sum S(t) = 2087$ for all $n$-tuples $t$ which satisfy both conditions.
Find $\sum S(t)$ for $n = 7$.
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-439-sum-of-sum-of-divisors.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-439-sum-of-sum-of-divisors.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-439-sum-of-sum-of-divisors.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-439-sum-of-sum-of-divisors.md
index 264dfaf..bb5669e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-439-sum-of-sum-of-divisors.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-439-sum-of-sum-of-divisors.md
@@ -1,7 +1,7 @@
---
id: 5900f5231000cf542c510035
title: 'Problem 439: Sum of sum of divisors'
-challengeType: 5
+challengeType: 1
forumTopicId: 302110
dashedName: problem-439-sum-of-sum-of-divisors
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-440-gcd-and-tiling.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-440-gcd-and-tiling.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-440-gcd-and-tiling.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-440-gcd-and-tiling.md
index 21d7100..91d21dd 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-440-gcd-and-tiling.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-440-gcd-and-tiling.md
@@ -1,7 +1,7 @@
---
id: 5900f5241000cf542c510037
title: 'Problem 440: GCD and Tiling'
-challengeType: 5
+challengeType: 1
forumTopicId: 302112
dashedName: problem-440-gcd-and-tiling
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-441-the-inverse-summation-of-coprime-couples.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-441-the-inverse-summation-of-coprime-couples.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-441-the-inverse-summation-of-coprime-couples.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-441-the-inverse-summation-of-coprime-couples.md
index 4113a4c..9c310a1 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-441-the-inverse-summation-of-coprime-couples.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-441-the-inverse-summation-of-coprime-couples.md
@@ -1,7 +1,7 @@
---
id: 5900f5261000cf542c510038
title: 'Problem 441: The inverse summation of coprime couples'
-challengeType: 5
+challengeType: 1
forumTopicId: 302113
dashedName: problem-441-the-inverse-summation-of-coprime-couples
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-442-eleven-free-integers.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-442-eleven-free-integers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-442-eleven-free-integers.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-442-eleven-free-integers.md
index 3b010b0..9e2e8d9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-442-eleven-free-integers.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-442-eleven-free-integers.md
@@ -1,7 +1,7 @@
---
id: 5900f5271000cf542c510039
title: 'Problem 442: Eleven-free integers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302114
dashedName: problem-442-eleven-free-integers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-443-gcd-sequence.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-443-gcd-sequence.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-443-gcd-sequence.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-443-gcd-sequence.md
index 6c1d01e..d9cfbf0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-443-gcd-sequence.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-443-gcd-sequence.md
@@ -1,7 +1,7 @@
---
id: 5900f5271000cf542c51003a
title: 'Problem 443: GCD sequence'
-challengeType: 5
+challengeType: 1
forumTopicId: 302115
dashedName: problem-443-gcd-sequence
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-444-the-roundtable-lottery.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-444-the-roundtable-lottery.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-444-the-roundtable-lottery.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-444-the-roundtable-lottery.md
index 7ea868f..9e52d4e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-444-the-roundtable-lottery.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-444-the-roundtable-lottery.md
@@ -1,7 +1,7 @@
---
id: 5900f52a1000cf542c51003b
title: 'Problem 444: The Roundtable Lottery'
-challengeType: 5
+challengeType: 1
forumTopicId: 302116
dashedName: problem-444-the-roundtable-lottery
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-445-retractions-a.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-445-retractions-a.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-445-retractions-a.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-445-retractions-a.md
index 678660f..841d379 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-445-retractions-a.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-445-retractions-a.md
@@ -1,7 +1,7 @@
---
id: 5900f52a1000cf542c51003c
title: 'Problem 445: Retractions A'
-challengeType: 5
+challengeType: 1
forumTopicId: 302117
dashedName: problem-445-retractions-a
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-446-retractions-b.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-446-retractions-b.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-446-retractions-b.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-446-retractions-b.md
index 04954f5..f1919d4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-446-retractions-b.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-446-retractions-b.md
@@ -1,7 +1,7 @@
---
id: 5900f52c1000cf542c51003d
title: 'Problem 446: Retractions B'
-challengeType: 5
+challengeType: 1
forumTopicId: 302118
dashedName: problem-446-retractions-b
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-447-retractions-c.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-447-retractions-c.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-447-retractions-c.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-447-retractions-c.md
index 19a690c..882f61f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-447-retractions-c.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-447-retractions-c.md
@@ -1,7 +1,7 @@
---
id: 5900f52c1000cf542c51003e
title: 'Problem 447: Retractions C'
-challengeType: 5
+challengeType: 1
forumTopicId: 302119
dashedName: problem-447-retractions-c
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-448-average-least-common-multiple.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-448-average-least-common-multiple.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-448-average-least-common-multiple.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-448-average-least-common-multiple.md
index 6d551bf..2664396 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-448-average-least-common-multiple.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-448-average-least-common-multiple.md
@@ -1,7 +1,7 @@
---
id: 5900f52c1000cf542c51003f
title: 'Problem 448: Average least common multiple'
-challengeType: 5
+challengeType: 1
forumTopicId: 302120
dashedName: problem-448-average-least-common-multiple
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-449-chocolate-covered-candy.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-449-chocolate-covered-candy.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-449-chocolate-covered-candy.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-449-chocolate-covered-candy.md
index 5983812..f312fd4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-449-chocolate-covered-candy.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-449-chocolate-covered-candy.md
@@ -1,7 +1,7 @@
---
id: 5900f52d1000cf542c510040
title: 'Problem 449: Chocolate covered candy'
-challengeType: 5
+challengeType: 1
forumTopicId: 302121
dashedName: problem-449-chocolate-covered-candy
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-450-hypocycloid-and-lattice-points.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-450-hypocycloid-and-lattice-points.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-450-hypocycloid-and-lattice-points.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-450-hypocycloid-and-lattice-points.md
index 14a94a1..8460397 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-450-hypocycloid-and-lattice-points.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-450-hypocycloid-and-lattice-points.md
@@ -1,7 +1,7 @@
---
id: 5900f52e1000cf542c510041
title: 'Problem 450: Hypocycloid and Lattice points'
-challengeType: 5
+challengeType: 1
forumTopicId: 302123
dashedName: problem-450-hypocycloid-and-lattice-points
---
@@ -30,7 +30,7 @@ $$\begin{align}
&(68, -504),(-1356, 1088), (-1356, -1088), (-1500, 1000), (-1500, -1000)\\}
\end{align}$$
-**Note:** (-625, 0) is not an element of $C(2500, 1000)$ because $\sin(t)$ is not a rational number for the corresponding values of t.
+**Note:** (-625, 0) is not an element of $C(2500, 1000)$ because $\sin(t)$ is not a rational number for the corresponding values of $t$.
$S(3, 1) = (|3| + |0|) + (|-1| + |2|) + (|-1| + |0|) + (|-1| + |-2|) = 10$
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-451-modular-inverses.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-451-modular-inverses.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-451-modular-inverses.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-451-modular-inverses.md
index cb14349..a4f286b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-451-modular-inverses.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-451-modular-inverses.md
@@ -1,7 +1,7 @@
---
id: 5900f5311000cf542c510042
title: 'Problem 451: Modular inverses'
-challengeType: 5
+challengeType: 1
forumTopicId: 302124
dashedName: problem-451-modular-inverses
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-452-long-products.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-452-long-products.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-452-long-products.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-452-long-products.md
index 3224662..abb043b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-452-long-products.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-452-long-products.md
@@ -1,7 +1,7 @@
---
id: 5900f5311000cf542c510043
title: 'Problem 452: Long Products'
-challengeType: 5
+challengeType: 1
forumTopicId: 302125
dashedName: problem-452-long-products
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-453-lattice-quadrilaterals.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-453-lattice-quadrilaterals.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-453-lattice-quadrilaterals.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-453-lattice-quadrilaterals.md
index ef727e2..391f8b8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-453-lattice-quadrilaterals.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-453-lattice-quadrilaterals.md
@@ -1,7 +1,7 @@
---
id: 5900f5311000cf542c510044
title: 'Problem 453: Lattice Quadrilaterals'
-challengeType: 5
+challengeType: 1
forumTopicId: 302126
dashedName: problem-453-lattice-quadrilaterals
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-454-diophantine-reciprocals-iii.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-454-diophantine-reciprocals-iii.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-454-diophantine-reciprocals-iii.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-454-diophantine-reciprocals-iii.md
index 28b97f5..b2fca3b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-454-diophantine-reciprocals-iii.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-454-diophantine-reciprocals-iii.md
@@ -1,7 +1,7 @@
---
id: 5900f5331000cf542c510045
title: 'Problem 454: Diophantine reciprocals III'
-challengeType: 5
+challengeType: 1
forumTopicId: 302127
dashedName: problem-454-diophantine-reciprocals-iii
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-455-powers-with-trailing-digits.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-455-powers-with-trailing-digits.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-455-powers-with-trailing-digits.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-455-powers-with-trailing-digits.md
index 98a769b..1a0f74b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-455-powers-with-trailing-digits.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-455-powers-with-trailing-digits.md
@@ -1,7 +1,7 @@
---
id: 5900f5331000cf542c510046
title: 'Problem 455: Powers With Trailing Digits'
-challengeType: 5
+challengeType: 1
forumTopicId: 302129
dashedName: problem-455-powers-with-trailing-digits
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-456-triangles-containing-the-origin-ii.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-456-triangles-containing-the-origin-ii.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-456-triangles-containing-the-origin-ii.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-456-triangles-containing-the-origin-ii.md
index 3f7e6b5..f4284a8 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-456-triangles-containing-the-origin-ii.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-456-triangles-containing-the-origin-ii.md
@@ -1,7 +1,7 @@
---
id: 5900f5351000cf542c510047
title: 'Problem 456: Triangles containing the origin II'
-challengeType: 5
+challengeType: 1
forumTopicId: 302130
dashedName: problem-456-triangles-containing-the-origin-ii
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-457-a-polynomial-modulo-the-square-of-a-prime.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-457-a-polynomial-modulo-the-square-of-a-prime.md
similarity index 97%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-457-a-polynomial-modulo-the-square-of-a-prime.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-457-a-polynomial-modulo-the-square-of-a-prime.md
index d57d106..b187b6c 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-457-a-polynomial-modulo-the-square-of-a-prime.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-457-a-polynomial-modulo-the-square-of-a-prime.md
@@ -1,7 +1,7 @@
---
id: 5900f5361000cf542c510048
title: 'Problem 457: A polynomial modulo the square of a prime'
-challengeType: 5
+challengeType: 1
forumTopicId: 302131
dashedName: problem-457-a-polynomial-modulo-the-square-of-a-prime
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-458-permutations-of-project.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-458-permutations-of-project.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-458-permutations-of-project.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-458-permutations-of-project.md
index e6abd5b..c368503 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-458-permutations-of-project.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-458-permutations-of-project.md
@@ -1,7 +1,7 @@
---
id: 5900f5361000cf542c510049
title: 'Problem 458: Permutations of Project'
-challengeType: 5
+challengeType: 1
forumTopicId: 302132
dashedName: problem-458-permutations-of-project
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-459-flipping-game.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-459-flipping-game.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-459-flipping-game.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-459-flipping-game.md
index b53ff90..afb2647 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-459-flipping-game.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-459-flipping-game.md
@@ -1,7 +1,7 @@
---
id: 5900f5371000cf542c51004a
title: 'Problem 459: Flipping game'
-challengeType: 5
+challengeType: 1
forumTopicId: 302133
dashedName: problem-459-flipping-game
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-460-an-ant-on-the-move.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-460-an-ant-on-the-move.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-460-an-ant-on-the-move.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-460-an-ant-on-the-move.md
index 5d5e002..4056541 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-460-an-ant-on-the-move.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-460-an-ant-on-the-move.md
@@ -1,7 +1,7 @@
---
id: 5900f5381000cf542c51004b
title: 'Problem 460: An ant on the move'
-challengeType: 5
+challengeType: 1
forumTopicId: 302135
dashedName: problem-460-an-ant-on-the-move
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-461-almost-pi.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-461-almost-pi.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-461-almost-pi.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-461-almost-pi.md
index 10a83e6..8eb0e29 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-461-almost-pi.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-461-almost-pi.md
@@ -1,7 +1,7 @@
---
id: 5900f53a1000cf542c51004c
title: 'Problem 461: Almost Pi'
-challengeType: 5
+challengeType: 1
forumTopicId: 302136
dashedName: problem-461-almost-pi
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-462-permutation-of-3-smooth-numbers.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-462-permutation-of-3-smooth-numbers.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-462-permutation-of-3-smooth-numbers.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-462-permutation-of-3-smooth-numbers.md
index 550715f..b17dc1b 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-462-permutation-of-3-smooth-numbers.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-462-permutation-of-3-smooth-numbers.md
@@ -1,7 +1,7 @@
---
id: 5900f53b1000cf542c51004d
title: 'Problem 462: Permutation of 3-smooth numbers'
-challengeType: 5
+challengeType: 1
forumTopicId: 302137
dashedName: problem-462-permutation-of-3-smooth-numbers
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-463-a-weird-recurrence-relation.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-463-a-weird-recurrence-relation.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-463-a-weird-recurrence-relation.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-463-a-weird-recurrence-relation.md
index 2d12365..168f99d 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-463-a-weird-recurrence-relation.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-463-a-weird-recurrence-relation.md
@@ -1,7 +1,7 @@
---
id: 5900f53c1000cf542c51004e
title: 'Problem 463: A weird recurrence relation'
-challengeType: 5
+challengeType: 1
forumTopicId: 302138
dashedName: problem-463-a-weird-recurrence-relation
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-464-mbius-function-and-intervals.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-464-mbius-function-and-intervals.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-464-mbius-function-and-intervals.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-464-mbius-function-and-intervals.md
index 2e12caa..d293fcd 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-464-mbius-function-and-intervals.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-464-mbius-function-and-intervals.md
@@ -1,7 +1,7 @@
---
id: 5900f53d1000cf542c51004f
title: 'Problem 464: Möbius function and intervals'
-challengeType: 5
+challengeType: 1
forumTopicId: 302139
dashedName: problem-464-mbius-function-and-intervals
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-465-polar-polygons.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-465-polar-polygons.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-465-polar-polygons.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-465-polar-polygons.md
index ac58e07..ec34690 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-465-polar-polygons.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-465-polar-polygons.md
@@ -1,7 +1,7 @@
---
id: 5900f53d1000cf542c510050
title: 'Problem 465: Polar polygons'
-challengeType: 5
+challengeType: 1
forumTopicId: 302140
dashedName: problem-465-polar-polygons
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-466-distinct-terms-in-a-multiplication-table.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-466-distinct-terms-in-a-multiplication-table.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-466-distinct-terms-in-a-multiplication-table.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-466-distinct-terms-in-a-multiplication-table.md
index f578dd0..f362b24 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-466-distinct-terms-in-a-multiplication-table.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-466-distinct-terms-in-a-multiplication-table.md
@@ -1,7 +1,7 @@
---
id: 5900f53e1000cf542c510051
title: 'Problem 466: Distinct terms in a multiplication table'
-challengeType: 5
+challengeType: 1
forumTopicId: 302141
dashedName: problem-466-distinct-terms-in-a-multiplication-table
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-467-superinteger.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-467-superinteger.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-467-superinteger.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-467-superinteger.md
index d237fc9..f3c4693 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-467-superinteger.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-467-superinteger.md
@@ -1,7 +1,7 @@
---
id: 5900f5411000cf542c510052
title: 'Problem 467: Superinteger'
-challengeType: 5
+challengeType: 1
forumTopicId: 302142
dashedName: problem-467-superinteger
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-468-smooth-divisors-of-binomial-coefficients.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-468-smooth-divisors-of-binomial-coefficients.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-468-smooth-divisors-of-binomial-coefficients.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-468-smooth-divisors-of-binomial-coefficients.md
index 369c04b..04f9a16 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-468-smooth-divisors-of-binomial-coefficients.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-468-smooth-divisors-of-binomial-coefficients.md
@@ -1,7 +1,7 @@
---
id: 5900f5411000cf542c510054
title: 'Problem 468: Smooth divisors of binomial coefficients'
-challengeType: 5
+challengeType: 1
forumTopicId: 302143
dashedName: problem-468-smooth-divisors-of-binomial-coefficients
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-469-empty-chairs.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-469-empty-chairs.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-469-empty-chairs.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-469-empty-chairs.md
index d1db21f..3dce49f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-469-empty-chairs.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-469-empty-chairs.md
@@ -1,7 +1,7 @@
---
id: 5900f5411000cf542c510053
title: 'Problem 469: Empty chairs'
-challengeType: 5
+challengeType: 1
forumTopicId: 302144
dashedName: problem-469-empty-chairs
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-470-super-ramvok.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-470-super-ramvok.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-470-super-ramvok.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-470-super-ramvok.md
index a8f59ec..7d0f1aa 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-470-super-ramvok.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-470-super-ramvok.md
@@ -1,7 +1,7 @@
---
id: 5900f5431000cf542c510055
title: 'Problem 470: Super Ramvok'
-challengeType: 5
+challengeType: 1
forumTopicId: 302146
dashedName: problem-470-super-ramvok
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-471-triangle-inscribed-in-ellipse.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-471-triangle-inscribed-in-ellipse.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-471-triangle-inscribed-in-ellipse.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-471-triangle-inscribed-in-ellipse.md
index 7970b9d..da790b7 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-471-triangle-inscribed-in-ellipse.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-471-triangle-inscribed-in-ellipse.md
@@ -1,7 +1,7 @@
---
id: 5900f5431000cf542c510056
title: 'Problem 471: Triangle inscribed in ellipse'
-challengeType: 5
+challengeType: 1
forumTopicId: 302148
dashedName: problem-471-triangle-inscribed-in-ellipse
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-472-comfortable-distance-ii.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-472-comfortable-distance-ii.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-472-comfortable-distance-ii.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-472-comfortable-distance-ii.md
index 0d4c54d..f4a0fe4 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-472-comfortable-distance-ii.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-472-comfortable-distance-ii.md
@@ -1,7 +1,7 @@
---
id: 5900f5451000cf542c510057
title: 'Problem 472: Comfortable Distance II'
-challengeType: 5
+challengeType: 1
forumTopicId: 302149
dashedName: problem-472-comfortable-distance-ii
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-473-phigital-number-base.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-473-phigital-number-base.md
similarity index 93%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-473-phigital-number-base.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-473-phigital-number-base.md
index 0936140..97a545f 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-473-phigital-number-base.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-473-phigital-number-base.md
@@ -1,7 +1,7 @@
---
id: 5900f5461000cf542c510058
title: 'Problem 473: Phigital number base'
-challengeType: 5
+challengeType: 1
forumTopicId: 302150
dashedName: problem-473-phigital-number-base
---
@@ -22,7 +22,7 @@ $2 = \varphi + \varphi^{-2}$ and $3 = \varphi^{2} + \varphi^{-2}$
To represent this sum of powers of $\varphi$ we use a string of 0's and 1's with a point to indicate where the negative exponents start. We call this the representation in the phigital numberbase.
-So $1 = 1_{\varphi}$, $2 = 10.01_{\varphi}$, $3 = 100.01_{\varphi}$ and $14 = 100100.001001_{\varphi}$. The strings representing 1, 2 and 14 in the phigital number base are palindromic, while the string representing 3 is not. (the phigital point is not the middle character).
+So $1 = 1_{\varphi}$, $2 = 10.01_{\varphi}$, $3 = 100.01_{\varphi}$ and $14 = 100100.001001_{\varphi}$. The strings representing 1, 2 and 14 in the phigital number base are palindromic, while the string representing 3 is not (the phigital point is not the middle character).
The sum of the positive integers not exceeding 1000 whose phigital representation is palindromic is 4345.
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-474-last-digits-of-divisors.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-474-last-digits-of-divisors.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-474-last-digits-of-divisors.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-474-last-digits-of-divisors.md
index 04123a2..e63a971 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-474-last-digits-of-divisors.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-474-last-digits-of-divisors.md
@@ -1,7 +1,7 @@
---
id: 5900f5471000cf542c510059
title: 'Problem 474: Last digits of divisors'
-challengeType: 5
+challengeType: 1
forumTopicId: 302151
dashedName: problem-474-last-digits-of-divisors
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-475-music-festival.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-475-music-festival.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-475-music-festival.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-475-music-festival.md
index 4ab0b69..9f019e9 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-475-music-festival.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-475-music-festival.md
@@ -1,7 +1,7 @@
---
id: 5900f5481000cf542c51005a
title: 'Problem 475: Music festival'
-challengeType: 5
+challengeType: 1
forumTopicId: 302152
dashedName: problem-475-music-festival
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-476-circle-packing-ii.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-476-circle-packing-ii.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-476-circle-packing-ii.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-476-circle-packing-ii.md
index b87eca7..c6f88e3 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-476-circle-packing-ii.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-476-circle-packing-ii.md
@@ -1,7 +1,7 @@
---
id: 5900f5481000cf542c51005b
title: 'Problem 476: Circle Packing II'
-challengeType: 5
+challengeType: 1
forumTopicId: 302153
dashedName: problem-476-circle-packing-ii
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-477-number-sequence-game.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-477-number-sequence-game.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-477-number-sequence-game.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-477-number-sequence-game.md
index 24fa79f..18bcc8e 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-477-number-sequence-game.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-477-number-sequence-game.md
@@ -1,7 +1,7 @@
---
id: 5900f54a1000cf542c51005c
title: 'Problem 477: Number Sequence Game'
-challengeType: 5
+challengeType: 1
forumTopicId: 302154
dashedName: problem-477-number-sequence-game
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-478-mixtures.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-478-mixtures.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-478-mixtures.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-478-mixtures.md
index 745aefc..d2f0dbd 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-478-mixtures.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-478-mixtures.md
@@ -1,7 +1,7 @@
---
id: 5900f54c1000cf542c51005e
title: 'Problem 478: Mixtures'
-challengeType: 5
+challengeType: 1
forumTopicId: 302155
dashedName: problem-478-mixtures
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-479-roots-on-the-rise.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-479-roots-on-the-rise.md
similarity index 98%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-479-roots-on-the-rise.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-479-roots-on-the-rise.md
index f2114e5..b905a64 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-479-roots-on-the-rise.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-479-roots-on-the-rise.md
@@ -1,7 +1,7 @@
---
id: 5900f54b1000cf542c51005d
title: 'Problem 479: Roots on the Rise'
-challengeType: 5
+challengeType: 1
forumTopicId: 302156
dashedName: problem-479-roots-on-the-rise
---
diff --git a/.freeCodeCamp/tooling/locales/english/project-euler/problem-480-the-last-question.md b/curriculum/project-euler/project-euler-problems-401-to-480/problem-480-the-last-question.md
similarity index 99%
rename from .freeCodeCamp/tooling/locales/english/project-euler/problem-480-the-last-question.md
rename to curriculum/project-euler/project-euler-problems-401-to-480/problem-480-the-last-question.md
index 56ac54b..fbe75d0 100644
--- a/.freeCodeCamp/tooling/locales/english/project-euler/problem-480-the-last-question.md
+++ b/curriculum/project-euler/project-euler-problems-401-to-480/problem-480-the-last-question.md
@@ -1,7 +1,7 @@
---
id: 5900f54c1000cf542c51005f
title: 'Problem 480: The Last Question'
-challengeType: 5
+challengeType: 1
forumTopicId: 302158
dashedName: problem-480-the-last-question
---
diff --git a/freecodecamp.conf.json b/freecodecamp.conf.json
new file mode 100644
index 0000000..8d2cd86
--- /dev/null
+++ b/freecodecamp.conf.json
@@ -0,0 +1,38 @@
+{
+ "version": "0.1.0",
+ "port": 8080,
+ "client": {
+ "landing": {
+ "english": {
+ "title": "Project Euler in Rust",
+ "description": "Complete the freeCodeCamp Project Euler problems using the Rust programming language with WebAssembly.",
+ "faq-link": "https://www.freecodecamp.org/news/project-euler-problems-in-rust/",
+ "faq-text": "News Guide Article"
+ }
+ }
+ },
+ "config": {
+ "projects.json": "./config/projects.json",
+ "state.json": "./config/state.json"
+ },
+ "curriculum": {
+ "locales": {
+ "english": "./curriculum/locales/english"
+ }
+ },
+ "hotReload": {
+ "ignore": [
+ ".logs/.temp.log",
+ "config/",
+ "/node_modules/",
+ ".git",
+ "/target/",
+ "/test-ledger/",
+ ".vscode",
+ "freecodecamp.conf.json"
+ ]
+ },
+ "tooling": {
+ "helpers": "./tooling/helpers.js"
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index 1bec753..3f192b6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,460 +1,33 @@
{
- "name": "curriculum",
+ "name": "euler-rust",
"version": "1.0.0",
- "lockfileVersion": 2,
+ "lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "curriculum",
+ "name": "euler-rust",
"version": "1.0.0",
- "license": "ISC",
- "devDependencies": {
- "webpack": "5.89.0",
- "webpack-cli": "4.10.0",
- "webpack-dev-server": "4.15.1"
- }
- },
- "node_modules/@discoveryjs/json-ext": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz",
- "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
- "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
+ "@freecodecamp/freecodecamp-os": "3.1.0"
}
},
- "node_modules/@jridgewell/resolve-uri": {
+ "node_modules/@freecodecamp/freecodecamp-os": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz",
- "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.18",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
- "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
- }
- },
- "node_modules/@leichtgewicht/ip-codec": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz",
- "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==",
- "dev": true
- },
- "node_modules/@types/body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
- "dev": true,
- "dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/bonjour": {
- "version": "3.5.10",
- "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
- "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect-history-api-fallback": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
- "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
- "dev": true,
- "dependencies": {
- "@types/express-serve-static-core": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/eslint": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
- "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
- "dev": true,
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "node_modules/@types/eslint-scope": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
- "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
- "dev": true,
- "dependencies": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
- "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
- "dev": true
- },
- "node_modules/@types/express": {
- "version": "4.17.13",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
- "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
- "dev": true,
- "dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.18",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "node_modules/@types/express-serve-static-core": {
- "version": "4.17.28",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
- "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
- "dev": true,
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
- "node_modules/@types/http-proxy": {
- "version": "1.17.8",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
- "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.9",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
- "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
- "dev": true
- },
- "node_modules/@types/mime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
- "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
- "dev": true
- },
- "node_modules/@types/node": {
- "version": "17.0.18",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz",
- "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==",
- "dev": true
- },
- "node_modules/@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
- "dev": true
- },
- "node_modules/@types/range-parser": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
- "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
- "dev": true
- },
- "node_modules/@types/retry": {
- "version": "0.12.1",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
- "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
- "dev": true
- },
- "node_modules/@types/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
- "dev": true,
- "dependencies": {
- "@types/express": "*"
- }
- },
- "node_modules/@types/serve-static": {
- "version": "1.13.10",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
- "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
- "dev": true,
- "dependencies": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "node_modules/@types/sockjs": {
- "version": "0.3.33",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
- "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/ws": {
- "version": "8.5.5",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz",
- "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@webassemblyjs/ast": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz",
- "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/helper-numbers": "1.11.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.5"
- }
- },
- "node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz",
- "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==",
- "dev": true
- },
- "node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz",
- "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==",
- "dev": true
- },
- "node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz",
- "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==",
- "dev": true
- },
- "node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz",
- "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.5",
- "@webassemblyjs/helper-api-error": "1.11.5",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz",
- "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==",
- "dev": true
- },
- "node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz",
- "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.5",
- "@webassemblyjs/helper-buffer": "1.11.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
- "@webassemblyjs/wasm-gen": "1.11.5"
- }
- },
- "node_modules/@webassemblyjs/ieee754": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz",
- "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==",
- "dev": true,
- "dependencies": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "node_modules/@webassemblyjs/leb128": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz",
- "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==",
- "dev": true,
- "dependencies": {
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/utf8": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz",
- "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==",
- "dev": true
- },
- "node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz",
- "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.5",
- "@webassemblyjs/helper-buffer": "1.11.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
- "@webassemblyjs/helper-wasm-section": "1.11.5",
- "@webassemblyjs/wasm-gen": "1.11.5",
- "@webassemblyjs/wasm-opt": "1.11.5",
- "@webassemblyjs/wasm-parser": "1.11.5",
- "@webassemblyjs/wast-printer": "1.11.5"
- }
- },
- "node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz",
- "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
- "@webassemblyjs/ieee754": "1.11.5",
- "@webassemblyjs/leb128": "1.11.5",
- "@webassemblyjs/utf8": "1.11.5"
- }
- },
- "node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz",
- "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.5",
- "@webassemblyjs/helper-buffer": "1.11.5",
- "@webassemblyjs/wasm-gen": "1.11.5",
- "@webassemblyjs/wasm-parser": "1.11.5"
- }
- },
- "node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz",
- "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.5",
- "@webassemblyjs/helper-api-error": "1.11.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
- "@webassemblyjs/ieee754": "1.11.5",
- "@webassemblyjs/leb128": "1.11.5",
- "@webassemblyjs/utf8": "1.11.5"
- }
- },
- "node_modules/@webassemblyjs/wast-printer": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz",
- "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/@freecodecamp/freecodecamp-os/-/freecodecamp-os-3.1.0.tgz",
+ "integrity": "sha512-J+af+LEsNxnAQXj4oKuBbcezcmx5ObllRwD/ZvsSUKyf9m4DzZx1vPXo+B4A5h+fdlNV13fAz5nOzXC2YFosLQ==",
"dependencies": {
- "@webassemblyjs/ast": "1.11.5",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webpack-cli/configtest": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
- "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
- "dev": true,
- "peerDependencies": {
- "webpack": "4.x.x || 5.x.x",
- "webpack-cli": "4.x.x"
- }
- },
- "node_modules/@webpack-cli/info": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
- "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
- "dev": true,
- "dependencies": {
- "envinfo": "^7.7.3"
- },
- "peerDependencies": {
- "webpack-cli": "4.x.x"
- }
- },
- "node_modules/@webpack-cli/serve": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
- "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
- "dev": true,
- "peerDependencies": {
- "webpack-cli": "4.x.x"
- },
- "peerDependenciesMeta": {
- "webpack-dev-server": {
- "optional": true
- }
+ "chai": "4.4.1",
+ "chokidar": "3.5.3",
+ "express": "4.18.2",
+ "logover": "2.0.0",
+ "ws": "8.16.0"
}
},
- "node_modules/@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true
- },
- "node_modules/@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "dev": true
- },
"node_modules/accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dev": true,
"dependencies": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
@@ -463,108 +36,10 @@
"node": ">= 0.6"
}
},
- "node_modules/acorn": {
- "version": "8.8.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
- "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-import-assertions": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
- "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
- "dev": true,
- "peerDependencies": {
- "acorn": "^8"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dev": true,
- "dependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependenciesMeta": {
- "ajv": {
- "optional": true
- }
- }
- },
- "node_modules/ajv-formats/node_modules/ajv": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
- "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
- "dev": true,
- "engines": [
- "node >= 0.8.0"
- ],
- "bin": {
- "ansi-html": "bin/ansi-html"
- }
- },
"node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@@ -574,114 +49,53 @@
}
},
"node_modules/array-flatten": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
- "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
- "dev": true
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
- "node_modules/batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
- "dev": true
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "engines": {
+ "node": "*"
+ }
},
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
- "dev": true,
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.8.1",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
"iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.9.7",
- "raw-body": "2.4.3",
- "type-is": "~1.6.18"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/body-parser/node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/bonjour-service": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz",
- "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==",
- "dev": true,
- "dependencies": {
- "array-flatten": "^2.1.2",
- "dns-equal": "^1.0.0",
- "fast-deep-equal": "^3.1.3",
- "multicast-dns": "^7.2.4"
- }
- },
- "node_modules/bonjour-service/node_modules/dns-packet": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz",
- "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==",
- "dev": true,
- "dependencies": {
- "@leichtgewicht/ip-codec": "^2.0.1"
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
},
"engines": {
- "node": ">=6"
- }
- },
- "node_modules/bonjour-service/node_modules/multicast-dns": {
- "version": "7.2.4",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz",
- "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==",
- "dev": true,
- "dependencies": {
- "dns-packet": "^5.2.2",
- "thunky": "^1.0.2"
- },
- "bin": {
- "multicast-dns": "cli.js"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
"dependencies": {
"fill-range": "^7.0.1"
},
@@ -689,59 +103,63 @@
"node": ">=8"
}
},
- "node_modules/browserslist": {
- "version": "4.19.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz",
- "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==",
- "dev": true,
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz",
+ "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==",
"dependencies": {
- "caniuse-lite": "^1.0.30001312",
- "electron-to-chromium": "^1.4.71",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.2",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "browserslist": "cli.js"
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.3",
+ "set-function-length": "^1.2.0"
},
"engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ "node": ">= 0.4"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "node_modules/bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
- "dev": true,
+ "node_modules/chai": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
+ "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==",
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.3",
+ "deep-eql": "^4.1.3",
+ "get-func-name": "^2.0.2",
+ "loupe": "^2.3.6",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.8"
+ },
"engines": {
- "node": ">= 0.8"
+ "node": ">=4"
}
},
- "node_modules/caniuse-lite": {
- "version": "1.0.30001312",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
- "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
+ "node_modules/check-error": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "dependencies": {
+ "get-func-name": "^2.0.2"
+ },
+ "engines": {
+ "node": "*"
}
},
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
"funding": [
{
"type": "individual",
@@ -764,395 +182,155 @@
"fsevents": "~2.3.2"
}
},
- "node_modules/chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "dev": true,
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dev": true,
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"dependencies": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
+ "safe-buffer": "5.2.1"
},
"engines": {
- "node": ">=6"
+ "node": ">= 0.6"
}
},
- "node_modules/colorette": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
- "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
- "dev": true
- },
- "node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "dev": true,
- "dependencies": {
- "mime-db": ">= 1.43.0 < 2"
- },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "dev": true,
- "dependencies": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"engines": {
- "node": ">= 0.8.0"
+ "node": ">= 0.6"
}
},
- "node_modules/compression/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "node_modules/connect-history-api-fallback": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
- "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
- "dev": true
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
"dependencies": {
"ms": "2.0.0"
}
},
- "node_modules/default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "dev": true,
+ "node_modules/deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
"dependencies": {
- "execa": "^5.0.0"
+ "type-detect": "^4.0.0"
},
"engines": {
- "node": ">= 10"
+ "node": ">=6"
}
},
- "node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "dev": true,
+ "node_modules/define-data-property": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz",
+ "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.2",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.1"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
}
},
"node_modules/depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "dev": true,
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8"
}
},
"node_modules/destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
- "dev": true
- },
- "node_modules/detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "dev": true
- },
- "node_modules/dns-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
- "dev": true
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
- "dev": true
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.71",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz",
- "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==",
- "dev": true
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
- "dev": true,
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"engines": {
"node": ">= 0.8"
}
},
- "node_modules/enhanced-resolve": {
- "version": "5.15.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
- "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/envinfo": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
- "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
- "dev": true,
- "bin": {
- "envinfo": "dist/cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/es-module-lexer": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz",
- "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==",
- "dev": true
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
- "dev": true
- },
- "node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
- "dev": true,
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true,
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
"node_modules/express": {
- "version": "4.17.3",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
- "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
- "dev": true,
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.19.2",
+ "body-parser": "1.20.1",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.4.2",
+ "cookie": "0.5.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
- "depd": "~1.1.2",
+ "depd": "2.0.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "finalhandler": "~1.1.2",
+ "finalhandler": "1.2.0",
"fresh": "0.5.2",
+ "http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
- "on-finished": "~2.3.0",
+ "on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
- "qs": "6.9.7",
+ "qs": "6.11.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
- "send": "0.17.2",
- "serve-static": "1.14.2",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
"setprototypeof": "1.2.0",
- "statuses": "~1.5.0",
+ "statuses": "2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
@@ -1161,47 +339,10 @@
"node": ">= 0.10.0"
}
},
- "node_modules/express/node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
- "dev": true
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "node_modules/fastest-levenshtein": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
- "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
- "dev": true
- },
- "node_modules/faye-websocket": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "dev": true,
- "dependencies": {
- "websocket-driver": ">=0.5.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -1210,61 +351,26 @@
}
},
"node_modules/finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
- "dev": true,
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
+ "on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "statuses": "~1.5.0",
+ "statuses": "2.0.1",
"unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.14.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
- "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "dev": true,
"engines": {
"node": ">= 0.6"
}
@@ -1272,29 +378,15 @@
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
- "dev": true,
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/fs-monkey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
- "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==",
- "dev": true
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
"node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"hasInstallScript": true,
"optional": true,
"os": [
@@ -1305,48 +397,43 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": "*"
}
},
- "node_modules/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
},
"engines": {
- "node": "*"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -1354,173 +441,80 @@
"node": ">= 6"
}
},
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "dev": true
- },
- "node_modules/graceful-fs": {
- "version": "4.2.9",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
- "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
- "dev": true
- },
- "node_modules/handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
- "dev": true
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dependencies": {
- "function-bind": "^1.1.1"
+ "get-intrinsic": "^1.1.3"
},
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/hpack.js/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
"dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "get-intrinsic": "^1.2.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/hpack.js/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/hpack.js/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/html-entities": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz",
- "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==",
- "dev": true
- },
- "node_modules/http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
- "dev": true
- },
- "node_modules/http-errors": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
- "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
- "dev": true,
- "dependencies": {
- "depd": "~1.1.2",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.1"
- },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/http-parser-js": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz",
- "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==",
- "dev": true
- },
- "node_modules/http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "dev": true,
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
"dependencies": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
+ "function-bind": "^1.1.2"
},
"engines": {
- "node": ">=8.0.0"
+ "node": ">= 0.4"
}
},
- "node_modules/http-proxy-middleware": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz",
- "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==",
- "dev": true,
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dependencies": {
- "@types/http-proxy": "^1.17.8",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "@types/express": "^4.17.13"
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
},
- "peerDependenciesMeta": {
- "@types/express": {
- "optional": true
- }
- }
- },
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
"engines": {
- "node": ">=10.17.0"
+ "node": ">= 0.8"
}
},
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
@@ -1528,64 +522,23 @@
"node": ">=0.10.0"
}
},
- "node_modules/import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
- "dev": true,
- "dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- },
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/interpret": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
- "dev": true,
- "engines": {
- "node": ">= 0.10"
- }
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/ipaddr.js": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
- "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
- "dev": true,
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"engines": {
- "node": ">= 10"
+ "node": ">= 0.10"
}
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
"dependencies": {
"binary-extensions": "^2.0.0"
},
@@ -1593,38 +546,10 @@
"node": ">=8"
}
},
- "node_modules/is-core-module": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
- "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "dev": true,
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true,
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"engines": {
"node": ">=0.10.0"
}
@@ -1633,7 +558,6 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -1645,206 +569,48 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
"engines": {
"node": ">=0.12.0"
}
},
- "node_modules/is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "node_modules/isexe": {
+ "node_modules/logover": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/launch-editor": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz",
- "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==",
- "dev": true,
- "dependencies": {
- "picocolors": "^1.0.0",
- "shell-quote": "^1.7.3"
- }
- },
- "node_modules/loader-runner": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
- "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
- "dev": true,
- "engines": {
- "node": ">=6.11.5"
- }
+ "resolved": "https://registry.npmjs.org/logover/-/logover-2.0.0.tgz",
+ "integrity": "sha512-LZOEXlRUb7uDDfq34kFjt8HTnjxXcFgvd/rsl3TO+mBHtTC5JGNMVh7H3FkaBO0OecsuDMRU+15zyiZdo8z/+g=="
},
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
+ "node_modules/loupe": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
+ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
"dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
+ "get-func-name": "^2.0.1"
}
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
- "dev": true,
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/memfs": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
- "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
- "dev": true,
- "dependencies": {
- "fs-monkey": "1.0.3"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
- "dev": true
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
},
"node_modules/methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
- "dev": true,
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true,
"bin": {
"mime": "cli.js"
},
@@ -1853,121 +619,57 @@
}
},
"node_modules/mime-db": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
- "dev": true,
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
- "version": "2.1.34",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
- "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
- "dev": true,
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
- "mime-db": "1.51.0"
+ "mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "dev": true,
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
- },
- "node_modules/node-forge": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz",
- "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==",
- "dev": true,
- "engines": {
- "node": ">= 6.13.0"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
- "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
- "dev": true
- },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
+ "node_modules/object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
- "dev": true
- },
"node_modules/on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "dev": true,
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dependencies": {
"ee-first": "1.1.1"
},
@@ -1975,164 +677,31 @@
"node": ">= 0.8"
}
},
- "node_modules/on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/open": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
- "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
- "dev": true,
- "dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-retry": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
- "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
- "dev": true,
- "dependencies": {
- "@types/retry": "^0.12.0",
- "retry": "^0.13.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true,
"engines": {
"node": ">= 0.8"
}
},
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
- "dev": true
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "engines": {
+ "node": "*"
+ }
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
"engines": {
"node": ">=8.6"
},
@@ -2140,29 +709,10 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "dependencies": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dev": true,
"dependencies": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
@@ -2171,29 +721,13 @@
"node": ">= 0.10"
}
},
- "node_modules/proxy-addr/node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
- "dev": true,
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
"engines": {
"node": ">=0.6"
},
@@ -2201,32 +735,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/raw-body": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
- "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
- "dev": true,
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"dependencies": {
"bytes": "3.1.2",
- "http-errors": "1.8.1",
+ "http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
@@ -2234,34 +757,10 @@
"node": ">= 0.8"
}
},
- "node_modules/raw-body/node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
"dependencies": {
"picomatch": "^2.2.1"
},
@@ -2269,100 +768,10 @@
"node": ">=8.10.0"
}
},
- "node_modules/rechoir": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
- "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
- "dev": true,
- "dependencies": {
- "resolve": "^1.9.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "dev": true
- },
- "node_modules/resolve": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
- "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.8.1",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dev": true,
- "dependencies": {
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
"funding": [
{
"type": "github",
@@ -2381,64 +790,26 @@
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
- "node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dev": true,
+ "node_modules/send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
- "dev": true
- },
- "node_modules/selfsigned": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz",
- "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==",
- "dev": true,
- "dependencies": {
- "node-forge": "^1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/send": {
- "version": "0.17.2",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
- "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
- "dev": true,
- "dependencies": {
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "destroy": "~1.0.4",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "1.8.1",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.1",
- "statuses": "~1.5.0"
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
},
"engines": {
"node": ">= 0.8.0"
@@ -2447,364 +818,67 @@
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
- "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
- "dev": true,
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "dev": true,
- "dependencies": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/serve-index/node_modules/http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "dev": true,
- "dependencies": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-index/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- },
- "node_modules/serve-index/node_modules/setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "dev": true
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/serve-static": {
- "version": "1.14.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
- "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
- "dev": true,
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"dependencies": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
- "send": "0.17.2"
+ "send": "0.18.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
- "node_modules/setprototypeof": {
+ "node_modules/set-function-length": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true
- },
- "node_modules/shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "dev": true,
- "dependencies": {
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shell-quote": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
- "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "node_modules/sockjs": {
- "version": "0.3.24",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
- "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
- "dev": true,
- "dependencies": {
- "faye-websocket": "^0.11.3",
- "uuid": "^8.3.2",
- "websocket-driver": "^0.7.4"
- }
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- }
- },
- "node_modules/spdy-transport/node_modules/debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/spdy-transport/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/spdy/node_modules/debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz",
+ "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==",
"dependencies": {
- "ms": "2.1.2"
+ "define-data-property": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.2",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.1"
},
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/spdy/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.2.0"
+ "node": ">= 0.4"
}
},
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
- "node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/terser": {
- "version": "5.16.9",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz",
- "integrity": "sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==",
- "dev": true,
- "dependencies": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser-webpack-plugin": {
- "version": "5.3.7",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz",
- "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.17",
- "jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.1",
- "terser": "^5.16.5"
- },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "uglify-js": {
- "optional": true
- }
+ "node": ">= 0.8"
}
},
- "node_modules/thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
- "dev": true
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
"dependencies": {
"is-number": "^7.0.0"
},
@@ -2816,16 +890,22 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true,
"engines": {
"node": ">=0.6"
}
},
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dev": true,
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
@@ -2837,2997 +917,46 @@
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
- "dev": true,
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"engines": {
"node": ">= 0.8"
}
},
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "dev": true,
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
"engines": {
"node": ">= 0.4.0"
}
},
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "dev": true,
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"engines": {
"node": ">= 0.8"
}
},
- "node_modules/watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
- "dev": true,
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "dev": true,
- "dependencies": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "node_modules/webpack": {
- "version": "5.89.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
- "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
- "dev": true,
- "dependencies": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^1.0.0",
- "@webassemblyjs/ast": "^1.11.5",
- "@webassemblyjs/wasm-edit": "^1.11.5",
- "@webassemblyjs/wasm-parser": "^1.11.5",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.9.0",
- "browserslist": "^4.14.5",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.15.0",
- "es-module-lexer": "^1.2.1",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.9",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.2.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.3.7",
- "watchpack": "^2.4.0",
- "webpack-sources": "^3.2.3"
- },
- "bin": {
- "webpack": "bin/webpack.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-cli": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
- "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
- "dev": true,
- "dependencies": {
- "@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.2.0",
- "@webpack-cli/info": "^1.5.0",
- "@webpack-cli/serve": "^1.7.0",
- "colorette": "^2.0.14",
- "commander": "^7.0.0",
- "cross-spawn": "^7.0.3",
- "fastest-levenshtein": "^1.0.12",
- "import-local": "^3.0.2",
- "interpret": "^2.2.0",
- "rechoir": "^0.7.0",
- "webpack-merge": "^5.7.3"
- },
- "bin": {
- "webpack-cli": "bin/cli.js"
- },
+ "node_modules/ws": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
+ "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
"engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
+ "node": ">=10.0.0"
},
"peerDependencies": {
- "webpack": "4.x.x || 5.x.x"
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
- "@webpack-cli/generators": {
- "optional": true
- },
- "@webpack-cli/migrate": {
- "optional": true
- },
- "webpack-bundle-analyzer": {
+ "bufferutil": {
"optional": true
},
- "webpack-dev-server": {
+ "utf-8-validate": {
"optional": true
}
}
- },
- "node_modules/webpack-cli/node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "dev": true,
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/webpack-dev-middleware": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz",
- "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==",
- "dev": true,
- "dependencies": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.1",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/webpack-dev-middleware/node_modules/ajv": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
- "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "node_modules/webpack-dev-middleware/node_modules/schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/webpack-dev-server": {
- "version": "4.15.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz",
- "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==",
- "dev": true,
- "dependencies": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/express": "^4.17.13",
- "@types/serve-index": "^1.9.1",
- "@types/serve-static": "^1.13.10",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.5.5",
- "ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.0.11",
- "chokidar": "^3.5.3",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.0.1",
- "launch-editor": "^2.6.0",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "rimraf": "^3.0.2",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.1.1",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.24",
- "spdy": "^4.0.2",
- "webpack-dev-middleware": "^5.3.1",
- "ws": "^8.13.0"
- },
- "bin": {
- "webpack-dev-server": "bin/webpack-dev-server.js"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.37.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "webpack": {
- "optional": true
- },
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-dev-server/node_modules/ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/webpack-dev-server/node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "node_modules/webpack-dev-server/node_modules/schema-utils": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.1.0.tgz",
- "integrity": "sha512-Jw+GZVbP5IggB2WAn6UHI02LBwGmsIeYN/lNbSMZyDziQ7jmtAUrqKqDja+W89YHVs+KL/3IkIMltAklqB1vAw==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/webpack-merge": {
- "version": "5.8.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
- "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
- "dev": true,
- "dependencies": {
- "clone-deep": "^4.0.1",
- "wildcard": "^2.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "dev": true,
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "dev": true,
- "dependencies": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wildcard": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
- "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
- "dev": true
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "node_modules/ws": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
- "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- }
- },
- "dependencies": {
- "@discoveryjs/json-ext": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz",
- "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==",
- "dev": true
- },
- "@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
- "dev": true,
- "requires": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "dev": true
- },
- "@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true
- },
- "@jridgewell/source-map": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz",
- "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==",
- "dev": true,
- "requires": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
- "dev": true
- },
- "@jridgewell/trace-mapping": {
- "version": "0.3.18",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
- "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
- "dev": true,
- "requires": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
- }
- },
- "@leichtgewicht/ip-codec": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz",
- "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==",
- "dev": true
- },
- "@types/body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
- "dev": true,
- "requires": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "@types/bonjour": {
- "version": "3.5.10",
- "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
- "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/connect-history-api-fallback": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
- "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
- "dev": true,
- "requires": {
- "@types/express-serve-static-core": "*",
- "@types/node": "*"
- }
- },
- "@types/eslint": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
- "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
- "dev": true,
- "requires": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "@types/eslint-scope": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
- "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
- "dev": true,
- "requires": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "@types/estree": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
- "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
- "dev": true
- },
- "@types/express": {
- "version": "4.17.13",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
- "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
- "dev": true,
- "requires": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.18",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "@types/express-serve-static-core": {
- "version": "4.17.28",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
- "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
- "@types/http-proxy": {
- "version": "1.17.8",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
- "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/json-schema": {
- "version": "7.0.9",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
- "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
- "dev": true
- },
- "@types/mime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
- "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
- "dev": true
- },
- "@types/node": {
- "version": "17.0.18",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz",
- "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==",
- "dev": true
- },
- "@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
- "dev": true
- },
- "@types/range-parser": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
- "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
- "dev": true
- },
- "@types/retry": {
- "version": "0.12.1",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
- "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
- "dev": true
- },
- "@types/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
- "dev": true,
- "requires": {
- "@types/express": "*"
- }
- },
- "@types/serve-static": {
- "version": "1.13.10",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
- "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
- "dev": true,
- "requires": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "@types/sockjs": {
- "version": "0.3.33",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
- "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/ws": {
- "version": "8.5.5",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz",
- "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@webassemblyjs/ast": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz",
- "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==",
- "dev": true,
- "requires": {
- "@webassemblyjs/helper-numbers": "1.11.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.5"
- }
- },
- "@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz",
- "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==",
- "dev": true
- },
- "@webassemblyjs/helper-api-error": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz",
- "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==",
- "dev": true
- },
- "@webassemblyjs/helper-buffer": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz",
- "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==",
- "dev": true
- },
- "@webassemblyjs/helper-numbers": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz",
- "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==",
- "dev": true,
- "requires": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.5",
- "@webassemblyjs/helper-api-error": "1.11.5",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz",
- "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==",
- "dev": true
- },
- "@webassemblyjs/helper-wasm-section": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz",
- "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.5",
- "@webassemblyjs/helper-buffer": "1.11.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
- "@webassemblyjs/wasm-gen": "1.11.5"
- }
- },
- "@webassemblyjs/ieee754": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz",
- "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==",
- "dev": true,
- "requires": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "@webassemblyjs/leb128": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz",
- "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==",
- "dev": true,
- "requires": {
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/utf8": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz",
- "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==",
- "dev": true
- },
- "@webassemblyjs/wasm-edit": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz",
- "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.5",
- "@webassemblyjs/helper-buffer": "1.11.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
- "@webassemblyjs/helper-wasm-section": "1.11.5",
- "@webassemblyjs/wasm-gen": "1.11.5",
- "@webassemblyjs/wasm-opt": "1.11.5",
- "@webassemblyjs/wasm-parser": "1.11.5",
- "@webassemblyjs/wast-printer": "1.11.5"
- }
- },
- "@webassemblyjs/wasm-gen": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz",
- "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
- "@webassemblyjs/ieee754": "1.11.5",
- "@webassemblyjs/leb128": "1.11.5",
- "@webassemblyjs/utf8": "1.11.5"
- }
- },
- "@webassemblyjs/wasm-opt": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz",
- "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.5",
- "@webassemblyjs/helper-buffer": "1.11.5",
- "@webassemblyjs/wasm-gen": "1.11.5",
- "@webassemblyjs/wasm-parser": "1.11.5"
- }
- },
- "@webassemblyjs/wasm-parser": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz",
- "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.5",
- "@webassemblyjs/helper-api-error": "1.11.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.5",
- "@webassemblyjs/ieee754": "1.11.5",
- "@webassemblyjs/leb128": "1.11.5",
- "@webassemblyjs/utf8": "1.11.5"
- }
- },
- "@webassemblyjs/wast-printer": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz",
- "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.5",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webpack-cli/configtest": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
- "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
- "dev": true,
- "requires": {}
- },
- "@webpack-cli/info": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
- "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
- "dev": true,
- "requires": {
- "envinfo": "^7.7.3"
- }
- },
- "@webpack-cli/serve": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
- "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
- "dev": true,
- "requires": {}
- },
- "@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true
- },
- "@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "dev": true
- },
- "accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dev": true,
- "requires": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- }
- },
- "acorn": {
- "version": "8.8.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
- "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
- "dev": true
- },
- "acorn-import-assertions": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
- "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
- "dev": true,
- "requires": {}
- },
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dev": true,
- "requires": {
- "ajv": "^8.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
- "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- }
- }
- },
- "ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "requires": {}
- },
- "ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
- "dev": true
- },
- "anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "array-flatten": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
- "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
- "dev": true
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true
- },
- "body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
- "dev": true,
- "requires": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.8.1",
- "iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.9.7",
- "raw-body": "2.4.3",
- "type-is": "~1.6.18"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true
- }
- }
- },
- "bonjour-service": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz",
- "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==",
- "dev": true,
- "requires": {
- "array-flatten": "^2.1.2",
- "dns-equal": "^1.0.0",
- "fast-deep-equal": "^3.1.3",
- "multicast-dns": "^7.2.4"
- },
- "dependencies": {
- "dns-packet": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz",
- "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==",
- "dev": true,
- "requires": {
- "@leichtgewicht/ip-codec": "^2.0.1"
- }
- },
- "multicast-dns": {
- "version": "7.2.4",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz",
- "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==",
- "dev": true,
- "requires": {
- "dns-packet": "^5.2.2",
- "thunky": "^1.0.2"
- }
- }
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "browserslist": {
- "version": "4.19.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz",
- "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30001312",
- "electron-to-chromium": "^1.4.71",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.2",
- "picocolors": "^1.0.0"
- }
- },
- "buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
- "dev": true
- },
- "caniuse-lite": {
- "version": "1.0.30001312",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
- "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
- "dev": true
- },
- "chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- }
- },
- "chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "dev": true
- },
- "clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- }
- },
- "colorette": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
- "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
- "dev": true
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "dev": true,
- "requires": {
- "mime-db": ">= 1.43.0 < 2"
- }
- },
- "compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "dev": true,
- "requires": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- }
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "connect-history-api-fallback": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
- "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
- "dev": true
- },
- "content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "5.2.1"
- }
- },
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
- "dev": true
- },
- "cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
- "dev": true
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "dev": true,
- "requires": {
- "execa": "^5.0.0"
- }
- },
- "define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "dev": true
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "dev": true
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
- "dev": true
- },
- "detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "dev": true
- },
- "dns-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
- "dev": true
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
- "dev": true
- },
- "electron-to-chromium": {
- "version": "1.4.71",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz",
- "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==",
- "dev": true
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
- "dev": true
- },
- "enhanced-resolve": {
- "version": "5.15.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
- "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- }
- },
- "envinfo": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
- "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
- "dev": true
- },
- "es-module-lexer": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz",
- "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==",
- "dev": true
- },
- "escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
- "dev": true
- },
- "eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- }
- },
- "esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "requires": {
- "estraverse": "^5.2.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true
- }
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
- "dev": true
- },
- "eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true
- },
- "events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true
- },
- "execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- }
- },
- "express": {
- "version": "4.17.3",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
- "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
- "dev": true,
- "requires": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.19.2",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.4.2",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "~1.1.2",
- "fresh": "0.5.2",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.9.7",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.17.2",
- "serve-static": "1.14.2",
- "setprototypeof": "1.2.0",
- "statuses": "~1.5.0",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
- "dev": true
- }
- }
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "fastest-levenshtein": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
- "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
- "dev": true
- },
- "faye-websocket": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "dev": true,
- "requires": {
- "websocket-driver": ">=0.5.1"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "statuses": "~1.5.0",
- "unpipe": "~1.0.0"
- }
- },
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "follow-redirects": {
- "version": "1.14.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
- "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==",
- "dev": true
- },
- "forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "dev": true
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
- "dev": true
- },
- "fs-monkey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
- "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==",
- "dev": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true
- },
- "glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "dev": true
- },
- "graceful-fs": {
- "version": "4.2.9",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
- "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
- "dev": true
- },
- "handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
- "dev": true
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "html-entities": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz",
- "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==",
- "dev": true
- },
- "http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
- "dev": true
- },
- "http-errors": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
- "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
- "dev": true,
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.1"
- }
- },
- "http-parser-js": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz",
- "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==",
- "dev": true
- },
- "http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "dev": true,
- "requires": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- }
- },
- "http-proxy-middleware": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz",
- "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==",
- "dev": true,
- "requires": {
- "@types/http-proxy": "^1.17.8",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- }
- },
- "human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
- "dev": true,
- "requires": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "interpret": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
- "dev": true
- },
- "ipaddr.js": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
- "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
- "dev": true
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-core-module": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
- "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "dev": true
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "dev": true
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true
- },
- "is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "requires": {
- "is-docker": "^2.0.0"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- }
- },
- "json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- },
- "launch-editor": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz",
- "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==",
- "dev": true,
- "requires": {
- "picocolors": "^1.0.0",
- "shell-quote": "^1.7.3"
- }
- },
- "loader-runner": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
- "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
- "dev": true
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
- "dev": true
- },
- "memfs": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
- "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
- "dev": true,
- "requires": {
- "fs-monkey": "1.0.3"
- }
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
- "dev": true
- },
- "merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- }
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true
- },
- "mime-db": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.34",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
- "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
- "dev": true,
- "requires": {
- "mime-db": "1.51.0"
- }
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "dev": true
- },
- "neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
- },
- "node-forge": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz",
- "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==",
- "dev": true
- },
- "node-releases": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
- "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
- "dev": true
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "requires": {
- "path-key": "^3.0.0"
- }
- },
- "obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
- "dev": true
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "dev": true,
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
- "dev": true
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "open": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
- "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
- "dev": true,
- "requires": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "p-retry": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
- "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
- "dev": true,
- "requires": {
- "@types/retry": "^0.12.0",
- "retry": "^0.13.1"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
- "dev": true
- },
- "picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true
- },
- "pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "requires": {
- "find-up": "^4.0.0"
- }
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dev": true,
- "requires": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "dependencies": {
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "dev": true
- }
- }
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
- },
- "qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
- "dev": true
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true
- },
- "raw-body": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
- "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
- "dev": true,
- "requires": {
- "bytes": "3.1.2",
- "http-errors": "1.8.1",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true
- }
- }
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "rechoir": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
- "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
- "dev": true,
- "requires": {
- "resolve": "^1.9.0"
- }
- },
- "require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true
- },
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "dev": true
- },
- "resolve": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
- "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.8.1",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- },
- "resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dev": true,
- "requires": {
- "resolve-from": "^5.0.0"
- }
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- },
- "retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- },
- "select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
- "dev": true
- },
- "selfsigned": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz",
- "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==",
- "dev": true,
- "requires": {
- "node-forge": "^1"
- }
- },
- "send": {
- "version": "0.17.2",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
- "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "destroy": "~1.0.4",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "1.8.1",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.1",
- "statuses": "~1.5.0"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- }
- }
- },
- "serialize-javascript": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
- "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
- "dev": true,
- "requires": {
- "randombytes": "^2.1.0"
- }
- },
- "serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "dev": true,
- "requires": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "dependencies": {
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "dev": true,
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "dev": true
- }
- }
- },
- "serve-static": {
- "version": "1.14.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
- "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
- "dev": true,
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.17.2"
- }
- },
- "setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true
- },
- "shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.2"
- }
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
- },
- "shell-quote": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
- "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==",
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "sockjs": {
- "version": "0.3.24",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
- "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
- "dev": true,
- "requires": {
- "faye-websocket": "^0.11.3",
- "uuid": "^8.3.2",
- "websocket-driver": "^0.7.4"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "dev": true
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.2.0"
- }
- },
- "strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true
- },
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true
- },
- "tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "dev": true
- },
- "terser": {
- "version": "5.16.9",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz",
- "integrity": "sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==",
- "dev": true,
- "requires": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- }
- },
- "terser-webpack-plugin": {
- "version": "5.3.7",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz",
- "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==",
- "dev": true,
- "requires": {
- "@jridgewell/trace-mapping": "^0.3.17",
- "jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.1",
- "terser": "^5.16.5"
- }
- },
- "thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
- "dev": true
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dev": true,
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
- "dev": true
- },
- "uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "dev": true
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "dev": true
- },
- "watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
- "dev": true,
- "requires": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- }
- },
- "wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "dev": true,
- "requires": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "webpack": {
- "version": "5.89.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
- "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
- "dev": true,
- "requires": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^1.0.0",
- "@webassemblyjs/ast": "^1.11.5",
- "@webassemblyjs/wasm-edit": "^1.11.5",
- "@webassemblyjs/wasm-parser": "^1.11.5",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.9.0",
- "browserslist": "^4.14.5",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.15.0",
- "es-module-lexer": "^1.2.1",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.9",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.2.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.3.7",
- "watchpack": "^2.4.0",
- "webpack-sources": "^3.2.3"
- }
- },
- "webpack-cli": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
- "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
- "dev": true,
- "requires": {
- "@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.2.0",
- "@webpack-cli/info": "^1.5.0",
- "@webpack-cli/serve": "^1.7.0",
- "colorette": "^2.0.14",
- "commander": "^7.0.0",
- "cross-spawn": "^7.0.3",
- "fastest-levenshtein": "^1.0.12",
- "import-local": "^3.0.2",
- "interpret": "^2.2.0",
- "rechoir": "^0.7.0",
- "webpack-merge": "^5.7.3"
- },
- "dependencies": {
- "commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "dev": true
- }
- }
- },
- "webpack-dev-middleware": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz",
- "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==",
- "dev": true,
- "requires": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.1",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
- "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- }
- }
- }
- },
- "webpack-dev-server": {
- "version": "4.15.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz",
- "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==",
- "dev": true,
- "requires": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/express": "^4.17.13",
- "@types/serve-index": "^1.9.1",
- "@types/serve-static": "^1.13.10",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.5.5",
- "ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.0.11",
- "chokidar": "^3.5.3",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.0.1",
- "launch-editor": "^2.6.0",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "rimraf": "^3.0.2",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.1.1",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.24",
- "spdy": "^4.0.2",
- "webpack-dev-middleware": "^5.3.1",
- "ws": "^8.13.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "schema-utils": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.1.0.tgz",
- "integrity": "sha512-Jw+GZVbP5IggB2WAn6UHI02LBwGmsIeYN/lNbSMZyDziQ7jmtAUrqKqDja+W89YHVs+KL/3IkIMltAklqB1vAw==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- }
- }
- }
- },
- "webpack-merge": {
- "version": "5.8.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
- "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
- "dev": true,
- "requires": {
- "clone-deep": "^4.0.1",
- "wildcard": "^2.0.0"
- }
- },
- "webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "dev": true
- },
- "websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "dev": true,
- "requires": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- }
- },
- "websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "dev": true
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "wildcard": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
- "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
- "dev": true
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "ws": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
- "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
- "dev": true,
- "requires": {}
}
}
}
diff --git a/package.json b/package.json
index 64273ea..4efcc46 100644
--- a/package.json
+++ b/package.json
@@ -1,18 +1,15 @@
{
- "name": "curriculum",
+ "name": "euler-rust",
"version": "1.0.0",
"description": "",
"main": "webpack-config.js",
"scripts": {
- "build": "wasm-pack build && npm run webpack-build",
- "webpack-build": "webpack --config webpack.config.js",
- "dev": "webpack-dev-server --config webpack.config.js --hot"
+ "start": "node ./node_modules/@freecodecamp/freecodecamp-os/.freeCodeCamp/tooling/server.js"
},
- "author": "",
- "license": "ISC",
- "devDependencies": {
- "webpack": "5.89.0",
- "webpack-cli": "4.10.0",
- "webpack-dev-server": "4.15.1"
+ "author": "Shaun Hamilton",
+ "license": "BSD-3-Clause",
+ "type": "module",
+ "dependencies": {
+ "@freecodecamp/freecodecamp-os": "3.1.0"
}
}
diff --git a/project-euler-problems-1-to-100/Cargo.toml b/project-euler-problems-1-to-100/Cargo.toml
new file mode 100644
index 0000000..1075428
--- /dev/null
+++ b/project-euler-problems-1-to-100/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "project-euler-problems-1-to-100"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+wasm-bindgen = "0.2.90"
diff --git a/project-euler-problems-1-to-100/src/lib.rs b/project-euler-problems-1-to-100/src/lib.rs
new file mode 100644
index 0000000..8b7227c
--- /dev/null
+++ b/project-euler-problems-1-to-100/src/lib.rs
@@ -0,0 +1,9 @@
+use wasm_bindgen::prelude::*;
+
+// Example format to write functions:
+#[wasm_bindgen(js_name = camelCaseName)] // js_name must equal function name tested on client
+pub fn snake_case_name(num: i32) -> i32 {
+ // Function must be public
+ // All numbers in JS are 32-bit
+ num
+}
diff --git a/Cargo.toml b/project-euler-problems-101-to-200/Cargo.toml
similarity index 83%
rename from Cargo.toml
rename to project-euler-problems-101-to-200/Cargo.toml
index 4deaf38..fb18a52 100644
--- a/Cargo.toml
+++ b/project-euler-problems-101-to-200/Cargo.toml
@@ -1,5 +1,5 @@
[package]
-name = "curriculum"
+name = "project-euler-problems-101-to-200"
version = "0.1.0"
edition = "2021"
diff --git a/project-euler-problems-101-to-200/src/main.rs b/project-euler-problems-101-to-200/src/main.rs
new file mode 100644
index 0000000..8b7227c
--- /dev/null
+++ b/project-euler-problems-101-to-200/src/main.rs
@@ -0,0 +1,9 @@
+use wasm_bindgen::prelude::*;
+
+// Example format to write functions:
+#[wasm_bindgen(js_name = camelCaseName)] // js_name must equal function name tested on client
+pub fn snake_case_name(num: i32) -> i32 {
+ // Function must be public
+ // All numbers in JS are 32-bit
+ num
+}
diff --git a/project-euler-problems-201-to-300/Cargo.toml b/project-euler-problems-201-to-300/Cargo.toml
new file mode 100644
index 0000000..20d48f2
--- /dev/null
+++ b/project-euler-problems-201-to-300/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "project-euler-problems-201-to-300"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+wasm-bindgen = "0.2.84"
diff --git a/project-euler-problems-201-to-300/src/main.rs b/project-euler-problems-201-to-300/src/main.rs
new file mode 100644
index 0000000..8b7227c
--- /dev/null
+++ b/project-euler-problems-201-to-300/src/main.rs
@@ -0,0 +1,9 @@
+use wasm_bindgen::prelude::*;
+
+// Example format to write functions:
+#[wasm_bindgen(js_name = camelCaseName)] // js_name must equal function name tested on client
+pub fn snake_case_name(num: i32) -> i32 {
+ // Function must be public
+ // All numbers in JS are 32-bit
+ num
+}
diff --git a/project-euler-problems-301-to-400/Cargo.toml b/project-euler-problems-301-to-400/Cargo.toml
new file mode 100644
index 0000000..46f2026
--- /dev/null
+++ b/project-euler-problems-301-to-400/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "project-euler-problems-301-to-400"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+wasm-bindgen = "0.2.84"
diff --git a/project-euler-problems-301-to-400/src/main.rs b/project-euler-problems-301-to-400/src/main.rs
new file mode 100644
index 0000000..8b7227c
--- /dev/null
+++ b/project-euler-problems-301-to-400/src/main.rs
@@ -0,0 +1,9 @@
+use wasm_bindgen::prelude::*;
+
+// Example format to write functions:
+#[wasm_bindgen(js_name = camelCaseName)] // js_name must equal function name tested on client
+pub fn snake_case_name(num: i32) -> i32 {
+ // Function must be public
+ // All numbers in JS are 32-bit
+ num
+}
diff --git a/project-euler-problems-401-to-480/Cargo.toml b/project-euler-problems-401-to-480/Cargo.toml
new file mode 100644
index 0000000..612b6aa
--- /dev/null
+++ b/project-euler-problems-401-to-480/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "project-euler-problems-401-to-480"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+wasm-bindgen = "0.2.84"
diff --git a/project-euler-problems-401-to-480/src/main.rs b/project-euler-problems-401-to-480/src/main.rs
new file mode 100644
index 0000000..8b7227c
--- /dev/null
+++ b/project-euler-problems-401-to-480/src/main.rs
@@ -0,0 +1,9 @@
+use wasm_bindgen::prelude::*;
+
+// Example format to write functions:
+#[wasm_bindgen(js_name = camelCaseName)] // js_name must equal function name tested on client
+pub fn snake_case_name(num: i32) -> i32 {
+ // Function must be public
+ // All numbers in JS are 32-bit
+ num
+}
diff --git a/src/lib.rs b/src/lib.rs
deleted file mode 100644
index a3c4c54..0000000
--- a/src/lib.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-use wasm_bindgen::prelude::*;
-
-// Example format to write functions:
-#[wasm_bindgen(js_name = camelCaseName)] // js_name must equal function name tested on client
-pub fn snake_case_name(num: i32) -> i32 { // Function must be public
- // All numbers in JS are 32-bit
- num
-}
-
-// First function written for you - you still need to add the logic :)
-#[wasm_bindgen(js_name = multiplesOf3and5)]
-pub fn multiples_of_3_and_5(n: i32) -> i32 {
- n
-}
-
diff --git a/tooling/adjust-url.js b/tooling/adjust-url.js
new file mode 100644
index 0000000..8b3be1e
--- /dev/null
+++ b/tooling/adjust-url.js
@@ -0,0 +1,37 @@
+//! This script adjusts the preview URL for freeCodeCamp - Courses to open the correct preview.
+import { readFile, writeFile } from "fs/promises";
+
+let PREVIEW_URL = "http://localhost:8080";
+if (process.env.GITPOD_WORKSPACE_URL) {
+ PREVIEW_URL = `https://8080-${
+ process.env.GITPOD_WORKSPACE_URL.split("https://")[1]
+ }`;
+} else if (process.env.CODESPACE_NAME) {
+ PREVIEW_URL = `https://${process.env.CODESPACE_NAME}-8080.${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN}`;
+}
+
+const VSCODE_SETTINGS_PATH = ".vscode/settings.json";
+
+async function main() {
+ const settings_file = await readFile(VSCODE_SETTINGS_PATH, "utf-8");
+ const settings = JSON.parse(settings_file);
+
+ let [preview] = settings?.["freecodecamp-courses.workspace.previews"];
+ if (!preview.url) {
+ throw new Error(".vscode setting not found");
+ }
+ preview.url = PREVIEW_URL;
+
+ await writeFile(
+ VSCODE_SETTINGS_PATH,
+ JSON.stringify(settings, null, 2),
+ "utf-8"
+ );
+}
+
+try {
+ main();
+} catch (e) {
+ console.error("Unable to adjust .vscode/settings.json preview url setting:");
+ console.error(e);
+}
diff --git a/tooling/helpers.js b/tooling/helpers.js
new file mode 100644
index 0000000..a0b7095
--- /dev/null
+++ b/tooling/helpers.js
@@ -0,0 +1,24 @@
+import { readFileSync } from "fs";
+import { readdir } from "fs/promises";
+import { ROOT } from "@freecodecamp/freecodecamp-os/.freeCodeCamp/tooling/env.js";
+import { join } from "path";
+
+let wasm = {};
+
+const PROJECT_DIR = join(ROOT, getCurrentProject());
+const wasmDir = await readdir(join(PROJECT_DIR, "pkg"));
+
+const wasmFilePath = wasmDir.find((p) => p.endsWith(".wasm"));
+const wasmBuffer = readFileSync(join(PROJECT_DIR, "pkg", wasmFilePath));
+
+const wasmModule = await WebAssembly.instantiate(wasmBuffer);
+wasm = wasmModule.instance.exports;
+Object.entries(wasm).forEach(([id, func]) => {
+ global[id] = func;
+});
+
+function getCurrentProject() {
+ const stateFile = readFileSync(join(ROOT, "config/state.json"), "utf-8");
+ const state = JSON.parse(stateFile);
+ return state.currentProject;
+}
diff --git a/tooling/transform.js b/tooling/transform.js
new file mode 100644
index 0000000..06e18b2
--- /dev/null
+++ b/tooling/transform.js
@@ -0,0 +1,78 @@
+//! Transforms the multi-file lessons in `curriculum/project-euler/` to a single file with the correct format for freecodecamp-os in `curriculum/locales/english/project-euler.md`.
+import { readFile, readdir, writeFile } from "fs/promises";
+import { join } from "path";
+
+const INPUT_DIRECTORY = "./curriculum/project-euler/";
+const OUTPUT_DIRECTORY = "./curriculum/locales/english/";
+
+async function main() {
+ await addMeta();
+ await addLessons();
+}
+
+async function addMeta() {
+ const blocks = await readdir(INPUT_DIRECTORY);
+ for (const block of blocks) {
+ const [_, start, end] = block.match(/(\d+)-to-(\d+)/);
+ const meta = `# Project Euler in Rust: ${start} to ${end}
+
+Complete the freeCodeCamp Project Euler problems in the Rust programming language using WebAssembly.
+
+`;
+ await writeFile(join(OUTPUT_DIRECTORY, `${block}.md`), meta, "utf-8");
+ }
+}
+
+async function addLessons() {
+ const blocks = await readdir(INPUT_DIRECTORY);
+ for (const block of blocks) {
+ const lessonFiles = await readdir(join(INPUT_DIRECTORY, block));
+ const sortedLessonFiles = lessonFiles.sort(
+ (a, b) => Number(a.match(/\d+/)) - Number(b.match(/\d+/))
+ );
+ let lessonNumber = 0;
+ for (const lessonFile of sortedLessonFiles) {
+ // Read file
+ const lesson = await readFile(
+ join(INPUT_DIRECTORY, block, lessonFile),
+ "utf-8"
+ );
+ // Replace yaml with lesson number
+ const lessonSansYaml = lesson.replace(
+ /^---$.*?^---$/ms,
+ `## ${lessonNumber++}`
+ );
+ // Change headings
+ const lessonWithDescription = lessonSansYaml.replace(
+ "# --description--",
+ "### --description--"
+ );
+ const lessonWithTests = lessonWithDescription.replace(
+ "# --hints--",
+ "### --tests--"
+ );
+ const lessonSansSeed = lessonWithTests.slice(
+ 0,
+ lessonWithTests.indexOf("# --seed--")
+ );
+ // Append to file
+ await writeFile(join(OUTPUT_DIRECTORY, `${block}.md`), lessonSansSeed, {
+ encoding: "utf-8",
+ flag: "a",
+ });
+ }
+
+ const ending = `## --fcc-end--
+ `;
+ await writeFile(join(OUTPUT_DIRECTORY, `${block}.md`), ending, {
+ encoding: "utf-8",
+ flag: "a",
+ });
+ }
+}
+
+try {
+ main();
+} catch (e) {
+ console.error(e);
+}
diff --git a/webpack.config.js b/webpack.config.js
deleted file mode 100644
index 8b69800..0000000
--- a/webpack.config.js
+++ /dev/null
@@ -1,15 +0,0 @@
-const path = require("path");
-
-module.exports = {
- mode: "development",
- entry: "./pkg/curriculum_bg.js",
- output: {
- publicPath: "",
- path: path.resolve(__dirname, "dist"),
- filename: "bundle.js",
- },
- experiments: {
- asyncWebAssembly: true,
- },
- target: "node",
-};